Sfoglia il codice sorgente

fix: 报警消息服务

jackzhou 6 mesi fa
parent
commit
edf8e0ac57
13 ha cambiato i file con 322 aggiunte e 96 eliminazioni
  1. 18 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/SensorAlarmService.java
  2. 86 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/SensorAlarmServiceImpl.java
  3. 1 9
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/check/DefaultSensorAlarmChecker.java
  4. 3 6
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/messagepush/LocalSensorAlarmMessagePushService.java
  5. 92 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/messagepush/RedisSensorAlarmMessagePushService.java
  6. 3 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/cache/monitordevice/factory/MonitorDeviceCacheServiceFactory.java
  7. 11 8
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/config/JfcloudColdChainConstants.java
  8. 13 3
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/event/SensorAlarmEventListener.java
  9. 5 4
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/controller/AppController.java
  10. 1 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/AppDevicePageParam.java
  11. 3 18
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/Message.java
  12. 74 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/MessagePageParam.java
  13. 12 46
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/service/MessageService.java

+ 18 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/SensorAlarmService.java

@@ -0,0 +1,18 @@
+package vip.xiaonuo.coldchain.core.alarm.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarm;
+import vip.xiaonuo.coldchain.modular.app.param.Message;
+import vip.xiaonuo.coldchain.modular.app.param.MessagePageParam;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/27 16:54:53
+ */
+public interface SensorAlarmService extends IService<SensorAlarm> {
+    Page<Message> getMessages(MessagePageParam messagePageParam);
+}

+ 86 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/SensorAlarmServiceImpl.java

@@ -0,0 +1,86 @@
+package vip.xiaonuo.coldchain.core.alarm.service;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarm;
+import vip.xiaonuo.coldchain.core.alarm.mapper.SensorAlarmMapper;
+import vip.xiaonuo.coldchain.modular.app.param.Message;
+import vip.xiaonuo.coldchain.modular.app.param.MessagePageParam;
+import vip.xiaonuo.coldchain.modular.app.param.MessageType;
+import vip.xiaonuo.common.page.CommonPageRequest;
+
+import java.util.stream.Collectors;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/27 16:55:56
+ */
+@Service
+@RequiredArgsConstructor
+@Slf4j
+public class SensorAlarmServiceImpl extends ServiceImpl<SensorAlarmMapper, SensorAlarm> implements SensorAlarmService {
+
+    @Override
+    public Page<Message> getMessages(MessagePageParam messagePageParam) {
+
+        if (messagePageParam.getType().equalsIgnoreCase("system")) {
+            return null;
+        } else {
+            // 创建分页对象
+            Page<Message> page = new Page<>(messagePageParam.getCurrent(), messagePageParam.getSize());
+            // 创建查询条件
+            QueryWrapper<SensorAlarm> queryWrapper = new QueryWrapper<SensorAlarm>().checkSqlInjection();
+            // 获取当前登录用户ID
+            String userId = StpLoginUserUtil.getLoginUser().getId();
+            // 查询创建用户为当前用户的记录
+            queryWrapper.lambda().eq(SensorAlarm::getCreateUser, userId);
+            // 如果有关键词,进行模糊查询或者设备名等字段的精确查询
+            if (ObjectUtil.isNotEmpty(messagePageParam.getKeyword())) {
+                queryWrapper.lambda().and(q -> q.like(SensorAlarm::getMessage, messagePageParam.getKeyword()).or().like(SensorAlarm::getDeviceName, messagePageParam.getKeyword()));
+            }
+            // 时间查询
+            if (StrUtil.isNotBlank(messagePageParam.getStartTime())) {
+                queryWrapper.lambda().ge(SensorAlarm::getCreateTime, DateUtil.parse(messagePageParam.getStartTime(), "yyyy-MM-dd HH:mm:ss"));  // greater than or equal to start time
+            }
+            if (StrUtil.isNotBlank(messagePageParam.getStartTime())) {
+                queryWrapper.lambda().le(SensorAlarm::getCreateTime, DateUtil.parse(messagePageParam.getEndTime(), "yyyy-MM-dd HH:mm:ss"));  // greater than or equal to start time
+            }
+            // 按创建时间降序排序
+            queryWrapper.lambda().orderByDesc(SensorAlarm::getCreateTime);
+            // 执行查询,传入分页对象
+            Page<SensorAlarm> sensorAlarmPage = this.page(CommonPageRequest.defaultPage(), queryWrapper);
+            // 将查询结果转换成Message类型的分页对象
+            Page<Message> resultPage = new Page<>();
+            resultPage.setSize(messagePageParam.getSize());
+            resultPage.setCurrent(messagePageParam.getCurrent());
+            resultPage.setRecords(sensorAlarmPage.getRecords().stream().map(this::convertToMessage) // 转换为Message类型
+                    .collect(Collectors.toList()));
+            resultPage.setTotal(sensorAlarmPage.getTotal()); // 设置总数
+            return resultPage;
+        }
+    }
+
+    private Message convertToMessage(SensorAlarm sensorAlarm) {
+        Message message = new Message();
+        message.setType(MessageType.ALERT);
+        // 假设Message和SensorAlarm有一些相似字段,进行转换
+        message.setId(sensorAlarm.getId());
+        message.setContent(sensorAlarm.getMessage());
+        message.setRead(false);
+        message.setTitle(sensorAlarm.getDeviceName() + ":" + sensorAlarm.getAlarmType());
+        message.setCreatedDate(sensorAlarm.getCreateTime());
+        return message;
+    }
+}
+

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

