refactor(dataDocking): 优化设备监控报警逻辑并清理冗余代码

- 移除了多个不必要的空行,提升代码可读性
- 简化了报警检查逻辑,删除关于REPORT_ID的特殊处理
- 优化报警确认机制和持续时间判断逻辑
- 统一了日志打印格式,便于问题追踪
- 清理了重复和无用的代码段,减少维护成本
- 保持核心功能不变,提高代码执行效率
dev
wangyan 2025-12-03 14:56:36 +08:00
parent 391164a205
commit 6066557d99
1 changed files with 48 additions and 60 deletions

View File

@ -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());
}
}
}
}