Commit e5ce1952795ab19302afbc1dca0473d0eabf630b

Authored by YunaiV
1 parent ecf6a4a8

feat:【IoT 物联网】增加 OTA 相关的数据读取

Showing 15 changed files with 167 additions and 44 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java
@@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
11 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService; 11 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
12 import io.swagger.v3.oas.annotations.Operation; 12 import io.swagger.v3.oas.annotations.Operation;
13 import io.swagger.v3.oas.annotations.Parameter; 13 import io.swagger.v3.oas.annotations.Parameter;
  14 +import io.swagger.v3.oas.annotations.Parameters;
14 import io.swagger.v3.oas.annotations.tags.Tag; 15 import io.swagger.v3.oas.annotations.tags.Tag;
15 import jakarta.annotation.Resource; 16 import jakarta.annotation.Resource;
16 import jakarta.servlet.http.HttpServletResponse; 17 import jakarta.servlet.http.HttpServletResponse;
@@ -121,10 +122,14 @@ public class IotDeviceController { @@ -121,10 +122,14 @@ public class IotDeviceController {
121 122
122 @GetMapping("/simple-list") 123 @GetMapping("/simple-list")
123 @Operation(summary = "获取设备的精简信息列表", description = "主要用于前端的下拉选项") 124 @Operation(summary = "获取设备的精简信息列表", description = "主要用于前端的下拉选项")
124 - @Parameter(name = "deviceType", description = "设备类型", example = "1") 125 + @Parameters({
  126 + @Parameter(name = "deviceType", description = "设备类型", example = "1"),
  127 + @Parameter(name = "productId", description = "产品编号", example = "1024")
  128 + })
125 public CommonResult<List<IotDeviceRespVO>> getDeviceSimpleList( 129 public CommonResult<List<IotDeviceRespVO>> getDeviceSimpleList(
126 - @RequestParam(value = "deviceType", required = false) Integer deviceType) {  
127 - List<IotDeviceDO> list = deviceService.getDeviceListByDeviceType(deviceType); 130 + @RequestParam(value = "deviceType", required = false) Integer deviceType,
  131 + @RequestParam(value = "productId", required = false) Long productId) {
  132 + List<IotDeviceDO> list = deviceService.getDeviceListByCondition(deviceType, productId);
128 return success(convertList(list, device -> // 只返回 id、name、productId 字段 133 return success(convertList(list, device -> // 只返回 id、name、productId 字段
129 new IotDeviceRespVO().setId(device.getId()).setDeviceName(device.getDeviceName()) 134 new IotDeviceRespVO().setId(device.getId()).setDeviceName(device.getDeviceName())
130 .setProductId(device.getProductId()))); 135 .setProductId(device.getProductId())));
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/IotOtaFirmwareController.java
@@ -3,12 +3,14 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota; @@ -3,12 +3,14 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota;
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareCreateReqVO;
6 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwarePageReqVO; 7 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwarePageReqVO;
7 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareRespVO; 8 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareRespVO;
8 -import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareCreateReqVO;  
9 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareUpdateReqVO; 9 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwareUpdateReqVO;
10 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO; 10 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
  11 +import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
11 import cn.iocoder.yudao.module.iot.service.ota.IotOtaFirmwareService; 12 import cn.iocoder.yudao.module.iot.service.ota.IotOtaFirmwareService;
  13 +import cn.iocoder.yudao.module.iot.service.product.IotProductService;
12 import io.swagger.v3.oas.annotations.Operation; 14 import io.swagger.v3.oas.annotations.Operation;
13 import io.swagger.v3.oas.annotations.tags.Tag; 15 import io.swagger.v3.oas.annotations.tags.Tag;
14 import jakarta.annotation.Resource; 16 import jakarta.annotation.Resource;
@@ -27,6 +29,8 @@ public class IotOtaFirmwareController { @@ -27,6 +29,8 @@ public class IotOtaFirmwareController {
27 29
28 @Resource 30 @Resource
29 private IotOtaFirmwareService otaFirmwareService; 31 private IotOtaFirmwareService otaFirmwareService;
  32 + @Resource
  33 + private IotProductService productService;
30 34
31 @PostMapping("/create") 35 @PostMapping("/create")
32 @Operation(summary = "创建 OTA 固件") 36 @Operation(summary = "创建 OTA 固件")
@@ -47,8 +51,16 @@ public class IotOtaFirmwareController { @@ -47,8 +51,16 @@ public class IotOtaFirmwareController {
47 @Operation(summary = "获得 OTA 固件") 51 @Operation(summary = "获得 OTA 固件")
48 @PreAuthorize("@ss.hasPermission('iot:ota-firmware:query')") 52 @PreAuthorize("@ss.hasPermission('iot:ota-firmware:query')")
49 public CommonResult<IotOtaFirmwareRespVO> getOtaFirmware(@RequestParam("id") Long id) { 53 public CommonResult<IotOtaFirmwareRespVO> getOtaFirmware(@RequestParam("id") Long id) {
50 - IotOtaFirmwareDO otaFirmware = otaFirmwareService.getOtaFirmware(id);  
51 - return success(BeanUtils.toBean(otaFirmware, IotOtaFirmwareRespVO.class)); 54 + IotOtaFirmwareDO firmware = otaFirmwareService.getOtaFirmware(id);
  55 + if (firmware == null) {
  56 + return success(null);
  57 + }
  58 + return success(BeanUtils.toBean(firmware, IotOtaFirmwareRespVO.class, o -> {
  59 + IotProductDO product = productService.getProduct(firmware.getProductId());
  60 + if (product != null) {
  61 + o.setProductName(product.getName());
  62 + }
  63 + }));
52 } 64 }
53 65
54 @GetMapping("/page") 66 @GetMapping("/page")
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/IotOtaTaskRecordController.java
@@ -2,10 +2,15 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota; @@ -2,10 +2,15 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.CommonResult; 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 import cn.iocoder.yudao.framework.common.pojo.PageResult; 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils; 6 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record.IotOtaTaskRecordPageReqVO; 7 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record.IotOtaTaskRecordPageReqVO;
7 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record.IotOtaTaskRecordRespVO; 8 import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record.IotOtaTaskRecordRespVO;
  9 +import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
  10 +import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
8 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskRecordDO; 11 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskRecordDO;
  12 +import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
  13 +import cn.iocoder.yudao.module.iot.service.ota.IotOtaFirmwareService;
9 import cn.iocoder.yudao.module.iot.service.ota.IotOtaTaskRecordService; 14 import cn.iocoder.yudao.module.iot.service.ota.IotOtaTaskRecordService;
10 import io.swagger.v3.oas.annotations.Operation; 15 import io.swagger.v3.oas.annotations.Operation;
11 import io.swagger.v3.oas.annotations.Parameter; 16 import io.swagger.v3.oas.annotations.Parameter;
@@ -13,6 +18,7 @@ import io.swagger.v3.oas.annotations.Parameters; @@ -13,6 +18,7 @@ import io.swagger.v3.oas.annotations.Parameters;
13 import io.swagger.v3.oas.annotations.tags.Tag; 18 import io.swagger.v3.oas.annotations.tags.Tag;
14 import jakarta.annotation.Resource; 19 import jakarta.annotation.Resource;
15 import jakarta.validation.Valid; 20 import jakarta.validation.Valid;
  21 +import org.dromara.hutool.core.collection.CollUtil;
16 import org.springframework.security.access.prepost.PreAuthorize; 22 import org.springframework.security.access.prepost.PreAuthorize;
17 import org.springframework.validation.annotation.Validated; 23 import org.springframework.validation.annotation.Validated;
18 import org.springframework.web.bind.annotation.GetMapping; 24 import org.springframework.web.bind.annotation.GetMapping;
@@ -23,6 +29,7 @@ import org.springframework.web.bind.annotation.RestController; @@ -23,6 +29,7 @@ import org.springframework.web.bind.annotation.RestController;
23 import java.util.Map; 29 import java.util.Map;
24 30
25 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; 31 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  32 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
26 33
27 @Tag(name = "管理后台 - IoT OTA 升级任务记录") 34 @Tag(name = "管理后台 - IoT OTA 升级任务记录")
28 @RestController 35 @RestController
@@ -32,18 +39,22 @@ public class IotOtaTaskRecordController { @@ -32,18 +39,22 @@ public class IotOtaTaskRecordController {
32 39
33 @Resource 40 @Resource
34 private IotOtaTaskRecordService otaTaskRecordService; 41 private IotOtaTaskRecordService otaTaskRecordService;
  42 + @Resource
  43 + private IotDeviceService deviceService;
  44 + @Resource
  45 + private IotOtaFirmwareService otaFirmwareService;
35 46
36 - @GetMapping("/get-status-count") 47 + @GetMapping("/get-status-statistics")
37 @Operation(summary = "获得 OTA 升级记录状态统计") 48 @Operation(summary = "获得 OTA 升级记录状态统计")
38 @Parameters({ 49 @Parameters({
39 @Parameter(name = "firmwareId", description = "固件编号", example = "1024"), 50 @Parameter(name = "firmwareId", description = "固件编号", example = "1024"),
40 @Parameter(name = "taskId", description = "升级任务编号", example = "2048") 51 @Parameter(name = "taskId", description = "升级任务编号", example = "2048")
41 }) 52 })
42 @PreAuthorize("@ss.hasPermission('iot:ota-task-record:query')") 53 @PreAuthorize("@ss.hasPermission('iot:ota-task-record:query')")
43 - public CommonResult<Map<Integer, Long>> getOtaTaskRecordStatusCountMap( 54 + public CommonResult<Map<Integer, Long>> getOtaTaskRecordStatusStatistics(
44 @RequestParam(value = "firmwareId", required = false) Long firmwareId, 55 @RequestParam(value = "firmwareId", required = false) Long firmwareId,
45 @RequestParam(value = "taskId", required = false) Long taskId) { 56 @RequestParam(value = "taskId", required = false) Long taskId) {
46 - return success(otaTaskRecordService.getOtaTaskRecordStatusCountMap(firmwareId, taskId)); 57 + return success(otaTaskRecordService.getOtaTaskRecordStatusStatistics(firmwareId, taskId));
47 } 58 }
48 59
49 @GetMapping("/page") 60 @GetMapping("/page")
@@ -52,7 +63,22 @@ public class IotOtaTaskRecordController { @@ -52,7 +63,22 @@ public class IotOtaTaskRecordController {
52 public CommonResult<PageResult<IotOtaTaskRecordRespVO>> getOtaTaskRecordPage( 63 public CommonResult<PageResult<IotOtaTaskRecordRespVO>> getOtaTaskRecordPage(
53 @Valid IotOtaTaskRecordPageReqVO pageReqVO) { 64 @Valid IotOtaTaskRecordPageReqVO pageReqVO) {
54 PageResult<IotOtaTaskRecordDO> pageResult = otaTaskRecordService.getOtaTaskRecordPage(pageReqVO); 65 PageResult<IotOtaTaskRecordDO> pageResult = otaTaskRecordService.getOtaTaskRecordPage(pageReqVO);
55 - return success(BeanUtils.toBean(pageResult, IotOtaTaskRecordRespVO.class)); 66 + if (CollUtil.isEmpty(pageResult.getList())) {
  67 + return success(PageResult.empty());
  68 + }
  69 +
  70 + // 批量查询固件信息
  71 + Map<Long, IotOtaFirmwareDO> firmwareMap = otaFirmwareService.getOtaFirmwareMap(
  72 + convertSet(pageResult.getList(), IotOtaTaskRecordDO::getFromFirmwareId));
  73 + Map<Long, IotDeviceDO> deviceMap = deviceService.getDeviceMap(
  74 + convertSet(pageResult.getList(), IotOtaTaskRecordDO::getDeviceId));
  75 + // 转换为响应 VO
  76 + return success(BeanUtils.toBean(pageResult, IotOtaTaskRecordRespVO.class, (vo) -> {
  77 + MapUtils.findAndThen(firmwareMap, vo.getFromFirmwareId(), firmware ->
  78 + vo.setFromFirmwareVersion(firmware.getVersion()));
  79 + MapUtils.findAndThen(deviceMap, vo.getDeviceId(), device ->
  80 + vo.setDeviceName(device.getDeviceName()));
  81 + }));
56 } 82 }
57 83
58 @GetMapping("/get") 84 @GetMapping("/get")
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/firmware/IotOtaFirmwareRespVO.java
@@ -25,6 +25,9 @@ public class IotOtaFirmwareRespVO implements VO { @@ -25,6 +25,9 @@ public class IotOtaFirmwareRespVO implements VO {
25 @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 25 @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
26 private Long productId; 26 private Long productId;
27 27
  28 + @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "智能设备")
  29 + private String productName;
  30 +
28 @Schema(description = "固件文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/firmware.bin") 31 @Schema(description = "固件文件 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn/firmware.bin")
29 private String fileUrl; 32 private String fileUrl;
30 33
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/task/record/IotOtaTaskRecordPageReqVO.java
1 package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record; 1 package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record;
2 2
3 import cn.iocoder.yudao.framework.common.pojo.PageParam; 3 import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskRecordStatusEnum;
4 import io.swagger.v3.oas.annotations.media.Schema; 6 import io.swagger.v3.oas.annotations.media.Schema;
5 import lombok.Data; 7 import lombok.Data;
6 8
@@ -11,7 +13,8 @@ public class IotOtaTaskRecordPageReqVO extends PageParam { @@ -11,7 +13,8 @@ public class IotOtaTaskRecordPageReqVO extends PageParam {
11 @Schema(description = "升级任务编号", example = "1024") 13 @Schema(description = "升级任务编号", example = "1024")
12 private Long taskId; 14 private Long taskId;
13 15
14 - @Schema(description = "设备标识", example = "摄像头A1-1")  
15 - private String deviceName; 16 + @Schema(description = "升级记录状态", example = "5")
  17 + @InEnum(IotOtaTaskRecordStatusEnum.class)
  18 + private Integer status;
16 19
17 } 20 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/task/record/IotOtaTaskRecordRespVO.java
@@ -3,40 +3,46 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record; @@ -3,40 +3,46 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.task.record;
3 import io.swagger.v3.oas.annotations.media.Schema; 3 import io.swagger.v3.oas.annotations.media.Schema;
4 import lombok.Data; 4 import lombok.Data;
5 5
6 -@Schema(description = "管理后台 - IoT OTA 升级记录 Response VO") 6 +import java.time.LocalDateTime;
  7 +
  8 +@Schema(description = "管理后台 - IoT OTA 升级任务记录 Response VO")
7 @Data 9 @Data
8 public class IotOtaTaskRecordRespVO { 10 public class IotOtaTaskRecordRespVO {
9 11
10 - // TODO @芋艿:梳理字段  
11 -  
12 - @Schema(description = "升级记录编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 12 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13 private Long id; 13 private Long id;
14 14
15 @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 15 @Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
16 private Long firmwareId; 16 private Long firmwareId;
17 17
18 - @Schema(description = "固件版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "v1.0.0")  
19 - private String firmwareVersion;  
20 -  
21 - @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 18 + @Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
22 private Long taskId; 19 private Long taskId;
23 20
24 @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 21 @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
25 - private String deviceId; 22 + private Long deviceId;
26 23
27 - @Schema(description = "来源的固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") 24 + @Schema(description = "设备名称", example = "智能开关")
  25 + private String deviceName;
  26 +
  27 + @Schema(description = "来源的固件编号", example = "1023")
28 private Long fromFirmwareId; 28 private Long fromFirmwareId;
29 29
30 - @Schema(description = "来源的固件版本", requiredMode = Schema.RequiredMode.REQUIRED, example = "v1.0.0") 30 + @Schema(description = "来源固件版本", example = "1.0.0")
31 private String fromFirmwareVersion; 31 private String fromFirmwareVersion;
32 32
33 - @Schema(description = "升级状态", requiredMode = Schema.RequiredMode.REQUIRED) 33 + @Schema(description = "升级状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
34 private Integer status; 34 private Integer status;
35 35
36 - @Schema(description = "升级进度,百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") 36 + @Schema(description = "升级进度,百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "50")
37 private Integer progress; 37 private Integer progress;
38 38
39 - @Schema(description = "升级进度描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") 39 + @Schema(description = "升级进度描述", example = "正在下载固件...")
40 private String description; 40 private String description;
41 41
  42 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  43 + private LocalDateTime createTime;
  44 +
  45 + @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
  46 + private LocalDateTime updateTime;
  47 +
42 } 48 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/IotDeviceMapper.java
@@ -52,9 +52,11 @@ public interface IotDeviceMapper extends BaseMapperX&lt;IotDeviceDO&gt; { @@ -52,9 +52,11 @@ public interface IotDeviceMapper extends BaseMapperX&lt;IotDeviceDO&gt; {
52 return selectCount(IotDeviceDO::getProductId, productId); 52 return selectCount(IotDeviceDO::getProductId, productId);
53 } 53 }
54 54
55 - default List<IotDeviceDO> selectListByDeviceType(@Nullable Integer deviceType) { 55 + default List<IotDeviceDO> selectListByCondition(@Nullable Integer deviceType,
  56 + @Nullable Long productId) {
56 return selectList(new LambdaQueryWrapperX<IotDeviceDO>() 57 return selectList(new LambdaQueryWrapperX<IotDeviceDO>()
57 - .geIfPresent(IotDeviceDO::getDeviceType, deviceType)); 58 + .eqIfPresent(IotDeviceDO::getDeviceType, deviceType)
  59 + .eqIfPresent(IotDeviceDO::getProductId, productId));
58 } 60 }
59 61
60 default List<IotDeviceDO> selectListByState(Integer state) { 62 default List<IotDeviceDO> selectListByState(Integer state) {
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/ota/IotOtaTaskRecordMapper.java
@@ -23,7 +23,8 @@ public interface IotOtaTaskRecordMapper extends BaseMapperX&lt;IotOtaTaskRecordDO&gt; @@ -23,7 +23,8 @@ public interface IotOtaTaskRecordMapper extends BaseMapperX&lt;IotOtaTaskRecordDO&gt;
23 23
24 default PageResult<IotOtaTaskRecordDO> selectPage(IotOtaTaskRecordPageReqVO pageReqVO) { 24 default PageResult<IotOtaTaskRecordDO> selectPage(IotOtaTaskRecordPageReqVO pageReqVO) {
25 return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaTaskRecordDO>() 25 return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaTaskRecordDO>()
26 - .eqIfPresent(IotOtaTaskRecordDO::getTaskId, pageReqVO.getTaskId())); 26 + .eqIfPresent(IotOtaTaskRecordDO::getTaskId, pageReqVO.getTaskId())
  27 + .eqIfPresent(IotOtaTaskRecordDO::getStatus, pageReqVO.getStatus()));
27 } 28 }
28 29
29 default void updateByTaskIdAndStatus(Long taskId, Integer fromStatus, IotOtaTaskRecordDO updateRecord) { 30 default void updateByTaskIdAndStatus(Long taskId, Integer fromStatus, IotOtaTaskRecordDO updateRecord) {
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/enums/DictTypeConstants.java
@@ -18,5 +18,6 @@ public class DictTypeConstants { @@ -18,5 +18,6 @@ public class DictTypeConstants {
18 18
19 public static final String OTA_TASK_DEVICE_SCOPE = "iot_ota_task_device_scope"; 19 public static final String OTA_TASK_DEVICE_SCOPE = "iot_ota_task_device_scope";
20 public static final String OTA_TASK_STATUS = "iot_ota_task_status"; 20 public static final String OTA_TASK_STATUS = "iot_ota_task_status";
  21 + public static final String OTA_TASK_RECORD_STATUS = "iot_ota_task_record_status";
21 22
22 } 23 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java
@@ -13,6 +13,8 @@ import java.util.Collection; @@ -13,6 +13,8 @@ import java.util.Collection;
13 import java.util.List; 13 import java.util.List;
14 import java.util.Map; 14 import java.util.Map;
15 15
  16 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  17 +
16 /** 18 /**
17 * IoT 设备 Service 接口 19 * IoT 设备 Service 接口
18 * 20 *
@@ -138,12 +140,14 @@ public interface IotDeviceService { @@ -138,12 +140,14 @@ public interface IotDeviceService {
138 PageResult<IotDeviceDO> getDevicePage(IotDevicePageReqVO pageReqVO); 140 PageResult<IotDeviceDO> getDevicePage(IotDevicePageReqVO pageReqVO);
139 141
140 /** 142 /**
141 - * 基于设备类型,获得设备列表 143 + * 根据条件,获得设备列表
142 * 144 *
143 * @param deviceType 设备类型 145 * @param deviceType 设备类型
  146 + * @param productId 产品编号
144 * @return 设备列表 147 * @return 设备列表
145 */ 148 */
146 - List<IotDeviceDO> getDeviceListByDeviceType(@Nullable Integer deviceType); 149 + List<IotDeviceDO> getDeviceListByCondition(@Nullable Integer deviceType,
  150 + @Nullable Long productId);
147 151
148 /** 152 /**
149 * 获得状态,获得设备列表 153 * 获得状态,获得设备列表
@@ -241,4 +245,22 @@ public interface IotDeviceService { @@ -241,4 +245,22 @@ public interface IotDeviceService {
241 */ 245 */
242 List<IotDeviceDO> validateDeviceListExists(Collection<Long> ids); 246 List<IotDeviceDO> validateDeviceListExists(Collection<Long> ids);
243 247
  248 + /**
  249 + * 获得设备列表
  250 + *
  251 + * @param ids 设备编号数组
  252 + * @return 设备列表
  253 + */
  254 + List<IotDeviceDO> getDeviceList(Collection<Long> ids);
  255 +
  256 + /**
  257 + * 获得设备 Map
  258 + *
  259 + * @param ids 设备编号数组
  260 + * @return 设备 Map
  261 + */
  262 + default Map<Long, IotDeviceDO> getDeviceMap(Collection<Long> ids) {
  263 + return convertMap(getDeviceList(ids), IotDeviceDO::getId);
  264 + }
  265 +
244 } 266 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java
@@ -264,8 +264,8 @@ public class IotDeviceServiceImpl implements IotDeviceService { @@ -264,8 +264,8 @@ public class IotDeviceServiceImpl implements IotDeviceService {
264 } 264 }
265 265
266 @Override 266 @Override
267 - public List<IotDeviceDO> getDeviceListByDeviceType(@Nullable Integer deviceType) {  
268 - return deviceMapper.selectListByDeviceType(deviceType); 267 + public List<IotDeviceDO> getDeviceListByCondition(@Nullable Integer deviceType, @Nullable Long productId) {
  268 + return deviceMapper.selectListByCondition(deviceType, productId);
269 } 269 }
270 270
271 @Override 271 @Override
@@ -470,16 +470,21 @@ public class IotDeviceServiceImpl implements IotDeviceService { @@ -470,16 +470,21 @@ public class IotDeviceServiceImpl implements IotDeviceService {
470 470
471 @Override 471 @Override
472 public List<IotDeviceDO> validateDeviceListExists(Collection<Long> ids) { 472 public List<IotDeviceDO> validateDeviceListExists(Collection<Long> ids) {
473 - if (CollUtil.isEmpty(ids)) {  
474 - return Collections.emptyList();  
475 - }  
476 - List<IotDeviceDO> devices = deviceMapper.selectByIds(ids); 473 + List<IotDeviceDO> devices = getDeviceList(ids);
477 if (devices.size() != ids.size()) { 474 if (devices.size() != ids.size()) {
478 throw exception(DEVICE_NOT_EXISTS); 475 throw exception(DEVICE_NOT_EXISTS);
479 } 476 }
480 return devices; 477 return devices;
481 } 478 }
482 479
  480 + @Override
  481 + public List<IotDeviceDO> getDeviceList(Collection<Long> ids) {
  482 + if (CollUtil.isEmpty(ids)) {
  483 + return Collections.emptyList();
  484 + }
  485 + return deviceMapper.selectByIds(ids);
  486 + }
  487 +
483 private IotDeviceServiceImpl getSelf() { 488 private IotDeviceServiceImpl getSelf() {
484 return SpringUtil.getBean(getClass()); 489 return SpringUtil.getBean(getClass());
485 } 490 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/ota/IotOtaFirmwareService.java
@@ -7,6 +7,12 @@ import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwa @@ -7,6 +7,12 @@ import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwa
7 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO; 7 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
8 import jakarta.validation.Valid; 8 import jakarta.validation.Valid;
9 9
  10 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
  11 +
  12 +import java.util.Collection;
  13 +import java.util.List;
  14 +import java.util.Map;
  15 +
10 /** 16 /**
11 * OTA 固件管理 Service 接口 17 * OTA 固件管理 Service 接口
12 * 18 *
@@ -30,14 +36,32 @@ public interface IotOtaFirmwareService { @@ -30,14 +36,32 @@ public interface IotOtaFirmwareService {
30 void updateOtaFirmware(@Valid IotOtaFirmwareUpdateReqVO updateReqVO); 36 void updateOtaFirmware(@Valid IotOtaFirmwareUpdateReqVO updateReqVO);
31 37
32 /** 38 /**
33 - * 根据 ID 获取 OTA 固件信息 39 + * 获取 OTA 固件信息
34 * 40 *
35 - * @param id OTA 固件编号 41 + * @param id 固件编号
36 * @return 固件信息 42 * @return 固件信息
37 */ 43 */
38 IotOtaFirmwareDO getOtaFirmware(Long id); 44 IotOtaFirmwareDO getOtaFirmware(Long id);
39 45
40 /** 46 /**
  47 + * 获取 OTA 固件信息列表
  48 + *
  49 + * @param ids 固件编号集合
  50 + * @return 固件信息列表
  51 + */
  52 + List<IotOtaFirmwareDO> getOtaFirmwareList(Collection<Long> ids);
  53 +
  54 + /**
  55 + * 获取 OTA 固件信息 Map
  56 + *
  57 + * @param ids 固件编号集合
  58 + * @return 固件信息 Map
  59 + */
  60 + default Map<Long, IotOtaFirmwareDO> getOtaFirmwareMap(Collection<Long> ids) {
  61 + return convertMap(getOtaFirmwareList(ids), IotOtaFirmwareDO::getId);
  62 + }
  63 +
  64 + /**
41 * 分页查询 OTA 固件信息 65 * 分页查询 OTA 固件信息
42 * 66 *
43 * @param pageReqVO 分页查询条件 67 * @param pageReqVO 分页查询条件
@@ -46,10 +70,10 @@ public interface IotOtaFirmwareService { @@ -46,10 +70,10 @@ public interface IotOtaFirmwareService {
46 PageResult<IotOtaFirmwareDO> getOtaFirmwarePage(@Valid IotOtaFirmwarePageReqVO pageReqVO); 70 PageResult<IotOtaFirmwareDO> getOtaFirmwarePage(@Valid IotOtaFirmwarePageReqVO pageReqVO);
47 71
48 /** 72 /**
49 - * 验证物联网 OTA 固件是否存在 73 + * 验证 OTA 固件是否存在
50 * 74 *
51 - * @param id 物联网 OTA 固件编号  
52 - * @return OTA 固件 75 + * @param id 固件编号
  76 + * @return 固件信息
53 */ 77 */
54 IotOtaFirmwareDO validateFirmwareExists(Long id); 78 IotOtaFirmwareDO validateFirmwareExists(Long id);
55 79
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/ota/IotOtaFirmwareServiceImpl.java
@@ -18,8 +18,13 @@ import org.springframework.stereotype.Service; @@ -18,8 +18,13 @@ import org.springframework.stereotype.Service;
18 import org.springframework.validation.annotation.Validated; 18 import org.springframework.validation.annotation.Validated;
19 19
20 import java.io.ByteArrayInputStream; 20 import java.io.ByteArrayInputStream;
  21 +import java.util.Collection;
  22 +import java.util.Collections;
  23 +import java.util.List;
  24 +import java.util.Map;
21 25
22 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; 26 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  27 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
23 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.OTA_FIRMWARE_NOT_EXISTS; 28 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.OTA_FIRMWARE_NOT_EXISTS;
24 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.OTA_FIRMWARE_PRODUCT_VERSION_DUPLICATE; 29 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.OTA_FIRMWARE_PRODUCT_VERSION_DUPLICATE;
25 30
@@ -77,6 +82,14 @@ public class IotOtaFirmwareServiceImpl implements IotOtaFirmwareService { @@ -77,6 +82,14 @@ public class IotOtaFirmwareServiceImpl implements IotOtaFirmwareService {
77 } 82 }
78 83
79 @Override 84 @Override
  85 + public List<IotOtaFirmwareDO> getOtaFirmwareList(Collection<Long> ids) {
  86 + if (ids == null || ids.isEmpty()) {
  87 + return Collections.emptyList();
  88 + }
  89 + return otaFirmwareMapper.selectByIds(ids);
  90 + }
  91 +
  92 + @Override
80 public PageResult<IotOtaFirmwareDO> getOtaFirmwarePage(IotOtaFirmwarePageReqVO pageReqVO) { 93 public PageResult<IotOtaFirmwareDO> getOtaFirmwarePage(IotOtaFirmwarePageReqVO pageReqVO) {
81 return otaFirmwareMapper.selectPage(pageReqVO); 94 return otaFirmwareMapper.selectPage(pageReqVO);
82 } 95 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/ota/IotOtaTaskRecordService.java
@@ -31,7 +31,7 @@ public interface IotOtaTaskRecordService { @@ -31,7 +31,7 @@ public interface IotOtaTaskRecordService {
31 * @param taskId 任务编号 31 * @param taskId 任务编号
32 * @return 状态统计 Map,key 为状态码,value 为对应状态的升级记录数量 32 * @return 状态统计 Map,key 为状态码,value 为对应状态的升级记录数量
33 */ 33 */
34 - Map<Integer, Long> getOtaTaskRecordStatusCountMap(Long firmwareId, Long taskId); 34 + Map<Integer, Long> getOtaTaskRecordStatusStatistics(Long firmwareId, Long taskId);
35 35
36 /** 36 /**
37 * 获取 OTA 升级记录 37 * 获取 OTA 升级记录
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/ota/IotOtaTaskRecordServiceImpl.java
@@ -42,7 +42,7 @@ public class IotOtaTaskRecordServiceImpl implements IotOtaTaskRecordService { @@ -42,7 +42,7 @@ public class IotOtaTaskRecordServiceImpl implements IotOtaTaskRecordService {
42 } 42 }
43 43
44 @Override 44 @Override
45 - public Map<Integer, Long> getOtaTaskRecordStatusCountMap(Long firmwareId, Long taskId) { 45 + public Map<Integer, Long> getOtaTaskRecordStatusStatistics(Long firmwareId, Long taskId) {
46 // 按照 status 枚举,初始化 countMap 为 0 46 // 按照 status 枚举,初始化 countMap 为 0
47 Map<Integer, Long> countMap = convertMap(Arrays.asList(IotOtaTaskRecordStatusEnum.values()), 47 Map<Integer, Long> countMap = convertMap(Arrays.asList(IotOtaTaskRecordStatusEnum.values()),
48 IotOtaTaskRecordStatusEnum::getStatus, iotOtaTaskRecordStatusEnum -> 0L); 48 IotOtaTaskRecordStatusEnum::getStatus, iotOtaTaskRecordStatusEnum -> 0L);