using IStation.Untity;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IStation.Calculation
{
///
/// 监测处理辅助类
///
public static class MonitorHandleHelper
{
///
/// 处理
///
/// 测点
/// 信号
/// 接收记录
/// 最后一次记录
/// 数据时间
/// 为null则不需要后续处理
public static Model.MonitorBasicRecord Handle
(
Model.MonitorPoint monitor,
Model.Signal_SignalType signal,
Model.MonitorDataDockingReceiveRecord receiveRecord,
Model.MonitorBasicRecord lastRecord,
DateTime dataTime
)
{
Model.MonitorBasicRecord record = null;//监测记录
var dataStatus = receiveRecord.DataStatus;//数据状态
if (dataStatus == null)
dataStatus = new List();
var dataValue = receiveRecord.SrcValue;//数据值
#region 实时记录 和 最后一次记录对比,判断是否完全一样,并根据条件判断是否需要补充点
if (monitor.CronType == Model.Monitor.eCronType.Real)
{
if (lastRecord != null)
{
if (lastRecord.SrcTime == receiveRecord.SrcTime)
{
//相同时间给出了相同值
if (lastRecord.SrcValue == receiveRecord.SrcValue)
{
var real_slot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
if (real_slot == null)
{
real_slot = new Model.Monitor.RealSlot();
}
if (!real_slot.UpdateWhenChanged)
{
return record;
}
dataStatus.Add(MonitorRecord.Status_Supplement);
}
}
}
}
#endregion
#region 通过信号类型的值类型和信号的数据类型进行相关的换算
switch (signal.SignalType.ValueType)
{
case Model.Monitor.eValueType.Numeric:
{
//数值验证
if (!double.TryParse(dataValue, out double dataValueNumeric))
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换
if (signal.ConvertParas != null)
{
dataValueNumeric = signal.ConvertParas.Convert(dataValueNumeric, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数据修正
if (signal.CorrectParas != null)
{
dataValueNumeric = signal.CorrectParas.Correct(dataValueNumeric);
}
//类型特殊情况处理 (累积的清零和初始值)
switch (signal.DataType)
{
case Model.Monitor.eDataType.Instant://瞬时
{
}
break;
case Model.Monitor.eDataType.Accumulate://累积
{
var dataTypeModel = Model.Monitor.AccumulateParameters.ToModel(signal.DataParas);
if (dataTypeModel != null)
{
if (lastRecord == null)
{
if (dataTypeModel.InitialValue != null)
{
dataValueNumeric += dataTypeModel.InitialValue.Value;
}
}
else
{
if (dataTypeModel.ClearValue != null)
{
if (dataValueNumeric >= dataTypeModel.ClearValue.Value - dataTypeModel.ClearErrorValue && dataValueNumeric <= dataTypeModel.ClearValue.Value + dataTypeModel.ClearErrorValue)
{
dataValueNumeric += double.Parse(lastRecord.DataValue);
}
}
}
}
}
break;
}
//数据过滤
if (signal.FilterParas != null)
{
double? lastDataValue = null;
if (lastRecord != null)
{
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
{
lastDataValue = dataValueTemp;
}
}
if (!signal.FilterParas.Filter(dataValueNumeric, lastDataValue))
{
dataStatus.Add(MonitorRecord.Status_FilterFailed);
}
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueNumeric = Math.Round(dataValueNumeric, signal.SignalType.DecimalPlaces.Value);
}
dataValue = dataValueNumeric.ToString();
}
break;
case Model.Monitor.eValueType.Enum:
{
//数值转换
if (!double.TryParse(dataValue, out double dataValueEnum))
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换
if (signal.ConvertParas != null)
{
dataValueEnum = signal.ConvertParas.Convert(dataValueEnum, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数据修正
if (signal.CorrectParas != null)
{
dataValueEnum = signal.CorrectParas.Correct(dataValueEnum);
}
//数据过滤
if (signal.FilterParas != null)
{
double? dataValue_last = null;
if (lastRecord != null)
{
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
{
dataValue_last = dataValueTemp;
}
}
if (!signal.FilterParas.Filter(dataValueEnum, dataValue_last))
{
dataStatus.Add(MonitorRecord.Status_FilterFailed);
}
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueEnum = Math.Round(dataValueEnum, signal.SignalType.DecimalPlaces.Value);
}
dataValue = dataValueEnum.ToString();
}
break;
case Model.Monitor.eValueType.Array:
{
//数据格式验证
var dataValueArray = DoubleListHelper.ToList(dataValue);
if (dataValueArray == null || dataValueArray.Count < 1)
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换、修正、保留小数位数
var dataValueArrayNew = new List();
foreach (var dataValueNumeric in dataValueArray)
{
var dataValueNumericNew = dataValueNumeric;
//数据转换
if (signal.ConvertParas != null)
{
dataValueNumericNew = signal.ConvertParas.Convert(dataValueNumericNew, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数值修正
if (signal.CorrectParas != null)
{
dataValueNumericNew = signal.CorrectParas.Correct(dataValueNumericNew);
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueNumericNew = Math.Round(dataValueNumericNew, signal.SignalType.DecimalPlaces.Value);
}
dataValueArrayNew.Add(dataValueNumericNew);
}
dataValue = DoubleListHelper.ToString(dataValueArrayNew);
}
break;
case Model.Monitor.eValueType.Integration:
{
}
break;
default: break;
}
#endregion
#region 监测记录生成
switch (monitor.CronType)
{
case Model.Monitor.eCronType.Real:
{
var realRecord = new Model.MonitorRealRecordPure();
realRecord.CorpID = monitor.CorpID;
realRecord.MonitorPointID = monitor.ID;
realRecord.SignalID = signal.ID;
realRecord.RecordType = receiveRecord.RecordType;
realRecord.SrcTime = receiveRecord.SrcTime;
realRecord.SrcValue = receiveRecord.SrcValue;
realRecord.DataTime = dataTime;
realRecord.DataValue = dataValue;
realRecord.DataStatus = dataStatus;
record = realRecord;
}
break;
case Model.Monitor.eCronType.EachHour:
{
var hourRecord = new Model.MonitorHourRecordPure();
hourRecord.CorpID = monitor.CorpID;
hourRecord.MonitorPointID = monitor.ID;
hourRecord.SignalID = signal.ID;
hourRecord.RecordType = receiveRecord.RecordType;
hourRecord.SrcTime = receiveRecord.SrcTime;
hourRecord.SrcValue = receiveRecord.SrcValue;
hourRecord.DataDay = dataTime.AddHours(-1).Date;
hourRecord.DataHour = dataTime.AddHours(-1).Hour + 1;
hourRecord.DataTime = dataTime;
hourRecord.DataValue = dataValue;
hourRecord.DataStatus = dataStatus;
record = hourRecord;
}
break;
case Model.Monitor.eCronType.EachDay:
{
var dayRecord = new Model.MonitorDayRecordPure();
dayRecord.CorpID = monitor.CorpID;
dayRecord.MonitorPointID = monitor.ID;
dayRecord.SignalID = signal.ID;
dayRecord.RecordType = receiveRecord.RecordType;
dayRecord.SrcTime = receiveRecord.SrcTime;
dayRecord.SrcValue = receiveRecord.SrcValue;
dayRecord.DataDay = dataTime.AddDays(-1).Date;
dayRecord.DataTime = dataTime;
dayRecord.DataValue = dataValue;
dayRecord.DataStatus = dataStatus;
record = dayRecord;
}
break;
case Model.Monitor.eCronType.EachWeek:
{
var weekRecord = new Model.MonitorWeekRecordPure();
weekRecord.CorpID = monitor.CorpID;
weekRecord.MonitorPointID = monitor.ID;
weekRecord.SignalID = signal.ID;
weekRecord.RecordType = receiveRecord.RecordType;
weekRecord.SrcTime = receiveRecord.SrcTime;
weekRecord.SrcValue = receiveRecord.SrcValue;
weekRecord.DataTime = dataTime;
weekRecord.DataValue = dataValue;
weekRecord.DataStatus = dataStatus;
var cron_week = Model.Monitor.WeekSlot.ToModel(monitor.CronParas);
if (cron_week == null)
cron_week = new Model.Monitor.WeekSlot();
weekRecord.StartDay = cron_week.GetStartTime(dataTime).Date;
weekRecord.EndDay = cron_week.GetEndTime(dataTime).AddDays(-1).Date;
record = weekRecord;
}
break;
case Model.Monitor.eCronType.EachMonth:
{
var monthRecord = new Model.MonitorMonthRecordPure();
monthRecord.CorpID = monitor.CorpID;
monthRecord.MonitorPointID = monitor.ID;
monthRecord.SignalID = signal.ID;
monthRecord.RecordType = receiveRecord.RecordType;
monthRecord.SrcTime = receiveRecord.SrcTime;
monthRecord.SrcValue = receiveRecord.SrcValue;
monthRecord.DataYear = dataTime.AddMonths(-1).Year;
monthRecord.DataMonth = dataTime.AddMonths(-1).Month;
monthRecord.DataTime = dataTime;
monthRecord.DataValue = dataValue;
monthRecord.DataStatus = dataStatus;
record = monthRecord;
}
break;
case Model.Monitor.eCronType.EachYear:
{
var yearRecord = new Model.MonitorYearRecordPure();
yearRecord.CorpID = monitor.CorpID;
yearRecord.MonitorPointID = monitor.ID;
yearRecord.SignalID = signal.ID;
yearRecord.RecordType = receiveRecord.RecordType;
yearRecord.SrcTime = receiveRecord.SrcTime;
yearRecord.SrcValue = receiveRecord.SrcValue;
yearRecord.DataYear = dataTime.AddYears(-1).Year;
yearRecord.DataTime = dataTime;
yearRecord.DataValue = dataValue;
yearRecord.DataStatus = dataStatus;
record = yearRecord;
}
break;
default: break;
}
#endregion
return record;
}
///
/// 处理历史数据
///
/// 测点
/// 信号
/// 接收记录
/// 数据时间
/// 为null则不需要后续处理
public static Model.MonitorBasicRecord HandleHistory
(
Model.MonitorPoint monitor,
Model.Signal_SignalType signal,
Model.MonitorDataDockingReceiveRecord receiveRecord,
DateTime dataTime
)
{
Model.MonitorBasicRecord record = null;//监测记录
var dataStatus = receiveRecord.DataStatus;//数据状态
if (dataStatus == null)
dataStatus = new List();
var dataValue = receiveRecord.SrcValue;//数据值
#region 通过信号类型的值类型和信号的数据类型进行相关的换算
switch (signal.SignalType.ValueType)
{
case Model.Monitor.eValueType.Numeric:
{
//数值验证
if (!double.TryParse(dataValue, out double dataValueNumeric))
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换
if (signal.ConvertParas != null)
{
dataValueNumeric = signal.ConvertParas.Convert(dataValueNumeric, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数据修正
if (signal.CorrectParas != null)
{
dataValueNumeric = signal.CorrectParas.Correct(dataValueNumeric);
}
//数据过滤
if (signal.FilterParas != null)
{
if (!signal.FilterParas.Filter(dataValueNumeric, null))
{
dataStatus.Add(MonitorRecord.Status_FilterFailed);
}
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueNumeric = Math.Round(dataValueNumeric, signal.SignalType.DecimalPlaces.Value);
}
dataValue = dataValueNumeric.ToString();
}
break;
case Model.Monitor.eValueType.Enum:
{
//数值转换
if (!double.TryParse(dataValue, out double dataValueEnum))
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换
if (signal.ConvertParas != null)
{
dataValueEnum = signal.ConvertParas.Convert(dataValueEnum, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数据修正
if (signal.CorrectParas != null)
{
dataValueEnum = signal.CorrectParas.Correct(dataValueEnum);
}
//数据过滤
if (signal.FilterParas != null)
{
if (!signal.FilterParas.Filter(dataValueEnum, null))
{
dataStatus.Add(MonitorRecord.Status_FilterFailed);
}
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueEnum = Math.Round(dataValueEnum, signal.SignalType.DecimalPlaces.Value);
}
dataValue = dataValueEnum.ToString();
}
break;
case Model.Monitor.eValueType.Array:
{
//数据格式验证
var dataValueArray = DoubleListHelper.ToList(dataValue);
if (dataValueArray == null || dataValueArray.Count < 1)
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换、修正、保留小数位数
var dataValueArrayNew = new List();
foreach (var dataValueNumeric in dataValueArray)
{
var dataValueNumericNew = dataValueNumeric;
//数据转换
if (signal.ConvertParas != null)
{
dataValueNumericNew = signal.ConvertParas.Convert(dataValueNumericNew, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数值修正
if (signal.CorrectParas != null)
{
dataValueNumericNew = signal.CorrectParas.Correct(dataValueNumericNew);
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueNumericNew = Math.Round(dataValueNumericNew, signal.SignalType.DecimalPlaces.Value);
}
dataValueArrayNew.Add(dataValueNumericNew);
}
dataValue = DoubleListHelper.ToString(dataValueArrayNew);
}
break;
case Model.Monitor.eValueType.Integration:
{
}
break;
default: break;
}
#endregion
#region 监测记录生成
record = BuildMonitorRecord(monitor,signal,receiveRecord.SrcTime,receiveRecord.SrcValue,dataTime,dataValue,dataStatus);
#endregion
return record;
}
///
/// 处理
///
/// 测点
/// 信号
/// 最后一次记录
/// 原始值
/// 数据状态
/// 为空则不需要后续处理
public static string Handle
(
Model.MonitorPoint monitor,
Model.Signal_SignalType signal,
Model.MonitorBasicRecord lastRecord,
DateTime srcTime,
string srcValue,
List dataStatus
)
{
//数据状态
if (dataStatus == null)
{
dataStatus = new List();
}
var dataValue = srcValue;//数据值
#region 和最后一次记录对比,判断是否完全一样,并根据条件判断是否需要补充点
if (monitor.CronType == Model.Monitor.eCronType.Real)
{
if (lastRecord != null)
{
if (lastRecord.SrcTime == srcTime)
{
//相同时间给出了相同值
if (lastRecord.SrcValue == srcValue)
{
var real_slot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
if (real_slot == null)
{
real_slot = new Model.Monitor.RealSlot();
}
if (!real_slot.UpdateWhenChanged)
{
return default;
}
dataStatus.Add(MonitorRecord.Status_Supplement);
}
}
}
}
#endregion
#region 通过信号类型的值类型和信号的数据类型进行相关的换算
switch (signal.SignalType.ValueType)
{
case Model.Monitor.eValueType.Numeric:
{
//数值验证
if (!double.TryParse(dataValue, out double dataValueNumeric))
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换
if (signal.ConvertParas != null)
{
dataValueNumeric = signal.ConvertParas.Convert(dataValueNumeric, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数据修正
if (signal.CorrectParas != null)
{
dataValueNumeric = signal.CorrectParas.Correct(dataValueNumeric);
}
//类型特殊情况处理 (累积的清零和初始值)
switch (signal.DataType)
{
case Model.Monitor.eDataType.Instant://瞬时
{
}
break;
case Model.Monitor.eDataType.Accumulate://累积
{
var dataTypeModel = Model.Monitor.AccumulateParameters.ToModel(signal.DataParas);
switch (monitor.SourceType)
{
case Model.Monitor.eSourceType.Docking:
{
if (dataTypeModel != null)
{
if (lastRecord == null)
{
if (dataTypeModel.InitialValue != null)
{
dataValueNumeric += dataTypeModel.InitialValue.Value;
}
}
else
{
if (dataTypeModel.ClearValue != null)
{
if (dataValueNumeric >= dataTypeModel.ClearValue.Value - dataTypeModel.ClearErrorValue && dataValueNumeric <= dataTypeModel.ClearValue.Value + dataTypeModel.ClearErrorValue)
{
dataValueNumeric += double.Parse(lastRecord.DataValue);
}
}
}
}
}
break;
case Model.Monitor.eSourceType.Analyse:
{
if (lastRecord == null)
{
if (dataTypeModel != null)
{
if (dataTypeModel.InitialValue != null)
{
dataValueNumeric += dataTypeModel.InitialValue.Value;
}
}
}
else
{
if (double.TryParse(lastRecord.DataValue, out double last_value))
{
dataValueNumeric += last_value;
}
}
}
break;
case Model.Monitor.eSourceType.Input:
{
if (dataTypeModel != null)
{
if (lastRecord == null)
{
if (dataTypeModel.InitialValue != null)
{
dataValueNumeric += dataTypeModel.InitialValue.Value;
}
}
else
{
if (dataTypeModel.ClearValue != null)
{
if (dataValueNumeric >= dataTypeModel.ClearValue.Value - dataTypeModel.ClearErrorValue && dataValueNumeric <= dataTypeModel.ClearValue.Value + dataTypeModel.ClearErrorValue)
{
dataValueNumeric += double.Parse(lastRecord.DataValue);
}
}
}
}
}
break;
case Model.Monitor.eSourceType.Virtual:
{
if (lastRecord == null)
{
if (dataTypeModel != null)
{
if (dataTypeModel.InitialValue != null)
{
dataValueNumeric += dataTypeModel.InitialValue.Value;
}
}
}
else
{
if (double.TryParse(lastRecord.DataValue, out double last_value))
{
dataValueNumeric += last_value;
}
}
}
break;
default: break;
}
}
break;
}
//数据过滤
if (signal.FilterParas != null)
{
double? lastDataValue = null;
if (lastRecord != null)
{
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
{
lastDataValue = dataValueTemp;
}
}
if (!signal.FilterParas.Filter(dataValueNumeric, lastDataValue))
{
dataStatus.Add(MonitorRecord.Status_FilterFailed);
}
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueNumeric = Math.Round(dataValueNumeric, signal.SignalType.DecimalPlaces.Value);
}
dataValue = dataValueNumeric.ToString();
}
break;
case Model.Monitor.eValueType.Enum:
{
//数值转换
if (!double.TryParse(dataValue, out double dataValueEnum))
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换
if (signal.ConvertParas != null)
{
dataValueEnum = signal.ConvertParas.Convert(dataValueEnum, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数据修正
if (signal.CorrectParas != null)
{
dataValueEnum = signal.CorrectParas.Correct(dataValueEnum);
}
//数据过滤
if (signal.FilterParas != null)
{
double? lastDataValue = null;
if (lastRecord != null)
{
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
{
lastDataValue = dataValueTemp;
}
}
if (!signal.FilterParas.Filter(dataValueEnum, lastDataValue))
{
dataStatus.Add(MonitorRecord.Status_FilterFailed);
}
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueEnum = Math.Round(dataValueEnum, signal.SignalType.DecimalPlaces.Value);
}
dataValue = dataValueEnum.ToString();
}
break;
case Model.Monitor.eValueType.Array:
{
//数据格式验证
var dataValueArray = DoubleListHelper.ToList(dataValue);
if (dataValueArray == null || dataValueArray.Count < 1)
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换、修正、保留小数位数
var dataValueArrayNew = new List();
foreach (var dataValueNumeric in dataValueArray)
{
var dataValueNumericNew = dataValueNumeric;
//数据转换
if (signal.ConvertParas != null)
{
dataValueNumericNew = signal.ConvertParas.Convert(dataValueNumericNew, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数值修正
if (signal.CorrectParas != null)
{
dataValueNumericNew = signal.CorrectParas.Correct(dataValueNumericNew);
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueNumericNew = Math.Round(dataValueNumericNew, signal.SignalType.DecimalPlaces.Value);
}
dataValueArrayNew.Add(dataValueNumericNew);
}
dataValue = DoubleListHelper.ToString(dataValueArrayNew);
}
break;
case Model.Monitor.eValueType.Integration:
{
}
break;
default: break;
}
#endregion
return dataValue;
}
///
/// 处理
///
/// 测点
/// 信号
/// 最后一次记录
/// 原始值
/// 数据状态
/// 为空则不需要后续处理
public static string Handle
(
Model.MonitorPoint monitor,
Model.Signal_SignalType signal,
Func getLastRecord,
DateTime srcTime,
string srcValue,
List dataStatus
)
{
//数据状态
if (dataStatus == null)
{
dataStatus = new List();
}
var dataValue = srcValue;//数据值
Model.MonitorBasicRecord lastRecord = null;//最后一条记录
#region 和最后一次记录对比,判断是否完全一样,并根据条件判断是否需要补充点
if (monitor.CronType == Model.Monitor.eCronType.Real)
{
lastRecord = getLastRecord();
if (lastRecord != null)
{
if (lastRecord.SrcTime == srcTime)
{
//相同时间给出了相同值
if (lastRecord.SrcValue == srcValue)
{
var real_slot = Model.Monitor.RealSlot.ToModel(monitor.CronParas);
if (real_slot == null)
{
real_slot = new Model.Monitor.RealSlot();
}
if (!real_slot.UpdateWhenChanged)
{
return default;
}
dataStatus.Add(MonitorRecord.Status_Supplement);
}
}
}
}
#endregion
#region 通过信号类型的值类型和信号的数据类型进行相关的换算
switch (signal.SignalType.ValueType)
{
case Model.Monitor.eValueType.Numeric:
{
//数值验证
if (!double.TryParse(dataValue, out double dataValueNumeric))
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换
if (signal.ConvertParas != null)
{
dataValueNumeric = signal.ConvertParas.Convert(dataValueNumeric, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数据修正
if (signal.CorrectParas != null)
{
dataValueNumeric = signal.CorrectParas.Correct(dataValueNumeric);
}
//类型特殊情况处理
switch (signal.DataType)
{
case Model.Monitor.eDataType.Instant://瞬时
{
}
break;
case Model.Monitor.eDataType.Accumulate://累积
{
if (lastRecord == null)
{
if (monitor.CronType != Model.Monitor.eCronType.Real)
{
lastRecord = getLastRecord();
}
}
var dataTypeModel = Model.Monitor.AccumulateParameters.ToModel(signal.DataParas);
switch (monitor.SourceType)
{
case Model.Monitor.eSourceType.Docking:
{
if (dataTypeModel != null)
{
if (lastRecord == null)
{
if (dataTypeModel.InitialValue != null)
{
dataValueNumeric += dataTypeModel.InitialValue.Value;
}
}
else
{
if (dataTypeModel.ClearValue != null)
{
if (dataValueNumeric >= dataTypeModel.ClearValue.Value - dataTypeModel.ClearErrorValue && dataValueNumeric <= dataTypeModel.ClearValue.Value + dataTypeModel.ClearErrorValue)
{
dataValueNumeric += double.Parse(lastRecord.DataValue);
}
}
}
}
}
break;
case Model.Monitor.eSourceType.Analyse:
{
if (lastRecord == null)
{
if (dataTypeModel != null)
{
if (dataTypeModel.InitialValue != null)
{
dataValueNumeric += dataTypeModel.InitialValue.Value;
}
}
}
else
{
if (double.TryParse(lastRecord.DataValue, out double lastValueTemp))
{
dataValueNumeric += lastValueTemp;
}
}
}
break;
case Model.Monitor.eSourceType.Input:
{
if (dataTypeModel != null)
{
if (lastRecord == null)
{
if (dataTypeModel.InitialValue != null)
{
dataValueNumeric += dataTypeModel.InitialValue.Value;
}
}
else
{
if (dataTypeModel.ClearValue != null)
{
if (dataValueNumeric >= dataTypeModel.ClearValue.Value - dataTypeModel.ClearErrorValue && dataValueNumeric <= dataTypeModel.ClearValue.Value + dataTypeModel.ClearErrorValue)
{
dataValueNumeric += double.Parse(lastRecord.DataValue);
}
}
}
}
}
break;
case Model.Monitor.eSourceType.Virtual:
{
if (lastRecord == null)
{
if (dataTypeModel != null)
{
if (dataTypeModel.InitialValue != null)
{
dataValueNumeric += dataTypeModel.InitialValue.Value;
}
}
}
else
{
if (double.TryParse(lastRecord.DataValue, out double lastValueTemp))
{
dataValueNumeric += lastValueTemp;
}
}
}
break;
default: break;
}
}
break;
default: break;
}
//数据过滤
if (signal.FilterParas != null)
{
if (lastRecord == null)
{
if (monitor.CronType != Model.Monitor.eCronType.Real)
{
if (signal.DataType != Model.Monitor.eDataType.Accumulate)
{
lastRecord = getLastRecord();
}
}
}
double? lastDataValue = null;
if (lastRecord != null)
{
if (double.TryParse(lastRecord.DataValue, out double dataValueTemp))
{
lastDataValue = dataValueTemp;
}
}
if (!signal.FilterParas.Filter(dataValueNumeric, lastDataValue))
{
dataStatus.Add(MonitorRecord.Status_FilterFailed);
}
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueNumeric = Math.Round(dataValueNumeric, signal.SignalType.DecimalPlaces.Value);
}
dataValue = dataValueNumeric.ToString();
}
break;
case Model.Monitor.eValueType.Enum:
{
//数值转换
if (!double.TryParse(dataValue, out double dataValueEnum))
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换
if (signal.ConvertParas != null)
{
dataValueEnum = signal.ConvertParas.Convert(dataValueEnum, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数据修正
if (signal.CorrectParas != null)
{
dataValueEnum = signal.CorrectParas.Correct(dataValueEnum);
}
//数据过滤
if (signal.FilterParas != null)
{
if (lastRecord == null)
{
if (monitor.CronType != Model.Monitor.eCronType.Real)
{
lastRecord = getLastRecord();
}
}
double? lastDataValue = null;
if (lastRecord != null)
{
lastDataValue = double.Parse(lastRecord.DataValue);
}
if (!signal.FilterParas.Filter(dataValueEnum, lastDataValue))
{
dataStatus.Add(MonitorRecord.Status_FilterFailed);
}
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueEnum = Math.Round(dataValueEnum, signal.SignalType.DecimalPlaces.Value);
}
dataValue = dataValueEnum.ToString();
}
break;
case Model.Monitor.eValueType.Array:
{
//数据格式验证
var dataValueArray = DoubleListHelper.ToList(dataValue);
if (dataValueArray == null || dataValueArray.Count < 1)
{
dataStatus.Add(MonitorRecord.Status_DataFormatError);
break;
}
//数据转换、修正、保留小数位数
var dataValueArrayNew = new List();
foreach (var dataValueNumeric in dataValueArray)
{
var dataValueNumericNew = dataValueNumeric;
//数据转换
if (signal.ConvertParas != null)
{
dataValueNumericNew = signal.ConvertParas.Convert(dataValueNumericNew, out bool succed);
if (!succed)
{
dataStatus.Add(MonitorRecord.Status_ConvertFailed);
}
}
//数值修正
if (signal.CorrectParas != null)
{
dataValueNumericNew = signal.CorrectParas.Correct(dataValueNumericNew);
}
//保留小数位数
if (signal.SignalType.DecimalPlaces != null)
{
dataValueNumericNew = Math.Round(dataValueNumericNew, signal.SignalType.DecimalPlaces.Value);
}
dataValueArrayNew.Add(dataValueNumericNew);
}
dataValue = DoubleListHelper.ToString(dataValueArrayNew);
}
break;
case Model.Monitor.eValueType.Integration:
{
}
break;
default: break;
}
#endregion
return dataValue;
}
///
/// 生成监测记录
///
///
public static Model.MonitorBasicRecord BuildMonitorRecord
(
Model.MonitorPoint monitor,
Model.Signal_SignalType signal,
DateTime srcTime,
string srcValue,
DateTime dataTime,
string dataValue,
List dataStatus
)
{
//最近一条记录
Model.MonitorBasicRecord record = null;
#region 监测记录生成
switch (monitor.CronType)
{
case Model.Monitor.eCronType.Real:
{
var realRecord = new Model.MonitorRealRecordPure();
realRecord.CorpID = monitor.CorpID;
realRecord.MonitorPointID = monitor.ID;
realRecord.SignalID = signal.ID;
realRecord.RecordType = monitor.MonitorType;
realRecord.SrcTime = srcTime;
realRecord.SrcValue = srcValue;
realRecord.DataTime = dataTime;
realRecord.DataValue = dataValue;
realRecord.DataStatus = dataStatus?.ToList();
record = realRecord;
}
break;
case Model.Monitor.eCronType.EachHour:
{
var hourRecord = new Model.MonitorHourRecordPure();
hourRecord.CorpID = monitor.CorpID;
hourRecord.MonitorPointID = monitor.ID;
hourRecord.SignalID = signal.ID;
hourRecord.RecordType = monitor.MonitorType;
hourRecord.SrcTime = srcTime;
hourRecord.SrcValue = srcValue;
hourRecord.DataDay = dataTime.AddHours(-1).Date;
hourRecord.DataHour = dataTime.AddHours(-1).Hour + 1;
hourRecord.DataTime = dataTime;
hourRecord.DataValue = dataValue;
hourRecord.DataStatus = dataStatus?.ToList();
record = hourRecord;
}
break;
case Model.Monitor.eCronType.EachDay:
{
var dayRecord = new Model.MonitorDayRecordPure();
dayRecord.CorpID = monitor.CorpID;
dayRecord.MonitorPointID = monitor.ID;
dayRecord.SignalID = signal.ID;
dayRecord.RecordType = monitor.MonitorType;
dayRecord.SrcTime = srcTime;
dayRecord.SrcValue = srcValue;
dayRecord.DataDay = dataTime.AddDays(-1).Date;
dayRecord.DataTime = dataTime;
dayRecord.DataValue = dataValue;
dayRecord.DataStatus = dataStatus?.ToList();
record = dayRecord;
}
break;
case Model.Monitor.eCronType.EachWeek:
{
var weekRecord = new Model.MonitorWeekRecordPure();
weekRecord.CorpID = monitor.CorpID;
weekRecord.MonitorPointID = monitor.ID;
weekRecord.SignalID = signal.ID;
weekRecord.RecordType = monitor.MonitorType;
weekRecord.SrcTime = srcTime;
weekRecord.SrcValue = srcValue;
weekRecord.DataTime = dataTime;
weekRecord.DataValue = dataValue;
weekRecord.DataStatus = dataStatus?.ToList();
var cron_week = Model.Monitor.WeekSlot.ToModel(monitor.CronParas);
if (cron_week == null)
cron_week = new Model.Monitor.WeekSlot();
weekRecord.StartDay = cron_week.GetStartTime(dataTime).Date;
weekRecord.EndDay = cron_week.GetEndTime(dataTime).AddDays(-1).Date;
record = weekRecord;
}
break;
case Model.Monitor.eCronType.EachMonth:
{
var monthRecord = new Model.MonitorMonthRecordPure();
monthRecord.CorpID = monitor.CorpID;
monthRecord.MonitorPointID = monitor.ID;
monthRecord.SignalID = signal.ID;
monthRecord.RecordType = monitor.MonitorType;
monthRecord.SrcTime = srcTime;
monthRecord.SrcValue = srcValue;
monthRecord.DataYear = dataTime.AddMonths(-1).Year;
monthRecord.DataMonth = dataTime.AddMonths(-1).Month;
monthRecord.DataTime = dataTime;
monthRecord.DataValue = dataValue;
monthRecord.DataStatus = dataStatus?.ToList();
record = monthRecord;
}
break;
case Model.Monitor.eCronType.EachYear:
{
var yearRecord = new Model.MonitorYearRecordPure();
yearRecord.CorpID = monitor.CorpID;
yearRecord.MonitorPointID = monitor.ID;
yearRecord.SignalID = signal.ID;
yearRecord.RecordType = monitor.MonitorType;
yearRecord.SrcTime = srcTime;
yearRecord.SrcValue = srcValue;
yearRecord.DataYear = dataTime.AddYears(-1).Year;
yearRecord.DataTime = dataTime;
yearRecord.DataValue = dataValue;
yearRecord.DataStatus = dataStatus?.ToList();
record = yearRecord;
}
break;
default: break;
}
#endregion
return record;
}
}
}