|
|
|
@ -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<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,25 +313,46 @@ 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) {
|
|
|
|
|
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);
|
|
|
|
|
candidateAlarms.add(alarmData);
|
|
|
|
|
|
|
|
|
|
System.out.println("检测到阈值超标 - 设备:" + monitorId +
|
|
|
|
|
System.out.println("检测到阈值异常 - 设备:" + monitorId +
|
|
|
|
|
", 字段:" + fieldDesc +
|
|
|
|
|
", 实际值:" + actualValue +
|
|
|
|
|
", 阈值:" + threshold +
|
|
|
|
|
", 异常类型:" + alarmDescription +
|
|
|
|
|
", 设备采集时间:" + record.getCollectTime() +
|
|
|
|
|
", 系统记录时间:" + record.getRecodeTime());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 10. 使用严格的去重逻辑插入异常数据
|
|
|
|
|
if (!candidateAlarms.isEmpty()) {
|
|
|
|
@ -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); // 记录实际超标数值
|
|
|
|
|
|
|
|
|
|