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

- 在 EmsRecordAlarmData 模型中更新异常类型定义,支持低于阈值告警
- 在 EmsRecordAlarmDataServiceImpl 中实现低于阈值和高于阈值的双重检查- 优化告警记录的创建逻辑,根据触发规则设置告警类型
- 调整代码结构,提高可读性和可维护性
boardTest
zch 4 weeks 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")
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;
/** 统一设备名称 */

@ -169,6 +169,7 @@ public class EmsRecordAlarmDataServiceImpl implements IEmsRecordAlarmDataService
* 3. cause使
* 4. monitor_idmonitor_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<EmsRecordAlarmRule> alarmRules = emsRecordAlarmRuleMapper.selectEmsRecordAlarmRuleList(queryRule);
// 2. 查询所有启用的告警规则(包括大于阈值和小于阈值)
List<EmsRecordAlarmRule> alarmRules = emsRecordAlarmRuleMapper.selectEmsRecordAlarmRuleList(new EmsRecordAlarmRule());
// 按触发规则分类
List<EmsRecordAlarmRule> greaterThanRules = new ArrayList<>();
List<EmsRecordAlarmRule> 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); // 记录实际超标数值

Loading…
Cancel
Save