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 } }