feat(ems): 增加低于阈值告警功能并优化告警系统

- 在 EmsRecordAlarmData 模型中更新异常类型定义,支持低于阈值告警
- 在 EmsRecordAlarmDataServiceImpl 中实现低于阈值和高于阈值的双重检查- 优化告警记录的创建逻辑,根据触发规则设置告警类型
- 调整代码结构,提高可读性和可维护性
boardTest
zch 1 month ago
parent 0f3cbb05c1
commit 49329f4055

@ -41,8 +41,8 @@ public class EmsRecordAlarmData extends BaseEntity
@Excel(name = "记录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @Excel(name = "记录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date collectTime; private Date collectTime;
/** 异常类型0超过阈值 1设备离线 */ /** 异常类型0超过阈值 1低于阈值 */
@Excel(name = "异常类型", readConverterExp = "0=超过阈值,1=设备离线") // @Excel(name = "异常类型", readConverterExp = "0=超过阈值,1=设备离线")
private Long alarmType; private Long alarmType;
/** 异常状态0已处理 1未处理 */ /** 异常状态0已处理 1未处理 */
@ -65,12 +65,12 @@ public class EmsRecordAlarmData extends BaseEntity
private String beginOperationTime; private String beginOperationTime;
private String endOperationTime; private String endOperationTime;
/** 备注 */ /** 原因 */
@Excel(name = "备注") @Excel(name = "原因")
private String cause; private String cause;
/** 通知用户 */ /** 通知用户 */
@Excel(name = "通知用户") // @Excel(name = "通知用户")
private String notifyUser; private String notifyUser;
/** 统一设备名称 */ /** 统一设备名称 */

@ -169,6 +169,7 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService
* 3. cause使 * 3. cause使
* 4. monitor_idmonitor_code * 4. monitor_idmonitor_code
* 5. * 5.
* 6. trigger_rule: 0=, 1=
*/ */
@Scheduled(cron = "0 */1 * * * ?") // 每分钟执行一次 @Scheduled(cron = "0 */1 * * * ?") // 每分钟执行一次
@Override @Override
@ -186,20 +187,27 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService
return; return;
} }
// 2. 查询所有启用的告警规则trigger_rule=0 超过阈值) // 2. 查询所有启用的告警规则(包括大于阈值和小于阈值)
EmsRecordAlarmRule queryRule = new EmsRecordAlarmRule(); List<EmsRecordAlarmRule> alarmRules = emsRecordAlarmRuleMapper.selectEmsRecordAlarmRuleList(new EmsRecordAlarmRule());
queryRule.setTriggerRule(0L); // 0表示超过阈值
List<EmsRecordAlarmRule> alarmRules = emsRecordAlarmRuleMapper.selectEmsRecordAlarmRuleList(queryRule); // 按触发规则分类
List<EmsRecordAlarmRule> greaterThanRules = new ArrayList<>();
List<EmsRecordAlarmRule> lessThanRules = new ArrayList<>();
System.out.println("查询到的阈值告警规则数量: " + alarmRules.size());
for (EmsRecordAlarmRule rule : alarmRules) { for (EmsRecordAlarmRule rule : alarmRules) {
System.out.println("规则详情 - 规则ID:" + rule.getObjId() + if (rule.getTriggerRule() != null) {
", 设备ID:" + rule.getMonitorId() + if (rule.getTriggerRule() == 0L) {
", 监测字段:" + rule.getMonitorField() + greaterThanRules.add(rule); // 大于阈值
", 阈值:" + rule.getTriggerValue()); } 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("没有启用的阈值告警规则"); System.out.println("没有启用的阈值告警规则");
return; return;
} }
@ -305,25 +313,46 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService
} }
} }
// 9. 阈值比较:检查所有相关字段 // 9. 阈值比较:根据触发规则检查所有相关字段
for (int i = 0; i < valuesToCheck.size(); i++) { for (int i = 0; i < valuesToCheck.size(); i++) {
BigDecimal actualValue = valuesToCheck.get(i); BigDecimal actualValue = valuesToCheck.get(i);
String fieldDesc = fieldDescriptions.get(i); String fieldDesc = fieldDescriptions.get(i);
if (actualValue != null && actualValue.compareTo(threshold) > 0) { if (actualValue != null) {
boolean isAlarmTriggered = false;
String alarmDescription = "";
// 根据触发规则判断是否触发告警
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); EmsRecordAlarmData alarmData = createAlarmData(record, rule, actualValue.toString(), fieldDesc);
candidateAlarms.add(alarmData); candidateAlarms.add(alarmData);
System.out.println("检测到阈值超标 - 设备:" + monitorId + System.out.println("检测到阈值异常 - 设备:" + monitorId +
", 字段:" + fieldDesc + ", 字段:" + fieldDesc +
", 实际值:" + actualValue + ", 实际值:" + actualValue +
", 阈值:" + threshold + ", 阈值:" + threshold +
", 异常类型:" + alarmDescription +
", 设备采集时间:" + record.getCollectTime() + ", 设备采集时间:" + record.getCollectTime() +
", 系统记录时间:" + record.getRecodeTime()); ", 系统记录时间:" + record.getRecodeTime());
} }
} }
} }
} }
}
// 10. 使用严格的去重逻辑插入异常数据 // 10. 使用严格的去重逻辑插入异常数据
if (!candidateAlarms.isEmpty()) { if (!candidateAlarms.isEmpty()) {
@ -524,7 +553,14 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService
alarmData.setMonitorId(record.getMonitorId()); alarmData.setMonitorId(record.getMonitorId());
// 关键修改存储recordTime而非collectTime确保时间准确性 // 关键修改存储recordTime而非collectTime确保时间准确性
alarmData.setCollectTime(record.getRecodeTime()); // 存储系统记录时间 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.setAlarmStatus(1L); // 1表示未处理
alarmData.setAlarmData(actualValue); // 记录实际超标数值 alarmData.setAlarmData(actualValue); // 记录实际超标数值
@ -551,7 +587,14 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService
alarmData.setMonitorId(record.getMonitorId()); alarmData.setMonitorId(record.getMonitorId());
// 关键修改存储recordTime而非collectTime确保时间准确性 // 关键修改存储recordTime而非collectTime确保时间准确性
alarmData.setCollectTime(record.getRecodeTime()); // 存储系统记录时间 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.setAlarmStatus(1L); // 1表示未处理
alarmData.setAlarmData(actualValue); // 记录实际超标数值 alarmData.setAlarmData(actualValue); // 记录实际超标数值

Loading…
Cancel
Save