@@ -1,6 +1,5 @@
 package vip.xiaonuo.coldchain.core.alarm.service.check;
 
-import cn.hutool.json.JSONUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.ApplicationEventPublisher;
@@ -109,6 +108,7 @@ public class DefaultSensorAlarmChecker implements SensorAlarmChecker {
         sensorAlarm.setThreshold(threshold);  // 设置预警值
         sensorAlarm.setMonitorTargetId(monitorTargetId);
         sensorAlarm.setSensorRoute(sensorRoute);
+        sensorAlarm.setCreateUser(monitorTargetRegion.getCreateUser());
         List<SensorAlarmUser> alarmUsers = monitorTargetRegion.getAlarmUsers();
         sensorAlarm.setAlarmUsers(alarmUsers);
         sensorAlarm.setThreshold(threshold);
@@ -117,14 +117,6 @@ public class DefaultSensorAlarmChecker implements SensorAlarmChecker {
         applicationEventPublisher.publishEvent(new SensorAlarmEvent(this, sensorAlarm));
     }
 
-
-    public static void main(String[] args) {
-        SensorAlarm sensorAlarm = new SensorAlarm();
-        sensorAlarm.getAlarmUsers().add(new SensorAlarmUser(null, "oltp26cDdkiAAsualbzKMyiZbJrU"));
-        sensorAlarm.getAlarmUsers().add(new SensorAlarmUser(null, "oltp26fXeljOKUxYGhAx_dRqVAak"));
-        System.out.println(JSONUtil.toJsonStr(sensorAlarm.getAlarmUsers()));
-    }
-
     /**
      * 获取报警消息模板并替换占位符
      *

+ 3 - 6
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/messagepush/SensorAlarmMessagePushService.java → snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/messagepush/LocalSensorAlarmMessagePushService.java

@@ -16,7 +16,7 @@ import java.util.concurrent.ConcurrentHashMap;
 @Service
 @Slf4j
 @RequiredArgsConstructor
-public class SensorAlarmMessagePushService {
+public class LocalSensorAlarmMessagePushService {
     private final Map<String, MessagePushService> pushServices;
     private final SensorAlarmMapper sensorAlarmMapper;
     // 用来记录每个用户对某设备和告警类型的推送历史,key 为 (openid, deviceID, alarmType),value 为推送时间列表
@@ -43,17 +43,15 @@ public class SensorAlarmMessagePushService {
         for (String openid : openids) {
             // 判断该用户对该设备和告警类型的推送是否超过限制
             if (hasExceededPushLimit(openid, deviceID, alarmType)) {
-                log.info("用户 {} 对设备 {} 的告警类型 {} \n在过去{}小时内推送次数超过限制,跳过推送", openid, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 60 / 1000);
-                continue; // 跳过该用户
+                log.info("用户 {} 对设备 {} 的告警类型 {} \n在过去{}分钟内推送次数超过限制,跳过推送", openid, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 1000);
+                continue;
             }
             // 遍历每个接收人和通知渠道,发送告警信息
             for (NotificationChannel channel : alarm.getNotificationChannel()) {
                 MessagePushService pushService = pushServices.get(channel.name());
-                log.info("推送消息渠道: {}", channel.getChannelName());
                 if (pushService != null) {
                     try {
                         pushService.sendAlarmMessage(alarm);
-                        log.info("告警信息成功推送至渠道: {}", channel.getChannelName());
                     } catch (Exception e) {
                         log.error("推送消息失败,渠道: {},错误: {}", channel.getChannelName(), e.getMessage());
                     }
@@ -124,7 +122,6 @@ public class SensorAlarmMessagePushService {
     private void saveAlarmToDatabase(SensorAlarm alarm) {
         try {
             sensorAlarmMapper.insert(alarm);
-            log.info("告警信息已保存到数据库: {}", alarm.getId());
         } catch (Exception e) {
             log.error("保存告警信息到数据库失败: {}", e.getMessage());
         }

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

@@ -0,0 +1,92 @@
+package vip.xiaonuo.coldchain.core.alarm.service.messagepush;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.coldchain.core.alarm.bean.NotificationChannel;
+import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarm;
+import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarmUser;
+import vip.xiaonuo.coldchain.core.alarm.mapper.SensorAlarmMapper;
+import vip.xiaonuo.coldchain.core.config.JfcloudColdChainConstants;
+
+import java.util.*;
+
+/**
+ * @author jackzhou
+ * @version 1.0
+ * @project jfcloud-coldchain
+ * @description
+ * @date 2024/11/27 16:09:54
+ */
+@Service
+@Slf4j
+@RequiredArgsConstructor
+@Primary
+public class RedisSensorAlarmMessagePushService {
+    private final Map<String, MessagePushService> pushServices;
+    private final SensorAlarmMapper sensorAlarmMapper;
+    private final RedisTemplate<String, Object> redisTemplate;
+
+    @Async("coldChainAsyncTask")
+    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 (String openid : openids) {
+            if (hasExceededPushLimit(openid, deviceID, alarmType)) {
+                log.info("用户 {} 对设备 {} 的告警类型 {} \n在过去{}分钟内推送次数超过限制,跳过推送", openid, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 1000);
+                continue;
+            }
+            for (NotificationChannel channel : alarm.getNotificationChannel()) {
+                MessagePushService pushService = pushServices.get(channel.name());
+                if (pushService != null) {
+                    try {
+                        pushService.sendAlarmMessage(alarm);
+                    } catch (Exception e) {
+                        log.error("推送消息失败,渠道: {},错误: {}", channel.getChannelName(), e.getMessage());
+                    }
+                } else {
+                    log.warn("不支持的通知渠道: {}", channel.getChannelName());
+                }
+            }
+            recordPushTime(openid, deviceID, alarmType);
+        }
+
+        alarm.setNotified(true);
+        saveAlarmToDatabase(alarm);
+    }
+
+    private boolean hasExceededPushLimit(String openid, String deviceID, String alarmType) {
+        String key = generatePushHistoryKey(openid, deviceID, alarmType);
+        List<Object> pushTimes = redisTemplate.opsForList().range(key, 0, -1);
+        if (pushTimes == null || pushTimes.isEmpty()) {
+            return false;
+        }
+        long currentTime = System.currentTimeMillis();
+        pushTimes.removeIf(time -> currentTime - (Long) time > JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW);
+        return pushTimes.size() >= JfcloudColdChainConstants.MESS_PUSH_MAX_PUSH_COUNT;
+    }
+
+    private void recordPushTime(String openid, String deviceID, String alarmType) {
+        String key = generatePushHistoryKey(openid, deviceID, alarmType);
+        long currentTime = System.currentTimeMillis();
+        redisTemplate.opsForList().rightPush(key, currentTime);
+        redisTemplate.opsForList().trim(key, -JfcloudColdChainConstants.MESS_PUSH_MAX_PUSH_COUNT, -1);
+    }
+
+    private void saveAlarmToDatabase(SensorAlarm alarm) {
+        try {
+            sensorAlarmMapper.insert(alarm);
+        } catch (Exception e) {
+            log.error("保存告警信息到数据库失败: {}", e.getMessage());
+        }
+    }
+
+    private String generatePushHistoryKey(String openid, String deviceID, String alarmType) {
+        return JfcloudColdChainConstants.REDIS_PUSH_HISTORY_KEY_PREFIX + ":" + openid + ":" + deviceID + ":" + alarmType;
+    }
+}

