Commit 44d7d623b33514d7391ce1a3bc8a99cc3bf18425

Authored by YunaiV
1 parent 08ff69d5

【代码评审】IoT:OTA 的实现

Showing 15 changed files with 73 additions and 59 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/firmware/IotOtaFirmwareCreateReqVO.java
... ... @@ -27,6 +27,7 @@ public class IotOtaFirmwareCreateReqVO {
27 27 private String productId;
28 28  
29 29 @Schema(description = "签名方式", example = "MD5")
  30 + // TODO @li:是不是必传哈
30 31 private String signMethod;
31 32  
32 33 @Schema(description = "固件文件 URL", requiredMode = REQUIRED, example = "https://www.iocoder.cn/yudao-firmware.zip")
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/firmware/IotOtaFirmwareUpdateReqVO.java
... ... @@ -7,7 +7,7 @@ import lombok.Data;
7 7  
8 8 import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
9 9  
10   -@Schema(description = "管理后台 - OTA固件更新 Request VO")
  10 +@Schema(description = "管理后台 - OTA 固件更新 Request VO")
11 11 @Data
12 12 public class IotOtaFirmwareUpdateReqVO {
13 13  
... ... @@ -15,6 +15,7 @@ public class IotOtaFirmwareUpdateReqVO {
15 15 @NotNull(message = "固件编号不能为空")
16 16 private Long id;
17 17  
  18 + // TODO @li:name 是不是可以飞必传哈
18 19 @Schema(description = "固件名称", requiredMode = REQUIRED, example = "智能开关固件")
19 20 @NotEmpty(message = "固件名称不能为空")
20 21 private String name;
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/upgrade/record/IotOtaUpgradeRecordPageReqVO.java
... ... @@ -8,16 +8,17 @@ import lombok.Data;
8 8 import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
9 9  
10 10 @Data
11   -@Schema(description = "管理后台 - OTA升级记录分页 Request VO")
  11 +@Schema(description = "管理后台 - OTA 升级记录分页 Request VO")
12 12 public class IotOtaUpgradeRecordPageReqVO extends PageParam {
13 13  
  14 + // TODO @li:已经有注解,不用重复注释
14 15 /**
15 16 * 升级任务编号字段。
16 17 * <p>
17 18 * 该字段用于标识升级任务的唯一编号,不能为空。
18 19 */
19   - @NotNull(message = "升级任务编号不能为空")
20 20 @Schema(description = "升级任务编号", requiredMode = REQUIRED, example = "1024")
  21 + @NotNull(message = "升级任务编号不能为空")
21 22 private Long taskId;
22 23  
23 24 /**
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/ota/vo/upgrade/task/IotOtaUpgradeTaskSaveReqVO.java
... ... @@ -14,9 +14,12 @@ import java.util.List;
14 14 import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
15 15  
16 16 @Data
17   -@Schema(description = "管理后台 - OTA升级任务创建/修改 Request VO")
  17 +@Schema(description = "管理后台 - OTA 升级任务创建/修改 Request VO")
18 18 public class IotOtaUpgradeTaskSaveReqVO {
19 19  
  20 + // TODO @li:已经有注解,不用重复注释
  21 + // TODO @li: @Schema 写在参数校验前面。先有定义;其他的,也检查下;
  22 +
20 23 /**
21 24 * 任务名称
22 25 */
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/convert/ota/IotOtaUpgradeRecordConvert.java deleted
1   -package cn.iocoder.yudao.module.iot.convert.ota;
2   -
3   -import org.mapstruct.Mapper;
4   -import org.mapstruct.factory.Mappers;
5   -
6   -@Mapper
7   -public interface IotOtaUpgradeRecordConvert {
8   -
9   - IotOtaUpgradeRecordConvert INSTANCE = Mappers.getMapper(IotOtaUpgradeRecordConvert.class);
10   -
11   -}
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/ota/IotOtaFirmwareDO.java
... ... @@ -46,6 +46,7 @@ public class IotOtaFirmwareDO extends BaseDO {
46 46 *
47 47 * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()}
48 48 */
  49 + // TODO @li:帮我改成 Long 哈,写错了
49 50 private String productId;
50 51 /**
51 52 * 产品标识
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/ota/IotOtaFirmwareMapper.java
... ... @@ -9,11 +9,7 @@ import org.apache.ibatis.annotations.Mapper;
9 9  
10 10 import java.util.List;
11 11  
12   -/**
13   - * OTA固件 Mapper
14   - *
15   - * @author Shelly
16   - */
  12 +// TODO @li:参考 IotOtaUpgradeRecordMapper 的写法
17 13 @Mapper
18 14 public interface IotOtaFirmwareMapper extends BaseMapperX<IotOtaFirmwareDO> {
19 15  
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/ota/IotOtaUpgradeRecordMapper.java
... ... @@ -13,14 +13,10 @@ import org.apache.ibatis.annotations.Select;
13 13 import java.util.List;
14 14 import java.util.Map;
15 15  
16   -/**
17   - * OTA 升级记录 Mapper
18   - *
19   - * @author Shelly
20   - */
21 16 @Mapper
22 17 public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeRecordDO> {
23 18  
  19 + // TODO @li:selectByFirmwareIdAndTaskIdAndDeviceId;让方法自解释
24 20 /**
25 21 * 根据条件查询单个OTA升级记录
26 22 *
... ... @@ -37,6 +33,7 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX&lt;IotOtaUpgradeReco
37 33 .eqIfPresent(IotOtaUpgradeRecordDO::getDeviceId, deviceId));
38 34 }
39 35  
  36 + // TODO @li:这个是不是 groupby status 就 ok 拉?
40 37 /**
41 38 * 根据任务ID和设备名称查询OTA升级记录的状态统计信息。
42 39 * 该函数通过SQL查询统计不同状态(0到5)的记录数量,并返回一个包含统计结果的Map列表。
... ... @@ -75,19 +72,23 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX&lt;IotOtaUpgradeReco
75 72 "where firmware_id = #{firmwareId}")
76 73 List<Map<String, Object>> selectOtaUpgradeRecordStatistics(Long firmwareId);
77 74  
  75 + // TODO @li:这里的注释,可以去掉哈
78 76 /**
79 77 * 根据分页查询条件获取IOT OTA升级记录的分页结果
80 78 *
81 79 * @param pageReqVO 分页查询请求参数,包含设备名称、任务ID等查询条件
82 80 * @return 返回分页查询结果,包含符合条件的IOT OTA升级记录列表
83 81 */
  82 + // TODO @li:selectPage 就 ok 拉。
84 83 default PageResult<IotOtaUpgradeRecordDO> selectUpgradeRecordPage(IotOtaUpgradeRecordPageReqVO pageReqVO) {
  84 + // TODO @li:这里的注释,可以去掉哈;然后下面的“如果”。。。也没必要注释
85 85 // 使用LambdaQueryWrapperX构建查询条件,并根据请求参数动态添加查询条件
86 86 return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaUpgradeRecordDO>()
87 87 .likeIfPresent(IotOtaUpgradeRecordDO::getDeviceName, pageReqVO.getDeviceName()) // 如果设备名称存在,则添加模糊查询条件
88 88 .eqIfPresent(IotOtaUpgradeRecordDO::getTaskId, pageReqVO.getTaskId())); // 如果任务ID存在,则添加等值查询条件
89 89 }
90 90  
  91 + // TODO @li:这里的注释,可以去掉哈
91 92 /**
92 93 * 根据任务ID和状态更新升级记录的状态
93 94 * <p>
... ... @@ -97,6 +98,7 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX&lt;IotOtaUpgradeReco
97 98 * @param taskId 要更新的升级记录对应的任务ID,类型为Long
98 99 * @param whereStatus 用于筛选升级记录的当前状态值,类型为Integer
99 100 */
  101 + // TODO @li:改成 updateByTaskIdAndStatus(taskId, status, IotOtaUpgradeRecordDO) 更通用一些。
100 102 default void updateUpgradeRecordStatusByTaskIdAndStatus(Integer setStatus, Long taskId, Integer whereStatus) {
101 103 // 使用LambdaUpdateWrapper构建更新条件,将指定状态的记录更新为指定状态
102 104 update(new LambdaUpdateWrapper<IotOtaUpgradeRecordDO>()
... ... @@ -106,6 +108,7 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX&lt;IotOtaUpgradeReco
106 108 );
107 109 }
108 110  
  111 + // TODO @li:参考上面的建议,调整下这个方法
109 112 /**
110 113 * 根据状态查询符合条件的升级记录列表
111 114 * <p>
... ... @@ -120,6 +123,7 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX&lt;IotOtaUpgradeReco
120 123 .eq(IotOtaUpgradeRecordDO::getStatus, state));
121 124 }
122 125  
  126 + // TODO @li:参考上面的建议,调整下这个方法
123 127 /**
124 128 * 更新升级记录状态
125 129 * <p>
... ... @@ -137,6 +141,7 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX&lt;IotOtaUpgradeReco
137 141 );
138 142 }
139 143  
  144 + // TODO @li:参考上面的建议,调整下这个方法
140 145 /**
141 146 * 根据任务ID查询升级记录列表
142 147 * <p>
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/plugin/IotPluginInstanceMapper.java
... ... @@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Mapper;
8 8 import java.time.LocalDateTime;
9 9 import java.util.List;
10 10  
  11 +// TODO @li:参考 IotOtaUpgradeRecordMapper 的写法
11 12 @Mapper
12 13 public interface IotPluginInstanceMapper extends BaseMapperX<IotPluginInstanceDO> {
13 14  
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/ota/IotOtaFirmwareService.java
... ... @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwa
7 7 import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
8 8 import jakarta.validation.Valid;
9 9  
  10 +// TODO @li:注释写的有点冗余,可以看看别的模块哈。= = AI 生成的注释,有的时候太啰嗦了,需要处理下的哈
10 11 /**
11 12 * OTA 固件管理 Service
12 13 *
... ... @@ -15,7 +16,7 @@ import jakarta.validation.Valid;
15 16 public interface IotOtaFirmwareService {
16 17  
17 18 /**
18   - * 创建OTA固件
  19 + * 创建 OTA 固件
19 20 *
20 21 * @param saveReqVO OTA固件保存请求对象,包含固件的相关信息
21 22 * @return 返回新创建的固件的ID
... ... @@ -23,14 +24,14 @@ public interface IotOtaFirmwareService {
23 24 Long createOtaFirmware(@Valid IotOtaFirmwareCreateReqVO saveReqVO);
24 25  
25 26 /**
26   - * 更新OTA固件信息
  27 + * 更新 OTA 固件信息
27 28 *
28 29 * @param updateReqVO OTA固件保存请求对象,包含需要更新的固件信息
29 30 */
30 31 void updateOtaFirmware(@Valid IotOtaFirmwareUpdateReqVO updateReqVO);
31 32  
32 33 /**
33   - * 根据ID获取OTA固件信息
  34 + * 根据 ID 获取 OTA 固件信息
34 35 *
35 36 * @param id OTA固件的唯一标识符
36 37 * @return 返回OTA固件的详细信息对象
... ... @@ -38,7 +39,7 @@ public interface IotOtaFirmwareService {
38 39 IotOtaFirmwareDO getOtaFirmware(Long id);
39 40  
40 41 /**
41   - * 分页查询OTA固件信息
  42 + * 分页查询 OTA 固件信息
42 43 *
43 44 * @param pageReqVO 包含分页查询条件的请求对象
44 45 * @return 返回分页查询结果,包含固件信息列表和分页信息
... ... @@ -46,7 +47,7 @@ public interface IotOtaFirmwareService {
46 47 PageResult<IotOtaFirmwareDO> getOtaFirmwarePage(@Valid IotOtaFirmwarePageReqVO pageReqVO);
47 48  
48 49 /**
49   - * 验证物联网OTA固件是否存在
  50 + * 验证物联网 OTA 固件是否存在
50 51 *
51 52 * @param id 固件的唯一标识符
52 53 * 该方法用于检查系统中是否存在与给定ID关联的物联网OTA固件信息
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/ota/IotOtaFirmwareServiceImpl.java
... ... @@ -39,13 +39,14 @@ public class IotOtaFirmwareServiceImpl implements IotOtaFirmwareService {
39 39 public Long createOtaFirmware(IotOtaFirmwareCreateReqVO saveReqVO) {
40 40 // 1. 校验固件产品 + 版本号不能重复
41 41 validateProductAndVersionDuplicate(saveReqVO.getProductId(), saveReqVO.getVersion());
  42 +
42 43 // 2.1.转化数据格式,准备存储到数据库中
43 44 IotOtaFirmwareDO firmware = BeanUtils.toBean(saveReqVO, IotOtaFirmwareDO.class);
44 45 // 2.2.查询ProductKey
  46 + // TODO @li:productService.getProduct(Convert.toLong(firmware.getProductId())) 放到 1. 后面,先做参考校验。逻辑两段:1)先参数校验;2)构建对象 + 存储
45 47 IotProductDO product = productService.getProduct(Convert.toLong(firmware.getProductId()));
46 48 firmware.setProductKey(Objects.requireNonNull(product).getProductKey());
47 49 // TODO @芋艿: 附件、附件签名等属性的计算
48   -
49 50 otaFirmwareMapper.insert(firmware);
50 51 return firmware.getId();
51 52 }
... ... @@ -79,6 +80,7 @@ public class IotOtaFirmwareServiceImpl implements IotOtaFirmwareService {
79 80 return firmware;
80 81 }
81 82  
  83 + // TODO @li:注释有点冗余
82 84 /**
83 85 * 验证产品和版本号是否重复
84 86 * <p>
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/ota/IotOtaUpgradeRecordService.java
... ... @@ -8,6 +8,7 @@ import jakarta.validation.Valid;
8 8 import java.util.List;
9 9 import java.util.Map;
10 10  
  11 +// TODO @li:注释写的有点冗余,可以看看别的模块哈。= = AI 生成的注释,有的时候太啰嗦了,需要处理下的哈
11 12 /**
12 13 * IotOtaUpgradeRecordService 接口定义了与物联网设备OTA升级记录相关的操作。
13 14 * 该接口提供了创建、更新、查询、统计和重试升级记录的功能。
... ... @@ -15,7 +16,7 @@ import java.util.Map;
15 16 public interface IotOtaUpgradeRecordService {
16 17  
17 18 /**
18   - * 批量创建OTA升级记录。
  19 + * 批量创建 OTA 升级记录
19 20 * 该函数用于为指定的设备列表、固件ID和升级任务ID创建OTA升级记录。
20 21 *
21 22 * @param deviceIds 设备ID列表,表示需要升级的设备集合。
... ... @@ -25,7 +26,7 @@ public interface IotOtaUpgradeRecordService {
25 26 void createOtaUpgradeRecordBatch(List<Long> deviceIds, Long firmwareId, Long upgradeTaskId);
26 27  
27 28 /**
28   - * 获取OTA升级记录的数量统计。
  29 + * 获取 OTA 升级记录的数量统计
29 30 *
30 31 * @return 返回一个 Map,其中键为状态码,值为对应状态的升级记录数量
31 32 */
... ... @@ -39,14 +40,14 @@ public interface IotOtaUpgradeRecordService {
39 40 Map<Integer, Long> getOtaUpgradeRecordStatistics(Long firmwareId);
40 41  
41 42 /**
42   - * 重试指定的OTA升级记录。
  43 + * 重试指定的 OTA 升级记录
43 44 *
44 45 * @param id 需要重试的升级记录的ID。
45 46 */
46 47 void retryUpgradeRecord(Long id);
47 48  
48 49 /**
49   - * 获取指定ID的OTA升级记录的详细信息。
  50 + * 获取指定 ID 的 OTA 升级记录的详细信息。
50 51 *
51 52 * @param id 需要查询的升级记录的ID。
52 53 * @return 返回包含升级记录详细信息的响应对象。
... ... @@ -54,7 +55,7 @@ public interface IotOtaUpgradeRecordService {
54 55 IotOtaUpgradeRecordDO getUpgradeRecord(Long id);
55 56  
56 57 /**
57   - * 分页查询OTA升级记录。
  58 + * 分页查询 OTA 升级记录。
58 59 *
59 60 * @param pageReqVO 包含分页查询条件的请求对象,必须经过验证。
60 61 * @return 返回包含分页查询结果的响应对象。
... ... @@ -62,7 +63,7 @@ public interface IotOtaUpgradeRecordService {
62 63 PageResult<IotOtaUpgradeRecordDO> getUpgradeRecordPage(@Valid IotOtaUpgradeRecordPageReqVO pageReqVO);
63 64  
64 65 /**
65   - * 根据任务ID取消升级记录。
  66 + * 根据任务 ID 取消升级记录
66 67 * <p>
67 68 * 该函数用于根据给定的任务ID,取消与该任务相关的升级记录。通常用于在任务执行失败或用户手动取消时,
68 69 * 清理或标记相关的升级记录为取消状态。
... ... @@ -71,6 +72,7 @@ public interface IotOtaUpgradeRecordService {
71 72 */
72 73 void cancelUpgradeRecordByTaskId(Long taskId);
73 74  
  75 + // TODO @li:不要的方法,可以删除下哈。
74 76 /**
75 77 * 根据升级状态获取升级记录列表
76 78 *
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/ota/IotOtaUpgradeRecordServiceImpl.java
... ... @@ -25,8 +25,8 @@ import java.util.stream.Collectors;
25 25  
26 26 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
27 27 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*;
28   -import static cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeRecordStatusEnum.CANCELED;
29 28  
  29 +// TODO @li:@Service、@Validated、@Slf4j,先用关键注解;2)类注释,简单写
30 30 @Slf4j
31 31 @Service
32 32 @Validated
... ... @@ -34,6 +34,7 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
34 34  
35 35 @Resource
36 36 private IotOtaUpgradeRecordMapper upgradeRecordMapper;
  37 + // TODO @li:1)@Resource 写在 @Lazy 之前,先用关键注解;2)有必要的情况下,在写 @Lazy 注解。
37 38 @Lazy
38 39 @Resource
39 40 private IotDeviceService deviceService;
... ... @@ -46,8 +47,10 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
46 47  
47 48 @Override
48 49 public void createOtaUpgradeRecordBatch(List<Long> deviceIds, Long firmwareId, Long upgradeTaskId) {
49   - // 1.校验升级记录信息是否存在,并且已经取消的任务可以重新开始
  50 + // 1. 校验升级记录信息是否存在,并且已经取消的任务可以重新开始
  51 + // TODO @li:批量查询。。
50 52 deviceIds.forEach(deviceId -> validateUpgradeRecordDuplicate(firmwareId, upgradeTaskId, String.valueOf(deviceId)));
  53 +
51 54 // 2.初始化OTA升级记录列表信息
52 55 IotOtaUpgradeTaskDO upgradeTask = upgradeTaskService.getUpgradeTask(upgradeTaskId);
53 56 IotOtaFirmwareDO firmware = firmwareService.getOtaFirmware(firmwareId);
... ... @@ -70,6 +73,7 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
70 73  
71 74 }
72 75  
  76 + // TODO @li:1)方法注释,简单写;2)父类写了注释,子类就不用写了。。。
73 77 /**
74 78 * 获取OTA升级记录的数量统计。
75 79 * 该方法根据传入的查询条件,统计不同状态的OTA升级记录数量,并返回一个包含各状态数量的映射。
... ... @@ -87,10 +91,10 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
87 91 Objects.requireNonNull(upgradeRecordCountMap);
88 92 return upgradeRecordCountMap.entrySet().stream().collect(Collectors.toMap(
89 93 entry -> Convert.toInt(entry.getKey()),
90   - entry -> Convert.toLong(entry.getValue())
91   - ));
  94 + entry -> Convert.toLong(entry.getValue())));
92 95 }
93 96  
  97 + // TODO @li:1)方法注释,简单写;2)父类写了注释,子类就不用写了。。。
94 98 /**
95 99 * 获取指定固件ID的OTA升级记录统计信息。
96 100 * 该方法通过查询数据库,统计不同状态的OTA升级记录数量,并返回一个包含各状态数量的映射。
... ... @@ -107,8 +111,7 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
107 111 Objects.requireNonNull(upgradeRecordStatisticsMap);
108 112 return upgradeRecordStatisticsMap.entrySet().stream().collect(Collectors.toMap(
109 113 entry -> Convert.toInt(entry.getKey()),
110   - entry -> Convert.toLong(entry.getValue())
111   - ));
  114 + entry -> Convert.toLong(entry.getValue())));
112 115 }
113 116  
114 117 @Override
... ... @@ -118,7 +121,8 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
118 121 // 1.2.校验升级记录是否可以重新升级
119 122 validateUpgradeRecordCanRetry(upgradeRecord);
120 123  
121   - // 2.将一些数据重置,这样定时任务轮询就可以重启任务
  124 + // 2. 将一些数据重置,这样定时任务轮询就可以重启任务
  125 + // TODO @li:更新的时候,wherestatus;
122 126 upgradeRecordMapper.updateById(new IotOtaUpgradeRecordDO()
123 127 .setId(upgradeRecord.getId()).setProgress(0)
124 128 .setStatus(IotOtaUpgradeRecordStatusEnum.PENDING.getStatus()));
... ... @@ -136,9 +140,9 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
136 140  
137 141 @Override
138 142 public void cancelUpgradeRecordByTaskId(Long taskId) {
139   - // 暂定只有待推送的升级记录可以取消
  143 + // 暂定只有待推送的升级记录可以取消 TODO @芋艿:可以看看阿里云,哪些可以取消
140 144 upgradeRecordMapper.updateUpgradeRecordStatusByTaskIdAndStatus(
141   - CANCELED.getStatus(), taskId,
  145 + IotOtaUpgradeRecordStatusEnum.CANCELED.getStatus(), taskId,
142 146 IotOtaUpgradeRecordStatusEnum.PENDING.getStatus());
143 147 }
144 148  
... ... @@ -175,6 +179,7 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
175 179 return upgradeRecord;
176 180 }
177 181  
  182 + // TODO @li:注释有点冗余
178 183 /**
179 184 * 校验固件升级记录是否重复。
180 185 * <p>
... ... @@ -189,13 +194,17 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
189 194 // 根据条件查询升级记录
190 195 IotOtaUpgradeRecordDO upgradeRecord = upgradeRecordMapper.selectByConditions(firmwareId, taskId, deviceId);
191 196 // 如果查询到升级记录且状态不是已取消,则抛出异常
  197 + // TODO @li:if return,减少括号层级;
  198 + // TODO @li:ObjUtil.notEquals,尽量不用 !取否逻辑;
192 199 if (upgradeRecord != null) {
193   - if (!CANCELED.getStatus().equals(upgradeRecord.getStatus())) {
  200 + if (!IotOtaUpgradeRecordStatusEnum.CANCELED.getStatus().equals(upgradeRecord.getStatus())) {
  201 + // TODO @li:提示的时候,需要把 deviceName 给提示出来,不然用户不知道哪个重复啦。
194 202 throw exception(OTA_UPGRADE_RECORD_DUPLICATE);
195 203 }
196 204 }
197 205 }
198 206  
  207 + // TODO @li:注释有点冗余
199 208 /**
200 209 * 验证升级记录是否可以重试。
201 210 * <p>
... ... @@ -205,6 +214,7 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
205 214 * @param upgradeRecord 需要验证的升级记录对象,类型为 IotOtaUpgradeRecordDO
206 215 * @throws cn.iocoder.yudao.framework.common.exception.ServiceException,则抛出 OTA_UPGRADE_RECORD_CANNOT_RETRY 异常
207 216 */
  217 + // TODO @li:这种一次性的方法(不复用的),其实一步一定要抽成小方法;
208 218 private void validateUpgradeRecordCanRetry(IotOtaUpgradeRecordDO upgradeRecord) {
209 219 // 检查升级记录的状态是否为 PENDING、PUSHED 或 UPGRADING
210 220 if (ObjectUtils.equalsAny(upgradeRecord.getStatus(),
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/ota/IotOtaUpgradeTaskServiceImpl.java
... ... @@ -27,6 +27,7 @@ import java.util.stream.Collectors;
27 27 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
28 28 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*;
29 29  
  30 +// TODO @li:完善注释、注解顺序
30 31 @Slf4j
31 32 @Service
32 33 @Validated
... ... @@ -54,9 +55,11 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
54 55 IotOtaFirmwareDO firmware = firmwareService.validateFirmwareExists(createReqVO.getFirmwareId());
55 56 // 1.3 补全设备范围信息,并且校验是否又设备可以升级,如果没有设备可以升级,则报错
56 57 validateScopeAndDevice(createReqVO.getScope(), createReqVO.getDeviceIds(), firmware.getProductId());
  58 +
57 59 // 2. 保存 OTA 升级任务信息到数据库
58 60 IotOtaUpgradeTaskDO upgradeTask = initOtaUpgradeTask(createReqVO, firmware.getProductId());
59 61 upgradeTaskMapper.insert(upgradeTask);
  62 +
60 63 // 3. 生成设备升级记录信息并存储,等待定时任务轮询
61 64 upgradeRecordService.createOtaUpgradeRecordBatch(upgradeTask.getDeviceIds(), firmware.getId(), upgradeTask.getId());
62 65 return upgradeTask.getId();
... ... @@ -68,15 +71,16 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
68 71 // 1.1 校验升级任务是否存在
69 72 IotOtaUpgradeTaskDO upgradeTask = validateUpgradeTaskExists(id);
70 73 // 1.2 校验升级任务是否可以取消
71   - // 检查升级任务的状态是否为进行中,只有此状态下的任务才允许取消
  74 + // TODO @li:ObjUtil notequals
72 75 if (!Objects.equals(upgradeTask.getStatus(), IotOtaUpgradeTaskStatusEnum.IN_PROGRESS.getStatus())) {
73   - // 只有进行中的任务才可以取消
74 76 throw exception(OTA_UPGRADE_TASK_CANNOT_CANCEL);
75 77 }
  78 +
76 79 // 2. 更新 OTA 升级任务状态为已取消
77 80 upgradeTaskMapper.updateById(IotOtaUpgradeTaskDO.builder()
78 81 .id(id).status(IotOtaUpgradeTaskStatusEnum.CANCELED.getStatus())
79 82 .build());
  83 +
80 84 // 3. 更新 OTA 升级记录状态为已取消
81 85 upgradeRecordService.cancelUpgradeRecordByTaskId(id);
82 86 }
... ... @@ -98,11 +102,10 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
98 102  
99 103 @Override
100 104 public void updateUpgradeTaskStatus(Long id, Integer status) {
101   - upgradeTaskMapper.updateById(IotOtaUpgradeTaskDO.builder()
102   - .id(id).status(status)
103   - .build());
  105 + upgradeTaskMapper.updateById(IotOtaUpgradeTaskDO.builder().id(id).status(status).build());
104 106 }
105 107  
  108 + // TODO @li:注释有点冗余
106 109 /**
107 110 * 校验固件升级任务是否重复
108 111 * <p>
... ... @@ -123,6 +126,7 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
123 126 }
124 127 }
125 128  
  129 + // TODO @li:注释有点冗余
126 130 /**
127 131 * 验证升级任务的范围和设备列表的有效性。
128 132 * <p>
... ... @@ -135,6 +139,7 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
135 139 * @throws cn.iocoder.yudao.framework.common.exception.ServiceException,抛出相应的异常
136 140 */
137 141 private void validateScopeAndDevice(Integer scope, List<Long> deviceIds, String productId) {
  142 + // TODO @li:if return
138 143 // 验证范围为“选择设备”时,设备列表不能为空
139 144 if (Objects.equals(scope, IotOtaUpgradeTaskScopeEnum.SELECT.getScope())) {
140 145 if (CollUtil.isEmpty(deviceIds)) {
... ... @@ -149,6 +154,7 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
149 154 }
150 155 }
151 156  
  157 + // TODO @li:注释有点冗余
152 158 /**
153 159 * 验证升级任务是否存在
154 160 * <p>
... ... @@ -167,6 +173,7 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
167 173 return upgradeTask;
168 174 }
169 175  
  176 + // TODO @li:注释有点冗余
170 177 /**
171 178 * 初始化升级任务
172 179 * <p>
... ... @@ -177,6 +184,7 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
177 184 * @param createReqVO 升级任务保存请求对象,包含创建升级任务所需的信息
178 185 * @return 返回初始化后的升级任务对象
179 186 */
  187 + // TODO @li:一次性的方法,不用特别抽小方法
180 188 private IotOtaUpgradeTaskDO initOtaUpgradeTask(IotOtaUpgradeTaskSaveReqVO createReqVO, String productId) {
181 189 // 将请求参数转换为升级任务对象
182 190 IotOtaUpgradeTaskDO upgradeTask = BeanUtils.toBean(createReqVO, IotOtaUpgradeTaskDO.class);
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/ota/IotOtaUpgradeRecordMapper.xml deleted
1   -<?xml version="1.0" encoding="UTF-8"?>
2   -<!DOCTYPE mapper
3   - PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4   - "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5   -<mapper namespace="cn.iocoder.yudao.module.iot.dal.mysql.ota.IotOtaUpgradeRecordMapper">
6   -
7   -</mapper>
8 0 \ No newline at end of file