internal static void UpdateAnalogAlarm(ref AnalogAlarmModel analogAlarmModel, List <AnalogAlarmModel> analogAlarmModels, RealDataModel realDataModel, AnalogPointModel analogPointModel, Func <PointState, bool> isAlarmState) { if (analogAlarmModel == null) { NewAlarmAndSaveDatabase(out analogAlarmModel, analogAlarmModels, realDataModel, analogPointModel, isAlarmState); } else { analogAlarmModel.EndTime = realDataModel.RealDate; if (analogAlarmModel.IsRequireNew(realDataModel)) { // 有新的记录, 把老记录状态置1 analogAlarmModel.State = 1; } if (isAlarmState((PointState)analogAlarmModel.AlarmState) && (analogAlarmModel.IsTimeToSave(realDataModel) || analogAlarmModel.IsRequireNew(realDataModel))) { // 报警情况下, 当状态改变或者时间大于10秒时候, 写入数据库. var newM = analogAlarmModel.DeepClone(); AnalogAlarmModel existM; if ((existM = analogAlarmModels.FirstOrDefault(o => o.PointID == newM.PointID && o.StartTime == newM.StartTime && o.AlarmState == newM.AlarmState)) != null) { existM.State = newM.State; existM.EndTime = newM.EndTime; existM.SpanTime = (int)newM.EndTime.Subtract(newM.StartTime).TotalSeconds; } else { analogAlarmModels.Add(newM); } } var realValue = realDataModel.RealValue.Value <float>(); if (realValue < analogAlarmModel.MinValue) { analogAlarmModel.MinValue = realValue; analogAlarmModel.MinValueTime = realDataModel.RealDate; } else if (realValue > analogAlarmModel.MaxValue) { analogAlarmModel.MaxValue = realValue; analogAlarmModel.MaxValueTime = realDataModel.RealDate; } analogAlarmModel.SumValue += realValue; analogAlarmModel.SumCount++; if (analogAlarmModel.IsRequireNew(realDataModel)) { // 有新记录. NewAlarmAndSaveDatabase(out analogAlarmModel, analogAlarmModels, realDataModel, analogPointModel, isAlarmState); } } }
/// <summary> /// 新增一条AnalogAlarm记录, 并且把它保存到数据库中. /// </summary> private static void NewAlarmAndSaveDatabase(out AnalogAlarmModel analogAlarmModel, List <AnalogAlarmModel> analogAlarmModels, RealDataModel realDataModel, AnalogPointModel analogPointModel, Func <PointState, bool> isAlarmState) { // 需要新增加一条数据. analogAlarmModel = NewAnalogAlarmModel(realDataModel, analogPointModel); if (isAlarmState((PointState)analogAlarmModel.AlarmState)) { analogAlarmModels.Add(analogAlarmModel.DeepClone()); // 直接写入数据库 } }