using IStation.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IStation.Calculation
{
///
/// 监测公式历史计算辅助类
///
public class MonitorFormulaHistoryCalcuHelper
{
#region 常规实时
#region 映射
///
/// 计算单一映射(常规实时)
///
public static List CalcuSingleMapping
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//时间循环
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();
}
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();
}
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;
}
///
/// 计算比较映射(常规实时)
///
public static List CalcuCompareMapping
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//时间循环
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();
}
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();
}
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;
}
///
/// 计算区间映射(常规实时)
///
public static List CalcuRangeMapping
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//时间循环
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();
}
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();
}
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 系数
///
/// 计算一元系数(实时)
///
public static List CalcuOnceRatio
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//时间循环
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();
}
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();
}
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;
}
///
/// 计算二元系数(实时)
///
public static List CalcuTwiceRatio
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//时间循环
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();
}
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();
}
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 其他
///
/// 计算-和值(常规实时)
///
public static List CalcuSum
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
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>();//关联测点记录
var relatedRealSlotDict = new Dictionary();
var relatedRecordReadIndexDict = new Dictionary();//已读角标
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();
//时间循环
for (int i = 0; i <= duration; i += realSlot.TimeStep)
{
var dataTime = startTime.AddSeconds(i);
var relatedRecordDict = new Dictionary();
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();
}
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();
var dataValueList = new List();
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;
}
///
/// 计算-差值(常规实时)
///
public static List CalcuDiff
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//时间循环
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();
}
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();
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;
}
///
/// 计算数值累积(常规实时)
///
public static List CalcuNumberAccumulate
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//时间循环
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();
}
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();
}
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;
}
///
/// 计算枚举累积(常规实时)
///
public static List CalcuEnumAccumulate
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//时间循环
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();
}
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();
}
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;
}
///
/// 计算效率(常规实时)
///
public static List CalcuE
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//时间循环
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();
}
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();
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;
}
///
/// 计算千吨能耗(常规实时)
///
public static List CalcuWP
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//时间循环
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();
}
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();
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;
}
///
/// 计算效率(常规实时)
///
public static List CalcuUWP
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//时间循环
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();
}
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();
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;
}
///
/// 计算运行状态(常规实时)
///
public static List CalcuRunStatus
(
DateTime startTime,//开始时间
DateTime endTime,//结束时间
Model.MonitorPoint_Signal_SignalType monitor,//当前测点
string formulaParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//关联RealSlot字典
var relatedRealSlotDict = new Dictionary();
//判断项Model字典
var judgeItemModelDict = new Dictionary();
//关联记录列表字典
var relatedRecordListDict = new Dictionary>();
//关联记录读取索引字典
var relatedRecordReadIndexDict = new Dictionary();
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();
//时间循环
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();
}
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();
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 常规时
///
/// 统计时最大值
///
public static List StatisticalHourMaxValue
(
DateTime startDay,//开始日期
DateTime endDay,//结束日期
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
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();
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();
//数据转换
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;
}
///
/// 统计时最小值
///
public static List StatisticalHourMinValue
(
DateTime startDay,//开始日期
DateTime endDay,//结束日期
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
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();
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();
//数据转换
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;
}
///
/// 统计时平均值
///
public static List StatisticalHourAvgValue
(
DateTime startDay,//开始日期
DateTime endDay,//结束日期
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
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();
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();
//数据转换
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;
}
///
/// 统计时差值
///
public static List StatisticalHourDiffValue
(
DateTime startDay,//开始日期
DateTime endDay,//结束日期
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
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();
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();
//数据转换
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;
}
///
/// 统计时和值
///
public static List StatisticalHourSumValue
(
DateTime startDay,//开始日期
DateTime endDay,//结束日期
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
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();
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();
//数据转换
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 常规日
///
/// 统计日最大值
///
public static List StatisticalDayMaxValue
(
DateTime startDay,//开始日期
DateTime endDay,//结束日期
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//日期循环
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();
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();
//数据转换
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;
}
///
/// 统计日最小值
///
public static List StatisticalDayMinValue
(
DateTime startDay,//开始日期
DateTime endDay,//结束日期
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//日期循环
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();
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();
//数据转换
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;
}
///
/// 统计日平均值
///
public static List StatisticalDayAvgValue
(
DateTime startDay,//开始日期
DateTime endDay,//结束日期
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//日期循环
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();
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();
//数据转换
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;
}
///
/// 统计日差值
///
public static List StatisticalDayDiffValue
(
DateTime startDay,//开始日期
DateTime endDay,//结束日期
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//日期循环
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();
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();
//数据转换
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;
}
///
/// 统计日和值
///
public static List StatisticalDaySumValue
(
DateTime startDay,//开始日期
DateTime endDay,//结束日期
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//日期循环
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();
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();
//数据转换
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 常规月
///
/// 统计月最大值
///
public static List StatisticalMonthMaxValue
(
int startYear,//开始年份
int startMonth,//开始月份
int endYear,//结束年份
int endMonth,//结束月份
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//日期循环
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();
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();
//数据转换
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;
}
///
/// 统计月最小值
///
public static List StatisticalMonthMinValue
(
int startYear,//开始年份
int startMonth,//开始月份
int endYear,//结束年份
int endMonth,//结束月份
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//日期循环
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();
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();
//数据转换
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;
}
///
/// 统计月平均值
///
public static List StatisticalMonthAvgValue
(
int startYear,//开始年份
int startMonth,//开始月份
int endYear,//结束年份
int endMonth,//结束月份
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//日期循环
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();
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();
//数据转换
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;
}
///
/// 统计月差值
///
public static List StatisticalMonthDiffValue
(
int startYear,//开始年份
int startMonth,//开始月份
int endYear,//结束年份
int endMonth,//结束月份
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//日期循环
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();
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();
//数据转换
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;
}
///
/// 统计月和值
///
public static List StatisticalMonthSumValue
(
int startYear,//开始年份
int startMonth,//开始月份
int endYear,//结束年份
int endMonth,//结束月份
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//日期循环
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();
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();
//数据转换
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 常规年
///
/// 统计年最大值
///
public static List StatisticalYearMaxValue
(
int startYear,//开始年份
int endYear,//结束年份
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//年份循环
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();
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();
//数据转换
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;
}
///
/// 统计年最小值
///
public static List StatisticalYearMinValue
(
int startYear,//开始年份
int endYear,//结束年份
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//年份循环
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();
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();
//数据转换
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;
}
///
/// 统计年平均值
///
public static List StatisticalYearAvgValue
(
int startYear,//开始年份
int endYear,//结束年份
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//年份循环
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();
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();
//数据转换
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;
}
///
/// 统计年差值
///
public static List StatisticalYearDiffValue
(
int startYear,//开始年份
int endYear,//结束年份
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//年份循环
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();
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();
//数据转换
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;
}
///
/// 统计年和值
///
public static List StatisticalYearSumValue
(
int startYear,//开始年份
int endYear,//结束年份
Model.MonitorPoint_Signal_SignalType monitor,//监测点
string formularParas,//公式参数
Func getMonitorPoint,//获取测点
Func> getRecordList,//获取记录列表
Func 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();
//年份循环
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();
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();
//数据转换
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
}
}