Esempio n. 1
0
        public static void UpdateDeviceFaultRun(ref DeviceFaultRunModel deviceFaultRunModel,
                                                List <DeviceFaultRunModel> deviceFaultRunModels,
                                                RealDataModel realDataModel,
                                                AnalogPointModel analogPointModel, Func <PointState, bool> isAlarmState)
        {
            if (deviceFaultRunModel == null)
            {
                NewAlarmAndSaveDatabase(out deviceFaultRunModel, deviceFaultRunModels, realDataModel, analogPointModel, isAlarmState);
            }
            else
            {
                deviceFaultRunModel.EndTime = realDataModel.RealDate;

                if (deviceFaultRunModel.IsRequireNew(realDataModel))
                {
                    // 有新的记录, 把老记录状态置1
                    deviceFaultRunModel.State = 1;
                }
                if (!deviceFaultRunModel.IsRequireNew(realDataModel))
                {
                    deviceFaultRunModel.PointState = realDataModel.RealState;
                }

                if (isAlarmState((PointState)deviceFaultRunModel.PointState) &&
                    (deviceFaultRunModel.IsTimeToSave(realDataModel) || deviceFaultRunModel.IsRequireNew(realDataModel)))
                {
                    // 报警情况下, 写入数据库.
                    var newM = deviceFaultRunModel.DeepClone();
                    DeviceFaultRunModel existM;
                    if ((existM = deviceFaultRunModels.FirstOrDefault(o => o.PointID == newM.PointID && o.StartTime == newM.StartTime && o.PointState == newM.PointState)) != null)
                    {
                        existM.State          = newM.State;
                        existM.PointState     = newM.PointState;
                        existM.PointStateName = Alarm_TodayModel.GetAlarmStateName((PointState)newM.PointState);
                        existM.EndTime        = newM.EndTime;
                        existM.SpanTime       = (int)newM.EndTime.Subtract(newM.StartTime).TotalSeconds;
                    }
                    else
                    {
                        deviceFaultRunModels.Add(deviceFaultRunModel.DeepClone());
                    }
                }

                if (deviceFaultRunModel.IsRequireNew(realDataModel))
                {
                    // 有新记录.
                    NewAlarmAndSaveDatabase(out deviceFaultRunModel, deviceFaultRunModels, realDataModel, analogPointModel, isAlarmState);
                }
            }
        }
Esempio n. 2
0
        private static void NewAlarmAndSaveDatabase(out DeviceFaultRunModel deviceFaultRunModel,
                                                    List <DeviceFaultRunModel> deviceFaultRunModels,
                                                    RealDataModel realDataModel,
                                                    AnalogPointModel analogPointModel,
                                                    Func <PointState, bool> isAlarmState)
        {
            deviceFaultRunModel = NewDeviceFaultRunModel(realDataModel, analogPointModel);

            var newStartTime       = deviceFaultRunModel.StartTime;
            var valueState         = deviceFaultRunModel.PointState;
            var existSameStartTime = deviceFaultRunModels.Find(o => newStartTime.Subtract(o.StartTime).TotalSeconds < 1 &&
                                                               o.PointState == valueState);

            if (existSameStartTime != null)
            {
                // 只有当开始时间和结束时间不一致的时候, 排除初始化出现主键冲突问题.
                deviceFaultRunModels.Remove(existSameStartTime);

                LogD.Warn($"分站{deviceFaultRunModel.PointID} 状态{existSameStartTime.PointState}出现一秒内多次状态报警状态改变, 会发生主键冲突.");
            }

            if (isAlarmState((PointState)deviceFaultRunModel.PointState))
            {
                deviceFaultRunModels.Add(deviceFaultRunModel.DeepClone()); // 直接写入数据库
            }
        }