From 49329f4055d9c3f4ec18ed07321c99f19f5c2dc5 Mon Sep 17 00:00:00 2001 From: zch Date: Tue, 27 May 2025 13:19:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(ems):=20=E5=A2=9E=E5=8A=A0=E4=BD=8E?= =?UTF-8?q?=E4=BA=8E=E9=98=88=E5=80=BC=E5=91=8A=E8=AD=A6=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=B9=B6=E4=BC=98=E5=8C=96=E5=91=8A=E8=AD=A6=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 EmsRecordAlarmData 模型中更新异常类型定义,支持低于阈值告警 - 在 EmsRecordAlarmDataServiceImpl 中实现低于阈值和高于阈值的双重检查- 优化告警记录的创建逻辑,根据触发规则设置告警类型 - 调整代码结构,提高可读性和可维护性 --- .../ems/record/domain/EmsRecordAlarmData.java | 10 +-- .../impl/EmsRecordAlarmDataServiceImpl.java | 87 ++++++++++++++----- 2 files changed, 70 insertions(+), 27 deletions(-) diff --git a/os-ems/src/main/java/com/os/ems/record/domain/EmsRecordAlarmData.java b/os-ems/src/main/java/com/os/ems/record/domain/EmsRecordAlarmData.java index 2d0c4f6..5335321 100644 --- a/os-ems/src/main/java/com/os/ems/record/domain/EmsRecordAlarmData.java +++ b/os-ems/src/main/java/com/os/ems/record/domain/EmsRecordAlarmData.java @@ -41,8 +41,8 @@ public class EmsRecordAlarmData extends BaseEntity @Excel(name = "记录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date collectTime; - /** 异常类型(0超过阈值 1设备离线) */ - @Excel(name = "异常类型", readConverterExp = "0=超过阈值,1=设备离线") + /** 异常类型(0超过阈值 1低于阈值) */ +// @Excel(name = "异常类型", readConverterExp = "0=超过阈值,1=设备离线") private Long alarmType; /** 异常状态(0已处理 1未处理) */ @@ -65,12 +65,12 @@ public class EmsRecordAlarmData extends BaseEntity private String beginOperationTime; private String endOperationTime; - /** 备注 */ - @Excel(name = "备注") + /** 原因 */ + @Excel(name = "原因") private String cause; /** 通知用户 */ - @Excel(name = "通知用户") +// @Excel(name = "通知用户") private String notifyUser; /** 统一设备名称 */ diff --git a/os-ems/src/main/java/com/os/ems/record/service/impl/EmsRecordAlarmDataServiceImpl.java b/os-ems/src/main/java/com/os/ems/record/service/impl/EmsRecordAlarmDataServiceImpl.java index 2a446f0..1925ee7 100644 --- a/os-ems/src/main/java/com/os/ems/record/service/impl/EmsRecordAlarmDataServiceImpl.java +++ b/os-ems/src/main/java/com/os/ems/record/service/impl/EmsRecordAlarmDataServiceImpl.java @@ -169,6 +169,7 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService * 3. 优化异常记录的cause字段,使用字典描述而非数据库字段名 * 4. 修复数据关联:monitor_id存储的是monitor_code值,与采集数据分表保持一致 * 5. 完全重构去重逻辑:确保绝对不会产生重复数据 + * 6. 支持大于阈值和小于阈值双重检查(trigger_rule: 0=大于阈值, 1=小于阈值) */ @Scheduled(cron = "0 */1 * * * ?") // 每分钟执行一次 @Override @@ -186,20 +187,27 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService return; } - // 2. 查询所有启用的告警规则(trigger_rule=0 超过阈值) - EmsRecordAlarmRule queryRule = new EmsRecordAlarmRule(); - queryRule.setTriggerRule(0L); // 0表示超过阈值 - List alarmRules = emsRecordAlarmRuleMapper.selectEmsRecordAlarmRuleList(queryRule); + // 2. 查询所有启用的告警规则(包括大于阈值和小于阈值) + List alarmRules = emsRecordAlarmRuleMapper.selectEmsRecordAlarmRuleList(new EmsRecordAlarmRule()); + + // 按触发规则分类 + List greaterThanRules = new ArrayList<>(); + List lessThanRules = new ArrayList<>(); - System.out.println("查询到的阈值告警规则数量: " + alarmRules.size()); for (EmsRecordAlarmRule rule : alarmRules) { - System.out.println("规则详情 - 规则ID:" + rule.getObjId() + - ", 设备ID:" + rule.getMonitorId() + - ", 监测字段:" + rule.getMonitorField() + - ", 阈值:" + rule.getTriggerValue()); + if (rule.getTriggerRule() != null) { + if (rule.getTriggerRule() == 0L) { + greaterThanRules.add(rule); // 大于阈值 + } else if (rule.getTriggerRule() == 1L) { + lessThanRules.add(rule); // 小于阈值 + } + } } - if (alarmRules.isEmpty()) { + System.out.println("查询到的告警规则 - 大于阈值规则: " + greaterThanRules.size() + + " 条, 小于阈值规则: " + lessThanRules.size() + " 条"); + + if (greaterThanRules.isEmpty() && lessThanRules.isEmpty()) { System.out.println("没有启用的阈值告警规则"); return; } @@ -305,21 +313,42 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService } } - // 9. 阈值比较:检查所有相关字段 + // 9. 阈值比较:根据触发规则检查所有相关字段 for (int i = 0; i < valuesToCheck.size(); i++) { BigDecimal actualValue = valuesToCheck.get(i); String fieldDesc = fieldDescriptions.get(i); - if (actualValue != null && actualValue.compareTo(threshold) > 0) { - EmsRecordAlarmData alarmData = createAlarmData(record, rule, actualValue.toString(), fieldDesc); - candidateAlarms.add(alarmData); + if (actualValue != null) { + boolean isAlarmTriggered = false; + String alarmDescription = ""; - System.out.println("检测到阈值超标 - 设备:" + monitorId + - ", 字段:" + fieldDesc + - ", 实际值:" + actualValue + - ", 阈值:" + threshold + - ", 设备采集时间:" + record.getCollectTime() + - ", 系统记录时间:" + record.getRecodeTime()); + // 根据触发规则判断是否触发告警 + if (rule.getTriggerRule() == 0L) { + // 大于阈值检查 + if (actualValue.compareTo(threshold) > 0) { + isAlarmTriggered = true; + alarmDescription = "大于阈值"; + } + } else if (rule.getTriggerRule() == 1L) { + // 小于阈值检查 + if (actualValue.compareTo(threshold) < 0) { + isAlarmTriggered = true; + alarmDescription = "小于阈值"; + } + } + + if (isAlarmTriggered) { + EmsRecordAlarmData alarmData = createAlarmData(record, rule, actualValue.toString(), fieldDesc); + candidateAlarms.add(alarmData); + + System.out.println("检测到阈值异常 - 设备:" + monitorId + + ", 字段:" + fieldDesc + + ", 实际值:" + actualValue + + ", 阈值:" + threshold + + ", 异常类型:" + alarmDescription + + ", 设备采集时间:" + record.getCollectTime() + + ", 系统记录时间:" + record.getRecodeTime()); + } } } } @@ -524,7 +553,14 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService alarmData.setMonitorId(record.getMonitorId()); // 关键修改:存储recordTime而非collectTime,确保时间准确性 alarmData.setCollectTime(record.getRecodeTime()); // 存储系统记录时间 - alarmData.setAlarmType(0L); // 0表示超过阈值 + + // 根据触发规则设置告警类型:0=大于阈值,1=小于阈值 + if (rule.getTriggerRule() != null && rule.getTriggerRule() == 1L) { + alarmData.setAlarmType(1L); // 小于阈值 + } else { + alarmData.setAlarmType(0L); // 大于阈值(默认) + } + alarmData.setAlarmStatus(1L); // 1表示未处理 alarmData.setAlarmData(actualValue); // 记录实际超标数值 @@ -551,7 +587,14 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService alarmData.setMonitorId(record.getMonitorId()); // 关键修改:存储recordTime而非collectTime,确保时间准确性 alarmData.setCollectTime(record.getRecodeTime()); // 存储系统记录时间 - alarmData.setAlarmType(0L); // 0表示超过阈值 + + // 根据触发规则设置告警类型:0=大于阈值,1=小于阈值 + if (rule.getTriggerRule() != null && rule.getTriggerRule() == 1L) { + alarmData.setAlarmType(1L); // 小于阈值 + } else { + alarmData.setAlarmType(0L); // 大于阈值(默认) + } + alarmData.setAlarmStatus(1L); // 1表示未处理 alarmData.setAlarmData(actualValue); // 记录实际超标数值