浏览代码

feate: 用户的通知渠道设置

jackzhou 6 月之前
父节点
当前提交
7b598732a0

+ 8 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/bean/SensorAlarmUser.java

@@ -11,6 +11,14 @@ import lombok.Data;
  */
 @Data
 public class SensorAlarmUser {
+    public SensorAlarmUser() {
+    }
+
+    public SensorAlarmUser(String userId, String openId) {
+        this.userId = userId;
+        this.openId = openId;
+    }
+
     /**
      * 系统用户ID,唯一标识一个用户
      */

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

@@ -5,11 +5,13 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.stereotype.Component;
 import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarm;
+import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
 import vip.xiaonuo.coldchain.core.alarm.bean.SensorThreshold;
 import vip.xiaonuo.coldchain.core.alarm.config.ColdChainAlarmMessageProperties;
 import vip.xiaonuo.coldchain.core.alarm.service.threshold.SensorThresholdService;
 import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;
 import vip.xiaonuo.coldchain.core.event.SensorAlarmEvent;
+import vip.xiaonuo.coldchain.core.util.DateFormatter;
 
 import java.text.SimpleDateFormat;
 import java.util.Date;
@@ -35,7 +37,7 @@ public class DefaultSensorAlarmChecker implements SensorAlarmChecker {
             log.warn("没有找到设备 {} 的阈值配置", sensorData.getDeviceId());
             return false;
         }
-        final  String deviceName = threshold.getMonitorTargetRegion().getDeviceName();
+        final String deviceName = threshold.getMonitorTargetRegion().getDeviceName();
         // 检查传感器数据并触发报警
         boolean alarmTriggered = false;
         if (sensorData.getTemperature() != null) {
@@ -66,16 +68,17 @@ public class DefaultSensorAlarmChecker implements SensorAlarmChecker {
         String unit = getUnit(type);
         if (value > upperThreshold) {
             // 超过上限,触发超标报警
-            publishAlarm(type + "超标", value, unit, deviceName, time);
+            publishAlarm(type + "超标", value, unit, deviceName, time, upperThreshold);
             alarmTriggered = true;
         } else if (value < lowerThreshold) {
             // 低于下限,触发低于阈值报警
-            publishAlarm(type + "过低", value, unit, deviceName, time);
+            publishAlarm(type + "过低", value, unit, deviceName, time, lowerThreshold);
             alarmTriggered = true;
         }
         return alarmTriggered;
     }
 
+
     /**
      * 发布报警事件
      *
@@ -85,15 +88,30 @@ public class DefaultSensorAlarmChecker implements SensorAlarmChecker {
      * @param deviceName 设备名称
      * @param time       时间戳
      */
-    private void publishAlarm(String alarmType, Float value, String unit, String deviceName, String time) {
+    private void publishAlarm(String alarmType, Float value, String unit, String deviceName, String time, float threshold) {
         // 获取对应的报警消息模板
         String alarmMessage = getAlarmMessage(alarmType, value, unit, deviceName, time);
+        // 构建 SensorAlarm 对象
         SensorAlarm sensorAlarm = new SensorAlarm();
-        sensorAlarm.setAlarmType(alarmType);
-        // 发布报警事件(可以替换成实际的报警处理逻辑)
+        sensorAlarm.setAlarmType(alarmType);  // 设置报警类型(例如 温度超标、湿度过低等)
+        sensorAlarm.setValue(value);  // 设置传感器值
+        sensorAlarm.setAlarmTime(DateFormatter.now(new Date()));  // 设置单位(例如 °C, %, ppm)
+        sensorAlarm.setSource(deviceName);  // 设置设备名称
+        sensorAlarm.setDeviceName(deviceName);  // 设置设备名称
+        sensorAlarm.setPriority("高");  // 设置设备名称
+        sensorAlarm.setStatus("未处理");  // 设置设备名称
+        sensorAlarm.setAlarmTime(time);  // 设置报警时间
+        sensorAlarm.setMessage(alarmMessage);  // 设置报警消息
+        sensorAlarm.setThreshold(threshold);  // 设置预警值
+        sensorAlarm.getAlarmUsers().add(new SensorAlarmUser(null,"oltp26cDdkiAAsualbzKMyiZbJrU"));
+        sensorAlarm.getAlarmUsers().add(new SensorAlarmUser(null,"oltp26fXeljOKUxYGhAx_dRqVAak"));
+        // 打印日志(可选)
+        log.warn("触发报警: 类型: {}, 设备: {}, 值: {} {}, 时间: {}", alarmType, deviceName, value, unit, time);
+        // 发布报警事件
         applicationEventPublisher.publishEvent(new SensorAlarmEvent(this, sensorAlarm));
     }
 
+
     /**
      * 获取报警消息模板并替换占位符
      *

+ 7 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/util/DateFormatter.java

@@ -8,6 +8,7 @@ package vip.xiaonuo.coldchain.core.util;
  * @date 2024/11/22 14:50:28
  */
 
+import java.text.SimpleDateFormat;
 import java.time.Instant;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
@@ -121,5 +122,11 @@ public class DateFormatter {
         // 3. 返回格式化后的时间字符串
         return formatter.format(zonedDateTime);
     }
+
+    public static String now(Date instant) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        // 3. 返回格式化后的时间字符串
+        return formatter.format(instant);
+    }
 }
 

+ 9 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/entity/MonitorTarget.java

@@ -19,7 +19,9 @@ import com.google.common.collect.Lists;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;
 import lombok.Setter;
+import vip.xiaonuo.coldchain.core.alarm.bean.NotificationChannel;
 import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
+import vip.xiaonuo.coldchain.core.handler.NotificationChannelListTypeHandler;
 import vip.xiaonuo.coldchain.core.handler.SensorAlarmUserTypeHandler;
 import vip.xiaonuo.coldchain.modular.monitortargetregion.entity.MonitorTargetRegion;
 
@@ -122,4 +124,11 @@ public class MonitorTarget {
     @TableField(value = "alarm_users", typeHandler = SensorAlarmUserTypeHandler.class)
     @Schema(description = "告警接收人,存储告警通知的接收用户信息")
     private List<SensorAlarmUser> alarmUsers = Lists.newArrayList();
+
+    /**
+     * 用户的通知渠道设置,支持选择接收告警的多个渠道,如短信、邮件、APP通知等
+     */
+    @Schema(description = "用户的通知渠道设置,支持选择接收告警的多个渠道,如短信、邮件、APP通知等")
+    @TableField(value = "notification_channel", typeHandler = NotificationChannelListTypeHandler.class)
+    private List<NotificationChannel> notificationChannel = List.of(NotificationChannel.WECHAT);
 }

+ 9 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/entity/MonitorTargetRegion.java

@@ -22,7 +22,9 @@ import com.google.common.collect.Lists;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;
 import lombok.Setter;
+import vip.xiaonuo.coldchain.core.alarm.bean.NotificationChannel;
 import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
+import vip.xiaonuo.coldchain.core.handler.NotificationChannelListTypeHandler;
 import vip.xiaonuo.coldchain.core.handler.SensorAlarmUserTypeHandler;
 import vip.xiaonuo.coldchain.modular.app.param.FloatNullToDashSerializer;
 
@@ -192,4 +194,11 @@ public class MonitorTargetRegion {
     @Schema(description = "告警接收人,存储告警通知的接收用户信息")
     private List<SensorAlarmUser> alarmUsers = Lists.newArrayList();
 
+    /**
+     * 用户的通知渠道设置,支持选择接收告警的多个渠道,如短信、邮件、APP通知等
+     */
+    @Schema(description = "用户的通知渠道设置,支持选择接收告警的多个渠道,如短信、邮件、APP通知等")
+    @TableField(value = "notification_channel", typeHandler = NotificationChannelListTypeHandler.class)
+    private List<NotificationChannel> notificationChannel = List.of(NotificationChannel.WECHAT);
+
 }