using IStation.Model;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace IStation.Calculation
|
{
|
/// <summary>
|
/// 监测公式历史计算辅助类
|
/// </summary>
|
public class MonitorFormulaHistoryCalcuHelper
|
{
|
#region 常规实时
|
|
#region 映射
|
|
/// <summary>
|
/// 计算单一映射(常规实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuSingleMapping
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.SingleMappingCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点不是实时测点";
|
return default;
|
}
|
var relatedRecordList = getRecordList(relatedMonitor.ID,relatedMonitor.SignalList.First().ID);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
Msg = "关联测点不存在监测记录";
|
return default;
|
}
|
var relatedRealSlot = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (relatedRealSlot == null)
|
{
|
relatedRealSlot = new Model.Monitor.RealSlot();
|
}
|
var relatedRecordReadIndex = -1;
|
|
var signal = monitor.SignalList.First();
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <=duration; i+=realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndex + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndex = index + 1;
|
break;
|
}
|
}
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (relatedRecord == null|| relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus =lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = relatedRecord.SrcTime;
|
pure.SrcValue = relatedRecord.DataValue;
|
pure.DataTime = dataTime;
|
pure.DataValue = relatedRecord.DataValue;
|
pure.DataStatus = relatedRecord.DataStatus;
|
if (pure.DataStatus == null)
|
{
|
pure.DataStatus = new List<string>();
|
}
|
|
if (double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
if (formulaModel.Calculate(dataValue, out double toValue))
|
{
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
toValue = signal.ConvertParas.Convert(toValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
toValue = signal.CorrectParas.Correct(toValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(toValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
toValue = Math.Round(toValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = toValue.ToString();
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_CalculateFailed);
|
}
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
return recordList;
|
}
|
|
/// <summary>
|
/// 计算比较映射(常规实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuCompareMapping
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.CompareMappingCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点不是实时测点";
|
return default;
|
}
|
var relatedRecordList = getRecordList(relatedMonitor.ID,relatedMonitor.SignalList.First().ID);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
Msg = "关联测点不存在监测记录";
|
return default;
|
}
|
var relatedRealSlot = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (relatedRealSlot == null)
|
{
|
relatedRealSlot = new Model.Monitor.RealSlot();
|
}
|
var relatedRecordReadIndex = -1;
|
|
var signal = monitor.SignalList.First();
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndex + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndex = index + 1;
|
break;
|
}
|
}
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (relatedRecord == null || relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = relatedRecord.SrcTime;
|
pure.SrcValue = relatedRecord.DataValue;
|
pure.DataTime = dataTime;
|
pure.DataValue = relatedRecord.DataValue;
|
pure.DataStatus = relatedRecord.DataStatus;
|
if (pure.DataStatus == null)
|
{
|
pure.DataStatus = new List<string>();
|
}
|
|
if (double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
if (formulaModel.Calculate(dataValue, out double toValue))
|
{
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
toValue = signal.ConvertParas.Convert(toValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
toValue = signal.CorrectParas.Correct(toValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(toValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
toValue = Math.Round(toValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = toValue.ToString();
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_CalculateFailed);
|
}
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
|
/// <summary>
|
/// 计算区间映射(常规实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuRangeMapping
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.RangeMappingCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点不是实时测点";
|
return default;
|
}
|
var relatedRecordList = getRecordList(relatedMonitor.ID,relatedMonitor.SignalList.First().ID);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
Msg = "关联测点不存在监测记录";
|
return default;
|
}
|
var relatedRealSlot = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (relatedRealSlot == null)
|
{
|
relatedRealSlot = new Model.Monitor.RealSlot();
|
}
|
var relatedRecordReadIndex = -1;
|
|
var signal = monitor.SignalList.First();
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndex + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndex = index + 1;
|
break;
|
}
|
}
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (relatedRecord == null || relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = relatedRecord.SrcTime;
|
pure.SrcValue = relatedRecord.DataValue;
|
pure.DataTime = dataTime;
|
pure.DataValue = relatedRecord.DataValue;
|
pure.DataStatus = relatedRecord.DataStatus;
|
if (pure.DataStatus == null)
|
{
|
pure.DataStatus = new List<string>();
|
}
|
|
if (double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
if (formulaModel.Calculate(dataValue, out double toValue))
|
{
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
toValue = signal.ConvertParas.Convert(toValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
toValue = signal.CorrectParas.Correct(toValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(toValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
toValue = Math.Round(toValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = toValue.ToString();
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_CalculateFailed);
|
}
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
|
#endregion
|
|
#region 系数
|
|
/// <summary>
|
/// 计算一元系数(实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuOnceRatio
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.OnceRatioCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点不是实时测点";
|
return default;
|
}
|
var relatedRecordList = getRecordList(relatedMonitor.ID,relatedMonitor.SignalList.First().ID);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
Msg = "关联测点不存在监测记录";
|
return default;
|
}
|
var relatedRealSlot = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (relatedRealSlot == null)
|
{
|
relatedRealSlot = new Model.Monitor.RealSlot();
|
}
|
var relatedRecordReadIndex = -1;
|
|
var signal = monitor.SignalList.First();
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndex + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndex = index + 1;
|
break;
|
}
|
}
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (relatedRecord == null || relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = relatedRecord.SrcTime;
|
pure.SrcValue = relatedRecord.DataValue;
|
pure.DataTime = dataTime;
|
pure.DataValue = relatedRecord.DataValue;
|
pure.DataStatus = relatedRecord.DataStatus;
|
if (pure.DataStatus == null)
|
{
|
pure.DataStatus = new List<string>();
|
}
|
|
if (double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
if (formulaModel.Calculate(dataValue, out double toValue))
|
{
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
toValue = signal.ConvertParas.Convert(toValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
toValue = signal.CorrectParas.Correct(toValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(toValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
toValue = Math.Round(toValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = toValue.ToString();
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_CalculateFailed);
|
}
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 计算二元系数(实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuTwiceRatio
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.TwiceRatioCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点不是实时测点";
|
return default;
|
}
|
var relatedRecordList = getRecordList(relatedMonitor.ID,relatedMonitor.SignalList.First().ID);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
Msg = "关联测点不存在监测记录";
|
return default;
|
}
|
var relatedRealSlot = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (relatedRealSlot == null)
|
{
|
relatedRealSlot = new Model.Monitor.RealSlot();
|
}
|
var relatedRecordReadIndex = -1;
|
|
var signal = monitor.SignalList.First();
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndex + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndex = index + 1;
|
break;
|
}
|
}
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (relatedRecord == null || relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = relatedRecord.SrcTime;
|
pure.SrcValue = relatedRecord.DataValue;
|
pure.DataTime = dataTime;
|
pure.DataValue = relatedRecord.DataValue;
|
pure.DataStatus = relatedRecord.DataStatus;
|
if (pure.DataStatus == null)
|
{
|
pure.DataStatus = new List<string>();
|
}
|
|
if (double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
if (formulaModel.Calculate(dataValue, out double toValue))
|
{
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
toValue = signal.ConvertParas.Convert(toValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
toValue = signal.CorrectParas.Correct(toValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(toValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
toValue = Math.Round(toValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = toValue.ToString();
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_CalculateFailed);
|
}
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
#endregion
|
|
#region 其他
|
|
/// <summary>
|
/// 计算-和值(常规实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuSum
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.SumValueCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
if (formulaModel.ObjectIds == null || formulaModel.ObjectIds.Count < 1)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
|
//关联测点列表
|
var relatedMonitorList = new List<Model.MonitorPoint_Signal_SignalType>();
|
foreach (var objectid in formulaModel.ObjectIds)
|
{
|
var relatedMonitor = getMonitorPoint(objectid);
|
if (relatedMonitor == null)
|
{
|
Msg = $"关联测点:{objectid},不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = $"关联测点:{objectid},不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = $"关联测点:{objectid},关联测点不是实时测点";
|
return default;
|
}
|
relatedMonitorList.Add(relatedMonitor);
|
}
|
var relatedRecordListDict = new Dictionary<Model.MonitorPoint_Signal_SignalType, List<Model.MonitorBasicRecord>>();//关联测点记录
|
var relatedRealSlotDict = new Dictionary<Model.MonitorPoint_Signal_SignalType, Model.Monitor.RealSlot>();
|
var relatedRecordReadIndexDict = new Dictionary<Model.MonitorPoint_Signal_SignalType, int>();//已读角标
|
foreach (var relatedMonitor in relatedMonitorList)
|
{
|
var relatedRecordList = getRecordList(relatedMonitor.ID,relatedMonitor.SignalList.First().ID);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
Msg = $"关联测点:{relatedMonitor.ID},不存在记录";
|
return default;
|
}
|
relatedRecordListDict.Add(relatedMonitor, relatedRecordList);
|
var relatedRealSlot = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (relatedRealSlot == null)
|
{
|
relatedRealSlot = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(relatedMonitor, relatedRealSlot);
|
relatedRecordReadIndexDict.Add(relatedMonitor, -1);
|
}
|
|
var signal = monitor.SignalList.First();
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
var relatedRecordDict = new Dictionary<Model.MonitorPoint_Signal_SignalType, Model.MonitorBasicRecord>();
|
foreach (var relatedMonitor in relatedMonitorList)
|
{
|
var relatedRecordList = relatedRecordListDict[relatedMonitor];
|
var relatedRecordReadIndex = relatedRecordReadIndexDict[relatedMonitor];
|
for (int j = relatedRecordReadIndex + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecord = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordDict.Add(relatedMonitor, relatedRecordList[index]);
|
relatedRecordReadIndexDict[relatedMonitor] = index + 1;
|
break;
|
}
|
}
|
}
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
if (relatedRecordDict.Count != relatedMonitorList.Count || relatedRecordDict.ToList().Exists(x => x.Value.DataTime < relatedRealSlotDict[x.Key].GetStartTime(dataTime)))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = dataTime;
|
pure.SrcValue = string.Join(',', relatedRecordDict.Values.Select(x => x.DataValue));
|
pure.DataTime = dataTime;
|
pure.DataValue = string.Empty;
|
pure.DataStatus = new List<string>();
|
|
var dataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordDict.Values)
|
{
|
if (!double.TryParse(relatedRecord.DataValue, out double dataValueTemp))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
break;
|
}
|
dataValueList.Add(dataValueTemp);
|
if (relatedRecord.DataStatus != null)
|
{
|
pure.DataStatus.AddRange(relatedRecord.DataStatus);
|
}
|
}
|
var dataValue = formulaModel.Calculate(dataValueList);
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_ConvertFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_FilterFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 计算-差值(常规实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuDiff
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.DiffValueCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
|
#region 第一个参数
|
|
var relatedMonitor1 = getMonitorPoint(formulaModel.First);
|
if (relatedMonitor1 == null)
|
{
|
Msg = $"关联测点:{formulaModel.First},不存在";
|
return default;
|
}
|
if (relatedMonitor1.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = $"关联测点:{formulaModel.First},不是常规测点";
|
return default;
|
}
|
if (relatedMonitor1.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = $"关联测点:{formulaModel.First},不是实时测点";
|
return default;
|
}
|
var relatedRecordList1 = getRecordList(relatedMonitor1.ID, relatedMonitor1.SignalList.First().ID);
|
if (relatedRecordList1 == null || relatedRecordList1.Count < 1)
|
{
|
Msg = $"关联测点:{formulaModel.First},不存在记录";
|
return default;
|
}
|
var relatedRealSlot1 = Model.Monitor.RealSlot.ToModel(relatedMonitor1.CronParas);
|
if (relatedRealSlot1 == null)
|
{
|
relatedRealSlot1 = new Model.Monitor.RealSlot();
|
}
|
var relatedRecordReadIndex1 = -1;
|
|
#endregion
|
|
#region 第二个参数
|
|
var relatedMonitor2 = getMonitorPoint(formulaModel.Second);
|
if (relatedMonitor2 == null)
|
{
|
Msg = $"关联测点:{formulaModel.Second},不存在";
|
return default;
|
}
|
if (relatedMonitor2.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = $"关联测点:{formulaModel.Second},不是常规测点";
|
return default;
|
}
|
if (relatedMonitor2.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = $"关联测点:{formulaModel.Second},不是实时测点";
|
return default;
|
}
|
var relatedRecordList2 = getRecordList(relatedMonitor2.ID,relatedMonitor2.SignalList.First().ID);
|
if (relatedRecordList2 == null || relatedRecordList2.Count < 1)
|
{
|
Msg = $"关联测点:{formulaModel.Second},不存在记录";
|
return default;
|
}
|
var relatedRealSlot2 = Model.Monitor.RealSlot.ToModel(relatedMonitor2.CronParas);
|
if (relatedRealSlot2 == null)
|
{
|
relatedRealSlot2 = new Model.Monitor.RealSlot();
|
}
|
var relatedRecordReadIndex2 = -1;
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
|
Model.MonitorBasicRecord relatedRecord1 = null;
|
for (int j = relatedRecordReadIndex1 + 1; j < relatedRecordList1.Count; j++)
|
{
|
var relatedRecord = relatedRecordList1[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord1 = relatedRecordList1[index];
|
relatedRecordReadIndex1 = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord relatedRecord2 = null;
|
for (int j = relatedRecordReadIndex2 + 1; j < relatedRecordList2.Count; j++)
|
{
|
var relatedRecord = relatedRecordList2[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord2 = relatedRecordList2[index];
|
relatedRecordReadIndex2 = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (relatedRecord1 == null || relatedRecord1.DataTime < relatedRealSlot1.GetStartTime(dataTime)
|
|| relatedRecord2 == null || relatedRecord2.DataTime < relatedRealSlot2.GetStartTime(dataTime))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = dataTime;
|
pure.SrcValue = $"{relatedRecord1.DataValue},{relatedRecord2.DataValue}";
|
pure.DataTime = dataTime;
|
pure.DataValue = string.Empty;
|
pure.DataStatus = new List<string>();
|
|
if (!double.TryParse(relatedRecord1.DataValue, out double dataValue1))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
if (relatedRecord1.DataStatus != null)
|
{
|
pure.DataStatus.AddRange(relatedRecord1.DataStatus);
|
}
|
|
if (!double.TryParse(relatedRecord2.DataValue, out double dataValue2))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
if (relatedRecord2.DataStatus != null)
|
{
|
pure.DataStatus.AddRange(relatedRecord2.DataStatus);
|
}
|
|
var dataValue = formulaModel.Calculate(dataValue2, dataValue1);
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_ConvertFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_FilterFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 计算数值累积(常规实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuNumberAccumulate
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.NumberAccumulateCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = $"关联测点:{formulaModel.ObjectID},不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = $"关联测点:{formulaModel.ObjectID},不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = $"关联测点:{formulaModel.ObjectID},不是实时测点";
|
return default;
|
}
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedMonitor.SignalList.First().ID);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
Msg = $"关联测点:{formulaModel.ObjectID},不存在记录";
|
return default;
|
}
|
var relatedRealSlot = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (relatedRealSlot == null)
|
{
|
relatedRealSlot = new Model.Monitor.RealSlot();
|
}
|
var relatedRecordReadIndex = -1;
|
|
var signal = monitor.SignalList.First();
|
var accumulateModel = Model.Monitor.AccumulateParameters.ToModel(signal.DataParas);
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndex+ 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecordTemp.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndex = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (relatedRecord == null || relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = relatedRecord.SrcTime;
|
pure.SrcValue = relatedRecord.DataValue;
|
pure.DataTime = dataTime;
|
pure.DataValue = relatedRecord.DataValue;
|
pure.DataStatus = relatedRecord.DataStatus;
|
if (pure.DataStatus == null)
|
{
|
pure.DataStatus = new List<string>();
|
}
|
|
if (double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
dataValue = formulaModel.Calculate(dataValue, realSlot.TimeStep);
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double lastDataValue))
|
{
|
dataValue += lastDataValue;
|
}
|
}
|
else
|
{
|
if (accumulateModel != null)
|
{
|
if (accumulateModel.InitialValue.HasValue)
|
{
|
dataValue += accumulateModel.InitialValue.Value;
|
}
|
}
|
}
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_FilterFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
return recordList;
|
}
|
|
/// <summary>
|
/// 计算枚举累积(常规实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuEnumAccumulate
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.EnumAccumulateCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = $"关联测点:{formulaModel.ObjectID},不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = $"关联测点:{formulaModel.ObjectID},不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = $"关联测点:{formulaModel.ObjectID},不是实时测点";
|
return default;
|
}
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedMonitor.SignalList.First().ID);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
Msg = $"关联测点:{formulaModel.ObjectID},不存在记录";
|
return default;
|
}
|
var relatedRealSlot = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (relatedRealSlot == null)
|
{
|
relatedRealSlot = new Model.Monitor.RealSlot();
|
}
|
var relatedRecordReadIndex = -1;
|
|
var signal = monitor.SignalList.First();
|
var accumulateModel = Model.Monitor.AccumulateParameters.ToModel(signal.DataParas);
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndex + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecordTemp.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndex = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (relatedRecord == null || relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = relatedRecord.SrcTime;
|
pure.SrcValue = relatedRecord.DataValue;
|
pure.DataTime = dataTime;
|
pure.DataValue = relatedRecord.DataValue;
|
pure.DataStatus = relatedRecord.DataStatus;
|
if (pure.DataStatus == null)
|
{
|
pure.DataStatus = new List<string>();
|
}
|
|
if (double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
dataValue = formulaModel.Calculate(dataValue, realSlot.TimeStep);
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double lastDataValue))
|
{
|
dataValue += lastDataValue;
|
}
|
}
|
else
|
{
|
if (accumulateModel != null)
|
{
|
if (accumulateModel.InitialValue.HasValue)
|
{
|
dataValue += accumulateModel.InitialValue.Value;
|
}
|
}
|
}
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_FilterFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
return recordList;
|
}
|
|
|
/// <summary>
|
/// 计算效率(常规实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuE
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.ECalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
|
#region 流量参数
|
|
var relatedMonitorQ = getMonitorPoint(formulaModel.Q);
|
if (relatedMonitorQ == null)
|
{
|
Msg = "关联测点:{formulaModel.Q},不存在";
|
return default;
|
}
|
if (relatedMonitorQ.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点:{formulaModel.Q},不是常规测点";
|
return default;
|
}
|
if (relatedMonitorQ.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点:{formulaModel.Q},不是实时测点";
|
return default;
|
}
|
var relatedSignalQ = relatedMonitorQ.SignalList.First();
|
if (relatedSignalQ.SignalType.Identifier != SignalType.瞬时流量)
|
{
|
Msg = "关联测点:{formulaModel.Q},不是瞬时流量测点";
|
return default;
|
}
|
var relatedRecordListQ = getRecordList(relatedMonitorQ.ID, relatedSignalQ.ID);
|
if (relatedRecordListQ == null || relatedRecordListQ.Count < 1)
|
{
|
Msg = "关联测点:{formulaModel.Q},记录不存在";
|
return default;
|
}
|
var relatedRealSlotQ = Model.Monitor.RealSlot.ToModel(relatedMonitorQ.CronParas);
|
if (relatedRealSlotQ == null)
|
{
|
relatedRealSlotQ = new Model.Monitor.RealSlot();
|
}
|
int relatedRecordReadIndexQ = -1;
|
|
#endregion
|
|
#region 扬程参数
|
|
var relatedMonitorH = getMonitorPoint(formulaModel.H);
|
if (relatedMonitorH == null)
|
{
|
Msg = "关联测点:{formulaModel.H},不存在";
|
return default;
|
}
|
if (relatedMonitorH.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点:{formulaModel.H},不是常规测点";
|
return default;
|
}
|
if (relatedMonitorH.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点:{formulaModel.H},不是实时测点";
|
return default;
|
}
|
var relatedSignalH = relatedMonitorH.SignalList.First();
|
if (relatedSignalH.SignalType.Identifier != SignalType.扬程)
|
{
|
Msg = "关联测点:{formulaModel.H},不是扬程测点";
|
return default;
|
}
|
var relatedRecordListH = getRecordList(relatedMonitorH.ID, relatedSignalH.ID);
|
if (relatedRecordListH == null || relatedRecordListH.Count < 1)
|
{
|
Msg = "关联测点:{formulaModel.H},记录不存在";
|
return default;
|
}
|
var relatedRealSlotH = Model.Monitor.RealSlot.ToModel(relatedMonitorH.CronParas);
|
if (relatedRealSlotH == null)
|
{
|
relatedRealSlotH = new Model.Monitor.RealSlot();
|
}
|
int relatedRecordReadIndexH = -1;
|
|
#endregion
|
|
#region 功率参数
|
|
var relatedMonitorP = getMonitorPoint(formulaModel.P);
|
if (relatedMonitorP == null)
|
{
|
Msg = "关联测点:{formulaModel.P},不存在";
|
return default;
|
}
|
if (relatedMonitorP.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点:{formulaModel.P},不是常规测点";
|
return default;
|
}
|
if (relatedMonitorP.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点:{formulaModel.P},不是实时测点";
|
return default;
|
}
|
var relatedSignalP = relatedMonitorP.SignalList.First();
|
if (relatedSignalP.SignalType.Identifier != SignalType.有功功率)
|
{
|
Msg = "关联测点:{formulaModel.P},不是扬程测点";
|
return default;
|
}
|
var relatedRecordListP = getRecordList(relatedMonitorP.ID, relatedSignalP.ID);
|
if (relatedRecordListP == null || relatedRecordListP.Count < 1)
|
{
|
Msg = "关联测点:{formulaModel.P},记录不存在";
|
return default;
|
}
|
var relatedRealSlotP = Model.Monitor.RealSlot.ToModel(relatedMonitorP.CronParas);
|
if (relatedRealSlotP == null)
|
{
|
relatedRealSlotP = new Model.Monitor.RealSlot();
|
}
|
int relatedRecordReadIndexP = -1;
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
|
Model.MonitorBasicRecord relatedRecordQ = null;
|
for (int j = relatedRecordReadIndexQ + 1; j < relatedRecordListQ.Count; j++)
|
{
|
var relatedRecord = relatedRecordListQ[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordQ = relatedRecordListQ[index];
|
relatedRecordReadIndexQ = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord relatedRecordH = null;
|
for (int j = relatedRecordReadIndexH + 1; j < relatedRecordListH.Count; j++)
|
{
|
var relatedRecord = relatedRecordListH[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordH = relatedRecordListH[index];
|
relatedRecordReadIndexH = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord relatedRecordP = null;
|
for (int j = relatedRecordReadIndexP + 1; j < relatedRecordListP.Count; j++)
|
{
|
var relatedRecord = relatedRecordListP[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordP = relatedRecordListP[index];
|
relatedRecordReadIndexP = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (relatedRecordQ == null || relatedRecordQ.DataTime < relatedRealSlotQ.GetStartTime(dataTime)
|
|| relatedRecordH == null || relatedRecordH.DataTime < relatedRealSlotH.GetStartTime(dataTime)
|
|| relatedRecordP == null || relatedRecordP.DataTime < relatedRealSlotP.GetStartTime(dataTime))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = dataTime;
|
pure.SrcValue = $"{relatedRecordQ.DataValue},{relatedRecordH.DataValue},{relatedRecordP.DataValue}";
|
pure.DataTime = dataTime;
|
pure.DataValue = string.Empty;
|
pure.DataStatus = new List<string>();
|
|
|
if (!double.TryParse(relatedRecordQ.DataValue, out double dataValueQ))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
if (relatedRecordQ.DataStatus != null)
|
{
|
pure.DataStatus.AddRange(relatedRecordQ.DataStatus);
|
}
|
|
if (!double.TryParse(relatedRecordH.DataValue, out double dataValueH))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
if (relatedRecordH.DataStatus != null)
|
{
|
pure.DataStatus.AddRange(relatedRecordH.DataStatus);
|
}
|
|
if (!double.TryParse(relatedRecordP.DataValue, out double dataValueP))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
if (relatedRecordP.DataStatus != null)
|
{
|
pure.DataStatus.AddRange(relatedRecordP.DataStatus);
|
}
|
|
if (formulaModel.Calculate(dataValueQ, dataValueH, dataValueP, out double dataValue))
|
{
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_ConvertFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_FilterFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_CalculateFailed);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 计算千吨能耗(常规实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuWP
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.WPCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
|
|
#region 流量参数
|
|
var relatedMonitorQ = getMonitorPoint(formulaModel.Q);
|
if (relatedMonitorQ == null)
|
{
|
Msg = "关联测点:{formulaModel.Q},不存在";
|
return default;
|
}
|
if (relatedMonitorQ.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点:{formulaModel.Q},不是常规测点";
|
return default;
|
}
|
if (relatedMonitorQ.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点:{formulaModel.Q},不是实时测点";
|
return default;
|
}
|
var relatedSignalQ = relatedMonitorQ.SignalList.First();
|
if (relatedSignalQ.SignalType.Identifier != SignalType.瞬时流量)
|
{
|
Msg = "关联测点:{formulaModel.Q},不是瞬时流量测点";
|
return default;
|
}
|
var relatedRecordListQ = getRecordList(relatedMonitorQ.ID, relatedSignalQ.ID);
|
if (relatedRecordListQ == null || relatedRecordListQ.Count < 1)
|
{
|
Msg = "关联测点:{formulaModel.Q},记录不存在";
|
return default;
|
}
|
var relatedRealSlotQ = Model.Monitor.RealSlot.ToModel(relatedMonitorQ.CronParas);
|
if (relatedRealSlotQ == null)
|
{
|
relatedRealSlotQ = new Model.Monitor.RealSlot();
|
}
|
int relatedRecordReadIndexQ = -1;
|
|
#endregion
|
|
#region 功率参数
|
|
var relatedMonitorP = getMonitorPoint(formulaModel.P);
|
if (relatedMonitorP == null)
|
{
|
Msg = "关联测点:{formulaModel.P},不存在";
|
return default;
|
}
|
if (relatedMonitorP.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点:{formulaModel.P},不是常规测点";
|
return default;
|
}
|
if (relatedMonitorP.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点:{formulaModel.P},不是实时测点";
|
return default;
|
}
|
var relatedSignalP = relatedMonitorP.SignalList.First();
|
if (relatedSignalP.SignalType.Identifier != SignalType.有功功率)
|
{
|
Msg = "关联测点:{formulaModel.P},不是扬程测点";
|
return default;
|
}
|
var relatedRecordListP = getRecordList(relatedMonitorP.ID, relatedSignalP.ID);
|
if (relatedRecordListP == null || relatedRecordListP.Count < 1)
|
{
|
Msg = "关联测点:{formulaModel.P},记录不存在";
|
return default;
|
}
|
var relatedRealSlotP = Model.Monitor.RealSlot.ToModel(relatedMonitorP.CronParas);
|
if (relatedRealSlotP == null)
|
{
|
relatedRealSlotP = new Model.Monitor.RealSlot();
|
}
|
int relatedRecordReadIndexP = -1;
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
|
Model.MonitorBasicRecord relatedRecordQ = null;
|
for (int j = relatedRecordReadIndexQ + 1; j < relatedRecordListQ.Count; j++)
|
{
|
var relatedRecord = relatedRecordListQ[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordQ = relatedRecordListQ[index];
|
relatedRecordReadIndexQ = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord relatedRecordP = null;
|
for (int j = relatedRecordReadIndexP + 1; j < relatedRecordListP.Count; j++)
|
{
|
var relatedRecord = relatedRecordListP[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordP = relatedRecordListP[index];
|
relatedRecordReadIndexP = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (relatedRecordQ == null || relatedRecordQ.DataTime < relatedRealSlotQ.GetStartTime(dataTime)
|
|| relatedRecordP == null || relatedRecordP.DataTime < relatedRealSlotP.GetStartTime(dataTime))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = dataTime;
|
pure.SrcValue = $"{relatedRecordQ.DataValue},{relatedRecordP.DataValue}";
|
pure.DataTime = dataTime;
|
pure.DataValue = string.Empty;
|
pure.DataStatus = new List<string>();
|
|
if (!double.TryParse(relatedRecordQ.DataValue, out double dataValueQ))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
if (relatedRecordQ.DataStatus != null)
|
{
|
pure.DataStatus.AddRange(relatedRecordQ.DataStatus);
|
}
|
|
if (!double.TryParse(relatedRecordP.DataValue, out double dataValueP))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
if (relatedRecordP.DataStatus != null)
|
{
|
pure.DataStatus.AddRange(relatedRecordP.DataStatus);
|
}
|
|
if (formulaModel.Calculate(dataValueP, dataValueQ, out double dataValue))
|
{
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_ConvertFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_FilterFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_CalculateFailed);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 计算效率(常规实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuUWP
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.UWPCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
|
#region 流量参数
|
|
var relatedMonitorQ = getMonitorPoint(formulaModel.Q);
|
if (relatedMonitorQ == null)
|
{
|
Msg = "关联测点:{formulaModel.Q},不存在";
|
return default;
|
}
|
if (relatedMonitorQ.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点:{formulaModel.Q},不是常规测点";
|
return default;
|
}
|
if (relatedMonitorQ.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点:{formulaModel.Q},不是实时测点";
|
return default;
|
}
|
var relatedSignalQ = relatedMonitorQ.SignalList.First();
|
if (relatedSignalQ.SignalType.Identifier != SignalType.瞬时流量)
|
{
|
Msg = "关联测点:{formulaModel.Q},不是瞬时流量测点";
|
return default;
|
}
|
var relatedRecordListQ = getRecordList(relatedMonitorQ.ID, relatedSignalQ.ID);
|
if (relatedRecordListQ == null || relatedRecordListQ.Count < 1)
|
{
|
Msg = "关联测点:{formulaModel.Q},记录不存在";
|
return default;
|
}
|
var relatedRealSlotQ = Model.Monitor.RealSlot.ToModel(relatedMonitorQ.CronParas);
|
if (relatedRealSlotQ == null)
|
{
|
relatedRealSlotQ = new Model.Monitor.RealSlot();
|
}
|
int relatedRecordReadIndexQ = -1;
|
|
#endregion
|
|
#region 扬程参数
|
|
var relatedMonitorH = getMonitorPoint(formulaModel.H);
|
if (relatedMonitorH == null)
|
{
|
Msg = "关联测点:{formulaModel.H},不存在";
|
return default;
|
}
|
if (relatedMonitorH.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点:{formulaModel.H},不是常规测点";
|
return default;
|
}
|
if (relatedMonitorH.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点:{formulaModel.H},不是实时测点";
|
return default;
|
}
|
var relatedSignalH = relatedMonitorH.SignalList.First();
|
if (relatedSignalH.SignalType.Identifier != SignalType.扬程)
|
{
|
Msg = "关联测点:{formulaModel.H},不是扬程测点";
|
return default;
|
}
|
var relatedRecordListH = getRecordList(relatedMonitorH.ID, relatedSignalH.ID);
|
if (relatedRecordListH == null || relatedRecordListH.Count < 1)
|
{
|
Msg = "关联测点:{formulaModel.H},记录不存在";
|
return default;
|
}
|
var relatedRealSlotH = Model.Monitor.RealSlot.ToModel(relatedMonitorH.CronParas);
|
if (relatedRealSlotH == null)
|
{
|
relatedRealSlotH = new Model.Monitor.RealSlot();
|
}
|
int relatedRecordReadIndexH = -1;
|
|
#endregion
|
|
#region 功率参数
|
|
var relatedMonitorP = getMonitorPoint(formulaModel.P);
|
if (relatedMonitorP == null)
|
{
|
Msg = "关联测点:{formulaModel.P},不存在";
|
return default;
|
}
|
if (relatedMonitorP.MonitorType != eMonitorType.General)
|
{
|
Msg = "关联测点:{formulaModel.P},不是常规测点";
|
return default;
|
}
|
if (relatedMonitorP.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点:{formulaModel.P},不是实时测点";
|
return default;
|
}
|
var relatedSignalP = relatedMonitorP.SignalList.First();
|
if (relatedSignalP.SignalType.Identifier != SignalType.有功功率)
|
{
|
Msg = "关联测点:{formulaModel.P},不是扬程测点";
|
return default;
|
}
|
var relatedRecordListP = getRecordList(relatedMonitorP.ID, relatedSignalP.ID);
|
if (relatedRecordListP == null || relatedRecordListP.Count < 1)
|
{
|
Msg = "关联测点:{formulaModel.P},记录不存在";
|
return default;
|
}
|
var relatedRealSlotP = Model.Monitor.RealSlot.ToModel(relatedMonitorP.CronParas);
|
if (relatedRealSlotP == null)
|
{
|
relatedRealSlotP = new Model.Monitor.RealSlot();
|
}
|
int relatedRecordReadIndexP = -1;
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
|
Model.MonitorBasicRecord relatedRecordQ = null;
|
for (int j = relatedRecordReadIndexQ + 1; j < relatedRecordListQ.Count; j++)
|
{
|
var relatedRecord = relatedRecordListQ[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordQ = relatedRecordListQ[index];
|
relatedRecordReadIndexQ = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord relatedRecordH = null;
|
for (int j = relatedRecordReadIndexH + 1; j < relatedRecordListH.Count; j++)
|
{
|
var relatedRecord = relatedRecordListH[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordH = relatedRecordListH[index];
|
relatedRecordReadIndexH = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord relatedRecordP = null;
|
for (int j = relatedRecordReadIndexP + 1; j < relatedRecordListP.Count; j++)
|
{
|
var relatedRecord = relatedRecordListP[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordP = relatedRecordListP[index];
|
relatedRecordReadIndexP = index + 1;
|
break;
|
}
|
}
|
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (relatedRecordQ == null || relatedRecordQ.DataTime < relatedRealSlotQ.GetStartTime(dataTime)
|
|| relatedRecordH == null || relatedRecordH.DataTime < relatedRealSlotH.GetStartTime(dataTime)
|
|| relatedRecordP == null || relatedRecordP.DataTime < relatedRealSlotP.GetStartTime(dataTime))
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = dataTime;
|
pure.SrcValue = string.Empty;
|
pure.DataTime = dataTime;
|
pure.DataValue = string.Empty;
|
pure.DataStatus = new List<string>();
|
|
if (!double.TryParse(relatedRecordQ.DataValue, out double dataValueQ))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
if (relatedRecordQ.DataStatus != null)
|
{
|
pure.DataStatus.AddRange(relatedRecordQ.DataStatus);
|
}
|
|
if (!double.TryParse(relatedRecordH.DataValue, out double dataValueH))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
if (relatedRecordH.DataStatus != null)
|
{
|
pure.DataStatus.AddRange(relatedRecordH.DataStatus);
|
}
|
|
if (!double.TryParse(relatedRecordP.DataValue, out double dataValueP))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_DataFormatError);
|
}
|
if (relatedRecordP.DataStatus != null)
|
{
|
pure.DataStatus.AddRange(relatedRecordP.DataStatus);
|
}
|
|
if (formulaModel.Calculate(dataValueP, dataValueQ, dataValueH, out double dataValue))
|
{
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_ConvertFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_FilterFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
}
|
else
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_CalculateFailed);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
|
/// <summary>
|
/// 计算运行状态(常规实时)
|
/// </summary>
|
public static List<Model.MonitorRealRecordPure> CalcuRunStatus
|
(
|
DateTime startTime,//开始时间
|
DateTime endTime,//结束时间
|
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
|
string formulaParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long, Model.MonitorBasicRecord> getLastRecord,//获取最后一条记录
|
out string Msg//错误信息
|
)
|
{
|
Msg = string.Empty;
|
var formulaModel = Model.Monitor.RunStatusCalculationFormulaParas.ToModel(formulaParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
if (formulaModel.JudgeItems == null || formulaModel.JudgeItems.Count < 1)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
|
//关联测点字典
|
var relatedMonitorDict = new Dictionary<long, Model.MonitorPoint_Signal_SignalType>();
|
//关联RealSlot字典
|
var relatedRealSlotDict = new Dictionary<long, Model.Monitor.RealSlot>();
|
//判断项Model字典
|
var judgeItemModelDict = new Dictionary<Model.Monitor.RunStatusCalculationFormulaParas.JudgeItem, object>();
|
//关联记录列表字典
|
var relatedRecordListDict = new Dictionary<long, List<Model.MonitorBasicRecord>>();
|
//关联记录读取索引字典
|
var relatedRecordReadIndexDict = new Dictionary<long, int>();
|
|
var signal = monitor.SignalList.First();
|
var realSlot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
|
if (realSlot == null)
|
{
|
realSlot = new Model.Monitor.RealSlot();
|
}
|
var duration = (int)(endTime - startTime).TotalSeconds;
|
var recordList = new List<Model.MonitorRealRecordPure>();
|
|
//时间循环
|
for (int i = 0; i <= duration; i += realSlot.TimeStep)
|
{
|
var dataTime = startTime.AddSeconds(i);
|
int runStatus = RunStatus.UnKnown;
|
|
//且列表(必须满足的条件)
|
var judgeAndItemList = formulaModel.JudgeItems.Where(x => x.OperateType == Model.Monitor.RunStatusCalculationFormulaParas.eOperateType.And).ToList();
|
foreach (var judgeAndItem in judgeAndItemList)
|
{
|
switch (judgeAndItem.JudgeType)
|
{
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.RS:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeAndItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.RunStatusJudgeParas.ToModel(judgeAndItem.JudgeParas);
|
judgeItemModelDict.Add(judgeAndItem,judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据运行状态项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.RunStatusJudgeParas)judgeItemModelDict[judgeAndItem];
|
if (judgeModel == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedMonitorDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedMonitorTemp = getMonitorPoint(judgeModel.ObjectID);
|
relatedMonitorDict.Add(judgeModel.ObjectID,relatedMonitorTemp);
|
if (relatedMonitorTemp == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在";
|
}
|
else
|
{
|
if (relatedMonitorTemp.SignalList.First().SignalType.Identifier != SignalType.运行状态)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不是运行状态测点";
|
}
|
}
|
}
|
var relatedMonitor = relatedMonitorDict[judgeModel.ObjectID];
|
if (relatedMonitor == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (relatedMonitor.SignalList.First().SignalType.Identifier != SignalType.运行状态)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedRecordListTemp = getRecordList(relatedMonitor.ID,relatedMonitor.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.ObjectID, relatedRecordListTemp);
|
if (relatedRecordListTemp == null || relatedRecordListTemp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在记录";
|
}
|
}
|
var relatedRecordList = relatedRecordListDict[judgeModel.ObjectID];
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.ObjectID))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.ObjectID,-1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var realSlotTemp = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (realSlotTemp == null)
|
{
|
realSlotTemp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.ObjectID,realSlotTemp);
|
}
|
var relatedRealSlot=relatedRealSlotDict[judgeModel.ObjectID];
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.ObjectID] + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndexDict[judgeModel.ObjectID] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecord == null)
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
runStatus = dataValue > 0 ? RunStatus.Run : RunStatus.Shut;
|
}
|
break;
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.P:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeAndItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeAndItem.JudgeParas);
|
judgeItemModelDict.Add(judgeAndItem, judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据功率项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas)judgeItemModelDict[judgeAndItem];
|
if (judgeModel == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedMonitorDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedMonitorTemp = getMonitorPoint(judgeModel.ObjectID);
|
relatedMonitorDict.Add(judgeModel.ObjectID, relatedMonitorTemp);
|
if (relatedMonitorTemp == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在";
|
}
|
else
|
{
|
if (relatedMonitorTemp.SignalList.First().SignalType.Identifier != SignalType.有功功率)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不是有功功率测点";
|
}
|
}
|
}
|
var relatedMonitor = relatedMonitorDict[judgeModel.ObjectID];
|
if (relatedMonitor == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (relatedMonitor.SignalList.First().SignalType.Identifier != SignalType.有功功率)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedRecordListTemp = getRecordList(relatedMonitor.ID, relatedMonitor.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.ObjectID, relatedRecordListTemp);
|
if (relatedRecordListTemp == null || relatedRecordListTemp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在记录";
|
}
|
}
|
var relatedRecordList = relatedRecordListDict[judgeModel.ObjectID];
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.ObjectID))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.ObjectID, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var realSlotTemp = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (realSlotTemp == null)
|
{
|
realSlotTemp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.ObjectID, realSlotTemp);
|
}
|
var relatedRealSlot = relatedRealSlotDict[judgeModel.ObjectID];
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.ObjectID] + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndexDict[judgeModel.ObjectID] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecord == null)
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
runStatus = dataValue >= judgeModel.ThresholdValue ? RunStatus.Run : RunStatus.Shut;
|
}
|
break;
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.Pr:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeAndItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.PressureDiffThresholdJudgeParas.ToModel(judgeAndItem.JudgeParas);
|
judgeItemModelDict.Add(judgeAndItem, judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据压差项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.PressureDiffThresholdJudgeParas)judgeItemModelDict[judgeAndItem];
|
if (judgeModel == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
|
#region 进口压力
|
|
if (!relatedMonitorDict.ContainsKey(judgeModel.Pr1))
|
{
|
var relatedMonitorPr1Temp = getMonitorPoint(judgeModel.Pr1);
|
relatedMonitorDict.Add(judgeModel.Pr1, relatedMonitorPr1Temp);
|
if (relatedMonitorPr1Temp == null)
|
{
|
Msg += $"关联测点:{judgeModel.Pr1},不存在";
|
}
|
else
|
{
|
if (relatedMonitorPr1Temp.SignalList.First().SignalType.Identifier != SignalType.压力)
|
{
|
Msg += $"关联测点:{judgeModel.Pr1},不是压力测点";
|
}
|
}
|
}
|
var relatedMonitorPr1 = relatedMonitorDict[judgeModel.Pr1];
|
if (relatedMonitorPr1 == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (relatedMonitorPr1.SignalList.First().SignalType.Identifier != SignalType.压力)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.Pr1))
|
{
|
var relatedRecordListPr1Temp = getRecordList(relatedMonitorPr1.ID, relatedMonitorPr1.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.Pr1, relatedRecordListPr1Temp);
|
if (relatedRecordListPr1Temp == null || relatedRecordListPr1Temp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.Pr1},不存在记录";
|
}
|
}
|
var relatedRecordListPr1 = relatedRecordListDict[judgeModel.Pr1];
|
if (relatedRecordListPr1 == null || relatedRecordListPr1.Count < 1)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.Pr1))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.Pr1, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.Pr1))
|
{
|
var realSlotPr1Temp = Model.Monitor.RealSlot.ToModel(relatedMonitorPr1.CronParas);
|
if (realSlotPr1Temp == null)
|
{
|
realSlotPr1Temp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.Pr1, realSlotPr1Temp);
|
}
|
var relatedRealSlotPr1 = relatedRealSlotDict[judgeModel.Pr1];
|
|
Model.MonitorBasicRecord relatedRecordPr1 = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.Pr1] + 1; j < relatedRecordListPr1.Count; j++)
|
{
|
var relatedRecordPr1Temp = relatedRecordListPr1[j];
|
if (relatedRecordPr1.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordPr1 = relatedRecordListPr1[index];
|
relatedRecordReadIndexDict[judgeModel.Pr1] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecordPr1 == null)
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.Pr1},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecordPr1.DataTime < relatedRealSlotPr1.GetStartTime(dataTime))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.Pr1},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecordPr1.DataValue, out double dataValuePr1))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.Pr1},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
#endregion
|
|
#region 出口压力
|
|
if (!relatedMonitorDict.ContainsKey(judgeModel.Pr2))
|
{
|
var relatedMonitorPr2Temp = getMonitorPoint(judgeModel.Pr2);
|
relatedMonitorDict.Add(judgeModel.Pr2, relatedMonitorPr2Temp);
|
if (relatedMonitorPr2Temp == null)
|
{
|
Msg += $"关联测点:{judgeModel.Pr2},不存在";
|
}
|
else
|
{
|
if (relatedMonitorPr2Temp.SignalList.First().SignalType.Identifier != SignalType.压力)
|
{
|
Msg += $"关联测点:{judgeModel.Pr2},不是压力测点";
|
}
|
}
|
}
|
var relatedMonitorPr2 = relatedMonitorDict[judgeModel.Pr2];
|
if (relatedMonitorPr2 == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (relatedMonitorPr2.SignalList.First().SignalType.Identifier != SignalType.压力)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.Pr2))
|
{
|
var relatedRecordListPr2Temp = getRecordList(relatedMonitorPr2.ID, relatedMonitorPr2.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.Pr2, relatedRecordListPr2Temp);
|
if (relatedRecordListPr2Temp == null || relatedRecordListPr2Temp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.Pr2},不存在记录";
|
}
|
}
|
var relatedRecordListPr2 = relatedRecordListDict[judgeModel.Pr2];
|
if (relatedRecordListPr2 == null || relatedRecordListPr2.Count < 1)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.Pr2))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.Pr2, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.Pr2))
|
{
|
var realSlotPr2Temp = Model.Monitor.RealSlot.ToModel(relatedMonitorPr2.CronParas);
|
if (realSlotPr2Temp == null)
|
{
|
realSlotPr2Temp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.Pr2, realSlotPr2Temp);
|
}
|
var relatedRealSlotPr2 = relatedRealSlotDict[judgeModel.Pr2];
|
|
Model.MonitorBasicRecord relatedRecordPr2 = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.Pr2] + 1; j < relatedRecordListPr2.Count; j++)
|
{
|
var relatedRecordPr2Temp = relatedRecordListPr2[j];
|
if (relatedRecordPr2.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordPr2 = relatedRecordListPr2[index];
|
relatedRecordReadIndexDict[judgeModel.Pr2] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecordPr2 == null)
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.Pr2},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecordPr2.DataTime < relatedRealSlotPr2.GetStartTime(dataTime))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.Pr2},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecordPr2.DataValue, out double dataValuePr2))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.Pr2},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
#endregion
|
|
runStatus = dataValuePr2 - dataValuePr1 >= judgeModel.ThresholdValue ? RunStatus.Run : RunStatus.Shut;
|
}
|
break;
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.Q:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeAndItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeAndItem.JudgeParas);
|
judgeItemModelDict.Add(judgeAndItem, judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据流量项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas)judgeItemModelDict[judgeAndItem];
|
if (judgeModel == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedMonitorDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedMonitorTemp = getMonitorPoint(judgeModel.ObjectID);
|
relatedMonitorDict.Add(judgeModel.ObjectID, relatedMonitorTemp);
|
if (relatedMonitorTemp == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在";
|
}
|
else
|
{
|
if (relatedMonitorTemp.SignalList.First().SignalType.Identifier != SignalType.瞬时流量)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不是瞬时流量测点";
|
}
|
}
|
}
|
var relatedMonitor = relatedMonitorDict[judgeModel.ObjectID];
|
if (relatedMonitor == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (relatedMonitor.SignalList.First().SignalType.Identifier != SignalType.瞬时流量)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedRecordListTemp = getRecordList(relatedMonitor.ID, relatedMonitor.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.ObjectID, relatedRecordListTemp);
|
if (relatedRecordListTemp == null || relatedRecordListTemp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在记录";
|
}
|
}
|
var relatedRecordList = relatedRecordListDict[judgeModel.ObjectID];
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.ObjectID))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.ObjectID, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var realSlotTemp = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (realSlotTemp == null)
|
{
|
realSlotTemp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.ObjectID, realSlotTemp);
|
}
|
var relatedRealSlot = relatedRealSlotDict[judgeModel.ObjectID];
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.ObjectID] + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndexDict[judgeModel.ObjectID] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecord == null)
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
runStatus = dataValue >= judgeModel.ThresholdValue ? RunStatus.Run : RunStatus.Shut;
|
}
|
break;
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.I:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeAndItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeAndItem.JudgeParas);
|
judgeItemModelDict.Add(judgeAndItem, judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据电流项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas)judgeItemModelDict[judgeAndItem];
|
if (judgeModel == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedMonitorDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedMonitorTemp = getMonitorPoint(judgeModel.ObjectID);
|
relatedMonitorDict.Add(judgeModel.ObjectID, relatedMonitorTemp);
|
if (relatedMonitorTemp == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在";
|
}
|
else
|
{
|
if (relatedMonitorTemp.SignalList.First().SignalType.Identifier != SignalType.电流)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不是电流测点";
|
}
|
}
|
}
|
var relatedMonitor = relatedMonitorDict[judgeModel.ObjectID];
|
if (relatedMonitor == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (relatedMonitor.SignalList.First().SignalType.Identifier != SignalType.电流)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedRecordListTemp = getRecordList(relatedMonitor.ID, relatedMonitor.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.ObjectID, relatedRecordListTemp);
|
if (relatedRecordListTemp == null || relatedRecordListTemp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在记录";
|
}
|
}
|
var relatedRecordList = relatedRecordListDict[judgeModel.ObjectID];
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.ObjectID))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.ObjectID, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var realSlotTemp = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (realSlotTemp == null)
|
{
|
realSlotTemp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.ObjectID, realSlotTemp);
|
}
|
var relatedRealSlot = relatedRealSlotDict[judgeModel.ObjectID];
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.ObjectID] + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndexDict[judgeModel.ObjectID] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecord == null)
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
runStatus = dataValue >= judgeModel.ThresholdValue ? RunStatus.Run : RunStatus.Shut;
|
}
|
break;
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.HZ:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeAndItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeAndItem.JudgeParas);
|
judgeItemModelDict.Add(judgeAndItem, judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据频率项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas)judgeItemModelDict[judgeAndItem];
|
if (judgeModel == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedMonitorDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedMonitorTemp = getMonitorPoint(judgeModel.ObjectID);
|
relatedMonitorDict.Add(judgeModel.ObjectID, relatedMonitorTemp);
|
if (relatedMonitorTemp == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在";
|
}
|
else
|
{
|
if (relatedMonitorTemp.SignalList.First().SignalType.Identifier != SignalType.频率)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不是频率测点";
|
}
|
}
|
}
|
var relatedMonitor = relatedMonitorDict[judgeModel.ObjectID];
|
if (relatedMonitor == null)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (relatedMonitor.SignalList.First().SignalType.Identifier != SignalType.频率)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedRecordListTemp = getRecordList(relatedMonitor.ID, relatedMonitor.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.ObjectID, relatedRecordListTemp);
|
if (relatedRecordListTemp == null || relatedRecordListTemp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在记录";
|
}
|
}
|
var relatedRecordList = relatedRecordListDict[judgeModel.ObjectID];
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
runStatus = RunStatus.Shut;
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.ObjectID))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.ObjectID, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var realSlotTemp = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (realSlotTemp == null)
|
{
|
realSlotTemp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.ObjectID, realSlotTemp);
|
}
|
var relatedRealSlot = relatedRealSlotDict[judgeModel.ObjectID];
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.ObjectID] + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndexDict[judgeModel.ObjectID] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecord == null)
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
runStatus = RunStatus.Shut;
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
runStatus = dataValue >= judgeModel.ThresholdValue ? RunStatus.Run : RunStatus.Shut;
|
}
|
break;
|
default: break;
|
}
|
if (runStatus == RunStatus.Shut)
|
{
|
break;
|
}
|
}
|
|
//或列表(仅需满足一项的条件)
|
if (runStatus == RunStatus.UnKnown)
|
{
|
var judgeOrItemList = formulaModel.JudgeItems.Where(x => x.OperateType == Model.Monitor.RunStatusCalculationFormulaParas.eOperateType.Or).ToList();
|
foreach (var judgeOrItem in judgeOrItemList)
|
{
|
switch (judgeOrItem.JudgeType)
|
{
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.RS:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeOrItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.RunStatusJudgeParas.ToModel(judgeOrItem.JudgeParas);
|
judgeItemModelDict.Add(judgeOrItem, judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据运行状态项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.RunStatusJudgeParas)judgeItemModelDict[judgeOrItem];
|
if (judgeModel == null)
|
{
|
break;
|
}
|
if (!relatedMonitorDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedMonitorTemp = getMonitorPoint(judgeModel.ObjectID);
|
relatedMonitorDict.Add(judgeModel.ObjectID, relatedMonitorTemp);
|
if (relatedMonitorTemp == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在";
|
}
|
else
|
{
|
if (relatedMonitorTemp.SignalList.First().SignalType.Identifier != SignalType.运行状态)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不是运行状态测点";
|
}
|
}
|
}
|
var relatedMonitor = relatedMonitorDict[judgeModel.ObjectID];
|
if (relatedMonitor == null)
|
{
|
break;
|
}
|
if (relatedMonitor.SignalList.First().SignalType.Identifier != SignalType.运行状态)
|
{
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedRecordListTemp = getRecordList(relatedMonitor.ID, relatedMonitor.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.ObjectID, relatedRecordListTemp);
|
if (relatedRecordListTemp == null || relatedRecordListTemp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在记录";
|
}
|
}
|
var relatedRecordList = relatedRecordListDict[judgeModel.ObjectID];
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.ObjectID))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.ObjectID, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var realSlotTemp = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (realSlotTemp == null)
|
{
|
realSlotTemp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.ObjectID, realSlotTemp);
|
}
|
var relatedRealSlot = relatedRealSlotDict[judgeModel.ObjectID];
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.ObjectID] + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndexDict[judgeModel.ObjectID] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecord == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
if (dataValue > 0)
|
{
|
runStatus = RunStatus.Run;
|
}
|
}
|
break;
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.P:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeOrItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeOrItem.JudgeParas);
|
judgeItemModelDict.Add(judgeOrItem, judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据功率项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas)judgeItemModelDict[judgeOrItem];
|
if (judgeModel == null)
|
{
|
break;
|
}
|
if (!relatedMonitorDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedMonitorTemp = getMonitorPoint(judgeModel.ObjectID);
|
relatedMonitorDict.Add(judgeModel.ObjectID, relatedMonitorTemp);
|
if (relatedMonitorTemp == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在";
|
}
|
else
|
{
|
if (relatedMonitorTemp.SignalList.First().SignalType.Identifier != SignalType.有功功率)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不是有功功率测点";
|
}
|
}
|
}
|
var relatedMonitor = relatedMonitorDict[judgeModel.ObjectID];
|
if (relatedMonitor == null)
|
{
|
break;
|
}
|
if (relatedMonitor.SignalList.First().SignalType.Identifier != SignalType.有功功率)
|
{
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedRecordListTemp = getRecordList(relatedMonitor.ID, relatedMonitor.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.ObjectID, relatedRecordListTemp);
|
if (relatedRecordListTemp == null || relatedRecordListTemp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在记录";
|
}
|
}
|
var relatedRecordList = relatedRecordListDict[judgeModel.ObjectID];
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.ObjectID))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.ObjectID, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var realSlotTemp = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (realSlotTemp == null)
|
{
|
realSlotTemp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.ObjectID, realSlotTemp);
|
}
|
var relatedRealSlot = relatedRealSlotDict[judgeModel.ObjectID];
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.ObjectID] + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndexDict[judgeModel.ObjectID] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecord == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
if (dataValue >= judgeModel.ThresholdValue)
|
{
|
runStatus = RunStatus.Run;
|
}
|
}
|
break;
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.Pr:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeOrItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.PressureDiffThresholdJudgeParas.ToModel(judgeOrItem.JudgeParas);
|
judgeItemModelDict.Add(judgeOrItem, judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据压差项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.PressureDiffThresholdJudgeParas)judgeItemModelDict[judgeOrItem];
|
if (judgeModel == null)
|
{
|
break;
|
}
|
|
#region 进口压力
|
|
if (!relatedMonitorDict.ContainsKey(judgeModel.Pr1))
|
{
|
var relatedMonitorPr1Temp = getMonitorPoint(judgeModel.Pr1);
|
relatedMonitorDict.Add(judgeModel.Pr1, relatedMonitorPr1Temp);
|
if (relatedMonitorPr1Temp == null)
|
{
|
Msg += $"关联测点:{judgeModel.Pr1},不存在";
|
}
|
else
|
{
|
if (relatedMonitorPr1Temp.SignalList.First().SignalType.Identifier != SignalType.压力)
|
{
|
Msg += $"关联测点:{judgeModel.Pr1},不是压力测点";
|
}
|
}
|
}
|
var relatedMonitorPr1 = relatedMonitorDict[judgeModel.Pr1];
|
if (relatedMonitorPr1 == null)
|
{
|
break;
|
}
|
if (relatedMonitorPr1.SignalList.First().SignalType.Identifier != SignalType.压力)
|
{
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.Pr1))
|
{
|
var relatedRecordListPr1Temp = getRecordList(relatedMonitorPr1.ID, relatedMonitorPr1.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.Pr1, relatedRecordListPr1Temp);
|
if (relatedRecordListPr1Temp == null || relatedRecordListPr1Temp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.Pr1},不存在记录";
|
}
|
}
|
var relatedRecordListPr1 = relatedRecordListDict[judgeModel.Pr1];
|
if (relatedRecordListPr1 == null || relatedRecordListPr1.Count < 1)
|
{
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.Pr1))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.Pr1, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.Pr1))
|
{
|
var realSlotPr1Temp = Model.Monitor.RealSlot.ToModel(relatedMonitorPr1.CronParas);
|
if (realSlotPr1Temp == null)
|
{
|
realSlotPr1Temp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.Pr1, realSlotPr1Temp);
|
}
|
var relatedRealSlotPr1 = relatedRealSlotDict[judgeModel.Pr1];
|
|
Model.MonitorBasicRecord relatedRecordPr1 = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.Pr1] + 1; j < relatedRecordListPr1.Count; j++)
|
{
|
var relatedRecordPr1Temp = relatedRecordListPr1[j];
|
if (relatedRecordPr1.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordPr1 = relatedRecordListPr1[index];
|
relatedRecordReadIndexDict[judgeModel.Pr1] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecordPr1 == null)
|
{
|
Msg += $"关联测点:{judgeModel.Pr1},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecordPr1.DataTime < relatedRealSlotPr1.GetStartTime(dataTime))
|
{
|
Msg += $"关联测点:{judgeModel.Pr1},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecordPr1.DataValue, out double dataValuePr1))
|
{
|
Msg += $"关联测点:{judgeModel.Pr1},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
#endregion
|
|
#region 出口压力
|
|
if (!relatedMonitorDict.ContainsKey(judgeModel.Pr2))
|
{
|
var relatedMonitorPr2Temp = getMonitorPoint(judgeModel.Pr2);
|
relatedMonitorDict.Add(judgeModel.Pr2, relatedMonitorPr2Temp);
|
if (relatedMonitorPr2Temp == null)
|
{
|
Msg += $"关联测点:{judgeModel.Pr2},不存在";
|
}
|
else
|
{
|
if (relatedMonitorPr2Temp.SignalList.First().SignalType.Identifier != SignalType.压力)
|
{
|
Msg += $"关联测点:{judgeModel.Pr2},不是压力测点";
|
}
|
}
|
}
|
var relatedMonitorPr2 = relatedMonitorDict[judgeModel.Pr2];
|
if (relatedMonitorPr2 == null)
|
{
|
break;
|
}
|
if (relatedMonitorPr2.SignalList.First().SignalType.Identifier != SignalType.压力)
|
{
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.Pr2))
|
{
|
var relatedRecordListPr2Temp = getRecordList(relatedMonitorPr2.ID, relatedMonitorPr2.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.Pr2, relatedRecordListPr2Temp);
|
if (relatedRecordListPr2Temp == null || relatedRecordListPr2Temp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.Pr2},不存在记录";
|
}
|
}
|
var relatedRecordListPr2 = relatedRecordListDict[judgeModel.Pr2];
|
if (relatedRecordListPr2 == null || relatedRecordListPr2.Count < 1)
|
{
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.Pr2))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.Pr2, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.Pr2))
|
{
|
var realSlotPr2Temp = Model.Monitor.RealSlot.ToModel(relatedMonitorPr2.CronParas);
|
if (realSlotPr2Temp == null)
|
{
|
realSlotPr2Temp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.Pr2, realSlotPr2Temp);
|
}
|
var relatedRealSlotPr2 = relatedRealSlotDict[judgeModel.Pr2];
|
|
Model.MonitorBasicRecord relatedRecordPr2 = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.Pr2] + 1; j < relatedRecordListPr2.Count; j++)
|
{
|
var relatedRecordPr2Temp = relatedRecordListPr2[j];
|
if (relatedRecordPr2.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecordPr2 = relatedRecordListPr2[index];
|
relatedRecordReadIndexDict[judgeModel.Pr2] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecordPr2 == null)
|
{
|
Msg += $"关联测点:{judgeModel.Pr2},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecordPr2.DataTime < relatedRealSlotPr2.GetStartTime(dataTime))
|
{
|
Msg += $"关联测点:{judgeModel.Pr2},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecordPr2.DataValue, out double dataValuePr2))
|
{
|
Msg += $"关联测点:{judgeModel.Pr2},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
#endregion
|
|
if (dataValuePr2 - dataValuePr1 >= judgeModel.ThresholdValue)
|
{
|
runStatus = RunStatus.Run;
|
}
|
|
}
|
break;
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.Q:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeOrItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeOrItem.JudgeParas);
|
judgeItemModelDict.Add(judgeOrItem, judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据流量项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas)judgeItemModelDict[judgeOrItem];
|
if (judgeModel == null)
|
{
|
break;
|
}
|
if (!relatedMonitorDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedMonitorTemp = getMonitorPoint(judgeModel.ObjectID);
|
relatedMonitorDict.Add(judgeModel.ObjectID, relatedMonitorTemp);
|
if (relatedMonitorTemp == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在";
|
}
|
else
|
{
|
if (relatedMonitorTemp.SignalList.First().SignalType.Identifier != SignalType.瞬时流量)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不是瞬时流量测点";
|
}
|
}
|
}
|
var relatedMonitor = relatedMonitorDict[judgeModel.ObjectID];
|
if (relatedMonitor == null)
|
{
|
break;
|
}
|
if (relatedMonitor.SignalList.First().SignalType.Identifier != SignalType.瞬时流量)
|
{
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedRecordListTemp = getRecordList(relatedMonitor.ID, relatedMonitor.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.ObjectID, relatedRecordListTemp);
|
if (relatedRecordListTemp == null || relatedRecordListTemp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在记录";
|
}
|
}
|
var relatedRecordList = relatedRecordListDict[judgeModel.ObjectID];
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.ObjectID))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.ObjectID, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var realSlotTemp = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (realSlotTemp == null)
|
{
|
realSlotTemp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.ObjectID, realSlotTemp);
|
}
|
var relatedRealSlot = relatedRealSlotDict[judgeModel.ObjectID];
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.ObjectID] + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndexDict[judgeModel.ObjectID] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecord == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
if (dataValue >= judgeModel.ThresholdValue)
|
{
|
runStatus = RunStatus.Run;
|
}
|
}
|
break;
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.I:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeOrItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeOrItem.JudgeParas);
|
judgeItemModelDict.Add(judgeOrItem, judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据电流项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas)judgeItemModelDict[judgeOrItem];
|
if (judgeModel == null)
|
{
|
break;
|
}
|
if (!relatedMonitorDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedMonitorTemp = getMonitorPoint(judgeModel.ObjectID);
|
relatedMonitorDict.Add(judgeModel.ObjectID, relatedMonitorTemp);
|
if (relatedMonitorTemp == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在";
|
}
|
else
|
{
|
if (relatedMonitorTemp.SignalList.First().SignalType.Identifier != SignalType.电流)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不是电流测点";
|
}
|
}
|
}
|
var relatedMonitor = relatedMonitorDict[judgeModel.ObjectID];
|
if (relatedMonitor == null)
|
{
|
break;
|
}
|
if (relatedMonitor.SignalList.First().SignalType.Identifier != SignalType.电流)
|
{
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedRecordListTemp = getRecordList(relatedMonitor.ID, relatedMonitor.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.ObjectID, relatedRecordListTemp);
|
if (relatedRecordListTemp == null || relatedRecordListTemp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在记录";
|
}
|
}
|
var relatedRecordList = relatedRecordListDict[judgeModel.ObjectID];
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.ObjectID))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.ObjectID, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var realSlotTemp = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (realSlotTemp == null)
|
{
|
realSlotTemp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.ObjectID, realSlotTemp);
|
}
|
var relatedRealSlot = relatedRealSlotDict[judgeModel.ObjectID];
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.ObjectID] + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndexDict[judgeModel.ObjectID] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecord == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
if (dataValue >= judgeModel.ThresholdValue)
|
{
|
runStatus = RunStatus.Run;
|
}
|
}
|
break;
|
case Model.Monitor.RunStatusCalculationFormulaParas.eJudgeType.HZ:
|
{
|
if (!judgeItemModelDict.ContainsKey(judgeOrItem))
|
{
|
var judgeModelTemp = Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas.ToModel(judgeOrItem.JudgeParas);
|
judgeItemModelDict.Add(judgeOrItem, judgeModelTemp);
|
if (judgeModelTemp == null)
|
{
|
Msg += "公式参数配置错误(根据频率项)";
|
}
|
}
|
var judgeModel = (Model.Monitor.RunStatusCalculationFormulaParas.ThresholdJudgeParas)judgeItemModelDict[judgeOrItem];
|
if (judgeModel == null)
|
{
|
break;
|
}
|
if (!relatedMonitorDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedMonitorTemp = getMonitorPoint(judgeModel.ObjectID);
|
relatedMonitorDict.Add(judgeModel.ObjectID, relatedMonitorTemp);
|
if (relatedMonitorTemp == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在";
|
}
|
else
|
{
|
if (relatedMonitorTemp.SignalList.First().SignalType.Identifier != SignalType.频率)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不是频率测点";
|
}
|
}
|
}
|
var relatedMonitor = relatedMonitorDict[judgeModel.ObjectID];
|
if (relatedMonitor == null)
|
{
|
break;
|
}
|
if (relatedMonitor.SignalList.First().SignalType.Identifier != SignalType.频率)
|
{
|
break;
|
}
|
if (!relatedRecordListDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var relatedRecordListTemp = getRecordList(relatedMonitor.ID, relatedMonitor.SignalList.First().ID);
|
relatedRecordListDict.Add(judgeModel.ObjectID, relatedRecordListTemp);
|
if (relatedRecordListTemp == null || relatedRecordListTemp.Count < 1)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},不存在记录";
|
}
|
}
|
var relatedRecordList = relatedRecordListDict[judgeModel.ObjectID];
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
{
|
break;
|
}
|
if (!relatedRecordReadIndexDict.ContainsKey(judgeModel.ObjectID))
|
{
|
relatedRecordReadIndexDict.Add(judgeModel.ObjectID, -1);
|
}
|
if (!relatedRealSlotDict.ContainsKey(judgeModel.ObjectID))
|
{
|
var realSlotTemp = Model.Monitor.RealSlot.ToModel(relatedMonitor.CronParas);
|
if (realSlotTemp == null)
|
{
|
realSlotTemp = new Model.Monitor.RealSlot();
|
}
|
relatedRealSlotDict.Add(judgeModel.ObjectID, realSlotTemp);
|
}
|
var relatedRealSlot = relatedRealSlotDict[judgeModel.ObjectID];
|
|
Model.MonitorBasicRecord relatedRecord = null;
|
for (int j = relatedRecordReadIndexDict[judgeModel.ObjectID] + 1; j < relatedRecordList.Count; j++)
|
{
|
var relatedRecordTemp = relatedRecordList[j];
|
if (relatedRecord.DataTime > dataTime)
|
{
|
var index = j - 1;
|
if (index < 0)
|
index = 0;
|
relatedRecord = relatedRecordList[index];
|
relatedRecordReadIndexDict[judgeModel.ObjectID] = index + 1;
|
break;
|
}
|
}
|
if (relatedRecord == null)
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 不存在记录";
|
break;
|
}
|
if (relatedRecord.DataTime < relatedRealSlot.GetStartTime(dataTime))
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据已失效";
|
break;
|
}
|
if (!double.TryParse(relatedRecord.DataValue, out double dataValue))
|
{
|
Msg += $"关联测点:{judgeModel.ObjectID},时间:{dataTime:yyyy-MM-dd HH:mm:ss}, 数据格式错误";
|
break;
|
}
|
|
if (dataValue >= judgeModel.ThresholdValue)
|
{
|
runStatus = RunStatus.Run;
|
}
|
}
|
break;
|
default: break;
|
}
|
if (runStatus == RunStatus.Run)
|
{
|
break;
|
}
|
}
|
}
|
|
//判断是否生成记录
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
|
if (runStatus == RunStatus.UnKnown)
|
{
|
if (realSlot.UpdateWhenChanged)
|
{
|
if (lastRecord != null)
|
{
|
var spure = new Model.MonitorRealRecordPure();
|
spure.CorpID = monitor.CorpID;
|
spure.MonitorPointID = monitor.ID;
|
spure.SignalID = signal.ID;
|
spure.RecordType = eMonitorType.General;
|
spure.SrcTime = lastRecord.SrcTime;
|
spure.SrcValue = lastRecord.DataValue;
|
spure.DataTime = dataTime;
|
spure.DataValue = lastRecord.DataValue;
|
spure.DataStatus = lastRecord.DataStatus;
|
if (spure.DataStatus == null)
|
{
|
spure.DataStatus = new List<string>();
|
}
|
spure.DataStatus.Add(MonitorRecord.Status_Supplement);
|
spure.DataStatus = spure.DataStatus.Distinct().ToList();
|
recordList.Add(spure);
|
}
|
}
|
continue;
|
}
|
|
var pure = new Model.MonitorRealRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.SrcTime = dataTime;
|
pure.SrcValue = runStatus.ToString();
|
pure.DataTime = dataTime;
|
pure.DataValue = runStatus.ToString();
|
pure.DataStatus = new List<string>();
|
|
var toDataValue = (double)runStatus;
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
toDataValue = signal.ConvertParas.Convert(toDataValue, out bool succed);
|
if (!succed)
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_ConvertFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
toDataValue = signal.CorrectParas.Correct(toDataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(toDataValue, lastDataValue))
|
{
|
if (!pure.DataStatus.Contains(MonitorRecord.Status_FilterFailed))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
toDataValue = Math.Round(toDataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = toDataValue.ToString();
|
pure.DataStatus = pure.DataStatus.Distinct().ToList();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
|
#endregion
|
|
#endregion
|
|
#region 常规时
|
|
/// <summary>
|
/// 统计时最大值
|
/// </summary>
|
public static List<Model.MonitorHourRecordPure> StatisticalHourMaxValue
|
(
|
DateTime startDay,//开始日期
|
DateTime endDay,//结束日期
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long,Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long,long,DateTime,DateTime,List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long,long,Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.MaxValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点不是实时测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var hourSlot = Model.Monitor.HourSlot.ToModel(monitor.CronParas);
|
if (hourSlot == null)
|
{
|
hourSlot = new Model.Monitor.HourSlot();
|
}
|
var recordList = new List<Model.MonitorHourRecordPure>();
|
|
for (DateTime day = startDay.Date; day <= endDay.Date; day = day.AddDays(1))
|
{
|
for (int h = 0; h < 24; h++)
|
{
|
var dt = day.AddHours(h+1);
|
var startTime = hourSlot.GetStartTime(dt);
|
var endTime = hourSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID,relatedSignal.ID,startTime,endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorHourRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataDay = day;
|
pure.DataHour = h + 1;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID,signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计时最小值
|
/// </summary>
|
public static List<Model.MonitorHourRecordPure> StatisticalHourMinValue
|
(
|
DateTime startDay,//开始日期
|
DateTime endDay,//结束日期
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.MinValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点不是实时测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var hourSlot = Model.Monitor.HourSlot.ToModel(monitor.CronParas);
|
if (hourSlot == null)
|
{
|
hourSlot = new Model.Monitor.HourSlot();
|
}
|
var recordList = new List<Model.MonitorHourRecordPure>();
|
|
for (DateTime day = startDay.Date; day <= endDay.Date; day = day.AddDays(1))
|
{
|
for (int h = 0; h < 24; h++)
|
{
|
var dt = day.AddHours(h + 1);
|
var startTime = hourSlot.GetStartTime(dt);
|
var endTime = hourSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorHourRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataDay = day;
|
pure.DataHour = h + 1;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计时平均值
|
/// </summary>
|
public static List<Model.MonitorHourRecordPure> StatisticalHourAvgValue
|
(
|
DateTime startDay,//开始日期
|
DateTime endDay,//结束日期
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.AvgValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点不是实时测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var hourSlot = Model.Monitor.HourSlot.ToModel(monitor.CronParas);
|
if (hourSlot == null)
|
{
|
hourSlot = new Model.Monitor.HourSlot();
|
}
|
var recordList = new List<Model.MonitorHourRecordPure>();
|
|
for (DateTime day = startDay.Date; day <= endDay.Date; day = day.AddDays(1))
|
{
|
for (int h = 0; h < 24; h++)
|
{
|
var dt = day.AddHours(h + 1);
|
var startTime = hourSlot.GetStartTime(dt);
|
var endTime = hourSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorHourRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataDay = day;
|
pure.DataHour = h + 1;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计时差值
|
/// </summary>
|
public static List<Model.MonitorHourRecordPure> StatisticalHourDiffValue
|
(
|
DateTime startDay,//开始日期
|
DateTime endDay,//结束日期
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.DiffValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点不是实时测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var hourSlot = Model.Monitor.HourSlot.ToModel(monitor.CronParas);
|
if (hourSlot == null)
|
{
|
hourSlot = new Model.Monitor.HourSlot();
|
}
|
var recordList = new List<Model.MonitorHourRecordPure>();
|
|
for (DateTime day = startDay.Date; day <= endDay.Date; day = day.AddDays(1))
|
{
|
for (int h = 0; h < 24; h++)
|
{
|
var dt = day.AddHours(h + 1);
|
var startTime = hourSlot.GetStartTime(dt);
|
var endTime = hourSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorHourRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataDay = day;
|
pure.DataHour = h + 1;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计时和值
|
/// </summary>
|
public static List<Model.MonitorHourRecordPure> StatisticalHourSumValue
|
(
|
DateTime startDay,//开始日期
|
DateTime endDay,//结束日期
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.SumValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real)
|
{
|
Msg = "关联测点不是实时测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var hourSlot = Model.Monitor.HourSlot.ToModel(monitor.CronParas);
|
if (hourSlot == null)
|
{
|
hourSlot = new Model.Monitor.HourSlot();
|
}
|
var recordList = new List<Model.MonitorHourRecordPure>();
|
|
for (DateTime day = startDay.Date; day <= endDay.Date; day = day.AddDays(1))
|
{
|
for (int h = 0; h < 24; h++)
|
{
|
var dt = day.AddHours(h + 1);
|
var startTime = hourSlot.GetStartTime(dt);
|
var endTime = hourSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorHourRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataDay = day;
|
pure.DataHour = h + 1;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
}
|
|
return recordList;
|
}
|
|
#endregion
|
|
#region 常规日
|
|
/// <summary>
|
/// 统计日最大值
|
/// </summary>
|
public static List<Model.MonitorDayRecordPure> StatisticalDayMaxValue
|
(
|
DateTime startDay,//开始日期
|
DateTime endDay,//结束日期
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long,Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.MaxValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real&&relatedMonitor.CronType!=Model.Monitor.eCronType.EachHour)
|
{
|
Msg = "关联测点不是实时或时测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var daySlot = Model.Monitor.DaySlot.ToModel(monitor.CronParas);
|
if (daySlot == null)
|
{
|
daySlot = new Model.Monitor.DaySlot();
|
}
|
var recordList = new List<Model.MonitorDayRecordPure>();
|
|
//日期循环
|
for (DateTime day = startDay.Date; day <= endDay.Date; day = day.AddDays(1))
|
{
|
var dt = day.AddDays(1);
|
var startTime = daySlot.GetStartTime(dt);
|
var endTime = daySlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID,relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorDayRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataDay = day;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计日最小值
|
/// </summary>
|
public static List<Model.MonitorDayRecordPure> StatisticalDayMinValue
|
(
|
DateTime startDay,//开始日期
|
DateTime endDay,//结束日期
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.MinValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real && relatedMonitor.CronType != Model.Monitor.eCronType.EachHour)
|
{
|
Msg = "关联测点不是实时或时测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var daySlot = Model.Monitor.DaySlot.ToModel(monitor.CronParas);
|
if (daySlot == null)
|
{
|
daySlot = new Model.Monitor.DaySlot();
|
}
|
var recordList = new List<Model.MonitorDayRecordPure>();
|
|
//日期循环
|
for (DateTime day = startDay.Date; day <= endDay.Date; day = day.AddDays(1))
|
{
|
var dt = day.AddDays(1);
|
var startTime = daySlot.GetStartTime(dt);
|
var endTime = daySlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorDayRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataDay = day;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计日平均值
|
/// </summary>
|
public static List<Model.MonitorDayRecordPure> StatisticalDayAvgValue
|
(
|
DateTime startDay,//开始日期
|
DateTime endDay,//结束日期
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.AvgValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real && relatedMonitor.CronType != Model.Monitor.eCronType.EachHour)
|
{
|
Msg = "关联测点不是实时或时测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var daySlot = Model.Monitor.DaySlot.ToModel(monitor.CronParas);
|
if (daySlot == null)
|
{
|
daySlot = new Model.Monitor.DaySlot();
|
}
|
var recordList = new List<Model.MonitorDayRecordPure>();
|
|
//日期循环
|
for (DateTime day = startDay.Date; day <= endDay.Date; day = day.AddDays(1))
|
{
|
var dt = day.AddDays(1);
|
var startTime = daySlot.GetStartTime(dt);
|
var endTime = daySlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorDayRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataDay = day;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计日差值
|
/// </summary>
|
public static List<Model.MonitorDayRecordPure> StatisticalDayDiffValue
|
(
|
DateTime startDay,//开始日期
|
DateTime endDay,//结束日期
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.DiffValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real && relatedMonitor.CronType != Model.Monitor.eCronType.EachHour)
|
{
|
Msg = "关联测点不是实时或时测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var daySlot = Model.Monitor.DaySlot.ToModel(monitor.CronParas);
|
if (daySlot == null)
|
{
|
daySlot = new Model.Monitor.DaySlot();
|
}
|
var recordList = new List<Model.MonitorDayRecordPure>();
|
|
//日期循环
|
for (DateTime day = startDay.Date; day <= endDay.Date; day = day.AddDays(1))
|
{
|
var dt = day.AddDays(1);
|
var startTime = daySlot.GetStartTime(dt);
|
var endTime = daySlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorDayRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataDay = day;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计日和值
|
/// </summary>
|
public static List<Model.MonitorDayRecordPure> StatisticalDaySumValue
|
(
|
DateTime startDay,//开始日期
|
DateTime endDay,//结束日期
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.SumValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real && relatedMonitor.CronType != Model.Monitor.eCronType.EachHour)
|
{
|
Msg = "关联测点不是实时或时测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var daySlot = Model.Monitor.DaySlot.ToModel(monitor.CronParas);
|
if (daySlot == null)
|
{
|
daySlot = new Model.Monitor.DaySlot();
|
}
|
var recordList = new List<Model.MonitorDayRecordPure>();
|
|
//日期循环
|
for (DateTime day = startDay.Date; day <= endDay.Date; day = day.AddDays(1))
|
{
|
var dt = day.AddDays(1);
|
var startTime = daySlot.GetStartTime(dt);
|
var endTime = daySlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorDayRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataDay = day;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
#endregion
|
|
#region 常规月
|
|
/// <summary>
|
/// 统计月最大值
|
/// </summary>
|
public static List<Model.MonitorMonthRecordPure> StatisticalMonthMaxValue
|
(
|
int startYear,//开始年份
|
int startMonth,//开始月份
|
int endYear,//结束年份
|
int endMonth,//结束月份
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.MaxValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real && relatedMonitor.CronType != Model.Monitor.eCronType.EachDay)
|
{
|
Msg = "关联测点不是实时或日测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var monthSlot = Model.Monitor.MonthSlot.ToModel(monitor.CronParas);
|
if (monthSlot == null)
|
{
|
monthSlot = new Model.Monitor.MonthSlot();
|
}
|
var recordList = new List<Model.MonitorMonthRecordPure>();
|
|
//日期循环
|
for (DateTime day = new DateTime(startYear,startMonth,1); day <=new DateTime(endYear,endMonth,1); day = day.AddMonths(1))
|
{
|
var dt = day.AddMonths(1);
|
var startTime = monthSlot.GetStartTime(dt);
|
var endTime = monthSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorMonthRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataYear = day.Year;
|
pure.DataMonth = day.Month;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计月最小值
|
/// </summary>
|
public static List<Model.MonitorMonthRecordPure> StatisticalMonthMinValue
|
(
|
int startYear,//开始年份
|
int startMonth,//开始月份
|
int endYear,//结束年份
|
int endMonth,//结束月份
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.MinValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real && relatedMonitor.CronType != Model.Monitor.eCronType.EachDay)
|
{
|
Msg = "关联测点不是实时或日测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var monthSlot = Model.Monitor.MonthSlot.ToModel(monitor.CronParas);
|
if (monthSlot == null)
|
{
|
monthSlot = new Model.Monitor.MonthSlot();
|
}
|
var recordList = new List<Model.MonitorMonthRecordPure>();
|
|
//日期循环
|
for (DateTime day = new DateTime(startYear, startMonth, 1); day <= new DateTime(endYear, endMonth, 1); day = day.AddMonths(1))
|
{
|
var dt = day.AddMonths(1);
|
var startTime = monthSlot.GetStartTime(dt);
|
var endTime = monthSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorMonthRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataYear = day.Year;
|
pure.DataMonth = day.Month;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计月平均值
|
/// </summary>
|
public static List<Model.MonitorMonthRecordPure> StatisticalMonthAvgValue
|
(
|
int startYear,//开始年份
|
int startMonth,//开始月份
|
int endYear,//结束年份
|
int endMonth,//结束月份
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.AvgValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real && relatedMonitor.CronType != Model.Monitor.eCronType.EachDay)
|
{
|
Msg = "关联测点不是实时或日测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var monthSlot = Model.Monitor.MonthSlot.ToModel(monitor.CronParas);
|
if (monthSlot == null)
|
{
|
monthSlot = new Model.Monitor.MonthSlot();
|
}
|
var recordList = new List<Model.MonitorMonthRecordPure>();
|
|
//日期循环
|
for (DateTime day = new DateTime(startYear, startMonth, 1); day <= new DateTime(endYear, endMonth, 1); day = day.AddMonths(1))
|
{
|
var dt = day.AddMonths(1);
|
var startTime = monthSlot.GetStartTime(dt);
|
var endTime = monthSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorMonthRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataYear = day.Year;
|
pure.DataMonth = day.Month;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计月差值
|
/// </summary>
|
public static List<Model.MonitorMonthRecordPure> StatisticalMonthDiffValue
|
(
|
int startYear,//开始年份
|
int startMonth,//开始月份
|
int endYear,//结束年份
|
int endMonth,//结束月份
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.DiffValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real && relatedMonitor.CronType != Model.Monitor.eCronType.EachDay)
|
{
|
Msg = "关联测点不是实时或日测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var monthSlot = Model.Monitor.MonthSlot.ToModel(monitor.CronParas);
|
if (monthSlot == null)
|
{
|
monthSlot = new Model.Monitor.MonthSlot();
|
}
|
var recordList = new List<Model.MonitorMonthRecordPure>();
|
|
//日期循环
|
for (DateTime day = new DateTime(startYear, startMonth, 1); day <= new DateTime(endYear, endMonth, 1); day = day.AddMonths(1))
|
{
|
var dt = day.AddMonths(1);
|
var startTime = monthSlot.GetStartTime(dt);
|
var endTime = monthSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorMonthRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataYear = day.Year;
|
pure.DataMonth = day.Month;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计月和值
|
/// </summary>
|
public static List<Model.MonitorMonthRecordPure> StatisticalMonthSumValue
|
(
|
int startYear,//开始年份
|
int startMonth,//开始月份
|
int endYear,//结束年份
|
int endMonth,//结束月份
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.SumValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real && relatedMonitor.CronType != Model.Monitor.eCronType.EachDay)
|
{
|
Msg = "关联测点不是实时或日测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var monthSlot = Model.Monitor.MonthSlot.ToModel(monitor.CronParas);
|
if (monthSlot == null)
|
{
|
monthSlot = new Model.Monitor.MonthSlot();
|
}
|
var recordList = new List<Model.MonitorMonthRecordPure>();
|
|
//日期循环
|
for (DateTime day = new DateTime(startYear, startMonth, 1); day <= new DateTime(endYear, endMonth, 1); day = day.AddMonths(1))
|
{
|
var dt = day.AddMonths(1);
|
var startTime = monthSlot.GetStartTime(dt);
|
var endTime = monthSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorMonthRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataYear = day.Year;
|
pure.DataMonth = day.Month;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
return recordList;
|
}
|
|
#endregion
|
|
#region 常规年
|
|
/// <summary>
|
/// 统计年最大值
|
/// </summary>
|
public static List<Model.MonitorYearRecordPure> StatisticalYearMaxValue
|
(
|
int startYear,//开始年份
|
int endYear,//结束年份
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.MaxValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real
|
&& relatedMonitor.CronType != Model.Monitor.eCronType.EachDay
|
&&relatedMonitor.CronType!=Model.Monitor.eCronType.EachMonth)
|
{
|
Msg = "关联测点不是实时、日或月测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var yearSlot = Model.Monitor.YearSlot.ToModel(monitor.CronParas);
|
if (yearSlot == null)
|
{
|
yearSlot = new Model.Monitor.YearSlot();
|
}
|
var recordList = new List<Model.MonitorYearRecordPure>();
|
|
//年份循环
|
for (int year = startYear; year <= endYear; year++)
|
{
|
var dt =new DateTime(year,1,1);
|
dt = dt.AddYears(1);
|
var startTime = yearSlot.GetStartTime(dt);
|
var endTime = yearSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorYearRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataYear = year;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计年最小值
|
/// </summary>
|
public static List<Model.MonitorYearRecordPure> StatisticalYearMinValue
|
(
|
int startYear,//开始年份
|
int endYear,//结束年份
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.MinValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real
|
&& relatedMonitor.CronType != Model.Monitor.eCronType.EachDay
|
&& relatedMonitor.CronType != Model.Monitor.eCronType.EachMonth)
|
{
|
Msg = "关联测点不是实时、日或月测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var yearSlot = Model.Monitor.YearSlot.ToModel(monitor.CronParas);
|
if (yearSlot == null)
|
{
|
yearSlot = new Model.Monitor.YearSlot();
|
}
|
var recordList = new List<Model.MonitorYearRecordPure>();
|
|
//年份循环
|
for (int year = startYear; year <= endYear; year++)
|
{
|
var dt = new DateTime(year, 1, 1);
|
dt = dt.AddYears(1);
|
var startTime = yearSlot.GetStartTime(dt);
|
var endTime = yearSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorYearRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataYear = year;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计年平均值
|
/// </summary>
|
public static List<Model.MonitorYearRecordPure> StatisticalYearAvgValue
|
(
|
int startYear,//开始年份
|
int endYear,//结束年份
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.AvgValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real
|
&& relatedMonitor.CronType != Model.Monitor.eCronType.EachDay
|
&& relatedMonitor.CronType != Model.Monitor.eCronType.EachMonth)
|
{
|
Msg = "关联测点不是实时、日或月测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var yearSlot = Model.Monitor.YearSlot.ToModel(monitor.CronParas);
|
if (yearSlot == null)
|
{
|
yearSlot = new Model.Monitor.YearSlot();
|
}
|
var recordList = new List<Model.MonitorYearRecordPure>();
|
|
//年份循环
|
for (int year = startYear; year <= endYear; year++)
|
{
|
var dt = new DateTime(year, 1, 1);
|
dt = dt.AddYears(1);
|
var startTime = yearSlot.GetStartTime(dt);
|
var endTime = yearSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorYearRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataYear = year;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计年差值
|
/// </summary>
|
public static List<Model.MonitorYearRecordPure> StatisticalYearDiffValue
|
(
|
int startYear,//开始年份
|
int endYear,//结束年份
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.DiffValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real
|
&& relatedMonitor.CronType != Model.Monitor.eCronType.EachDay
|
&& relatedMonitor.CronType != Model.Monitor.eCronType.EachMonth)
|
{
|
Msg = "关联测点不是实时、日或月测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var yearSlot = Model.Monitor.YearSlot.ToModel(monitor.CronParas);
|
if (yearSlot == null)
|
{
|
yearSlot = new Model.Monitor.YearSlot();
|
}
|
var recordList = new List<Model.MonitorYearRecordPure>();
|
|
//年份循环
|
for (int year = startYear; year <= endYear; year++)
|
{
|
var dt = new DateTime(year, 1, 1);
|
dt = dt.AddYears(1);
|
var startTime = yearSlot.GetStartTime(dt);
|
var endTime = yearSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorYearRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataYear = year;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
|
return recordList;
|
}
|
|
/// <summary>
|
/// 统计年和值
|
/// </summary>
|
public static List<Model.MonitorYearRecordPure> StatisticalYearSumValue
|
(
|
int startYear,//开始年份
|
int endYear,//结束年份
|
Model.MonitorPoint_Signal_SignalType monitor,//监测点
|
string formularParas,//公式参数
|
Func<long, Model.MonitorPoint_Signal_SignalType> getMonitorPoint,//获取测点
|
Func<long, long, Model.Monitor.eCronType, DateTime, DateTime, List<Model.MonitorBasicRecord>> getRecordList,//获取记录列表
|
Func<long, long, Model.MonitorBasicRecord> getLastRecord,//获取最近一条记录
|
out string Msg
|
)
|
{
|
Msg = string.Empty;
|
|
#region 数据验证
|
|
var formulaModel = Model.Monitor.SumValueStatisticsFormulaParas.ToModel(formularParas);
|
if (formulaModel == null)
|
{
|
Msg = "公式参数配置错误";
|
return default;
|
}
|
var relatedMonitor = getMonitorPoint(formulaModel.ObjectID);
|
if (relatedMonitor == null)
|
{
|
Msg = "关联测点不存在";
|
return default;
|
}
|
if (relatedMonitor.MonitorType != Model.eMonitorType.General)
|
{
|
Msg = "关联测点不是常规测点";
|
return default;
|
}
|
if (relatedMonitor.CronType != Model.Monitor.eCronType.Real
|
&& relatedMonitor.CronType != Model.Monitor.eCronType.EachDay
|
&& relatedMonitor.CronType != Model.Monitor.eCronType.EachMonth)
|
{
|
Msg = "关联测点不是实时、日或月测点";
|
return default;
|
}
|
var relatedSignal = relatedMonitor.SignalList.First();
|
|
#endregion
|
|
var signal = monitor.SignalList.First();
|
var yearSlot = Model.Monitor.YearSlot.ToModel(monitor.CronParas);
|
if (yearSlot == null)
|
{
|
yearSlot = new Model.Monitor.YearSlot();
|
}
|
var recordList = new List<Model.MonitorYearRecordPure>();
|
|
//年份循环
|
for (int year = startYear; year <= endYear; year++)
|
{
|
var dt = new DateTime(year, 1, 1);
|
dt = dt.AddYears(1);
|
var startTime = yearSlot.GetStartTime(dt);
|
var endTime = yearSlot.GetEndTime(dt);
|
var relatedRecordList = getRecordList(relatedMonitor.ID, relatedSignal.ID, relatedMonitor.CronType, startTime, endTime);
|
if (relatedRecordList == null || relatedRecordList.Count < 1)
|
continue;
|
var relatedDataValueList = new List<double>();
|
foreach (var relatedRecord in relatedRecordList)
|
{
|
if (double.TryParse(relatedRecord.DataValue, out double relatedDataValue))
|
{
|
relatedDataValueList.Add(relatedDataValue);
|
}
|
}
|
if (relatedDataValueList.Count < 1)
|
continue;
|
var dataValue = formulaModel.Statistic(relatedDataValueList);
|
|
var pure = new Model.MonitorYearRecordPure();
|
pure.CorpID = monitor.CorpID;
|
pure.MonitorPointID = monitor.ID;
|
pure.SignalID = signal.ID;
|
pure.RecordType = eMonitorType.General;
|
pure.DataYear = year;
|
pure.SrcTime = dt;
|
pure.SrcValue = dataValue.ToString();
|
pure.DataTime = dt;
|
pure.DataValue = dataValue.ToString();
|
pure.DataStatus = new List<string>();
|
|
//数据转换
|
if (signal.ConvertParas != null)
|
{
|
dataValue = signal.ConvertParas.Convert(dataValue, out bool succed);
|
if (!succed)
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_ConvertFailed);
|
}
|
}
|
|
//数据修正
|
if (signal.CorrectParas != null)
|
{
|
dataValue = signal.CorrectParas.Correct(dataValue);
|
}
|
|
//数据过滤
|
if (signal.FilterParas != null)
|
{
|
double? lastDataValue = null;
|
Model.MonitorBasicRecord lastRecord = recordList.LastOrDefault();
|
if (lastRecord == null)
|
{
|
lastRecord = getLastRecord(monitor.ID, signal.ID);
|
}
|
if (lastRecord != null)
|
{
|
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
|
{
|
lastDataValue = dataValueTemp;
|
}
|
}
|
if (!signal.FilterParas.Filter(dataValue, lastDataValue))
|
{
|
pure.DataStatus.Add(MonitorRecord.Status_FilterFailed);
|
}
|
}
|
|
//保留小数位数
|
if (signal.SignalType.DecimalPlaces != null)
|
{
|
dataValue = Math.Round(dataValue, signal.SignalType.DecimalPlaces.Value);
|
}
|
|
pure.DataValue = dataValue.ToString();
|
recordList.Add(pure);
|
}
|
|
|
return recordList;
|
}
|
|
#endregion
|
|
|
}
|
}
|