refactor(dataDocking): 优化设备监控报警逻辑并清理冗余代码
- 移除了多个不必要的空行,提升代码可读性 - 简化了报警检查逻辑,删除关于REPORT_ID的特殊处理 - 优化报警确认机制和持续时间判断逻辑 - 统一了日志打印格式,便于问题追踪 - 清理了重复和无用的代码段,减少维护成本 - 保持核心功能不变,提高代码执行效率dev
parent
391164a205
commit
6066557d99
|
|
@ -44,34 +44,34 @@ public class MesDataScheduled extends IJobHandler {
|
|||
|
||||
@Resource
|
||||
private MesDeviceMonitoringMapper mesDeviceMonitoringMapper;
|
||||
|
||||
|
||||
@Resource
|
||||
private DeviceMonitoringAlarmSrevice deviceMonitoringAlarmSrevice;
|
||||
|
||||
@Resource
|
||||
private RedisUtil redisUtil;
|
||||
|
||||
|
||||
@Resource
|
||||
private TbIronWarnInfoDao tbIronWarnInfoDao;
|
||||
|
||||
// 用于跟踪设备节点的报警状态
|
||||
private final Map<String, PageData> alarmStatusMap = new ConcurrentHashMap<>();
|
||||
|
||||
|
||||
// 用于报警延时确认机制的计数器
|
||||
private final Map<String, Integer> alarmConfirmCount = new ConcurrentHashMap<>();
|
||||
|
||||
|
||||
// 用于跟踪报警开始时间的映射
|
||||
private final Map<String, Long> alarmStartTimeMap = new ConcurrentHashMap<>();
|
||||
|
||||
|
||||
// 用于跟踪报警恢复开始时间的映射
|
||||
private final Map<String, Long> alarmRecoverStartTimeMap = new ConcurrentHashMap<>();
|
||||
|
||||
|
||||
// 用于存储当前报警信息的映射(避免存入过期的报警信息)
|
||||
private final Map<String, Map<String, Object>> currentAlarmInfo = new ConcurrentHashMap<>();
|
||||
|
||||
|
||||
// 报警确认次数阈值
|
||||
private static final int ALARM_CONFIRM_THRESHOLD = 3;
|
||||
|
||||
|
||||
// 最小报警持续时间(毫秒),默认30秒
|
||||
private static final long MIN_ALARM_DURATION = 30 * 1000;
|
||||
|
||||
|
|
@ -253,7 +253,7 @@ public class MesDataScheduled extends IJobHandler {
|
|||
// 当suffix为B1且A枪工作位_1不为0时,处理B1数据
|
||||
shouldProcess = true;
|
||||
}
|
||||
|
||||
|
||||
if (shouldProcess) {
|
||||
// 使用zl1TargetList中A1的配置项进行匹配
|
||||
final String targetKey;
|
||||
|
|
@ -340,22 +340,10 @@ public class MesDataScheduled extends IJobHandler {
|
|||
// 检查是否需要报警
|
||||
// 根据需求调整报警检查逻辑:
|
||||
// 1. 除尘器设备不检查(最高优先级)
|
||||
// 2. REPORT_ID不为空且不为空串时必须检查(次优先级)
|
||||
// 3. OPEN_ALARM为0时检查为1不检查(第三优先级)
|
||||
// 2. OPEN_ALARM为0时检查为1不检查(第二优先级)
|
||||
if (!key.contains("除尘器")) {
|
||||
String reportId = pageData.getString("REPORT_ID");
|
||||
String openAlarm = pageData.getString("OPEN_ALARM");
|
||||
|
||||
// REPORT_ID不为空且不为空串时必须检查(即使OPEN_ALARM为1也检查)
|
||||
if (reportId != null && !"".equals(reportId.trim())) {
|
||||
checkThresholdWithDelayConfirmation(mesData);
|
||||
}
|
||||
// OPEN_ALARM为1时不检查
|
||||
else if ("1".equals(openAlarm)) {
|
||||
// 不检查报警
|
||||
}
|
||||
// 其他情况正常检查(OPEN_ALARM为0或其他值)
|
||||
else {
|
||||
if ("0".equals(openAlarm)) {
|
||||
checkThresholdWithDelayConfirmation(mesData);
|
||||
}
|
||||
}
|
||||
|
|
@ -444,7 +432,7 @@ public class MesDataScheduled extends IJobHandler {
|
|||
|
||||
double currentValue = Double.parseDouble(currentValueStr);
|
||||
String equipmentKey = equipmentId + "_" + plcId;
|
||||
|
||||
|
||||
boolean isAlarm = false;
|
||||
String alarmType = "";
|
||||
|
||||
|
|
@ -485,24 +473,24 @@ public class MesDataScheduled extends IJobHandler {
|
|||
}
|
||||
|
||||
long currentTimestamp = System.currentTimeMillis();
|
||||
|
||||
|
||||
// 处理报警确认逻辑
|
||||
if (isAlarm) {
|
||||
// 如果超过阈值,增加计数
|
||||
int currentCount = alarmConfirmCount.getOrDefault(equipmentKey, 0) + 1;
|
||||
alarmConfirmCount.put(equipmentKey, currentCount);
|
||||
|
||||
|
||||
// 记录首次报警时间
|
||||
if (!alarmStartTimeMap.containsKey(equipmentKey)) {
|
||||
alarmStartTimeMap.put(equipmentKey, currentTimestamp);
|
||||
}
|
||||
|
||||
|
||||
// 清除恢复计时(如果有的话)
|
||||
alarmRecoverStartTimeMap.remove(equipmentKey);
|
||||
|
||||
|
||||
// 保存当前报警信息,确保后续处理的是最新的报警数据
|
||||
currentAlarmInfo.put(equipmentKey, new HashMap<>(data));
|
||||
|
||||
|
||||
// 检查是否满足最小持续时间要求
|
||||
Long startTime = alarmStartTimeMap.get(equipmentKey);
|
||||
if (startTime != null) {
|
||||
|
|
@ -512,7 +500,7 @@ public class MesDataScheduled extends IJobHandler {
|
|||
if (currentCount >= ALARM_CONFIRM_THRESHOLD) {
|
||||
data.put("WARNING", 1);
|
||||
data.put("OVERVIEW_OF_ALERTS", alarmType);
|
||||
XxlJobHelper.log("设备 {} 触发报警: {} (值: {},持续时间: {}ms)",
|
||||
XxlJobHelper.log("设备 {} 触发报警: {} (值: {},持续时间: {}ms)",
|
||||
equipmentKey, alarmType, currentValue, duration);
|
||||
}
|
||||
}
|
||||
|
|
@ -530,10 +518,10 @@ public class MesDataScheduled extends IJobHandler {
|
|||
alarmConfirmCount.remove(equipmentKey);
|
||||
alarmStartTimeMap.remove(equipmentKey);
|
||||
}
|
||||
|
||||
|
||||
// 清除当前报警信息
|
||||
currentAlarmInfo.remove(equipmentKey);
|
||||
|
||||
|
||||
// 确保WARNING字段为0,表示未报警
|
||||
data.put("WARNING", 0);
|
||||
data.put("OVERVIEW_OF_ALERTS", "");
|
||||
|
|
@ -576,11 +564,11 @@ public class MesDataScheduled extends IJobHandler {
|
|||
private void processAlarmData(ArrayList<Map<String, Object>> mesSaveList) {
|
||||
ArrayList<PageData> alarmLogArrayList = new ArrayList<>();
|
||||
ArrayList<PageData> activeAlarms = new ArrayList<>();
|
||||
|
||||
|
||||
for (Map<String, Object> item : mesSaveList) {
|
||||
// 检查是否有报警且是模拟量
|
||||
Object warningObj = item.get("WARNING");
|
||||
|
||||
|
||||
if (warningObj != null && "1".equals(String.valueOf(warningObj))) {
|
||||
// 只有当WARNING为1时才创建报警记录,这表示已经通过了延时确认机制
|
||||
PageData itemPageData = new PageData();
|
||||
|
|
@ -603,28 +591,28 @@ public class MesDataScheduled extends IJobHandler {
|
|||
itemPageData.put("CREATTIME", DateUtil.date2Str(new Date()));
|
||||
itemPageData.put("REPORT_ID", item.get("REPORT_ID"));
|
||||
alarmLogArrayList.add(itemPageData);
|
||||
|
||||
|
||||
// 添加到活跃报警列表,用于处理warninfo表
|
||||
activeAlarms.add(itemPageData);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 把报警的数据转存到数据库里
|
||||
if (!alarmLogArrayList.isEmpty()) {
|
||||
deviceMonitoringAlarmSrevice.saveBatch(alarmLogArrayList);
|
||||
XxlJobHelper.log("成功保存{}条报警数据到报警表", alarmLogArrayList.size());
|
||||
}
|
||||
|
||||
|
||||
// 将报警数据存入Redis
|
||||
if (!activeAlarms.isEmpty()) {
|
||||
redisUtil.set("MES_ALARM_DATA_LIST", JSONObject.toJSONString(activeAlarms));
|
||||
XxlJobHelper.log("成功将{}条报警数据存入Redis", activeAlarms.size());
|
||||
}
|
||||
|
||||
|
||||
// 处理告警信息表(tb_iron_warninfo)
|
||||
processWarnInfo(activeAlarms, mesSaveList);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 处理告警信息表(tb_iron_warninfo)
|
||||
* @param activeAlarms 当前活跃的报警
|
||||
|
|
@ -634,14 +622,14 @@ public class MesDataScheduled extends IJobHandler {
|
|||
// 获取当前时间
|
||||
String currentTime = DateUtil.date2Str(new Date());
|
||||
long currentTimestamp = System.currentTimeMillis();
|
||||
|
||||
|
||||
// 用于存储消警数据的列表
|
||||
ArrayList<PageData> recoverAlarms = new ArrayList<>();
|
||||
|
||||
|
||||
// 处理新产生的报警
|
||||
for (PageData alarm : activeAlarms) {
|
||||
String key = alarm.getString("EQUIPMENT_ID") + "_" + alarm.getString("PLC_ID") + "_" + alarm.getString("PLC_NAME");
|
||||
|
||||
|
||||
// 检查该监测点是否已有报警记录
|
||||
if (!alarmStatusMap.containsKey(key)) {
|
||||
// 新报警,创建告警信息
|
||||
|
|
@ -671,14 +659,14 @@ public class MesDataScheduled extends IJobHandler {
|
|||
|
||||
// 保存到数据库
|
||||
tbIronWarnInfoDao.saveWarnInfo(warnInfo);
|
||||
|
||||
|
||||
// 保存到alarmStatusMap中,用于跟踪状态
|
||||
alarmStatusMap.put(key, warnInfo);
|
||||
|
||||
|
||||
// 清除恢复计时(如果有的话)
|
||||
alarmRecoverStartTimeMap.remove(key);
|
||||
|
||||
XxlJobHelper.log("创建新的告警信息: 设备ID={}, PLC_ID={}, 报警内容={}",
|
||||
|
||||
XxlJobHelper.log("创建新的告警信息: 设备ID={}, PLC_ID={}, 报警内容={}",
|
||||
alarm.get("EQUIPMENT_ID"), alarm.get("PLC_ID"), alarm.get("OVERVIEW_OF_ALERTS"));
|
||||
} else {
|
||||
// 已存在报警,更新当前值和时间
|
||||
|
|
@ -686,26 +674,26 @@ public class MesDataScheduled extends IJobHandler {
|
|||
existingWarn.put("MESSAGE", "设备名称:"+ alarm.get("DEVICE_ID")+",监测节点:"+ alarm.get("PLC_NAME")+",报警内容:"+ alarm.get("OVERVIEW_OF_ALERTS"));
|
||||
existingWarn.put("OPERATTIME", currentTime);
|
||||
alarmStatusMap.put(key, existingWarn);
|
||||
|
||||
|
||||
// 清除恢复计时(如果有的话)
|
||||
alarmRecoverStartTimeMap.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 检查是否有报警恢复的节点
|
||||
Set<String> activeAlarmKeys = new HashSet<>();
|
||||
for (PageData alarm : activeAlarms) {
|
||||
String key = alarm.getString("EQUIPMENT_ID") + "_" + alarm.getString("PLC_ID") + "_" + alarm.getString("PLC_NAME");
|
||||
activeAlarmKeys.add(key);
|
||||
}
|
||||
|
||||
|
||||
// 检查之前报警但现在不报警的节点
|
||||
Iterator<Map.Entry<String, PageData>> iterator = alarmStatusMap.entrySet().iterator();
|
||||
while (iterator.hasNext()) {
|
||||
Map.Entry<String, PageData> entry = iterator.next();
|
||||
String key = entry.getKey();
|
||||
PageData warnInfo = entry.getValue();
|
||||
|
||||
|
||||
if (!activeAlarmKeys.contains(key)) {
|
||||
// 检查是否满足最小恢复持续时间要求
|
||||
Long recoverStartTime = alarmRecoverStartTimeMap.get(key);
|
||||
|
|
@ -713,7 +701,7 @@ public class MesDataScheduled extends IJobHandler {
|
|||
long recoverDuration = currentTimestamp - recoverStartTime;
|
||||
if (recoverDuration < MIN_ALARM_DURATION) {
|
||||
// 未达到最小恢复持续时间,暂不处理消警
|
||||
XxlJobHelper.log("设备 {} 恢复未达到最小持续时间 {}ms,当前持续时间 {}ms,暂不消警",
|
||||
XxlJobHelper.log("设备 {} 恢复未达到最小持续时间 {}ms,当前持续时间 {}ms,暂不消警",
|
||||
key, MIN_ALARM_DURATION, recoverDuration);
|
||||
continue;
|
||||
}
|
||||
|
|
@ -723,24 +711,24 @@ public class MesDataScheduled extends IJobHandler {
|
|||
XxlJobHelper.log("设备 {} 开始恢复计时", key);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
// 该节点之前报警,现在已经满足恢复条件,需要更新状态为已消警
|
||||
warnInfo.put("WARN_STATUS", "1"); // 1表示已消警
|
||||
warnInfo.put("END_TIME", currentTime); // 预警结束时间
|
||||
warnInfo.put("OPERATTIME", currentTime);
|
||||
|
||||
|
||||
// 更新数据库中的记录
|
||||
tbIronWarnInfoDao.updateWarnInfo(warnInfo);
|
||||
|
||||
|
||||
// 添加到消警列表中,用于存储到Redis
|
||||
recoverAlarms.add(warnInfo);
|
||||
|
||||
XxlJobHelper.log("更新告警信息为已消警: 设备ID={}, PLC_ID={}, 报警内容={}",
|
||||
|
||||
XxlJobHelper.log("更新告警信息为已消警: 设备ID={}, PLC_ID={}, 报警内容={}",
|
||||
warnInfo.get("EQUIPMENT_ID"), warnInfo.get("PLC_ID"), warnInfo.get("OVERVIEW_OF_ALERTS"));
|
||||
|
||||
|
||||
// 从跟踪map中移除
|
||||
iterator.remove();
|
||||
|
||||
|
||||
// 同时清除报警确认计数器、开始时间记录和恢复开始时间记录
|
||||
alarmConfirmCount.remove(key);
|
||||
alarmStartTimeMap.remove(key);
|
||||
|
|
@ -748,7 +736,7 @@ public class MesDataScheduled extends IJobHandler {
|
|||
currentAlarmInfo.remove(key);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 将消警数据存入Redis
|
||||
if (!recoverAlarms.isEmpty()) {
|
||||
// 获取现有的消警数据
|
||||
|
|
@ -766,4 +754,4 @@ public class MesDataScheduled extends IJobHandler {
|
|||
XxlJobHelper.log("成功将{}条消警数据存入Redis", recoverAlarms.size());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue