You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Haoliang.Models.Device;
using Haoliang.Models.DataCollection;
namespace Haoliang.Core.Services
{
public interface IDeviceCollectionService
{
Task CollectAllDevicesAsync();
Task CollectDeviceAsync(int deviceId);
Task<DeviceCurrentStatus> CollectDeviceDataAsync(int deviceId);
Task<bool> PingDeviceAsync(string ipAddress);
Task<string> GetDeviceDataAsync(string httpUrl);
Task ProcessCollectedDataAsync(CollectionResult result);
Task<IEnumerable<CollectionResult>> GetCollectionHistoryAsync(int deviceId, DateTime startDate, DateTime endDate);
Task<CollectionStatistics> GetCollectionStatisticsAsync(DateTime date);
Task<CollectionHealth> GetCollectionHealthAsync();
Task RestartFailedCollectionsAsync();
Task<bool> TestConnectionAsync(int deviceId);
}
public interface IPingService
{
Task<bool> PingAsync(string ipAddress);
Task<int> GetPingTimeAsync(string ipAddress);
Task<bool> IsDeviceOnlineAsync(string ipAddress);
Task<PingResult> GetPingResultAsync(string ipAddress);
}
public interface IDataParserService
{
Task<DeviceCurrentStatus> ParseDeviceDataAsync(string rawJson, int deviceId);
Task<TagData> ParseTagDataAsync(object tagValue, string dataType);
Task<bool> ValidateDeviceDataAsync(DeviceCurrentStatus data);
Task<string> ConvertDataFormatAsync(object value, string dataType);
}
public interface IDataStorageService
{
Task SaveCollectionResultAsync(CollectionResult result);
Task SaveDeviceStatusAsync(DeviceCurrentStatus status);
Task SaveRawDataAsync(int deviceId, string rawJson, bool isSuccess, string errorMessage = null);
Task LogCollectionAsync(int deviceId, LogLevel logLevel, string message, string data = null);
Task ArchiveOldDataAsync(int daysToKeep = 30);
}
public class PingResult
{
public bool IsSuccess { get; set; }
public int PingTimeMs { get; set; }
public string ErrorMessage { get; set; }
public DateTime Timestamp { get; set; }
}
public interface IRetryService
{
Task<T> ExecuteWithRetryAsync<T>(Func<Task<T>> operation, int maxRetries = 3, int delayMs = 30000);
Task ExecuteWithRetryAsync(Func<Task> operation, int maxRetries = 3, int delayMs = 30000);
bool ShouldRetry(Exception ex, int attemptNumber);
}
public class CollectionException : Exception
{
public int DeviceId { get; set; }
public string DeviceCode { get; set; }
public CollectionErrorType ErrorType { get; set; }
public CollectionException(int deviceId, string deviceCode, string message, CollectionErrorType errorType)
: base(message)
{
DeviceId = deviceId;
DeviceCode = deviceCode;
ErrorType = errorType;
}
}
public enum CollectionErrorType
{
DeviceOffline,
NetworkError,
DataParseError,
DatabaseError,
Unknown
}
}