Commit 44d7d623b33514d7391ce1a3bc8a99cc3bf18425
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
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<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<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<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<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<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<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 |