瀏覽代碼

feat:修改模板消息工具类,适配新的模板id

黄渊昊 4 月之前
父節點
當前提交
1c7df0c981
共有 13 個文件被更改,包括 432 次插入74 次删除
  1. 5 5
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/messagepush/impl/WechatMessagePushService.java
  2. 13 10
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/impl/MonitorDeviceServiceImpl.java
  3. 4 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/entity/MonitorDeviceType.java
  4. 5 2
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/enums/MonitorDeviceTypeEnum.java
  5. 1 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/param/MonitorTargetAddParam.java
  6. 1 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/param/MonitorTargetAddWithRoomParam.java
  7. 50 19
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/config/PushConfigure.java
  8. 3 3
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/param/AlarmPushParam.java
  9. 44 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/param/AlarmRecoverPushParam.java
  10. 41 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/param/OfflinePushParam.java
  11. 41 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/param/OnlinePushParam.java
  12. 206 19
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/utils/PushUtil.java
  13. 18 14
      snowy-web-app/src/main/resources/application.properties

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

@@ -5,7 +5,7 @@ import org.springframework.stereotype.Service;
 import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarm;
 import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
 import vip.xiaonuo.coldchain.core.alarm.service.messagepush.MessagePushService;
-import vip.xiaonuo.coldchain.modular.push.param.PushParam;
+import vip.xiaonuo.coldchain.modular.push.param.AlarmPushParam;
 import vip.xiaonuo.coldchain.modular.push.utils.PushUtil;
 
 import java.util.Date;
