Эх сурвалжийг харах

fix:修复设备离线提醒/设备上线提醒/设备告警恢复提醒推送失败bug

黄渊昊 4 сар өмнө
parent
commit
bdd7259053

+ 3 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/offline/DeviceOfflineDetectionService.java

@@ -14,6 +14,7 @@ import vip.xiaonuo.coldchain.core.alarm.service.messagepush.LocalSensorAlarmMess
 import vip.xiaonuo.coldchain.core.alarm.service.messagepush.RedisSensorAlarmMessagePushService;
 import vip.xiaonuo.coldchain.core.event.SensorAlarmEvent;
 import vip.xiaonuo.coldchain.core.renke.config.JfcloudColdChainServerProperties;
+import vip.xiaonuo.coldchain.modular.monitordevice.entity.MonitorDevice;
 import vip.xiaonuo.coldchain.modular.monitordevice.service.MonitorDeviceService;
 import vip.xiaonuo.coldchain.modular.monitortarget.enums.MonitorStatusEnum;
 import vip.xiaonuo.coldchain.modular.monitortarget.service.MonitorTargetService;
@@ -134,7 +135,8 @@ public class DeviceOfflineDetectionService {
             } else {
                 // TODO
                 // 怎么之前是离线才推送它上线
-                if (redisSensorAlarmMessagePushService.hasExceededPushLimit("*", deviceCode, route,"设备离线")) {
+                MonitorTargetRegion monitorTargetRegion = monitorTargetRegionService.findOneByDeviceCodeAndSensorNo(deviceCode, route);
+                if (redisSensorAlarmMessagePushService.hasExceededPushLimitLike("*", monitorTargetRegion.getId(), route,"设备离线")) {
                     publishAlarm(deviceCode, route, lastReportTimeStr, "设备上线",SensorAlarmType.SENSOR_ON_LINE.getDeviceCode());
                 }
                 status = MonitorStatusEnum.ONLINE;

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/check/DefaultSensorAlarmChecker.java

@@ -91,7 +91,7 @@ public class DefaultSensorAlarmChecker implements SensorAlarmChecker {
         } else {
             //todo
             // SensorAlarmType.DATA_RESTORE_ALARM
-            if (redisSensorAlarmMessagePushService.hasExceededPushLimit("*", monitorTargetRegion.getDeviceCode(), monitorTargetRegion.getSensorRoute(),type + "??")) {
+            if (redisSensorAlarmMessagePushService.hasExceededPushLimitLike("*", monitorTargetRegion.getId(), monitorTargetRegion.getSensorRoute(),type + "*")) {
                 publishAlarm(type + "恢复", value, unit, time, upperThreshold, monitorTargetRegion
                         , SensorAlarmType.DATA_RESTORE_ALARM.getDeviceCode());
                 alarmTriggered = true;

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

@@ -65,10 +65,10 @@ public class RedisSensorAlarmMessagePushService {
                                 b = pushService.sendAlarmMessage(alarm);
                                 break;
                             case "1":
-                                b = pushService.sendAlarmRecoverMessage(alarm);
+                                b = pushService.sendOfflineMessage(alarm);
                                 break;
                             case "2":
-                                b = pushService.sendOfflineMessage(alarm);
+                                b = pushService.sendAlarmRecoverMessage(alarm);
                                 break;
                             case "4":
                                 b = pushService.sendOnlineMessage(alarm);
@@ -100,6 +100,24 @@ public class RedisSensorAlarmMessagePushService {
         return pushTimes.size() >= JfcloudColdChainConstants.MESS_PUSH_MAX_PUSH_COUNT;
     }
 
+    public boolean hasExceededPushLimitLike(String openid, String deviceID, Integer sensorRoute,  String alarmType) {
+        String key = generatePushHistoryKey(openid, deviceID, sensorRoute, alarmType);
+        Set<String> keys = redisTemplate.keys(key);
+        if (keys == null || keys.isEmpty()) {
+            return false;
+        }
+        for (String k : keys) {
+            if (k.endsWith("恢复") || k.endsWith("上线")) {
+                continue;
+            }
+            List<Object> pushTimes = redisTemplate.opsForList().range(k, 0, -1);
+            long currentTime = System.currentTimeMillis();
+            pushTimes.removeIf(time -> currentTime - (Long) time > JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW);
+            return pushTimes.size() >= JfcloudColdChainConstants.MESS_PUSH_MAX_PUSH_COUNT;
+        }
+        return false;
+    }
+
     private void recordPushTime(String openid, String deviceID, Integer sensorRoute, String alarmType) {
         String key = generatePushHistoryKey(openid, deviceID, sensorRoute, alarmType);
         long currentTime = System.currentTimeMillis();

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

@@ -59,7 +59,7 @@ public class WechatMessagePushService implements MessagePushService {
         pushParam.setDeviceName(alarm.getSource());
         pushParam.setRecoverTime(new Date());
         pushParam.setType(alarm.getAlarmType());
-        pushParam.setValue(alarm.getValue());
+        pushParam.setValue(alarm.getValue() + "/" + alarm.getThreshold());
         pushParam.setUserIdList(alarm.getAlarmUsers().stream().map(SensorAlarmUser::getOpenId).collect(Collectors.toSet()));
         if (alarm.getMessage().length() > 17) {
             pushParam.setRecoverCause(alarm.getMessage().substring(0, 17) + "...");
@@ -83,6 +83,7 @@ public class WechatMessagePushService implements MessagePushService {
         pushParam.setOfflineTime(new Date());
         pushParam.setDeviceName(alarm.getSource());
         pushParam.setStatus("离线");
+        pushParam.setUserIdList(alarm.getAlarmUsers().stream().map(SensorAlarmUser::getOpenId).collect(Collectors.toSet()));
         if (StrUtil.isNotBlank(alarm.getRoomName())) {
             pushParam.setLocation(alarm.getRoomName());
         }
@@ -96,7 +97,8 @@ public class WechatMessagePushService implements MessagePushService {
         OnlinePushParam pushParam = new OnlinePushParam();
         pushParam.setOnlineTime(new Date());
         pushParam.setDeviceName(alarm.getSource());
-        pushParam.setLocation("上线");
+        pushParam.setStatus("上线");
+        pushParam.setUserIdList(alarm.getAlarmUsers().stream().map(SensorAlarmUser::getOpenId).collect(Collectors.toSet()));
         if (StrUtil.isNotBlank(alarm.getRoomName())) {
             pushParam.setLocation(alarm.getRoomName());
         }

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/MonitorDeviceService.java

@@ -116,7 +116,7 @@ public interface MonitorDeviceService extends IService<MonitorDevice> {
      */
     CountEntity getIndexCount();
 
-    MonitorDevice queryByDeviceCode(Integer deviceId);
+    MonitorDevice queryByDeviceCode(String deviceId);
 
     /**
      * 下载导入模版

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/impl/MonitorDeviceServiceImpl.java

@@ -408,7 +408,7 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
     }
 
     @Override
-    public MonitorDevice queryByDeviceCode(Integer deviceId) {
+    public MonitorDevice queryByDeviceCode(String deviceId) {
         LambdaQueryWrapper<MonitorDevice> onlineDeviceQueryWrapper = new LambdaQueryWrapper<>();
         onlineDeviceQueryWrapper.eq(MonitorDevice::getDeviceCode, deviceId).eq(MonitorDevice::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
         return this.getOne(onlineDeviceQueryWrapper);

+ 2 - 2
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/param/AlarmRecoverPushParam.java

@@ -28,8 +28,8 @@ public class AlarmRecoverPushParam {
     /**
      * 告警值
      */
-    @Size(min = 1, max = 20)
-    private Float value;
+    @Size(min = 1, max = 32)
+    private String value;
     /**
      * 恢复时间
      */

+ 8 - 8
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/utils/PushUtil.java

@@ -139,11 +139,11 @@ public class PushUtil {
                 pushParam.setType(" ");
             }
             templateMessage.addData(new WxMpTemplateData("thing4", pushParam.getType()));
-            //恢复原因
-            if (StrUtil.isBlank(pushParam.getRecoverCause())) {
-                pushParam.setRecoverCause(" ");
+            //告警值
+            if (StrUtil.isBlank(pushParam.getValue())) {
+                pushParam.setValue(" ");
             }
-            templateMessage.addData(new WxMpTemplateData("number31", pushParam.getRecoverCause()));
+            templateMessage.addData(new WxMpTemplateData("character_string47", pushParam.getValue()));
             //恢复原因
             if (StrUtil.isBlank(pushParam.getRecoverCause())) {
                 pushParam.setRecoverCause(" ");
@@ -197,18 +197,18 @@ public class PushUtil {
             if (StrUtil.isBlank(pushParam.getStatus())) {
                 pushParam.setStatus(" ");
             }
-            templateMessage.addData(new WxMpTemplateData("phrases3", pushParam.getStatus()));
+            templateMessage.addData(new WxMpTemplateData("phrase3", pushParam.getStatus()));
             //设备位置
             if (StrUtil.isBlank(pushParam.getLocation())) {
                 pushParam.setLocation(" ");
             }
-            templateMessage.addData(new WxMpTemplateData("thing8", pushParam.getLocation()));
+            templateMessage.addData(new WxMpTemplateData("thing11", pushParam.getLocation()));
             //上线时间
             if (Objects.isNull(pushParam.getOnlineTime())) {
                 pushParam.setOnlineTime(new Date());
             }
             String onlineTimeFormat = DateUtil.format(pushParam.getOnlineTime(), "yyyy-MM-dd HH:mm:ss");
-            templateMessage.addData(new WxMpTemplateData("time6", onlineTimeFormat));
+            templateMessage.addData(new WxMpTemplateData("time4", onlineTimeFormat));
 
             try {
                 pushCode = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
@@ -251,7 +251,7 @@ public class PushUtil {
             if (StrUtil.isBlank(pushParam.getStatus())) {
                 pushParam.setStatus(" ");
             }
-            templateMessage.addData(new WxMpTemplateData("phrases3", pushParam.getStatus()));
+            templateMessage.addData(new WxMpTemplateData("phrase3", pushParam.getStatus()));
             //设备位置
             if (StrUtil.isBlank(pushParam.getLocation())) {
                 pushParam.setLocation(" ");

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

@@ -247,7 +247,7 @@ wechat.appID=wx49b1fb6f9c0d0b8d
 wechat.secret=6b177348efc2b21da105fc126b933db9
 wechat.templateId=WgKOAJrnNhnr2lIkfI_vppfY--7oImjddrd4GPnE_UA
 wechat.alarmsTemplateId=WgKOAJrnNhnr2lIkfI_vppfY--7oImjddrd4GPnE_UA
-wechat.alarmsRecoverTemplateId=VTN3rREcSxV9Hv9WKgu_j875Bux-_auOeOLO8EUTRgA
+wechat.alarmsRecoverTemplateId=	VTN3rREcSxV9Hv9WKgu_j7OwQuoVALjptMAwlZhfPH0
 wechat.OnlineTemplateId=nQXwP-WWRi71C2-9-EnYfDSuQ2ez1RBS585ra6aeKvM
 wechat.offlineTemplateId=qxBSnOKZcN6MpC8Vwpy1lyIfB8ZTxyITR3f-Bzv8zGs
 wechat.miniProgram=wx1eebc072a607c055