| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | * @version 1.1 |
| | | * @date 2022/7/6 |
| | | */ |
| | | @Slf4j |
| | | @Service |
| | | @Transactional |
| | | public class DeviceHmsServiceImpl implements IDeviceHmsService { |
| | |
| | | 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); |
| | | }); |
| | |
| | | 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()); |
| | |
| | | |
| | | @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) { |
| | |
| | | new LambdaUpdateWrapper<DeviceHmsEntity>() |
| | | .eq(DeviceHmsEntity::getSn, deviceSn) |
| | | .eq(DeviceHmsEntity::getUpdateTime, 0L)); |
| | | // Delete unread messages cached in redis. |
| | | // 删除Redis中缓存的未读消息。 |
| | | RedisOpsUtils.del(RedisConst.HMS_PREFIX + deviceSn); |
| | | } |
| | | |
| | |
| | | .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()); |
| | | } |
| | | |
| | | /** |
| | |
| | | } |
| | | 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); |
| | | } |
| | | } |