+ 3 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/cache/monitordevice/factory/MonitorDeviceCacheServiceFactory.java

@@ -6,6 +6,8 @@ import vip.xiaonuo.coldchain.core.cache.monitordevice.MonitorDeviceCacheService;
 import vip.xiaonuo.coldchain.core.cache.monitordevice.impl.LocalMonitorDeviceCacheService;
 import vip.xiaonuo.coldchain.core.cache.monitordevice.impl.RedisMonitorDeviceCacheService;
 import vip.xiaonuo.coldchain.core.renke.config.JfcloudColdChainServerProperties;
+
+import static vip.xiaonuo.coldchain.core.config.JfcloudColdChainConstants.DEFAULT_CACHE_TYPE;
 /**
  * @author jackzhou
  * @version 1.0
@@ -23,7 +25,7 @@ public class MonitorDeviceCacheServiceFactory {
 
     @Bean
     public MonitorDeviceCacheService cacheService(JfcloudColdChainServerProperties jfcloudColdChainServerProperties, RedisMonitorDeviceCacheService redisCacheService, LocalMonitorDeviceCacheService localCacheService) {
-        if ("redis".equalsIgnoreCase(jfcloudColdChainServerProperties.getCacheType())) {
+        if (DEFAULT_CACHE_TYPE.equalsIgnoreCase(jfcloudColdChainServerProperties.getCacheType())) {
             return redisCacheService;  // 使用 Redis 缓存
         } else {
             return localCacheService;  // 使用本地缓存

+ 11 - 8
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/config/JfcloudColdChainConstants.java

@@ -19,11 +19,10 @@ public interface JfcloudColdChainConstants {
      */
     String DEFAULT_CACHE_TYPE = "redis";
 
