zhaowenyu
2025-11-27 c115e881f015101269bd4010175ddf448a248731
2025-11-27 zwy Hms接口完成
3 files modified
161 ■■■■■ changed files
ard-admin/src/main/java/com/ard/web/controller/sample/DeviceHmsController.java 24 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/manage/model/param/DeviceHmsQueryParam.java 35 ●●●●● patch | view | raw | blame | history
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceHmsServiceImpl.java 102 ●●●●● patch | view | raw | blame | history
ard-admin/src/main/java/com/ard/web/controller/sample/DeviceHmsController.java
@@ -5,6 +5,9 @@
import com.ard.sample.manage.model.dto.DeviceHmsDTO;
import com.ard.sample.manage.model.param.DeviceHmsQueryParam;
import com.ard.sample.manage.service.IDeviceHmsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.Operation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -18,7 +21,7 @@
 * @version 1.1
 * @date 2022/7/7
 */
@Api(tags = "设备HMS管理")
@RestController
@Slf4j
@RequestMapping("/dock/devices")
@@ -28,14 +31,17 @@
    private IDeviceHmsService deviceHmsService;
    /**
     * Page to query the hms information of the device.
     * 查询设备hms信息的页面。/{workspace_id},@PathVariable("workspace_id") String workspaceId
     * @param param
     * @param workspaceId
     * @return
     */
    @GetMapping("/{workspace_id}/devices/hms")
    public ResponseResult<PaginationData<DeviceHmsDTO>> getHmsInformation(DeviceHmsQueryParam param,
                                                          @PathVariable("workspace_id") String workspaceId) {
    @Operation(summary = "获取设备HMS信息", description = "参数传空则忽略该条件,返回所有符合其他条件的数据")
    @ApiOperation("获取设备HMS信息")
    @GetMapping("/devices/hms")
    public ResponseResult<PaginationData<DeviceHmsDTO>> getHmsInformation(DeviceHmsQueryParam param) {
        if (param == null) {
            param = new DeviceHmsQueryParam();
        }
        PaginationData<DeviceHmsDTO> devices = deviceHmsService.getDeviceHmsByParam(param);
        return ResponseResult.success(devices);
@@ -46,7 +52,8 @@
     * @param deviceSn
     * @return
     */
    @PutMapping("/{workspace_id}/devices/hms/{device_sn}")
    @ApiOperation("更新HMS消息为已读状态")
    @PutMapping("/devices/hms/{device_sn}")
    public ResponseResult updateReadHmsByDeviceSn(@PathVariable("device_sn") String deviceSn) {
        deviceHmsService.updateUnreadHms(deviceSn);
        return ResponseResult.success();
@@ -57,7 +64,8 @@
     * @param deviceSn
     * @return
     */
    @GetMapping("/{workspace_id}/devices/hms/{device_sn}")
    @ApiOperation("获取设备未读HMS消息")
    @GetMapping("/devices/hms/{device_sn}")
    public ResponseResult<List<DeviceHmsDTO>> getUnreadHmsByDeviceSn(@PathVariable("device_sn") String deviceSn) {
        PaginationData<DeviceHmsDTO> paginationData = deviceHmsService.getDeviceHmsByParam(
                DeviceHmsQueryParam.builder()
ard-sample/src/main/java/com/ard/sample/manage/model/param/DeviceHmsQueryParam.java
@@ -5,6 +5,8 @@
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.Min;
import java.util.Collections;
import java.util.Set;
/**
@@ -18,7 +20,8 @@
@NoArgsConstructor
public class DeviceHmsQueryParam {
    private Set<String> deviceSn;
    // 空集合兜底:避免getDeviceSn()返回null
    private Set<String> deviceSn = Collections.emptySet();
    private Long beginTime;
@@ -28,11 +31,37 @@
    private String message;
    private Long page;
    // SpringBoot 校验:页码最小为1
    @Min(value = 1, message = "页码不能小于1")
    private Long page = 1L;
    private Long pageSize;
    // SpringBoot 校验:页大小最小为0(0表示返回全部)
    @Min(value = 0, message = "页大小不能小于0(0表示返回全部数据)")
    private Long pageSize = 10L;
    private Integer level;
    private Long updateTime;
    // Builder模式兼容空集合
    public static class DeviceHmsQueryParamBuilder {
        private Set<String> deviceSn = Collections.emptySet();
    }
//    private Set<String> deviceSn;
//
//    private Long beginTime;
//
//    private Long endTime;
//
//    private String language;
//
//    private String message;
//
//    private Long page;
//
//    private Long pageSize;
//
//    private Integer level;
//
//    private Long updateTime;
}
ard-sample/src/main/java/com/ard/sample/manage/service/impl/DeviceHmsServiceImpl.java
@@ -122,29 +122,93 @@
    @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
@@ -153,7 +217,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);
    }