From 9f2c303047b6f79ed3fe12f603d9aa749a2dae09 Mon Sep 17 00:00:00 2001 From: zq Date: Tue, 27 Jan 2026 17:26:11 +0800 Subject: [PATCH] =?UTF-8?q?topic=E8=AE=BE=E5=A4=87=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=B6=88=E6=81=AF5=E6=AC=A1=E6=B2=A1=E6=9C=89=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E5=86=85=E5=AE=B9=E5=88=99=E5=A2=9E=E5=8A=A0=E5=91=8A?= =?UTF-8?q?=E8=AD=A6=EF=BC=8C=E5=91=8A=E8=AD=A6=E7=AD=89=E7=BA=A7=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E2=80=9C=E4=B8=80=E8=88=AC=E2=80=9D=EF=BC=8C?= =?UTF-8?q?=E8=AF=BB=E5=88=B0=E6=95=B0=E6=8D=AE=E5=90=8E=E8=87=AA=E6=81=A2?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ems/service/IEmsAlarmRecordsService.java | 2 ++ .../impl/DeviceDataProcessServiceImpl.java | 25 ++++++++++++++++--- .../impl/EmsAlarmRecordsServiceImpl.java | 17 ++++++++++++- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/ems-system/src/main/java/com/xzzn/ems/service/IEmsAlarmRecordsService.java b/ems-system/src/main/java/com/xzzn/ems/service/IEmsAlarmRecordsService.java index b178467..9d8a906 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/IEmsAlarmRecordsService.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/IEmsAlarmRecordsService.java @@ -85,6 +85,8 @@ public interface IEmsAlarmRecordsService // topic 内没有数据,按照设备维度告警 public void addEmptyDataAlarmRecord(String siteId, String deviceId); + public void deleteEmptyDataAlarmRecord(String siteId, String deviceId); + // 告警字段和告警信息 public void initAlarmMatchInfo(); diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java index 4ba6573..fcb4274 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/DeviceDataProcessServiceImpl.java @@ -72,6 +72,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -91,6 +92,7 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i private static final Pattern PATTERN = Pattern.compile("(BMSD\\d{2})(ZT|SOC|SOH|DL|DY|BDSC)"); // 匹配DTDC+数字格式的正则(提取序号) private static final Pattern DTDC_PATTERN = Pattern.compile("DTDC(\\d+)([A-Za-z]*)"); + private final Map topicEmptyCounts = new ConcurrentHashMap<>(); @Autowired private EmsBatteryClusterMapper emsBatteryClusterMapper; @@ -166,12 +168,27 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i Date dataUpdateTime = DateUtils.convertUpdateTime(timestamp); log.info("deviceId:" + deviceId); + String deviceNumber = siteId + deviceId; boolean isEmpty = checkJsonDataEmpty(jsonData); if (isEmpty) { - // 添加设备告警 - iEmsAlarmRecordsService.addEmptyDataAlarmRecord(siteId, deviceId); + // 增加失败计数 + int failureCount = topicEmptyCounts.getOrDefault(deviceNumber, 0) + 1; + topicEmptyCounts.put(deviceNumber, failureCount); + + log.warn("设备 {} topic内没有数据,当前连续次数: {}", deviceId, failureCount); + + // 连续5次失败触发报警 + if (failureCount >= 5) { + // 添加设备告警 + iEmsAlarmRecordsService.addEmptyDataAlarmRecord(siteId, deviceId); + log.error("设备 {} 连续 {} 次topic内没有数据,触发告警", deviceNumber, failureCount); + } return; } + // 数据读取成功,重置计数器 + topicEmptyCounts.remove(deviceNumber); + // 读取到数据后告警自恢复 + iEmsAlarmRecordsService.deleteEmptyDataAlarmRecord(siteId, deviceId); // 存放mqtt原始每个设备最晚一次数据,便于后面点位获取数据 redisCache.setCacheObject(RedisKeyConstants.ORIGINAL_MQTT_DATA + siteId + "_" + deviceId, obj); @@ -1891,12 +1908,12 @@ public class DeviceDataProcessServiceImpl extends AbstractBatteryDataProcessor i boolean flag = false; try { if (StringUtils.isEmpty(jsonData)) { - flag = true; + return true; } JsonNode jsonNode = objectMapper.readTree(jsonData); // 判断是否为空对象({}) if (jsonNode.isObject() && jsonNode.isEmpty()) { - flag = true; + return true; } } catch (JsonProcessingException e) { throw new RuntimeException(e); diff --git a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsAlarmRecordsServiceImpl.java b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsAlarmRecordsServiceImpl.java index 92687b1..d9e13f2 100644 --- a/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsAlarmRecordsServiceImpl.java +++ b/ems-system/src/main/java/com/xzzn/ems/service/impl/EmsAlarmRecordsServiceImpl.java @@ -231,7 +231,7 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService if (emsAlarmRecords != null) { return; } - emsAlarmRecords = createAlarmAtPcs(siteId,topicDevice,"topic内没有数据",AlarmLevelStatus.EMERGENCY.getCode()); + emsAlarmRecords = createAlarmAtPcs(siteId,topicDevice,"topic内没有数据",AlarmLevelStatus.GENERAL.getCode()); emsAlarmRecordsMapper.insertEmsAlarmRecords(emsAlarmRecords); // 存redis-防止重复插入-有效期一天 @@ -252,6 +252,21 @@ public class EmsAlarmRecordsServiceImpl implements IEmsAlarmRecordsService return emsAlarmRecords; } + @Override + public void deleteEmptyDataAlarmRecord(String siteId, String topicDevice) { + String key = RedisKeyConstants.TOPIC_EMPTY_ALARM_RECORD + siteId + "_" + topicDevice; + EmsAlarmRecords emsAlarmRecords = redisCache.getCacheObject(key); + if (emsAlarmRecords == null) { + return; + } + emsAlarmRecords.setStatus(AlarmStatus.DONE.getCode()); + emsAlarmRecords.setUpdateTime(new Date()); + emsAlarmRecords.setAlarmEndTime(new Date()); + emsAlarmRecordsMapper.updateEmsAlarmRecords(emsAlarmRecords); + + redisCache.deleteObject(key); + } + private String createRandomTicketNo() { String ticketNo = ""; String nowDate = DateUtils.dateTime();