-
     /**
-     * 每 1 分钟定期执行设备缓存更新
+     * 每 10 分钟定期执行设备缓存更新
      */
-    Long CACHE_UPDATE_INTERVAL = 5 * 60 * 1000L;
+    Long CACHE_UPDATE_INTERVAL = 10 * 60 * 1000L;
 
     /**
      * influxDB default bucketName
@@ -48,18 +47,22 @@ public interface JfcloudColdChainConstants {
     /**
      * 重试机制配置- 最大重试5次数
      */
-    int MAX_RETRIES = 5;
+    int MAX_RETRIES = 3;
     /**
      * 每次重试的间隔时间,单位:毫秒
      */
     int RETRY_DELAY_MS = 5000;
 
     /**
-     * 消息推送限制固定时间内的最大推送次数
+     * 消息推送限制固定时间内的最大推送次数,10分钟内推送2次
+     */
+    int MESS_PUSH_MAX_PUSH_COUNT = 1;
+    /**
+     * 消息推送限制的时间窗口,单位为毫秒(10分钟)
      */
-    int MESS_PUSH_MAX_PUSH_COUNT = 5;
+    long MESS_PUSH_TIME_WINDOW = 5 * 60 * 1000;
     /**
-     * 消息推送限制的时间窗口,单位为毫秒(例如 1 小时)
+     * redis 缓存用户推送消息频率限制
      */
-    long MESS_PUSH_TIME_WINDOW = 1 * 60 * 60 * 1000;
+    String REDIS_PUSH_HISTORY_KEY_PREFIX = "alarm_push_history";
 }

+ 13 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/event/SensorAlarmEventListener.java

