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); } } }
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()); // 直接写入数据库 } }