zhaowenyu
2025-12-17 0f2c1b35813fd47dd33f3757f59758cfe8edf3a2
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());
@@ -184,7 +201,10 @@
        return new PaginationData<DeviceHmsDTO>(deviceHmsList, new Pagination(pagination));
        // region 原代码注释备份一份
    }
    // 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,
@@ -208,8 +228,7 @@
//        List<DeviceHmsDTO> deviceHmsList = pagination.getRecords().stream().map(this::entity2Dto).collect(Collectors.toList());
//
//        return new PaginationData<DeviceHmsDTO>(deviceHmsList, new Pagination(pagination));
        // endregion
    }
    // endregion
    @Override
    public void updateUnreadHms(String deviceSn) {
@@ -238,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());
    }
    /**
@@ -358,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);
    }
}