ningshuxia
2022-12-01 391e0e408d09e698850eb5daaef485d088612b4f
Calculation/IStation.Calculation.Handle/MonitorHandleHelper.cs
@@ -374,6 +374,183 @@
        }
        /// <summary>
        /// 处理历史数据
        /// </summary>
        /// <param name="monitor">测点</param>
        /// <param name="signal">信号</param>
        /// <param name="receiveRecord">接收记录</param>
        /// <param name="dataTime">数据时间</param>
        /// <returns>为null则不需要后续处理</returns>
        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<string>();
            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<double>();
                        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;
        }
        /// <summary>
        /// 处理
        /// </summary>
        /// <param name="monitor">测点</param>
@@ -1052,10 +1229,10 @@
        }
        /// <summary>
        /// 生成最近一条记录
        /// 生成监测记录
        /// </summary>
        /// <returns></returns>
        public static Model.MonitorBasicRecord BuildLastRecord
        public static Model.MonitorBasicRecord BuildMonitorRecord
            (
                Model.MonitorPoint monitor,
                Model.Signal_SignalType signal,