136 lines
4.9 KiB
C#
Raw Permalink Normal View History

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace YunDa.SOMS.Application.DataMonitoring.SecondaryCircuitInspection.Services
{
/// <summary>
/// 时间窗口计算服务接口
/// </summary>
public interface ITimeWindowCalculatorService
{
/// <summary>
/// 计算时间窗口内的数据并返回JSON格式结果
/// </summary>
/// <param name="inspectionItemId">巡检项ID</param>
/// <param name="timeWindowSeconds">时间窗口(秒)</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>JSON格式的计算结果如 {"16835_0": 52.5, "16835_1": 75.3}</returns>
Task<string> CalculateTimeWindowDataAsync(
Guid inspectionItemId,
int timeWindowSeconds = 60,
CancellationToken cancellationToken = default);
/// <summary>
/// 计算时间窗口内的数据并返回结构化结果
/// </summary>
/// <param name="inspectionItemId">巡检项ID</param>
/// <param name="timeWindowSeconds">时间窗口(秒)</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>结构化的计算结果</returns>
Task<CalculationResult> CalculateTimeWindowDataStructuredAsync(
Guid inspectionItemId,
int timeWindowSeconds = 60,
CancellationToken cancellationToken = default);
/// <summary>
/// 根据变量代码列表计算时间窗口数据
/// </summary>
/// <param name="variableCodes">变量代码列表,格式如 ["16835_0", "16835_1"]</param>
/// <param name="timeWindowSeconds">时间窗口(秒)</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>JSON格式的计算结果</returns>
Task<string> CalculateVariableDataAsync(
List<string> variableCodes,
int timeWindowSeconds = 60,
CancellationToken cancellationToken = default);
/// <summary>
/// 计算时间窗口内的历史数据(支持时间序列)
/// </summary>
/// <param name="inspectionItemId">巡检项ID</param>
/// <param name="timeWindowSeconds">时间窗口(秒)</param>
/// <param name="sampleIntervalSeconds">采样间隔(秒)</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>时间序列数据</returns>
Task<List<Dictionary<string, object>>> CalculateTimeSeriesDataAsync(
Guid inspectionItemId,
int timeWindowSeconds = 60,
int sampleIntervalSeconds = 5,
CancellationToken cancellationToken = default);
/// <summary>
/// 使用JavaScript表达式计算时间窗口数据
/// </summary>
/// <param name="inspectionItemId">巡检项ID</param>
/// <param name="javascriptExpression">JavaScript表达式</param>
/// <param name="timeWindowSeconds">时间窗口(秒)</param>
/// <param name="cancellationToken">取消令牌</param>
/// <returns>计算结果</returns>
Task<CalculationResult> CalculateWithJavaScriptExpressionAsync(
Guid inspectionItemId,
string javascriptExpression,
int timeWindowSeconds = 60,
CancellationToken cancellationToken = default);
}
/// <summary>
/// 计算结果类
/// </summary>
public class CalculationResult
{
/// <summary>
/// 计算是否成功
/// </summary>
public bool IsSuccess { get; set; }
/// <summary>
/// 错误信息
/// </summary>
public string ErrorMessage { get; set; }
/// <summary>
/// 计算结果数据(变量代码 -> 值)
/// </summary>
public Dictionary<string, decimal> Data { get; set; }
/// <summary>
/// JSON格式的结果
/// </summary>
public string JsonResult { get; set; }
/// <summary>
/// 计算详情
/// </summary>
public List<string> CalculationDetails { get; set; }
/// <summary>
/// 计算耗时(毫秒)
/// </summary>
public long ExecutionTimeMs { get; set; }
/// <summary>
/// 计算时间
/// </summary>
public DateTime CalculationTime { get; set; }
/// <summary>
/// 时间窗口开始时间
/// </summary>
public DateTime WindowStartTime { get; set; }
/// <summary>
/// 时间窗口结束时间
/// </summary>
public DateTime WindowEndTime { get; set; }
public CalculationResult()
{
Data = new Dictionary<string, decimal>();
CalculationDetails = new List<string>();
CalculationTime = DateTime.Now;
}
}
}