Bladeren bron

fix:修复最大报警次数是异常。

黄渊昊 2 weken geleden
bovenliggende
commit
6fa15179c7

+ 19 - 13
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/messagepush/RedisSensorAlarmMessagePushService.java

@@ -59,8 +59,14 @@ public class RedisSensorAlarmMessagePushService {
             return;
         }
         List<SensorAlarmUser> alarmUsers = new ArrayList<>(users.values().stream().toList());
-        for (String openid : users.keySet()) {
-            SensorAlarmUser user = users.get(openid);
+
+        List<String> openIdList = alarmUsers.stream().map(SensorAlarmUser::getOpenId)
+                .filter(openId -> openId != null && !openId.trim().isEmpty()) // 过滤空值
+                .distinct() // 去重
+                .toList();
+        for (String openId : users.keySet()) {
+
+            SensorAlarmUser user = users.get(openId);
             // ✅ 1️⃣ 首先判断该设备或该路是否处于预警延期(禁用)状态
             if (deviceAlertDelayService.isAlertDelayed(deviceID, alarm.getSensorRoute()).getDelay()) {
                 log.info("设备 {} 第 {} 路处于延期预警状态(单路禁用),跳过推送", deviceID, alarm.getSensorRoute());
@@ -70,15 +76,21 @@ public class RedisSensorAlarmMessagePushService {
                 continue;
             }
             // ✅ 2️⃣ 再判断该用户是否超出推送频率限制
-            if (hasExceededPushLimit(openid, deviceID, alarm.getSensorRoute(), alarmType)) {
+            if (hasExceededPushLimit(openId, deviceID, alarm.getSensorRoute(), alarmType)) {
                 log.info("用户 {} 对设备 {} 的告警类型 {} 在过去 {} 分钟内推送次数超过限制,跳过推送",
-                        openid, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 1000);
+                        openId, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 1000);
                 delAlarmTime(deviceID, alarm.getSensorRoute(), alarmType);
                 continue;
             }
+
+            // 对每个用户进行判断,是否超过总体最大推送次数
+            if (hasExceededPushRegionLimit(openId, alarm.getSensorCode(), alarm.getSensorRoute(), alarm.getType())) {
+                continue;
+            }
+
             // 只对当前人发送预警消息
             alarm.setAlarmUsers(List.of(user));
-            recordPushTime(openid, deviceID, alarm.getSensorRoute(), alarmType);
+            recordPushTime(openId, deviceID, alarm.getSensorRoute(), alarmType);
             log.info("{}拥有的通知渠道:{}", alarm.getSensorCode(), alarm.getNotificationChannel());
             for (NotificationChannel channel : alarm.getNotificationChannel()) {
                 MessagePushService pushService = pushServices.get(channel.name());
@@ -86,12 +98,6 @@ public class RedisSensorAlarmMessagePushService {
                     try {
                         boolean b = false;
                         Long firstAlarmTime;
-                        for (SensorAlarmUser alarmUser : alarmUsers) {
-                            // 获取redis中记录的告警次数
-                            if (hasExceededPushRegionLimit(alarmUser.getOpenId(), alarm.getSensorCode(), alarm.getSensorRoute(), alarm.getType())) {
-                                alarmUsers.remove(alarmUser);
-                            }
-                        }
                         switch (alarm.getType()) {
                             case "0":
                                 log.info("发送设备 {} 第 {} 路 {} 告警消息", deviceID, alarm.getSensorRoute(), alarm.getAlarmType());
@@ -190,7 +196,7 @@ public class RedisSensorAlarmMessagePushService {
      * @param alarmType 告警类型(0:数据异常, 1:设备离线, 2:恢复通知, 4:其他类型)
      * @return true-超过限制, false-未超过限制
      */
-    public boolean hasExceededPushRegionLimit(String openid, String sensorCode, Integer sensorRoute, String alarmType) {
+    public boolean hasExceededPushRegionLimit(String openId, String sensorCode, Integer sensorRoute, String alarmType) {
         // 获取监控目标区域的配置信息
         MonitorTargetRegion monitorTargetRegion = monitorTargetRegionService.findOneByDeviceCodeAndSensorNo(sensorCode, sensorRoute);
         if (monitorTargetRegion == null) {
@@ -199,7 +205,7 @@ public class RedisSensorAlarmMessagePushService {
         }
 
         // 生成Redis存储的键
-        String key = generatePushHistoryCountKey(openid, sensorCode, sensorRoute, alarmType);
+        String key = generatePushHistoryCountKey(openId, sensorCode, sensorRoute, alarmType);
 
         // 从Redis获取推送历史计数
         Object countObj = redisTemplate.opsForValue().get(key);