From 342236a5694a22c544a217c9f1503e5ac790b609 Mon Sep 17 00:00:00 2001
From: zhaowenyu <35589726@qq.com>
Date: Wed, 01 Apr 2026 17:42:46 +0800
Subject: [PATCH] 2026-04-01 优化机场视频推流顺序,先入库再推流。

---
 ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceHmsServiceImpl.java |  158 ++++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 133 insertions(+), 25 deletions(-)

diff --git a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceHmsServiceImpl.java b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceHmsServiceImpl.java
index 848a010..8138c7c 100644
--- a/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceHmsServiceImpl.java
+++ b/ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceHmsServiceImpl.java
@@ -1,5 +1,6 @@
 package com.ard.sample.manage.service.impl;
 
+import com.ard.sample.manage.model.enums.DeviceDomainEnum;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -26,6 +27,7 @@
 import com.ard.sample.manage.service.IDeviceHmsService;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.integration.annotation.ServiceActivator;
 import org.springframework.integration.mqtt.support.MqttHeaders;
@@ -47,6 +49,7 @@
  * @version 1.1
  * @date 2022/7/6
  */
+@Slf4j
 @Service
 @Transactional
 public class DeviceHmsServiceImpl implements IDeviceHmsService {
@@ -96,12 +99,21 @@
                 new TypeReference<List<DeviceHmsReceiver>>() {})
                 .forEach(hmsReceiver -> {
                     final DeviceHmsEntity hms = entity.clone();
-                    this.fillEntity(hms, hmsReceiver);
+                    this.fillEntity(hms, hmsReceiver, device);
+                    this.fillMessage(hms, hmsReceiver.getArgs());
                     // The same unread hms are no longer incremented.
                     if (hmsMap.contains(hms.getHmsKey())) {
+                        // 修改已存在数据的创建时间,先查询到已存在记录,再修改。
+                        DeviceHmsEntity exisHms=getDeviceHmsEntity(hms);
+                        if (exisHms != null) {
+                            LambdaUpdateWrapper<DeviceHmsEntity> updateWrapper = new LambdaUpdateWrapper<>();
+                            updateWrapper.set(DeviceHmsEntity::getCreateTime, hms.getCreateTime());
+                            updateWrapper.eq(DeviceHmsEntity::getId, exisHms.getId());
+
+                            mapper.update(exisHms, updateWrapper);
+                        }
                         return;
                     }
-                    this.fillMessage(hms, hmsReceiver.getArgs());
                     unReadList.add(entity2Dto(hms));
                     mapper.insert(hms);
                 });
@@ -109,7 +121,12 @@
         if (unReadList.isEmpty()) {
             return;
         }
-        RedisOpsUtils.listRPush(key, (Object) unReadList.stream().map(DeviceHmsDTO::getKey).toArray(String[]::new));
+        // RedisOpsUtils.listRPush(key, (Object) unReadList.stream().map(DeviceHmsDTO::getKey).toArray(String[]::new));
+        // 修正后:直接传入String数组,每个元素单独存
+        List<String> newHmsKeys = unReadList.stream()
+                .map(DeviceHmsDTO::getKey)
+                .collect(Collectors.toList());
+        RedisOpsUtils.listRPush(key, newHmsKeys.toArray(new String[0]));
         // push to the web
 //        Collection<ConcurrentWebSocketSession> sessions = webSocketManageService.getValueWithWorkspaceAndUserType(
 //                device.getWorkspaceId(), UserTypeEnum.WEB.getVal());
