From 467c05265fdef2e9d56d78812b43e9d7d68d5979 Mon Sep 17 00:00:00 2001 From: tianyongbao Date: Sun, 26 Apr 2026 07:24:50 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E5=A4=AA=E9=98=B3=E8=83=BD=E7=BD=91?= =?UTF-8?q?=E6=8E=A7=EF=BC=8C=E7=A6=BB=E7=BA=BF=E6=8A=A5=E8=AD=A6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E9=85=8D=E7=BD=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application-dev.yml | 2 ++ .../intc/iot/config/AliyunIotProperties.java | 7 +++++++ .../intc/iot/handler/DeviceDataHandler.java | 19 ++++++++++++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/intc-admin/src/main/resources/application-dev.yml b/intc-admin/src/main/resources/application-dev.yml index c52e23d..52e75cd 100644 --- a/intc-admin/src/main/resources/application-dev.yml +++ b/intc-admin/src/main/resources/application-dev.yml @@ -245,6 +245,8 @@ aliyun: call-success-suppress-hours: 2 # 设备离线告警延迟触发时间(分钟),设备离线超过此时间后才发送告警 offline-warn-delay-minutes: 6 + # 太阳能网控离线告警延迟触发时间(分钟),工作1分钟休眠同分钟为正常行为,需要更长延迟 + solar-offline-warn-delay-minutes: 30 # 是否启用报警电话通知(全局开关,关闭后所有类型的报警都不会触发电话通知) call-notice-enabled: false # AMQP 服务端订阅配置(使用数据同步的 AppKey + AppSecret) diff --git a/intc-modules/intc-iot/src/main/java/com/intc/iot/config/AliyunIotProperties.java b/intc-modules/intc-iot/src/main/java/com/intc/iot/config/AliyunIotProperties.java index 18a3798..a21393c 100644 --- a/intc-modules/intc-iot/src/main/java/com/intc/iot/config/AliyunIotProperties.java +++ b/intc-modules/intc-iot/src/main/java/com/intc/iot/config/AliyunIotProperties.java @@ -89,6 +89,13 @@ public class AliyunIotProperties { */ private int offlineWarnDelayMinutes = 6; + /** + * 太阳能网控离线告警延迟触发时间(分钟) + * 太阳能网控工作1分钟、休眠10分钟属于正常行为,需要更长的延迟才能判定为真正离线 + * 默认 30 分钟 + */ + private int solarOfflineWarnDelayMinutes = 30; + /** * 夜间溶解氧饱和度告警阈值(%),超过此值时开始计时 * 对应 C# DeviceSaturabilityWarnValue = 200 diff --git a/intc-modules/intc-iot/src/main/java/com/intc/iot/handler/DeviceDataHandler.java b/intc-modules/intc-iot/src/main/java/com/intc/iot/handler/DeviceDataHandler.java index c4339c9..2430cb2 100644 --- a/intc-modules/intc-iot/src/main/java/com/intc/iot/handler/DeviceDataHandler.java +++ b/intc-modules/intc-iot/src/main/java/com/intc/iot/handler/DeviceDataHandler.java @@ -888,8 +888,25 @@ public class DeviceDataHandler { log.debug("[离线告警] 已有等待标记,跳过重复写入: {}", deviceName); return; } - String offlineTime = LocalDateTime.now().format(DATETIME_FORMATTER); + + // 查询设备类型,太阳能网控(type=3)使用独立的延迟时长 int offlineDelayMinutes = aliyunIotProperties.getOfflineWarnDelayMinutes(); + try { + Device deviceForType = deviceMapper.selectOne( + new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(Device::getSerialNum, deviceName) + .select(Device::getDeviceType) + .last("LIMIT 1") + ); + if (deviceForType != null && Integer.valueOf(3).equals(deviceForType.getDeviceType())) { + offlineDelayMinutes = aliyunIotProperties.getSolarOfflineWarnDelayMinutes(); + log.debug("[离线告警] 太阳能网控设备,使用延迟 {} 分钟: {}", offlineDelayMinutes, deviceName); + } + } catch (Exception e) { + log.warn("[离线告警] 查询设备类型失败,使用默认延迟: {}", e.getMessage()); + } + + String offlineTime = LocalDateTime.now().format(DATETIME_FORMATTER); int ttlMinutes = offlineDelayMinutes * OFFLINE_WAIT_TTL_MULTIPLIER; RedisUtils.setCacheObject(redisKey, offlineTime, Duration.ofMinutes(ttlMinutes)); log.info("[离线告警] 设备离线,已记录等待标记,将在 {} 分钟后触发告警: {}", offlineDelayMinutes, deviceName);