From 6066557d993311f139788ea595641485bd152461 Mon Sep 17 00:00:00 2001 From: wangyan Date: Wed, 3 Dec 2025 14:56:36 +0800 Subject: [PATCH] =?UTF-8?q?refactor(dataDocking):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E7=9B=91=E6=8E=A7=E6=8A=A5=E8=AD=A6=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=B9=B6=E6=B8=85=E7=90=86=E5=86=97=E4=BD=99=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了多个不必要的空行,提升代码可读性 - 简化了报警检查逻辑,删除关于REPORT_ID的特殊处理 - 优化报警确认机制和持续时间判断逻辑 - 统一了日志打印格式,便于问题追踪 - 清理了重复和无用的代码段,减少维护成本 - 保持核心功能不变,提高代码执行效率 --- .../dataDocking/MesDataScheduled.java | 108 ++++++++---------- 1 file changed, 48 insertions(+), 60 deletions(-) diff --git a/src/main/java/com/zcloud/scheduled/dataDocking/MesDataScheduled.java b/src/main/java/com/zcloud/scheduled/dataDocking/MesDataScheduled.java index 93b4bbf..0ca4303 100644 --- a/src/main/java/com/zcloud/scheduled/dataDocking/MesDataScheduled.java +++ b/src/main/java/com/zcloud/scheduled/dataDocking/MesDataScheduled.java @@ -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 alarmStatusMap = new ConcurrentHashMap<>(); - + // 用于报警延时确认机制的计数器 private final Map alarmConfirmCount = new ConcurrentHashMap<>(); - + // 用于跟踪报警开始时间的映射 private final Map alarmStartTimeMap = new ConcurrentHashMap<>(); - + // 用于跟踪报警恢复开始时间的映射 private final Map alarmRecoverStartTimeMap = new ConcurrentHashMap<>(); - + // 用于存储当前报警信息的映射(避免存入过期的报警信息) private final Map> 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> mesSaveList) { ArrayList alarmLogArrayList = new ArrayList<>(); ArrayList activeAlarms = new ArrayList<>(); - + for (Map 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 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 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> iterator = alarmStatusMap.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry 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()); } } -} \ No newline at end of file +}