@@ -13,17 +13,27 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
-import vip.xiaonuo.coldchain.core.alarm.service.messagepush.SensorAlarmMessagePushService;
+import vip.xiaonuo.coldchain.core.alarm.service.messagepush.LocalSensorAlarmMessagePushService;
+import vip.xiaonuo.coldchain.core.alarm.service.messagepush.RedisSensorAlarmMessagePushService;
+import vip.xiaonuo.coldchain.core.renke.config.JfcloudColdChainServerProperties;
+
+import static vip.xiaonuo.coldchain.core.config.JfcloudColdChainConstants.DEFAULT_CACHE_TYPE;
 
 @Slf4j
 @RequiredArgsConstructor
 @Component
 public class SensorAlarmEventListener {
-    private final SensorAlarmMessagePushService sensorAlarmMessagePushService;
+    private final JfcloudColdChainServerProperties jfcloudColdChainServerProperties;
+    private final LocalSensorAlarmMessagePushService localSensorAlarmMessagePushService;
+    private final RedisSensorAlarmMessagePushService redisSensorAlarmMessagePushService;
 
     @Async("coldChainAsyncTask")
     @EventListener
     public void handleSensorAlarmEvent(SensorAlarmEvent event) {
-        sensorAlarmMessagePushService.pushAlarmMessage(event.getSensorAlarm());
+        if (DEFAULT_CACHE_TYPE.equalsIgnoreCase(jfcloudColdChainServerProperties.getCacheType())) {
+            redisSensorAlarmMessagePushService.pushAlarmMessage(event.getSensorAlarm());
+        } else {
+            localSensorAlarmMessagePushService.pushAlarmMessage(event.getSensorAlarm());
+        }
     }
 }

+ 5 - 4
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/controller/AppController.java

@@ -84,18 +84,19 @@ public class AppController {
         return null;
     }
 
-
     @GetMapping("/message/unread/count")
     @Operation(summary = "获取未读消息统计")
     public Map<String, Long> getUnreadMessagesCount() {
         return messageService.getUnreadMessagesCount();
     }
 
