From 8a69645044afb6305e2ba17ac073201d5795b9eb Mon Sep 17 00:00:00 2001 From: xiaohuo <14141624+dsgfhrh@user.noreply.gitee.com> Date: Sat, 8 Nov 2025 21:02:17 +0800 Subject: [PATCH] =?UTF-8?q?11.8=E9=A2=84=E8=AD=A6=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/AlertLaunchServiceImpl.java | 117 +++++++++++++++--- 1 file changed, 99 insertions(+), 18 deletions(-) diff --git a/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/impl/AlertLaunchServiceImpl.java b/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/impl/AlertLaunchServiceImpl.java index 9f8243de..87af6ec9 100644 --- a/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/impl/AlertLaunchServiceImpl.java +++ b/ALOps_sys_backend/alops-system/src/main/java/com/alops/system/service/impl/AlertLaunchServiceImpl.java @@ -229,6 +229,59 @@ public class AlertLaunchServiceImpl implements IAlertLaunchService { /** * 单条规则执行逻辑(独立事务执行,避免互相影响) */ +// @Transactional(propagation = Propagation.REQUIRES_NEW) +// public Map processRule(AlertRule rule, Integer currentBatch) { +// Map failureCountMap = new HashMap<>(); +// List messages = new ArrayList<>(); +// List msgs = new ArrayList<>(); +// +// try { +// boolean isChangedRule = "CHANGED".equalsIgnoreCase(rule.getAlertSql()); +// List> queryResults = isChangedRule +// ? handleChangedRule(rule) +// : jdbcTemplate.queryForList(rule.getAlertSql()); +// +// +// +// for (Map row : queryResults) { +// AlertMessage msg = new AlertMessage(); +// msg.setLevel(rule.getSeverity()); +// msg.setType(rule.getType()); +// msg.setOccurTime(new Date()); +// msg.setStatus("UNHANDLED"); +// +// String equId = row.get("equ_id") != null ? row.get("equ_id").toString() : null; +// msg.setEquId(equId); +// msg.setEquType(row.get("equ_type") != null ? row.get("equ_type").toString() : null); +// String msgdes = fillTemplate(rule.getAlertTemplate(), row, rule); +// +// msg.setBatch(currentBatch); +// msg.setMessage(msgdes); +// msg.setAlertRuleId(rule.getId()); +// messages.add(msg); +// msgs.add(msgdes); +// +// if (equId != null) { +// failureCountMap.put(equId, failureCountMap.getOrDefault(equId, 0) + 1); +// } +// } +// +// // ⚙️ 发送预警 & 入库 +// if (!messages.isEmpty()) { +// alertSender.sendAlert(msgs, rule.getAlertWay(), rule.getAlertStation()); +// insertAlertMessages(messages); +// } +// +// log.info("规则执行成功 → 规则ID={} 名称='{}',生成预警 {} 条", +// rule.getId(), rule.getRuleName(), messages.size()); +// +// } catch (Exception e) { +// // ⚠️ 独立事务自动回滚,不影响其他规则 +// log.error("【规则执行异常】规则ID={} 名称='{}',SQL={},原因:{}", +// rule.getId(), rule.getRuleName(), rule.getAlertSql(), e.getMessage(), e); +// } +// return failureCountMap; +// } @Transactional(propagation = Propagation.REQUIRES_NEW) public Map processRule(AlertRule rule, Integer currentBatch) { Map failureCountMap = new HashMap<>(); @@ -241,43 +294,71 @@ public class AlertLaunchServiceImpl implements IAlertLaunchService { ? handleChangedRule(rule) : jdbcTemplate.queryForList(rule.getAlertSql()); - for (Map row : queryResults) { - AlertMessage msg = new AlertMessage(); - msg.setLevel(rule.getSeverity()); - msg.setType(rule.getType()); - msg.setOccurTime(new Date()); - msg.setStatus("UNHANDLED"); + // 设备ID -> AlertMessage + Map messageMap = new HashMap<>(); + // 设备ID -> 拼接内容 + Map msgBuilderMap = new HashMap<>(); + for (Map row : queryResults) { String equId = row.get("equ_id") != null ? row.get("equ_id").toString() : null; - msg.setEquId(equId); - msg.setEquType(row.get("equ_type") != null ? row.get("equ_type").toString() : null); + String equType = row.get("equ_type") != null ? row.get("equ_type").toString() : null; + + // 当前行的描述 String msgdes = fillTemplate(rule.getAlertTemplate(), row, rule); - msg.setBatch(currentBatch); - msg.setMessage(msgdes); - msg.setAlertRuleId(rule.getId()); - messages.add(msg); - msgs.add(msgdes); + // 若设备ID为空,生成临时ID避免丢失记录 + if (equId == null) { + equId = UUID.randomUUID().toString(); + } - if (equId != null) { - failureCountMap.put(equId, failureCountMap.getOrDefault(equId, 0) + 1); + // 若该设备第一次出现,创建 AlertMessage 实体 + AlertMessage msg = messageMap.get(equId); + if (msg == null) { + msg = new AlertMessage(); + msg.setLevel(rule.getSeverity()); + msg.setType(rule.getType()); + msg.setOccurTime(new Date()); + msg.setStatus("UNHANDLED"); + msg.setEquId(equId); + msg.setEquType(equType); + msg.setBatch(currentBatch); + msg.setAlertRuleId(rule.getId()); + messageMap.put(equId, msg); + + msgBuilderMap.put(equId, new StringBuilder()); + + // ✅ 第一次遇到该设备时计数一次 + failureCountMap.put(equId, 1); } + + // 拼接消息(换行分隔) + msgBuilderMap.get(equId) + .append("- ").append(msgdes).append("\n"); } + // 拼接完成,填入 message 字段 + for (Map.Entry entry : messageMap.entrySet()) { + String equId = entry.getKey(); + AlertMessage msg = entry.getValue(); + msg.setMessage(msgBuilderMap.get(equId).toString().trim()); + messages.add(msg); + msgs.add(msg.getMessage()); + } + System.out.println("生成预警信息条数"+messageMap.size()); // ⚙️ 发送预警 & 入库 if (!messages.isEmpty()) { alertSender.sendAlert(msgs, rule.getAlertWay(), rule.getAlertStation()); insertAlertMessages(messages); } - log.info("规则执行成功 → 规则ID={} 名称='{}',生成预警 {} 条", - rule.getId(), rule.getRuleName(), messages.size()); + log.info("规则执行成功 → 规则ID={} 名称='{}',生成预警 {} 条(涉及设备数 {})", + rule.getId(), rule.getRuleName(), messages.size(), failureCountMap.size()); } catch (Exception e) { - // ⚠️ 独立事务自动回滚,不影响其他规则 log.error("【规则执行异常】规则ID={} 名称='{}',SQL={},原因:{}", rule.getId(), rule.getRuleName(), rule.getAlertSql(), e.getMessage(), e); } + return failureCountMap; }