/// <summary> /// 单个告警处理 /// </summary> private void SubProcessGroupAlarm( GroupAlarmType alarmType, SelectionGroup group) { AlarmConfigData alarmSet; AlarmInfo info; float temperature; switch (alarmType) { case GroupAlarmType.MaxTemperature: alarmSet = group.mAlarmConfig.mMaxTempConfig; temperature = group.mTemperatureData.mMaxTemperature; info = group.mAlarmInfo.mMaxTempAlarm; break; case GroupAlarmType.MaxTempRise: alarmSet = group.mAlarmConfig.mMaxTempeRiseConfig; temperature = group.mTemperatureData.mTemperatureRise; info = group.mAlarmInfo.mMaxTempRiseAlarmInfo; break; case GroupAlarmType.MaxTempDif: alarmSet = group.mAlarmConfig.mMaxTempDifConfig; temperature = group.mTemperatureData.mTemperatureDif; info = group.mAlarmInfo.mMaxTempDifAlarmInfo; break; case GroupAlarmType.RelativeTempDif: alarmSet = group.mAlarmConfig.mRelativeTempDifConfig; temperature = group.mTemperatureData.mRelTemperatureDif; info = group.mAlarmInfo.mRelativeTempDifAlarmInfo; break; default: return; } AlarmStatus lastStatus = info.mAlarmStatus; info.mLastAlarmLevel = info.mCurrentAlarmLevel; if ((alarmType == GroupAlarmType.MaxTemperature) || (alarmType == GroupAlarmType.RelativeTempDif)) { CalcAlarmInfo(alarmSet, temperature, info); } else { SpecialCalAlarmInfo(alarmSet, temperature, info); // 特殊处理组选区温升/温差 } if (alarmType == GroupAlarmType.MaxTemperature) { ProcessAlarmReadyEnd(alarmSet, temperature, info); } if (info.mAlarmStatus == AlarmStatus.AlarmStart) { info.mAlarmStatus = AlarmStatus.Alarming; // 添加告警 string groupData = group.Serialize(); string temperatureInfo = JsonUtils.ObjectToJson(group.mTemperatureData); // 阈值设置序列化 string condition = string.Format("{0},{1},{2}", alarmSet.mGeneralThreshold, alarmSet.mSeriousThreshold, alarmSet.mCriticalThreshold); // 记录告警开始时间 info.mBeginTime = DateTime.Now; info.mIsTimeout = false; // 告警入库 OnAddAlarmInfo?.Invoke( (int)AlarmMode.GroupSelection, (int)alarmType, (int)alarmSet.mAlarmReason, (int)info.mCurrentAlarmLevel, condition, temperature, group.mId, group.mGroupName, groupData, temperatureInfo, mMaxTemperature, mMinTemperature, group.mSelections, info); } else if (info.mAlarmStatus == AlarmStatus.AlarmEnd) { info.mAlarmStatus = AlarmStatus.Unknown; // 结束告警 string selectionData = group.Serialize(); OnUpdateAlarmInfo?.Invoke( (int)AlarmMode.GroupSelection, (int)alarmType, group.mId, selectionData, info); // 取消超时 info.mIsTimeout = true; } else if (info.mAlarmStatus == AlarmStatus.AlarmingChanged) { // 结束上一次告警 string selectionData = group.Serialize(); OnUpdateAlarmInfo?.Invoke( (int)AlarmMode.GroupSelection, (int)alarmType, group.mId, selectionData, info); string temperatureInfo = JsonUtils.ObjectToJson(group.mTemperatureData); // 阈值设置序列化 string condition = string.Format("{0},{1},{2}", alarmSet.mGeneralThreshold, alarmSet.mSeriousThreshold, alarmSet.mCriticalThreshold); // 记录告警开始时间 info.mBeginTime = DateTime.Now; info.mIsTimeout = false; info.mAlarmStatus = AlarmStatus.Alarming; OnAddAlarmInfo?.Invoke( (int)AlarmMode.GroupSelection, (int)alarmType, (int)alarmSet.mAlarmReason, (int)info.mCurrentAlarmLevel, condition, temperature, group.mId, group.mGroupName, selectionData, temperatureInfo, mMaxTemperature, mMinTemperature, group.mSelections, info); } else if ((info.mAlarmStatus == AlarmStatus.Alarming || info.mAlarmStatus == AlarmStatus.AlarmingReadyChanged) && (info.mIsTimeout == false)) { DateTime time = DateTime.Now; if ((time - info.mBeginTime).TotalMinutes >= mTimeout) { string selectionData = group.Serialize(); OnAlarmTimeout?.Invoke( (int)AlarmMode.GroupSelection, (int)alarmType, group.mId, selectionData, info); info.mIsTimeout = true; } } }
/// <summary> /// 获取告警短信内容 /// </summary> public static String GetShowMessage( String substation, String deviceName, Int32 alarmMode, Int32 alarmType, Int32 alarmLevel, Single temperature, DateTime time) { String msg = String.Format("变电站:{0}\n", substation); msg += String.Format("设备:{0}\n", deviceName); AlarmMode mode = (AlarmMode)alarmMode; if (mode == AlarmMode.Selection) { SelectionAlarmType type = (SelectionAlarmType)alarmType; switch (type) { case SelectionAlarmType.MaxTemp: msg += "监控类型:最高温度\n"; break; case SelectionAlarmType.MinTemp: msg += "监控类型:最低温度\n"; break; case SelectionAlarmType.AvgTemp: msg += "监控类型:平均温度\n"; break; } msg += String.Format("温度值:{0:F2}℃\n", temperature); } else if (mode == AlarmMode.GroupSelection) { GroupAlarmType type = (GroupAlarmType)alarmType; switch (type) { case GroupAlarmType.MaxTemperature: msg += "监控类型:最高温度(组)\n"; break; case GroupAlarmType.MaxTempDif: msg += "监控类型:最大温差(组)\n"; break; case GroupAlarmType.MaxTempRise: msg += "监控类型:最大温升(组)\n"; break; case GroupAlarmType.RelativeTempDif: msg += "监控类型:相对温差(组)\n"; break; } if (type == GroupAlarmType.RelativeTempDif) { msg += String.Format("百分比:{0:F2}%\n", temperature); } else { msg += String.Format("温度值:{0:F2}℃\n", temperature); } } AlarmLevel level = (AlarmLevel)alarmLevel; switch (level) { case AlarmLevel.General: msg += "告警等级:一般\n"; break; case AlarmLevel.Serious: msg += "告警等级:严重\n"; break; case AlarmLevel.Critical: msg += "告警等级:危急\n"; break; } msg += String.Format("时间:{0}", DateTime.Now.ToString("HH:mm:ss")); return(msg); }