@@ -21,13 +21,13 @@ public class WechatMessagePushService implements MessagePushService {
 
     @Override
     public boolean sendAlarmMessage(SensorAlarm alarm/*, SensorAlarmUser user*/) {
-        PushParam pushParam = null;
+        AlarmPushParam pushParam = null;
         if (alarm.getValue() == 0 || alarm.getThreshold() == 0) {
-            pushParam = new PushParam();
+            pushParam = new AlarmPushParam();
             pushParam.setValue("Device Offline or Power Failure");
         } else {
             //数据异常
-            pushParam = new PushParam(alarm.getValue() + "/" + alarm.getThreshold());
+            pushParam = new AlarmPushParam(alarm.getValue() + "/" + alarm.getThreshold());
         }
         if (alarm.getMessage().length() > 17) {
             pushParam.setContext(alarm.getMessage().substring(0, 17) + "...");
@@ -45,7 +45,7 @@ public class WechatMessagePushService implements MessagePushService {
         pushParam.setType(alarm.getAlarmType());
         pushParam.setUserIdList(alarm.getAlarmUsers().stream().map(SensorAlarmUser::getOpenId).collect(Collectors.toSet()));
         //推送到公众号
-        String pushCode = PushUtil.push(pushParam);
+        String pushCode = PushUtil.alarmPush(pushParam);
         alarm.setWeixinRequestCode(pushCode);
         return !StrUtil.isBlank(pushCode);
     }

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

@@ -55,6 +55,7 @@ import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDevicePageParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.service.MonitorDeviceService;
 import vip.xiaonuo.coldchain.modular.monitordevicetype.entity.CountEntity;
 import vip.xiaonuo.coldchain.modular.monitordevicetype.entity.MonitorDeviceType;
+import vip.xiaonuo.coldchain.modular.monitordevicetype.enums.MonitorDeviceTypeEnum;
 import vip.xiaonuo.coldchain.modular.monitordevicetype.service.MonitorDeviceTypeService;
 import vip.xiaonuo.coldchain.modular.monitortarget.param.TargetStatus;
 import vip.xiaonuo.coldchain.modular.monitortarget.service.MonitorTargetService;
@@ -172,12 +173,15 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
         boolean save = this.save(monitorDevice);
         // 召唤设备默认参数
         if (save) {
-            try {
-                // 调用设备配置参数接口
-                renKeService.callParamIds(Integer.parseInt(monitorDevice.getDeviceCode()));
-            } catch (NumberFormatException e) {
-                // 如果设备编码不能解析为整数,抛出异常或记录日志
-//                throw new CommonException("设备编码解析失败,无法发送配置参数。设备编码: " + monitorDevice.getDeviceCode(), e + "请输入整数编码");
+            MonitorDeviceType monitorDeviceType = monitorDeviceTypeService.getByModelName(monitorDevice.getModelName());
+            if (monitorDeviceType.getName().equals(MonitorDeviceTypeEnum.RENKE.toString())) {
+                try {
+                    // 调用设备配置参数接口
+                    renKeService.callParamIds(Integer.parseInt(monitorDevice.getDeviceCode()));
+                } catch (NumberFormatException e) {
+                    // 如果设备编码不能解析为整数,抛出异常或记录日志
+                throw new CommonException("设备编码解析失败,无法发送配置参数。设备编码: " + monitorDevice.getDeviceCode(), e + "请输入整数编码");
+                }
             }
         } else {
             throw new CommonException("设备保存失败,设备编码: " + monitorDevice.getDeviceCode());
@@ -483,8 +487,7 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
         if (monitorDeviceTemplateList.size() > 1000) {
             throw new RuntimeException("超过最多处理条数");
         }
-        // 将 userExcelList 转成 userList
-        List<MonitorDevice> monitorDeviceList = new ArrayList<>();
+        List<MonitorDeviceAddParam> monitorDeviceList = new ArrayList<>();
         for (MonitorDeviceTemplate monitorDeviceTemplate : monitorDeviceTemplateList) {
             // 判断上下限输入是否合法
             if (!Objects.isNull(monitorDeviceTemplate.getTemperatureUp()) && !Objects.isNull(monitorDeviceTemplate.getTemperatureDown())) {
@@ -502,11 +505,11 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
                     throw new CommonException("设备:*" + monitorDeviceTemplate.getDeviceName() + "*的二氧化碳上下限填写有误");
                 }
             }
-            MonitorDevice monitorDevice = BeanUtil.copyProperties(monitorDeviceTemplate, MonitorDevice.class);
+            MonitorDeviceAddParam monitorDevice = BeanUtil.copyProperties(monitorDeviceTemplate, MonitorDeviceAddParam.class);
             monitorDeviceList.add(monitorDevice);
         }
         // 入库操作
-        this.saveBatch(monitorDeviceList);
+        monitorDeviceList.forEach(this::add);
     }
 
 }

+ 4 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/entity/MonitorDeviceType.java

@@ -105,4 +105,8 @@ public class MonitorDeviceType extends CommonEntity {
     /** 供电类型 */
     @Schema(description = "供电类型")
     private String powerType;
+
+    /** 厂家 */
+    @Schema(description = "厂家")
+    private String makers;
 }

+ 5 - 2
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/enums/MonitorDeviceTypeEnum.java

@@ -23,8 +23,11 @@ import lombok.Getter;
 @Getter
 public enum MonitorDeviceTypeEnum {
 
-    /** 测试 */
-    TEST("TEST");
+    /** 建大仁科 */
+    RENKE("建大仁科"),
+
+    /** 青萍物联 */
+    QINGPING("青萍物联");
 
     private final String value;
 

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/param/MonitorTargetAddParam.java

@@ -43,7 +43,7 @@ public class MonitorTargetAddParam {
      * 状态(1:正常,2:闲置)
      */
     @Schema(description = "状态(1:正常,2:闲置)")
-    @NotNull(message = "状态不能为空")
+//    @NotNull(message = "状态不能为空")
     private String status;
 
     /**

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/param/MonitorTargetAddWithRoomParam.java

@@ -43,7 +43,7 @@ public class MonitorTargetAddWithRoomParam {
      * 状态(1:正常,2:闲置)
      */
     @Schema(description = "状态(1:正常,2:闲置)")
-    @NotNull(message = "状态不能为空")
+//    @NotNull(message = "状态不能为空")
     private String status;
 
     /**

+ 50 - 19
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/config/PushConfigure.java

@@ -21,9 +21,24 @@ public class PushConfigure {
     private static String secret;
 
     /**
-     * 模板ID
+     * 设备告警模板ID
      */
-    private static String templateId;
+    private static String alarmsTemplateId;
+
+    /**
+     * 设备告警恢复模板ID
+     */
+    private static String alarmsRecoverTemplateId;
+
+    /**
+     * 设备上线模板ID
+     */
+    private static String OnlineTemplateId;
+
+    /**
+     * 设备下线模板ID
+     */
+    private static String offlineTemplateId;
 
     /**
      * 小程序appId
@@ -35,8 +50,8 @@ public class PushConfigure {
      */
     private static String pagePath;
 
-//    private static String redirectUrl;
 
+//    private static String redirectUrl;
     private static String accessTokenUrl;
 
     private static String userInfoUrl;
@@ -57,14 +72,6 @@ public class PushConfigure {
         PushConfigure.secret = secret;
     }
 
-    public static String getTemplateId() {
-        return templateId;
-    }
-
-    public void setTemplateId(String templateId) {
-        PushConfigure.templateId = templateId;
-    }
-
     public static String getMiniProgram() {
         return miniProgram;
     }
@@ -81,14 +88,6 @@ public class PushConfigure {
         PushConfigure.pagePath = pagePath;
     }
 
-//    public static String getRedirectUrl() {
-//        return redirectUrl;
-//    }
-//
-//    public void setRedirectUrl(String redirectUrl) {
-//        PushConfigure.redirectUrl = redirectUrl;
-//    }
-
     public static String getAccessTokenUrl() {
         return accessTokenUrl;
     }
@@ -105,4 +104,36 @@ public class PushConfigure {
         PushConfigure.userInfoUrl = getUserInfoUrl;
     }
 
+    public static String getOfflineTemplateId() {
+        return offlineTemplateId;
+    }
+
+    public void setOfflineTemplateId(String offlineTemplateId) {
+        PushConfigure.offlineTemplateId = offlineTemplateId;
+    }
+
+    public static String getOnlineTemplateId() {
+        return OnlineTemplateId;
+    }
+
+    public void setOnlineTemplateId(String onlineTemplateId) {
+        OnlineTemplateId = onlineTemplateId;
+    }
+
+    public static String getAlarmsRecoverTemplateId() {
+        return alarmsRecoverTemplateId;
+    }
+
+    public void setAlarmsRecoverTemplateId(String alarmsRecoverTemplateId) {
+        PushConfigure.alarmsRecoverTemplateId = alarmsRecoverTemplateId;
+    }
+
+    public static String getAlarmsTemplateId() {
+        return alarmsTemplateId;
+    }
+
+    public void setAlarmsTemplateId(String alarmsTemplateId) {
+        PushConfigure.alarmsTemplateId = alarmsTemplateId;
+    }
+
 }

+ 3 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/param/PushParam.java → snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/param/AlarmPushParam.java

@@ -9,7 +9,7 @@ import java.util.Set;
 
 @Getter
 @Setter
-public class PushParam {
+public class AlarmPushParam {
     /**
      * 用户openId
      */
@@ -39,10 +39,10 @@ public class PushParam {
      */
     private String userName = "管理员";
 
-    public PushParam(String value) {
+    public AlarmPushParam(String value) {
         this.value = value;
     }
 
-    public PushParam() {
+    public AlarmPushParam() {
     }
 }

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

@@ -0,0 +1,44 @@
+package vip.xiaonuo.coldchain.modular.push.param;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+@Getter
+@Setter
+public class AlarmRecoverPushParam {
+    /**
+     * 用户openId
+     */
+    private Set<String> userIdList = new HashSet<String>();
+    /**
+     * 设备名
+     */
+    private String deviceName;
+    /**
+     * 告警时间
+     */
+    private Date alarmTime;
+    /**
+     * 告警原因
+     */
+    private String alarmCause;
+    /**
+     * 恢复时间
+     */
+    private Date recoverTime;
+    /**
+     * 恢复原因
+     */
+    private String recoverCause;
+    /**
+     * 用户名
+     */
+    private String userName = "管理员";
+
+    public AlarmRecoverPushParam() {
+    }
+}

+ 41 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/param/OfflinePushParam.java

@@ -0,0 +1,41 @@
+package vip.xiaonuo.coldchain.modular.push.param;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+@Getter
+@Setter
+public class OfflinePushParam {
+    /**
+     * 用户openId
+     */
+    private Set<String> userIdList = new HashSet<String>();
+    /**
+     * 设备名
+     */
+    private String deviceName;
+    /**
+     * 设备状态(五个以内汉字)
+     */
+    private String status;
+    /**
+     * 设备位置
+     */
+    private String location;
+    /**
+     * 上线时间
+     */
+    private Date OfflineTime;
+
+    /**
+     * 用户名
+     */
+    private String userName = "管理员";
+
+    public OfflinePushParam() {
+    }
+}

+ 41 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/push/param/OnlinePushParam.java

@@ -0,0 +1,41 @@
+package vip.xiaonuo.coldchain.modular.push.param;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+@Getter
+@Setter
+public class OnlinePushParam {
+    /**
+     * 用户openId
+     */
+    private Set<String> userIdList = new HashSet<String>();
+    /**
+     * 设备名
+     */
+    private String deviceName;
+    /**
+     * 设备状态(五个以内汉字)
+     */
+    private String status;
+    /**
+     * 设备位置
+     */
+    private String location;
+    /**
+     * 上线时间
+     */
+    private Date OnlineTime;
+
+    /**
+     * 用户名
+     */
+    private String userName = "管理员";
+
+    public OnlinePushParam() {
+    }
+}

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

@@ -3,6 +3,7 @@ package vip.xiaonuo.coldchain.modular.push.utils;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Assert;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.mp.api.WxMpService;
@@ -13,12 +14,13 @@ import me.chanjar.weixin.mp.config.WxMpConfigStorage;
 import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
 import vip.xiaonuo.coldchain.modular.push.config.PushConfigure;
 import vip.xiaonuo.coldchain.modular.push.entity.WeChatUser;
-import vip.xiaonuo.coldchain.modular.push.param.PushParam;
+import vip.xiaonuo.coldchain.modular.push.param.AlarmPushParam;
+import vip.xiaonuo.coldchain.modular.push.param.AlarmRecoverPushParam;
+import vip.xiaonuo.coldchain.modular.push.param.OfflinePushParam;
+import vip.xiaonuo.coldchain.modular.push.param.OnlinePushParam;
 
 import java.time.LocalDateTime;
-import java.util.Date;
-import java.util.Map;
-import java.util.Objects;
+import java.util.*;
 
 /**
  * 推送类
@@ -44,47 +46,49 @@ public class PushUtil {
     }
 
     /**
-     * 消息推送主要业务代码
+     * 设备告警推送
      */
-    public static String push(PushParam pushParam) {
-        // 数据校验
-        if (Objects.isNull(pushParam) || Objects.isNull(pushParam.getUserIdList()) || pushParam.getUserIdList().isEmpty()) {
+    public static String alarmPush(AlarmPushParam pushParam) {
+        WxMpTemplateMessage.MiniProgram miniProgram = getMiniProgram(pushParam.getUserIdList());
+
+        if (Objects.isNull(miniProgram)) {
             return null;
         }
+
         //1,配置
         WxMpService wxMpService = new WxMpServiceImpl();
         wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
 
-        WxMpTemplateMessage.MiniProgram miniProgram = new WxMpTemplateMessage.MiniProgram();
-        String miniProgramAppId = PushConfigure.getMiniProgram();
-        miniProgram.setAppid(miniProgramAppId);//小程序appid
-        miniProgram.setUsePath(false);
-        miniProgram.setPagePath(PushConfigure.getPagePath());//用户点击时需要跳转的小程序页面
         // 推送消息
         String pushCode = "";
         for (String userId : pushParam.getUserIdList()) {
             WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                     .toUser(userId)
-                    .templateId(PushConfigure.getTemplateId())
+                    .templateId(PushConfigure.getAlarmsTemplateId())
                     .miniProgram(miniProgram)
                     .build();
             // 配置你的信息
-            if (Objects.isNull(pushParam.getDeviceName())) {
+            //设备名称
+            if (StrUtil.isBlank(pushParam.getDeviceName())) {
                 pushParam.setDeviceName(" ");
             }
             templateMessage.addData(new WxMpTemplateData("thing23", pushParam.getDeviceName()));
-            if (Objects.isNull(pushParam.getType())) {
+            //事件类型
+            if (StrUtil.isBlank(pushParam.getType())) {
                 pushParam.setType(" ");
             }
             templateMessage.addData(new WxMpTemplateData("thing8", pushParam.getType()));
-            if (Objects.isNull(pushParam.getValue())) {
+            //告警值
+            if (StrUtil.isBlank(pushParam.getValue())) {
                 pushParam.setValue(" ");
             }
             templateMessage.addData(new WxMpTemplateData("character_string28", pushParam.getValue()));
-            if (Objects.isNull(pushParam.getContext())) {
+            //异常原因
+            if (StrUtil.isBlank(pushParam.getContext())) {
                 pushParam.setContext(" ");
             }
             templateMessage.addData(new WxMpTemplateData("thing25", pushParam.getContext()));
+            //告警时间
             if (Objects.isNull(pushParam.getNoticeTime())) {
                 pushParam.setNoticeTime(new Date());
             }
@@ -94,12 +98,195 @@ public class PushUtil {
             try {
                 pushCode = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
             } catch (Exception e) {
-                e.printStackTrace();
+                throw new RuntimeException(e);
             }
         }
         return pushCode;
     }
 
+    /**
+     * 预警恢复消息推送
+     */
+    public static String alarmRecoverPush(AlarmRecoverPushParam pushParam) {
+        WxMpTemplateMessage.MiniProgram miniProgram = getMiniProgram(pushParam.getUserIdList());
+
+        if (Objects.isNull(miniProgram)) {
+            return null;
+        }
+
+        //1,配置
+        WxMpService wxMpService = new WxMpServiceImpl();
+        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
+
+        // 推送消息
+        String pushCode = "";
+        for (String userId : pushParam.getUserIdList()) {
+            WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                    .toUser(userId)
+                    .templateId(PushConfigure.getAlarmsRecoverTemplateId())
+                    .miniProgram(miniProgram)
+                    .build();
+            // 配置你的信息
+            //设备名
+            if (StrUtil.isBlank(pushParam.getDeviceName())) {
+                pushParam.setDeviceName(" ");
+            }
+            templateMessage.addData(new WxMpTemplateData("thing15", pushParam.getDeviceName()));
+            //告警时间
+            if (Objects.isNull(pushParam.getAlarmTime())) {
+                pushParam.setAlarmTime(new Date());
+            }
+            String alarmTimeFormat = DateUtil.format(pushParam.getAlarmTime(), "yyyy-MM-dd HH:mm:ss");
+            templateMessage.addData(new WxMpTemplateData("time5", alarmTimeFormat));
+            //告警原因
+            if (StrUtil.isBlank(pushParam.getAlarmCause())) {
+                pushParam.setAlarmCause(" ");
+            }
+            templateMessage.addData(new WxMpTemplateData("thing8", pushParam.getAlarmCause()));
+            //恢复时间
+            if (Objects.isNull(pushParam.getRecoverTime())) {
+                pushParam.setRecoverTime(new Date());
+            }
+            String recoverTimeFormat = DateUtil.format(pushParam.getRecoverTime(), "yyyy-MM-dd HH:mm:ss");
+            templateMessage.addData(new WxMpTemplateData("time6", recoverTimeFormat));
+            //恢复原因
+            if (StrUtil.isBlank(pushParam.getRecoverCause())) {
+                pushParam.setRecoverCause(" ");
+            }
+            templateMessage.addData(new WxMpTemplateData("time3", pushParam.getRecoverCause()));
+
+            try {
+                pushCode = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return pushCode;
+    }
+
+    /**
+     * 设备上线消息推送
+     */
+    public static String onlinePush(OnlinePushParam pushParam) {
+        WxMpTemplateMessage.MiniProgram miniProgram = getMiniProgram(pushParam.getUserIdList());
+
+        if (Objects.isNull(miniProgram)) {
+            return null;
+        }
+
+        //1,配置
+        WxMpService wxMpService = new WxMpServiceImpl();
+        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
+
+        // 推送消息
+        String pushCode = "";
+        for (String userId : pushParam.getUserIdList()) {
+            WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                    .toUser(userId)
+                    .templateId(PushConfigure.getOnlineTemplateId())
+                    .miniProgram(miniProgram)
+                    .build();
+            // 配置你的信息
+            //设备名
+            if (StrUtil.isBlank(pushParam.getDeviceName())) {
+                pushParam.setDeviceName(" ");
+            }
+            templateMessage.addData(new WxMpTemplateData("thing2", pushParam.getDeviceName()));
+            //设备状态
+            if (StrUtil.isBlank(pushParam.getStatus())) {
+                pushParam.setStatus(" ");
+            }
+            templateMessage.addData(new WxMpTemplateData("phrases3", pushParam.getStatus()));
+            //设备位置
+            if (StrUtil.isBlank(pushParam.getLocation())) {
+                pushParam.setLocation(" ");
+            }
+            templateMessage.addData(new WxMpTemplateData("thing8", 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));
+
+            try {
+                pushCode = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return pushCode;
+    }
+
+    /**
+     * 设备上线消息推送
+     */
+    public static String onlinePush(OfflinePushParam pushParam) {
+        WxMpTemplateMessage.MiniProgram miniProgram = getMiniProgram(pushParam.getUserIdList());
+
+        if (Objects.isNull(miniProgram)) {
+            return null;
+        }
+
+        //1,配置
+        WxMpService wxMpService = new WxMpServiceImpl();
+        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
+
+        // 推送消息
+        String pushCode = "";
+        for (String userId : pushParam.getUserIdList()) {
+            WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
+                    .toUser(userId)
+                    .templateId(PushConfigure.getOfflineTemplateId())
+                    .miniProgram(miniProgram)
+                    .build();
+            // 配置你的信息
+            //设备名
+            if (StrUtil.isBlank(pushParam.getDeviceName())) {
+                pushParam.setDeviceName(" ");
+            }
+            templateMessage.addData(new WxMpTemplateData("thing2", pushParam.getDeviceName()));
+            //设备状态
+            if (StrUtil.isBlank(pushParam.getStatus())) {
+                pushParam.setStatus(" ");
+            }
+            templateMessage.addData(new WxMpTemplateData("phrases3", pushParam.getStatus()));
+            //设备位置
+            if (StrUtil.isBlank(pushParam.getLocation())) {
+                pushParam.setLocation(" ");
+            }
+            templateMessage.addData(new WxMpTemplateData("thing17", pushParam.getLocation()));
+            //上线时间
+            if (Objects.isNull(pushParam.getOfflineTime())) {
+                pushParam.setOfflineTime(new Date());
+            }
+            String onlineTimeFormat = DateUtil.format(pushParam.getOfflineTime(), "yyyy-MM-dd HH:mm:ss");
+            templateMessage.addData(new WxMpTemplateData("time4", onlineTimeFormat));
+
+            try {
+                pushCode = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+        }
+        return pushCode;
+    }
+
+
+    private static WxMpTemplateMessage.MiniProgram getMiniProgram(Set<String> userIdList) {
+        // 数据校验
+        if (Objects.isNull(userIdList) || userIdList.isEmpty()) {
+            return null;
+        }
+        WxMpTemplateMessage.MiniProgram miniProgram = new WxMpTemplateMessage.MiniProgram();
+        String miniProgramAppId = PushConfigure.getMiniProgram();
+        miniProgram.setAppid(miniProgramAppId);//小程序appid
+        miniProgram.setUsePath(false);
+        miniProgram.setPagePath(PushConfigure.getPagePath());//用户点击时需要跳转的小程序页面
+        return miniProgram;
+    }
+
+
     public static WeChatUser getUserInfo(String code) {
         Map<?, ?> result = WeChatUtil.getAccessToken(code);
         String accessToken = result.get(ACCESS_TOKEN).toString();

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

@@ -36,23 +36,23 @@ spring.datasource.dynamic.strict=true
 spring.data.influxdb.url=${INFLUXDB_URL:http://jfcloud-k6-influxdb:8086}
 ## 10.0.1.200
 #spring.data.influxdb.token=${INFLUXDB_TOKEN:1NdDyN3LCKIEBFkQ1AqAmRSitZGfdCs0nuF11nLQbTcnN_5mp_asnfFnmAXTvDDQXGr83llxuXJu5wNTPtrsIw==}
-# 公网的
+# \u516C\u7F51\u7684
 spring.data.influxdb.token=${INFLUXDB_TOKEN:g2gXWbSJar3fmUKFkv4SVtTzPE-rX0-6aW5bDwgNOZXsD3tWL2PgAcCneH5WYcE9OmrMvLbvR-TMZrtX2d8ihQ==}
 spring.data.influxdb.org=${INFLUXDB_ORG:coldchain}
 spring.data.influxdb.bucket=${INFLUXDB_BUCKET:coldchain}
 
-## 温度超标报警模板
-#coldchain.alarm.message.temperatureOverLimit=温度报警:设备【{deviceName}】的温度超标!\n当前温度:{value} {unit},已超出上限(阈值:{thresholdUp})。\n报警时间:{time}
-## 温度过低报警模板
-#coldchain.alarm.message.temperatureBelowLimit=温度报警:设备【{deviceName}】的温度过低!\n当前温度:{value} {unit},已低于下限(阈值:{thresholdDown})。\n报警时间:{time}
-## 湿度超标报警模板
-#coldchain.alarm.message.humidityOverLimit=湿度报警:设备【{deviceName}】的湿度超标!\n当前湿度:{value} {unit},已超出上限(阈值:{thresholdUp})。\n报警时间:{time}
-## 湿度过低报警模板
-#coldchain.alarm.message.humidityBelowLimit=湿度报警:设备【{deviceName}】的湿度过低!\n当前湿度:{value} {unit},已低于下限(阈值:{thresholdDown})。\n报警时间:{time}
-## 二氧化碳超标报警模板
-#coldchain.alarm.message.co2OverLimit=二氧化碳报警:设备【{deviceName}】的二氧化碳浓度超标!\n当前浓度:{value} {unit},已超出上限(阈值:{thresholdUp})。\n报警时间:{time}
-## 二氧化碳过低报警模板
-#coldchain.alarm.message.co2BelowLimit=二氧化碳报警:设备【{deviceName}】的二氧化碳浓度过低!\n当前浓度:{value} {unit},已低于下限(阈值:{thresholdDown})。\n报警时间:{time}
+## \u6E29\u5EA6\u8D85\u6807\u62A5\u8B66\u6A21\u677F
+#coldchain.alarm.message.temperatureOverLimit=\u6E29\u5EA6\u62A5\u8B66\uFF1A\u8BBE\u5907\u3010{deviceName}\u3011\u7684\u6E29\u5EA6\u8D85\u6807\uFF01\n\u5F53\u524D\u6E29\u5EA6\uFF1A{value} {unit}\uFF0C\u5DF2\u8D85\u51FA\u4E0A\u9650\uFF08\u9608\u503C\uFF1A{thresholdUp}\uFF09\u3002\n\u62A5\u8B66\u65F6\u95F4\uFF1A{time}
+## \u6E29\u5EA6\u8FC7\u4F4E\u62A5\u8B66\u6A21\u677F
+#coldchain.alarm.message.temperatureBelowLimit=\u6E29\u5EA6\u62A5\u8B66\uFF1A\u8BBE\u5907\u3010{deviceName}\u3011\u7684\u6E29\u5EA6\u8FC7\u4F4E\uFF01\n\u5F53\u524D\u6E29\u5EA6\uFF1A{value} {unit}\uFF0C\u5DF2\u4F4E\u4E8E\u4E0B\u9650\uFF08\u9608\u503C\uFF1A{thresholdDown}\uFF09\u3002\n\u62A5\u8B66\u65F6\u95F4\uFF1A{time}
+## \u6E7F\u5EA6\u8D85\u6807\u62A5\u8B66\u6A21\u677F
+#coldchain.alarm.message.humidityOverLimit=\u6E7F\u5EA6\u62A5\u8B66\uFF1A\u8BBE\u5907\u3010{deviceName}\u3011\u7684\u6E7F\u5EA6\u8D85\u6807\uFF01\n\u5F53\u524D\u6E7F\u5EA6\uFF1A{value} {unit}\uFF0C\u5DF2\u8D85\u51FA\u4E0A\u9650\uFF08\u9608\u503C\uFF1A{thresholdUp}\uFF09\u3002\n\u62A5\u8B66\u65F6\u95F4\uFF1A{time}
+## \u6E7F\u5EA6\u8FC7\u4F4E\u62A5\u8B66\u6A21\u677F
+#coldchain.alarm.message.humidityBelowLimit=\u6E7F\u5EA6\u62A5\u8B66\uFF1A\u8BBE\u5907\u3010{deviceName}\u3011\u7684\u6E7F\u5EA6\u8FC7\u4F4E\uFF01\n\u5F53\u524D\u6E7F\u5EA6\uFF1A{value} {unit}\uFF0C\u5DF2\u4F4E\u4E8E\u4E0B\u9650\uFF08\u9608\u503C\uFF1A{thresholdDown}\uFF09\u3002\n\u62A5\u8B66\u65F6\u95F4\uFF1A{time}
+## \u4E8C\u6C27\u5316\u78B3\u8D85\u6807\u62A5\u8B66\u6A21\u677F
+#coldchain.alarm.message.co2OverLimit=\u4E8C\u6C27\u5316\u78B3\u62A5\u8B66\uFF1A\u8BBE\u5907\u3010{deviceName}\u3011\u7684\u4E8C\u6C27\u5316\u78B3\u6D53\u5EA6\u8D85\u6807\uFF01\n\u5F53\u524D\u6D53\u5EA6\uFF1A{value} {unit}\uFF0C\u5DF2\u8D85\u51FA\u4E0A\u9650\uFF08\u9608\u503C\uFF1A{thresholdUp}\uFF09\u3002\n\u62A5\u8B66\u65F6\u95F4\uFF1A{time}
+## \u4E8C\u6C27\u5316\u78B3\u8FC7\u4F4E\u62A5\u8B66\u6A21\u677F
+#coldchain.alarm.message.co2BelowLimit=\u4E8C\u6C27\u5316\u78B3\u62A5\u8B66\uFF1A\u8BBE\u5907\u3010{deviceName}\u3011\u7684\u4E8C\u6C27\u5316\u78B3\u6D53\u5EA6\u8FC7\u4F4E\uFF01\n\u5F53\u524D\u6D53\u5EA6\uFF1A{value} {unit}\uFF0C\u5DF2\u4F4E\u4E8E\u4E0B\u9650\uFF08\u9608\u503C\uFF1A{thresholdDown}\uFF09\u3002\n\u62A5\u8B66\u65F6\u95F4\uFF1A{time}
 
 # postgres
 #spring.datasource.dynamic.datasource.master.driver-class-name=org.postgresql.Driver
@@ -232,7 +232,7 @@ snowy.config.common.front-url=http://localhost:81
 snowy.config.common.backend-url=http://localhost:82
 
 
-# 微信小程序
+# \u5FAE\u4FE1\u5C0F\u7A0B\u5E8F
 logging.level.org.springframework.web=info
 logging.level.com.github.binarywang.demo.wx.miniapp=debug
 logging.level.cn.binarywang.wx.miniapp=debug
@@ -246,6 +246,10 @@ logging.level.me.chanjar.weixin.mp.api.impl=DEBUG
 wechat.appID=wx49b1fb6f9c0d0b8d
 wechat.secret=6b177348efc2b21da105fc126b933db9
 wechat.templateId=WgKOAJrnNhnr2lIkfI_vppfY--7oImjddrd4GPnE_UA
+wechat.alarmsTemplateId=WgKOAJrnNhnr2lIkfI_vppfY--7oImjddrd4GPnE_UA
+wechat.alarmsRecoverTemplateId=VTN3rREcSxV9Hv9WKgu_jyLDT9rsWyNMcLYKMZCgEgA
+wechat.OnlineTemplateId=nQXwP-WWRi71C2-9-EnYfDSuQ2ez1RBS585ra6aeKvM
+wechat.offlineTemplateId=qxBSnOKZcN6MpC8Vwpy1lyIfB8ZTxyITR3f-Bzv8zGs
 wechat.miniProgram=wx1eebc072a607c055
 wechat.accessTokenUrl=https://api.weixin.qq.com/sns/oauth2/access_token
 wechat.userInfoUrl=https://api.weixin.qq.com/sns/userinfo