Kaynağa Gözat

fix: 消息推送

jackzhou 6 ay önce
ebeveyn
işleme
64097917d2

+ 4 - 4
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/messagepush/LocalSensorAlarmMessagePushService.java

@@ -43,7 +43,7 @@ public class LocalSensorAlarmMessagePushService {
         for (String openid : openids) {
             // 判断该用户对该设备和告警类型的推送是否超过限制
             if (hasExceededPushLimit(openid, deviceID, alarmType)) {
-//                log.info("用户 {} 对设备 {} 的告警类型 {} \n在过去{}分钟内推送次数超过限制,跳过推送", openid, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 1000);
+                log.info("用户 {} 对设备 {} 的告警类型 {} \n在过去{}分钟内推送次数超过限制,跳过推送", openid, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 1000);
                 continue;
             }
             // 遍历每个接收人和通知渠道,发送告警信息
@@ -51,7 +51,9 @@ public class LocalSensorAlarmMessagePushService {
                 MessagePushService pushService = pushServices.get(channel.name());
                 if (pushService != null) {
                     try {
-                        pushService.sendAlarmMessage(alarm);
+                        boolean b = pushService.sendAlarmMessage(alarm);
+                        // 设置已通知状态
+                        alarm.setNotified(b);
                     } catch (Exception e) {
                         log.error("推送消息失败,渠道: {},错误: {}", channel.getChannelName(), e.getMessage());
                     }
@@ -62,8 +64,6 @@ public class LocalSensorAlarmMessagePushService {
             // 记录推送时间
             recordPushTime(openid, deviceID, alarmType);
         }
-        // 设置已通知状态
-        alarm.setNotified(true);
         // 将告警信息存储到数据库
         saveAlarmToDatabase(alarm);
     }

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

@@ -1,5 +1,6 @@
 package vip.xiaonuo.coldchain.core.alarm.service.messagepush;
 
+import cn.hutool.core.util.StrUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.annotation.Primary;
@@ -13,6 +14,7 @@ import vip.xiaonuo.coldchain.core.alarm.mapper.SensorAlarmMapper;
 import vip.xiaonuo.coldchain.core.config.JfcloudColdChainConstants;
 
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @author jackzhou
@@ -34,9 +36,19 @@ public class RedisSensorAlarmMessagePushService {
     public void pushAlarmMessage(SensorAlarm alarm) {
         String deviceID = alarm.getDeviceId();
         String alarmType = alarm.getAlarmType();
-//        List<String> openids = Optional.ofNullable(alarm.getAlarmUsers()).orElse(Collections.emptyList()).stream().filter(Objects::nonNull).map(SensorAlarmUser::getOpenId).filter(Objects::nonNull).toList();
-        for (SensorAlarmUser user : alarm.getAlarmUsers()) {
-            String openid=user.getUserId();
+        Map<String, SensorAlarmUser> users = Optional.ofNullable(alarm.getAlarmUsers()).orElse(Collections.emptyList()) // 如果为 null 则返回空集合
+                .stream().filter(Objects::nonNull) // 过滤掉 null 的用户
+                .filter(user -> StrUtil.isNotBlank(user.getOpenId())) // 过滤掉 openId 为空的用户
+                .collect(Collectors.toMap(SensorAlarmUser::getOpenId, // key 是 openId
+                        user -> user // value 是当前的 AlarmUser 对象
+                ));
+        if (users.isEmpty()) {
+            log.info("No user found for alarm {}", alarm);
+            return;
+        }
+        List<SensorAlarmUser> alarmUsers = users.values().stream().toList();
+        for (String openid : users.keySet()) {
+            SensorAlarmUser user = users.get(openid);
             if (hasExceededPushLimit(openid, deviceID, alarmType)) {
                 log.info("用户 {} 对设备 {} 的告警类型 {} \n在过去{}分钟内推送次数超过限制,跳过推送", openid, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 1000);
                 continue;
@@ -49,7 +61,7 @@ public class RedisSensorAlarmMessagePushService {
                     try {
                         boolean b = pushService.sendAlarmMessage(alarm);
                         alarm.setNotified(b);
-                        log.info("Alarm message sent successfully {},{}",channel.name(), alarm);
+                        log.info("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$Alarm message sent successfully {},{}", channel.name(), alarm);
                     } catch (Exception e) {
                         log.error("推送消息失败,渠道: {},错误: {}", channel.getChannelName(), e.getMessage());
                     }
@@ -59,6 +71,8 @@ public class RedisSensorAlarmMessagePushService {
             }
             recordPushTime(openid, deviceID, alarmType);
         }
+        // 还原这条消息的发送所有人
+        alarm.setAlarmUsers(alarmUsers);
         saveAlarmToDatabase(alarm);
     }
 

+ 2 - 2
snowy-web-app/src/main/resources/application.properties

@@ -27,13 +27,13 @@ spring.servlet.multipart.max-file-size=100MB
 
 # mysql
 spring.datasource.dynamic.datasource.master.driver-class-name=com.mysql.cj.jdbc.Driver
-spring.datasource.dynamic.datasource.master.url=jdbc:mysql://jfcloud-k6-mysql:3306/rkmonitor?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true
+spring.datasource.dynamic.datasource.master.url=jdbc:mysql://jfcloud-k6-mysql:3306/coldchain?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&useInformationSchema=true
 spring.datasource.dynamic.datasource.master.username=root
 spring.datasource.dynamic.datasource.master.password=Root123...
 spring.datasource.dynamic.strict=true
 
 # influxdb
-spring.data.influxdb.url=${INFLUXDB_URL:http://jfcloud-k6-mysql:8086}
+spring.data.influxdb.url=${INFLUXDB_URL:http://jfcloud-k6-influxdb:8086}
 ## 10.0.1.200
 #spring.data.influxdb.token=${INFLUXDB_TOKEN:1NdDyN3LCKIEBFkQ1AqAmRSitZGfdCs0nuF11nLQbTcnN_5mp_asnfFnmAXTvDDQXGr83llxuXJu5wNTPtrsIw==}
 # 公网的