-    @GetMapping("/message/list")
-    public List<Message> getMessages(@RequestParam MessageType type, @RequestParam int page, @RequestParam int size) {
-        return messageService.getMessages(type, page, size);
+    @GetMapping("/message/page")
+    public CommonResult<Page<Message>> getMessages(MessagePageParam messagePageParam) {
+        Page<Message> rlt = messageService.getMessages(messagePageParam);
+        return CommonResult.data(rlt);
     }
 
+
     @PostMapping("/message/mark-read")
     @Operation(summary = "批量设置消息为已读")
     public void markMessagesAsRead(@RequestBody List<Long> messageIds) {

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/AppDevicePageParam.java

@@ -25,7 +25,6 @@ import lombok.Setter;
 @Getter
 @Setter
 public class AppDevicePageParam {
-
     /**
      * 当前页
      */
@@ -73,4 +72,5 @@ public class AppDevicePageParam {
      */
     @Schema(description = "所属组织")
     private String orgId;
+
 }

+ 3 - 18
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/Message.java

@@ -2,29 +2,14 @@ package vip.xiaonuo.coldchain.modular.app.param;
 
 import lombok.Data;
 
-import java.time.LocalDateTime;
+import java.util.Date;
 
 @Data
 public class Message {
-
-    private Long id;
+    private String id;
     private MessageType type;      // 消息类型
     private String title;          // 消息标题
     private String content;        // 消息内容
     private boolean read;          // 是否已读
-    private String createdBy;      // 创建人
-    private LocalDateTime createdDate;  // 消息创建时间
-
-    // 构造函数、getter、setter
-    public Message(Long id, MessageType type, String title, String content, boolean read, String createdBy, LocalDateTime createdDate) {
-        this.id = id;
-        this.type = type;
-        this.title = title;
-        this.content = content;
-        this.read = read;
-        this.createdBy = createdBy;
-        this.createdDate = createdDate;
-    }
-
-    // Getters and Setters
+    private Date createdDate;  // 消息创建时间
 }

+ 74 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/MessagePageParam.java

@@ -0,0 +1,74 @@
+/*
+ * Copyright [2022] [https://www.xiaonuo.vip]
+ *
+ * Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *
+ * 1.请不要删除和修改根目录下的LICENSE文件。
+ * 2.请不要删除和修改Snowy源码头部的版权声明。
+ * 3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ * 4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ * 5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ * 6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package vip.xiaonuo.coldchain.modular.app.param;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 用户查询参数
+ *
+ * @author xuyuxiang
+ * @date 2022/7/26 16:00
+ **/
+@Getter
+@Setter
+public class MessagePageParam {
+    /**
+     * 当前页
+     */
+    @Schema(description = "当前页码")
+    private Integer current = 1;
+
+    /**
+     * 每页条数
+     */
+    @Schema(description = "每页条数")
+    private Integer size = 20;
+
+    /**
+     * 排序字段
+     */
+    @Schema(description = "排序字段,字段驼峰名称,如:userName")
+    private String sortField;
+
+    /**
+     * 排序方式
+     */
+    @Schema(description = "排序方式,升序:ASCEND;降序:DESCEND")
+    private String sortOrder;
+
+    /**
+     * 账号、姓名关键词
+     */
+    @Schema(description = "system、alert")
+    private String type = "alert";
+    /**
+     * 关键字
+     */
+    @Schema(description = "关键字")
+    private String keyword;
+
+    /**
+     * 查询开始时间
+     */
+    @Schema(description = "查询开始时间")
+    private String startTime;
+
+    /**
+     * 查询结束时间
+     */
+    @Schema(description = "查询结束时间")
+    private String endTime;
+}

+ 12 - 46
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/service/MessageService.java

@@ -1,66 +1,32 @@
 package vip.xiaonuo.coldchain.modular.app.service;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
+import vip.xiaonuo.coldchain.core.alarm.service.SensorAlarmService;
 import vip.xiaonuo.coldchain.modular.app.param.Message;
-import vip.xiaonuo.coldchain.modular.app.param.MessageType;
+import vip.xiaonuo.coldchain.modular.app.param.MessagePageParam;
 
-import java.time.LocalDateTime;
-import java.util.*;
-import java.util.stream.Collectors;
+import java.util.List;
+import java.util.Map;
 
 @Service
+@RequiredArgsConstructor
 public class MessageService {
-
-    private List<Message> messageList;  // 存储所有的消息
-
-    // 构造函数,初始化假数据
-    public MessageService() {
-        this.messageList = new ArrayList<>();
-        generateMockData();
-    }
-
-    // 生成一些假数据
-    private void generateMockData() {
-        messageList.add(new Message(1L, MessageType.SYSTEM, "系统消息1", "这是一个系统消息", false, "admin", LocalDateTime.now().minusDays(1)));
-        messageList.add(new Message(2L, MessageType.SYSTEM, "系统消息2", "这是另一个系统消息", true, "admin", LocalDateTime.now().minusDays(2)));
-        messageList.add(new Message(3L, MessageType.ALERT, "预警消息1", "这是一个预警消息", false, "admin", LocalDateTime.now().minusHours(5)));
-        messageList.add(new Message(4L, MessageType.ALERT, "预警消息2", "这是另一个预警消息", false, "user1", LocalDateTime.now().minusDays(3)));
-        messageList.add(new Message(5L, MessageType.SYSTEM, "系统消息3", "这是最新的系统消息", false, "user2", LocalDateTime.now().minusHours(10)));
-    }
+    private final SensorAlarmService sensorAlarmService;
 
     // 获取未读消息的总数
     public Map<String, Long> getUnreadMessagesCount() {
-        long unreadSystemMessages = messageList.stream()
-                .filter(m -> m.getType() == MessageType.SYSTEM && !m.isRead())
-                .count();
-
-        long unreadAlertMessages = messageList.stream()
-                .filter(m -> m.getType() == MessageType.ALERT && !m.isRead())
-                .count();
-
-        Map<String, Long> countMap = new HashMap<>();
-        countMap.put("system", unreadSystemMessages);
-        countMap.put("alert", unreadAlertMessages);
-
-        return countMap;
+        return null;
     }
 
     // 获取消息分页列表
-    public List<Message> getMessages(MessageType type, int page, int size) {
-        return messageList.stream()
-                .filter(m -> m.getType() == type)
-                .sorted(Comparator.comparing(Message::getCreatedDate).reversed()) // 按创建时间降序
-                .skip(page * size)
-                .limit(size)
-                .collect(Collectors.toList());
+    public Page<Message> getMessages(MessagePageParam messagePageParam) {
+        return sensorAlarmService.getMessages(messagePageParam);
     }
 
     // 批量设置消息为已读
     public void markMessagesAsRead(List<Long> messageIds) {
-        for (Message message : messageList) {
-            if (messageIds.contains(message.getId())) {
-                message.setRead(true);
-            }
-        }
+
     }
 }