@@ -122,30 +139,96 @@
 
     @Override
     public PaginationData<DeviceHmsDTO> getDeviceHmsByParam(DeviceHmsQueryParam param) {
-        LambdaQueryWrapper<DeviceHmsEntity> queryWrapper = new LambdaQueryWrapper<DeviceHmsEntity>()
-                .and(wrapper -> param.getDeviceSn().forEach(sn -> wrapper.eq(DeviceHmsEntity::getSn, sn).or()))
-                .between(param.getBeginTime() != null && param.getEndTime() != null,
-                        DeviceHmsEntity::getCreateTime, param.getBeginTime(), param.getEndTime())
-                .eq(param.getUpdateTime() != null, DeviceHmsEntity::getUpdateTime, param.getUpdateTime())
-                .eq(param.getLevel() != null, DeviceHmsEntity::getLevel, param.getLevel())
-                .like(StringUtils.hasText(param.getMessage()) &&
-                                HmsEnum.MessageLanguage.ZH.getLanguage().equals(param.getLanguage()),
-                        DeviceHmsEntity::getMessageZh, param.getMessage())
-                .like(StringUtils.hasText(param.getMessage()) &&
-                                HmsEnum.MessageLanguage.EN.getLanguage().equals(param.getLanguage()),
-                        DeviceHmsEntity::getMessageEn, param.getMessage())
-                .orderByDesc(DeviceHmsEntity::getCreateTime);
-        if (param.getPage() == null || param.getPageSize() == null) {
-            param.setPage(1L);
-            param.setPageSize(Long.valueOf(mapper.selectCount(queryWrapper)));
+// 1. 核心兜底:参数为null时初始化空对象(结合实体默认值,避免所有NPE)
+        if (param == null) {
+            param = new DeviceHmsQueryParam();
         }
 
-        Page<DeviceHmsEntity> pagination = mapper.selectPage(new Page<>(param.getPage(), param.getPageSize()), queryWrapper);
+        LambdaQueryWrapper<DeviceHmsEntity> queryWrapper = new LambdaQueryWrapper<DeviceHmsEntity>();
 
-        List<DeviceHmsDTO> deviceHmsList = pagination.getRecords().stream().map(this::entity2Dto).collect(Collectors.toList());
+        // 2. 设备SN条件:仅当集合非空时添加IN条件(实体已兜底空集合,无需判null)
+        if (!param.getDeviceSn().isEmpty()) {
+            queryWrapper.in(DeviceHmsEntity::getSn, param.getDeviceSn());
+        }
+
+        // 3. 创建时间区间:① 两个时间都非null ② 开始时间≤结束时间(避免无效条件)
+        if (param.getBeginTime() != null && param.getEndTime() != null) {
+            //if (param.getBeginTime() <= param.getEndTime()) {
+                queryWrapper.between(DeviceHmsEntity::getCreateTime, param.getBeginTime(), param.getEndTime());
+//            } else {
+//                // 可选:抛异常/日志提醒/交换时间顺序
+//                // log.warn("创建时间区间不合法:beginTime({}) > endTime({})", param.getBeginTime(), param.getEndTime());
+//            }
+        }
+
+        // 4. 更新时间:参数非null时添加
+        queryWrapper.eq(param.getUpdateTime() != null, DeviceHmsEntity::getUpdateTime, param.getUpdateTime());
+
+        // 5. 级别:参数非null时添加
+        queryWrapper.eq(param.getLevel() != null, DeviceHmsEntity::getLevel, param.getLevel());
+
+        // 6. 消息模糊查询:按语言匹配(语言为null/空时自动忽略)
+        String language = param.getLanguage();
+        String message = param.getMessage();
+        if (StringUtils.hasText(message)) {
+            if (HmsEnum.MessageLanguage.ZH.getLanguage().equals(language)) {
+                queryWrapper.like(DeviceHmsEntity::getMessageZh, message);
+            } else if (HmsEnum.MessageLanguage.EN.getLanguage().equals(language)) {
+                queryWrapper.like(DeviceHmsEntity::getMessageEn, message);
+            }
+            // 语言不匹配/为null时,不添加任何消息条件
+        }
+
+        // 7. 固定排序:创建时间降序
+        queryWrapper.orderByDesc(DeviceHmsEntity::getCreateTime);
+
+        // 8. 分页参数校验(避免非法值:page<1 / pageSize≤0)
+        Long page = param.getPage() == null ? 1L : Math.max(param.getPage(), 1L); // 页码最小为1
+        Long pageSize = param.getPage() == null ? 1L : param.getPageSize() <= 0 ? 10L : param.getPageSize(); // 页大小默认10
+
+        // 9. 「传空返回所有」的分页处理:pageSize为null/0时,查询全部数据
+        if (param.getPageSize() == null || param.getPageSize() <= 0) {
+            pageSize = (long) mapper.selectCount(queryWrapper); // 总条数作为页大小
+        }
+
+        // 10. 执行分页查询
+        Page<DeviceHmsEntity> pagination = mapper.selectPage(new Page<>(page, pageSize), queryWrapper);
+
+        // 11. 实体转DTO
+        List<DeviceHmsDTO> deviceHmsList = pagination.getRecords().stream()
+                .map(this::entity2Dto)
+                .collect(Collectors.toList());
 
         return new PaginationData<DeviceHmsDTO>(deviceHmsList, new Pagination(pagination));
+
+
     }
+
+    // region 原代码注释备份一份
+//        LambdaQueryWrapper<DeviceHmsEntity> queryWrapper = new LambdaQueryWrapper<DeviceHmsEntity>()
+//                .and(wrapper -> param.getDeviceSn().forEach(sn -> wrapper.eq(DeviceHmsEntity::getSn, sn).or()))
+//                .between(param.getBeginTime() != null && param.getEndTime() != null,
+//                        DeviceHmsEntity::getCreateTime, param.getBeginTime(), param.getEndTime())
+//                .eq(param.getUpdateTime() != null, DeviceHmsEntity::getUpdateTime, param.getUpdateTime())
+//                .eq(param.getLevel() != null, DeviceHmsEntity::getLevel, param.getLevel())
+//                .like(StringUtils.hasText(param.getMessage()) &&
+//                                HmsEnum.MessageLanguage.ZH.getLanguage().equals(param.getLanguage()),
+//                        DeviceHmsEntity::getMessageZh, param.getMessage())
+//                .like(StringUtils.hasText(param.getMessage()) &&
+//                                HmsEnum.MessageLanguage.EN.getLanguage().equals(param.getLanguage()),
+//                        DeviceHmsEntity::getMessageEn, param.getMessage())
+//                .orderByDesc(DeviceHmsEntity::getCreateTime);
+//        if (param.getPage() == null || param.getPageSize() == null) {
+//            param.setPage(1L);
+//            param.setPageSize(Long.valueOf(mapper.selectCount(queryWrapper)));
+//        }
+//
+//        Page<DeviceHmsEntity> pagination = mapper.selectPage(new Page<>(param.getPage(), param.getPageSize()), queryWrapper);
+//
+//        List<DeviceHmsDTO> deviceHmsList = pagination.getRecords().stream().map(this::entity2Dto).collect(Collectors.toList());
+//
+//        return new PaginationData<DeviceHmsDTO>(deviceHmsList, new Pagination(pagination));
+    // endregion
 
     @Override
     public void updateUnreadHms(String deviceSn) {
@@ -153,7 +236,7 @@
                 new LambdaUpdateWrapper<DeviceHmsEntity>()
                         .eq(DeviceHmsEntity::getSn, deviceSn)
                         .eq(DeviceHmsEntity::getUpdateTime, 0L));
-        // Delete unread messages cached in redis.
+        // 删除Redis中缓存的未读消息。
         RedisOpsUtils.del(RedisConst.HMS_PREFIX + deviceSn);
     }
 
@@ -174,29 +257,40 @@
                 .module(entity.getModule())
                 .messageEn(entity.getMessageEn())
                 .messageZh(entity.getMessageZh())
+                .inTheSky(entity.getInTheSky())
+                .deviceType(entity.getDeviceType())
                 .build();
     }
 
     /**
-     * Populate the received data into the entity. Please refer to the documentation for splicing rules.
+     * 将收到的数据填充到实体中。请参阅文档中的拼接规则。
      * @param dto
      * @param receiver
      */
-    private void fillEntity(DeviceHmsEntity dto, DeviceHmsReceiver receiver) {
+    private void fillEntity(DeviceHmsEntity dto, DeviceHmsReceiver receiver, DeviceDTO deviceDTO) {
         dto.setLevel(receiver.getLevel());
         dto.setModule(receiver.getModule());
         dto.setHmsId(UUID.randomUUID().toString());
+        dto.setInTheSky(receiver.getInTheSky());
+        dto.setDeviceType(receiver.getDeviceType());
 
-        if (HmsEnum.DomainType.DRONE_NEST.getDomain().equals(receiver.getDomainType())) {
+        // 不知道什么原因,在程序替换jar包重新启动时,报了个空指针异常,排查应该是因为 DeviceDTO对象为空,没有从redis中读取到设备信息。增加判断
+        if(deviceDTO !=null && deviceDTO.getDomain() == DeviceDomainEnum.DOCK.getVal()) {
             dto.setHmsKey(HmsEnum.HmsFaqIdEnum.DOCK_TIP.getText() + receiver.getCode());
+//            log.info("SN:{}的Hms匹配拼接规则值为:{}",deviceDTO.getDeviceSn(), HmsEnum.HmsFaqIdEnum.DOCK_TIP.getText() + receiver.getCode());
             return;
         }
+//        if (HmsEnum.DomainType.DRONE_NEST.getDomain().equals(receiver.getDomainType())) {
+//            dto.setHmsKey(HmsEnum.HmsFaqIdEnum.DOCK_TIP.getText() + receiver.getCode());
+//            return;
+//        }
         StringBuilder key = new StringBuilder(HmsEnum.HmsFaqIdEnum.FPV_TIP.getText()).append(receiver.getCode());
 
         if (receiver != null && HmsEnum.IN_THE_SKY.getVal() == (receiver.getInTheSky() != null ? receiver.getInTheSky() : -1)) {
             key.append(HmsEnum.IN_THE_SKY.getText());
         }
         dto.setHmsKey(key.toString());
+//        log.info("SN:{}的Hms匹配拼接规则值为:{}",deviceDTO.getDeviceSn(), key.toString());
     }
 
     /**
@@ -294,4 +388,18 @@
         }
         return list;
     }
+
+    /**
+     * 按条件查询返回最新的一条数据
+     * */
+    public DeviceHmsEntity getDeviceHmsEntity(DeviceHmsEntity deviceHmsEntity) {
+        List <DeviceHmsEntity> lstHms = mapper.selectList(new LambdaQueryWrapper<DeviceHmsEntity>()
+                        .eq(DeviceHmsEntity::getHmsKey, deviceHmsEntity.getHmsKey())
+                        .eq(DeviceHmsEntity::getSn, deviceHmsEntity.getSn())
+                        .eq(DeviceHmsEntity::getUpdateTime,0)
+                        .orderByDesc(DeviceHmsEntity::getCreateTime)
+                        );
+
+        return lstHms.isEmpty() ? null : lstHms.get(0);
+    }
 }

--
Gitblit v1.9.3