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

This commit is contained in:
YunaiV 2025-03-16 21:26:51 +08:00
parent 08ff69d554
commit 44d7d623b3
15 changed files with 73 additions and 59 deletions

View File

@ -27,6 +27,7 @@ public class IotOtaFirmwareCreateReqVO {
private String productId; private String productId;
@Schema(description = "签名方式", example = "MD5") @Schema(description = "签名方式", example = "MD5")
// TODO @li是不是必传哈
private String signMethod; private String signMethod;
@Schema(description = "固件文件 URL", requiredMode = REQUIRED, example = "https://www.iocoder.cn/yudao-firmware.zip") @Schema(description = "固件文件 URL", requiredMode = REQUIRED, example = "https://www.iocoder.cn/yudao-firmware.zip")

View File

@ -15,6 +15,7 @@ public class IotOtaFirmwareUpdateReqVO {
@NotNull(message = "固件编号不能为空") @NotNull(message = "固件编号不能为空")
private Long id; private Long id;
// TODO @liname 是不是可以飞必传哈
@Schema(description = "固件名称", requiredMode = REQUIRED, example = "智能开关固件") @Schema(description = "固件名称", requiredMode = REQUIRED, example = "智能开关固件")
@NotEmpty(message = "固件名称不能为空") @NotEmpty(message = "固件名称不能为空")
private String name; private String name;

View File

@ -11,13 +11,14 @@ import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
@Schema(description = "管理后台 - OTA 升级记录分页 Request VO") @Schema(description = "管理后台 - OTA 升级记录分页 Request VO")
public class IotOtaUpgradeRecordPageReqVO extends PageParam { public class IotOtaUpgradeRecordPageReqVO extends PageParam {
// TODO @li已经有注解不用重复注释
/** /**
* 升级任务编号字段 * 升级任务编号字段
* <p> * <p>
* 该字段用于标识升级任务的唯一编号不能为空 * 该字段用于标识升级任务的唯一编号不能为空
*/ */
@NotNull(message = "升级任务编号不能为空")
@Schema(description = "升级任务编号", requiredMode = REQUIRED, example = "1024") @Schema(description = "升级任务编号", requiredMode = REQUIRED, example = "1024")
@NotNull(message = "升级任务编号不能为空")
private Long taskId; private Long taskId;
/** /**

View File

@ -17,6 +17,9 @@ import static io.swagger.v3.oas.annotations.media.Schema.RequiredMode.REQUIRED;
@Schema(description = "管理后台 - OTA 升级任务创建/修改 Request VO") @Schema(description = "管理后台 - OTA 升级任务创建/修改 Request VO")
public class IotOtaUpgradeTaskSaveReqVO { public class IotOtaUpgradeTaskSaveReqVO {
// TODO @li已经有注解不用重复注释
// TODO @li @Schema 写在参数校验前面先有定义其他的也检查下
/** /**
* 任务名称 * 任务名称
*/ */

View File

@ -1,11 +0,0 @@
package cn.iocoder.yudao.module.iot.convert.ota;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface IotOtaUpgradeRecordConvert {
IotOtaUpgradeRecordConvert INSTANCE = Mappers.getMapper(IotOtaUpgradeRecordConvert.class);
}

View File

@ -46,6 +46,7 @@ public class IotOtaFirmwareDO extends BaseDO {
* *
* 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()} * 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()}
*/ */
// TODO @li帮我改成 Long 写错了
private String productId; private String productId;
/** /**
* 产品标识 * 产品标识

View File

@ -9,11 +9,7 @@ import org.apache.ibatis.annotations.Mapper;
import java.util.List; import java.util.List;
/** // TODO @li参考 IotOtaUpgradeRecordMapper 的写法
* OTA固件 Mapper
*
* @author Shelly
*/
@Mapper @Mapper
public interface IotOtaFirmwareMapper extends BaseMapperX<IotOtaFirmwareDO> { public interface IotOtaFirmwareMapper extends BaseMapperX<IotOtaFirmwareDO> {

View File

@ -13,14 +13,10 @@ import org.apache.ibatis.annotations.Select;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/**
* OTA 升级记录 Mapper
*
* @author Shelly
*/
@Mapper @Mapper
public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeRecordDO> { public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeRecordDO> {
// TODO @liselectByFirmwareIdAndTaskIdAndDeviceId让方法自解释
/** /**
* 根据条件查询单个OTA升级记录 * 根据条件查询单个OTA升级记录
* *
@ -37,6 +33,7 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeReco
.eqIfPresent(IotOtaUpgradeRecordDO::getDeviceId, deviceId)); .eqIfPresent(IotOtaUpgradeRecordDO::getDeviceId, deviceId));
} }
// TODO @li这个是不是 groupby status ok
/** /**
* 根据任务ID和设备名称查询OTA升级记录的状态统计信息 * 根据任务ID和设备名称查询OTA升级记录的状态统计信息
* 该函数通过SQL查询统计不同状态0到5的记录数量并返回一个包含统计结果的Map列表 * 该函数通过SQL查询统计不同状态0到5的记录数量并返回一个包含统计结果的Map列表
@ -75,19 +72,23 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeReco
"where firmware_id = #{firmwareId}") "where firmware_id = #{firmwareId}")
List<Map<String, Object>> selectOtaUpgradeRecordStatistics(Long firmwareId); List<Map<String, Object>> selectOtaUpgradeRecordStatistics(Long firmwareId);
// TODO @li这里的注释可以去掉哈
/** /**
* 根据分页查询条件获取IOT OTA升级记录的分页结果 * 根据分页查询条件获取IOT OTA升级记录的分页结果
* *
* @param pageReqVO 分页查询请求参数包含设备名称任务ID等查询条件 * @param pageReqVO 分页查询请求参数包含设备名称任务ID等查询条件
* @return 返回分页查询结果包含符合条件的IOT OTA升级记录列表 * @return 返回分页查询结果包含符合条件的IOT OTA升级记录列表
*/ */
// TODO @liselectPage ok
default PageResult<IotOtaUpgradeRecordDO> selectUpgradeRecordPage(IotOtaUpgradeRecordPageReqVO pageReqVO) { default PageResult<IotOtaUpgradeRecordDO> selectUpgradeRecordPage(IotOtaUpgradeRecordPageReqVO pageReqVO) {
// TODO @li这里的注释可以去掉哈然后下面的如果也没必要注释
// 使用LambdaQueryWrapperX构建查询条件并根据请求参数动态添加查询条件 // 使用LambdaQueryWrapperX构建查询条件并根据请求参数动态添加查询条件
return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaUpgradeRecordDO>() return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaUpgradeRecordDO>()
.likeIfPresent(IotOtaUpgradeRecordDO::getDeviceName, pageReqVO.getDeviceName()) // 如果设备名称存在则添加模糊查询条件 .likeIfPresent(IotOtaUpgradeRecordDO::getDeviceName, pageReqVO.getDeviceName()) // 如果设备名称存在则添加模糊查询条件
.eqIfPresent(IotOtaUpgradeRecordDO::getTaskId, pageReqVO.getTaskId())); // 如果任务ID存在则添加等值查询条件 .eqIfPresent(IotOtaUpgradeRecordDO::getTaskId, pageReqVO.getTaskId())); // 如果任务ID存在则添加等值查询条件
} }
// TODO @li这里的注释可以去掉哈
/** /**
* 根据任务ID和状态更新升级记录的状态 * 根据任务ID和状态更新升级记录的状态
* <p> * <p>
@ -97,6 +98,7 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeReco
* @param taskId 要更新的升级记录对应的任务ID类型为Long * @param taskId 要更新的升级记录对应的任务ID类型为Long
* @param whereStatus 用于筛选升级记录的当前状态值类型为Integer * @param whereStatus 用于筛选升级记录的当前状态值类型为Integer
*/ */
// TODO @li改成 updateByTaskIdAndStatus(taskId, status, IotOtaUpgradeRecordDO) 更通用一些
default void updateUpgradeRecordStatusByTaskIdAndStatus(Integer setStatus, Long taskId, Integer whereStatus) { default void updateUpgradeRecordStatusByTaskIdAndStatus(Integer setStatus, Long taskId, Integer whereStatus) {
// 使用LambdaUpdateWrapper构建更新条件将指定状态的记录更新为指定状态 // 使用LambdaUpdateWrapper构建更新条件将指定状态的记录更新为指定状态
update(new LambdaUpdateWrapper<IotOtaUpgradeRecordDO>() update(new LambdaUpdateWrapper<IotOtaUpgradeRecordDO>()
@ -106,6 +108,7 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeReco
); );
} }
// TODO @li参考上面的建议调整下这个方法
/** /**
* 根据状态查询符合条件的升级记录列表 * 根据状态查询符合条件的升级记录列表
* <p> * <p>
@ -120,6 +123,7 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeReco
.eq(IotOtaUpgradeRecordDO::getStatus, state)); .eq(IotOtaUpgradeRecordDO::getStatus, state));
} }
// TODO @li参考上面的建议调整下这个方法
/** /**
* 更新升级记录状态 * 更新升级记录状态
* <p> * <p>
@ -137,6 +141,7 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeReco
); );
} }
// TODO @li参考上面的建议调整下这个方法
/** /**
* 根据任务ID查询升级记录列表 * 根据任务ID查询升级记录列表
* <p> * <p>

View File

@ -8,6 +8,7 @@ import org.apache.ibatis.annotations.Mapper;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
// TODO @li参考 IotOtaUpgradeRecordMapper 的写法
@Mapper @Mapper
public interface IotPluginInstanceMapper extends BaseMapperX<IotPluginInstanceDO> { public interface IotPluginInstanceMapper extends BaseMapperX<IotPluginInstanceDO> {

View File

@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.firmware.IotOtaFirmwa
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO; import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
import jakarta.validation.Valid; import jakarta.validation.Valid;
// TODO @li注释写的有点冗余可以看看别的模块哈= = AI 生成的注释有的时候太啰嗦了需要处理下的哈
/** /**
* OTA 固件管理 Service * OTA 固件管理 Service
* *

View File

@ -39,13 +39,14 @@ public class IotOtaFirmwareServiceImpl implements IotOtaFirmwareService {
public Long createOtaFirmware(IotOtaFirmwareCreateReqVO saveReqVO) { public Long createOtaFirmware(IotOtaFirmwareCreateReqVO saveReqVO) {
// 1. 校验固件产品 + 版本号不能重复 // 1. 校验固件产品 + 版本号不能重复
validateProductAndVersionDuplicate(saveReqVO.getProductId(), saveReqVO.getVersion()); validateProductAndVersionDuplicate(saveReqVO.getProductId(), saveReqVO.getVersion());
// 2.1.转化数据格式准备存储到数据库中 // 2.1.转化数据格式准备存储到数据库中
IotOtaFirmwareDO firmware = BeanUtils.toBean(saveReqVO, IotOtaFirmwareDO.class); IotOtaFirmwareDO firmware = BeanUtils.toBean(saveReqVO, IotOtaFirmwareDO.class);
// 2.2.查询ProductKey // 2.2.查询ProductKey
// TODO @liproductService.getProduct(Convert.toLong(firmware.getProductId())) 放到 1. 后面先做参考校验逻辑两段1先参数校验2构建对象 + 存储
IotProductDO product = productService.getProduct(Convert.toLong(firmware.getProductId())); IotProductDO product = productService.getProduct(Convert.toLong(firmware.getProductId()));
firmware.setProductKey(Objects.requireNonNull(product).getProductKey()); firmware.setProductKey(Objects.requireNonNull(product).getProductKey());
// TODO @芋艿: 附件附件签名等属性的计算 // TODO @芋艿: 附件附件签名等属性的计算
otaFirmwareMapper.insert(firmware); otaFirmwareMapper.insert(firmware);
return firmware.getId(); return firmware.getId();
} }
@ -79,6 +80,7 @@ public class IotOtaFirmwareServiceImpl implements IotOtaFirmwareService {
return firmware; return firmware;
} }
// TODO @li注释有点冗余
/** /**
* 验证产品和版本号是否重复 * 验证产品和版本号是否重复
* <p> * <p>

View File

@ -8,6 +8,7 @@ import jakarta.validation.Valid;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
// TODO @li注释写的有点冗余可以看看别的模块哈= = AI 生成的注释有的时候太啰嗦了需要处理下的哈
/** /**
* IotOtaUpgradeRecordService 接口定义了与物联网设备OTA升级记录相关的操作 * IotOtaUpgradeRecordService 接口定义了与物联网设备OTA升级记录相关的操作
* 该接口提供了创建更新查询统计和重试升级记录的功能 * 该接口提供了创建更新查询统计和重试升级记录的功能
@ -15,7 +16,7 @@ import java.util.Map;
public interface IotOtaUpgradeRecordService { public interface IotOtaUpgradeRecordService {
/** /**
* 批量创建OTA升级记录 * 批量创建 OTA 升级记录
* 该函数用于为指定的设备列表固件ID和升级任务ID创建OTA升级记录 * 该函数用于为指定的设备列表固件ID和升级任务ID创建OTA升级记录
* *
* @param deviceIds 设备ID列表表示需要升级的设备集合 * @param deviceIds 设备ID列表表示需要升级的设备集合
@ -25,7 +26,7 @@ public interface IotOtaUpgradeRecordService {
void createOtaUpgradeRecordBatch(List<Long> deviceIds, Long firmwareId, Long upgradeTaskId); void createOtaUpgradeRecordBatch(List<Long> deviceIds, Long firmwareId, Long upgradeTaskId);
/** /**
* 获取OTA升级记录的数量统计 * 获取 OTA 升级记录的数量统计
* *
* @return 返回一个 Map其中键为状态码值为对应状态的升级记录数量 * @return 返回一个 Map其中键为状态码值为对应状态的升级记录数量
*/ */
@ -39,7 +40,7 @@ public interface IotOtaUpgradeRecordService {
Map<Integer, Long> getOtaUpgradeRecordStatistics(Long firmwareId); Map<Integer, Long> getOtaUpgradeRecordStatistics(Long firmwareId);
/** /**
* 重试指定的OTA升级记录 * 重试指定的 OTA 升级记录
* *
* @param id 需要重试的升级记录的ID * @param id 需要重试的升级记录的ID
*/ */
@ -62,7 +63,7 @@ public interface IotOtaUpgradeRecordService {
PageResult<IotOtaUpgradeRecordDO> getUpgradeRecordPage(@Valid IotOtaUpgradeRecordPageReqVO pageReqVO); PageResult<IotOtaUpgradeRecordDO> getUpgradeRecordPage(@Valid IotOtaUpgradeRecordPageReqVO pageReqVO);
/** /**
* 根据任务ID取消升级记录 * 根据任务 ID 取消升级记录
* <p> * <p>
* 该函数用于根据给定的任务ID取消与该任务相关的升级记录通常用于在任务执行失败或用户手动取消时 * 该函数用于根据给定的任务ID取消与该任务相关的升级记录通常用于在任务执行失败或用户手动取消时
* 清理或标记相关的升级记录为取消状态 * 清理或标记相关的升级记录为取消状态
@ -71,6 +72,7 @@ public interface IotOtaUpgradeRecordService {
*/ */
void cancelUpgradeRecordByTaskId(Long taskId); void cancelUpgradeRecordByTaskId(Long taskId);
// TODO @li不要的方法可以删除下哈
/** /**
* 根据升级状态获取升级记录列表 * 根据升级状态获取升级记录列表
* *

View File

@ -25,8 +25,8 @@ import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*;
import static cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeRecordStatusEnum.CANCELED;
// TODO @li@Service@Validated@Slf4j先用关键注解2类注释简单写
@Slf4j @Slf4j
@Service @Service
@Validated @Validated
@ -34,6 +34,7 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
@Resource @Resource
private IotOtaUpgradeRecordMapper upgradeRecordMapper; private IotOtaUpgradeRecordMapper upgradeRecordMapper;
// TODO @li1@Resource 写在 @Lazy 之前先用关键注解2有必要的情况下在写 @Lazy 注解
@Lazy @Lazy
@Resource @Resource
private IotDeviceService deviceService; private IotDeviceService deviceService;
@ -47,7 +48,9 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
@Override @Override
public void createOtaUpgradeRecordBatch(List<Long> deviceIds, Long firmwareId, Long upgradeTaskId) { public void createOtaUpgradeRecordBatch(List<Long> deviceIds, Long firmwareId, Long upgradeTaskId) {
// 1. 校验升级记录信息是否存在并且已经取消的任务可以重新开始 // 1. 校验升级记录信息是否存在并且已经取消的任务可以重新开始
// TODO @li批量查询
deviceIds.forEach(deviceId -> validateUpgradeRecordDuplicate(firmwareId, upgradeTaskId, String.valueOf(deviceId))); deviceIds.forEach(deviceId -> validateUpgradeRecordDuplicate(firmwareId, upgradeTaskId, String.valueOf(deviceId)));
// 2.初始化OTA升级记录列表信息 // 2.初始化OTA升级记录列表信息
IotOtaUpgradeTaskDO upgradeTask = upgradeTaskService.getUpgradeTask(upgradeTaskId); IotOtaUpgradeTaskDO upgradeTask = upgradeTaskService.getUpgradeTask(upgradeTaskId);
IotOtaFirmwareDO firmware = firmwareService.getOtaFirmware(firmwareId); IotOtaFirmwareDO firmware = firmwareService.getOtaFirmware(firmwareId);
@ -70,6 +73,7 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
} }
// TODO @li1方法注释简单写2父类写了注释子类就不用写了
/** /**
* 获取OTA升级记录的数量统计 * 获取OTA升级记录的数量统计
* 该方法根据传入的查询条件统计不同状态的OTA升级记录数量并返回一个包含各状态数量的映射 * 该方法根据传入的查询条件统计不同状态的OTA升级记录数量并返回一个包含各状态数量的映射
@ -87,10 +91,10 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
Objects.requireNonNull(upgradeRecordCountMap); Objects.requireNonNull(upgradeRecordCountMap);
return upgradeRecordCountMap.entrySet().stream().collect(Collectors.toMap( return upgradeRecordCountMap.entrySet().stream().collect(Collectors.toMap(
entry -> Convert.toInt(entry.getKey()), entry -> Convert.toInt(entry.getKey()),
entry -> Convert.toLong(entry.getValue()) entry -> Convert.toLong(entry.getValue())));
));
} }
// TODO @li1方法注释简单写2父类写了注释子类就不用写了
/** /**
* 获取指定固件ID的OTA升级记录统计信息 * 获取指定固件ID的OTA升级记录统计信息
* 该方法通过查询数据库统计不同状态的OTA升级记录数量并返回一个包含各状态数量的映射 * 该方法通过查询数据库统计不同状态的OTA升级记录数量并返回一个包含各状态数量的映射
@ -107,8 +111,7 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
Objects.requireNonNull(upgradeRecordStatisticsMap); Objects.requireNonNull(upgradeRecordStatisticsMap);
return upgradeRecordStatisticsMap.entrySet().stream().collect(Collectors.toMap( return upgradeRecordStatisticsMap.entrySet().stream().collect(Collectors.toMap(
entry -> Convert.toInt(entry.getKey()), entry -> Convert.toInt(entry.getKey()),
entry -> Convert.toLong(entry.getValue()) entry -> Convert.toLong(entry.getValue())));
));
} }
@Override @Override
@ -119,6 +122,7 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
validateUpgradeRecordCanRetry(upgradeRecord); validateUpgradeRecordCanRetry(upgradeRecord);
// 2. 将一些数据重置这样定时任务轮询就可以重启任务 // 2. 将一些数据重置这样定时任务轮询就可以重启任务
// TODO @li更新的时候wherestatus
upgradeRecordMapper.updateById(new IotOtaUpgradeRecordDO() upgradeRecordMapper.updateById(new IotOtaUpgradeRecordDO()
.setId(upgradeRecord.getId()).setProgress(0) .setId(upgradeRecord.getId()).setProgress(0)
.setStatus(IotOtaUpgradeRecordStatusEnum.PENDING.getStatus())); .setStatus(IotOtaUpgradeRecordStatusEnum.PENDING.getStatus()));
@ -136,9 +140,9 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
@Override @Override
public void cancelUpgradeRecordByTaskId(Long taskId) { public void cancelUpgradeRecordByTaskId(Long taskId) {
// 暂定只有待推送的升级记录可以取消 // 暂定只有待推送的升级记录可以取消 TODO @芋艿可以看看阿里云哪些可以取消
upgradeRecordMapper.updateUpgradeRecordStatusByTaskIdAndStatus( upgradeRecordMapper.updateUpgradeRecordStatusByTaskIdAndStatus(
CANCELED.getStatus(), taskId, IotOtaUpgradeRecordStatusEnum.CANCELED.getStatus(), taskId,
IotOtaUpgradeRecordStatusEnum.PENDING.getStatus()); IotOtaUpgradeRecordStatusEnum.PENDING.getStatus());
} }
@ -175,6 +179,7 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
return upgradeRecord; return upgradeRecord;
} }
// TODO @li注释有点冗余
/** /**
* 校验固件升级记录是否重复 * 校验固件升级记录是否重复
* <p> * <p>
@ -189,13 +194,17 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
// 根据条件查询升级记录 // 根据条件查询升级记录
IotOtaUpgradeRecordDO upgradeRecord = upgradeRecordMapper.selectByConditions(firmwareId, taskId, deviceId); IotOtaUpgradeRecordDO upgradeRecord = upgradeRecordMapper.selectByConditions(firmwareId, taskId, deviceId);
// 如果查询到升级记录且状态不是已取消则抛出异常 // 如果查询到升级记录且状态不是已取消则抛出异常
// TODO @liif return减少括号层级
// TODO @liObjUtil.notEquals尽量不用 取否逻辑
if (upgradeRecord != null) { if (upgradeRecord != null) {
if (!CANCELED.getStatus().equals(upgradeRecord.getStatus())) { if (!IotOtaUpgradeRecordStatusEnum.CANCELED.getStatus().equals(upgradeRecord.getStatus())) {
// TODO @li提示的时候需要把 deviceName 给提示出来不然用户不知道哪个重复啦
throw exception(OTA_UPGRADE_RECORD_DUPLICATE); throw exception(OTA_UPGRADE_RECORD_DUPLICATE);
} }
} }
} }
// TODO @li注释有点冗余
/** /**
* 验证升级记录是否可以重试 * 验证升级记录是否可以重试
* <p> * <p>
@ -205,6 +214,7 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
* @param upgradeRecord 需要验证的升级记录对象类型为 IotOtaUpgradeRecordDO * @param upgradeRecord 需要验证的升级记录对象类型为 IotOtaUpgradeRecordDO
* @throws cn.iocoder.yudao.framework.common.exception.ServiceException则抛出 OTA_UPGRADE_RECORD_CANNOT_RETRY 异常 * @throws cn.iocoder.yudao.framework.common.exception.ServiceException则抛出 OTA_UPGRADE_RECORD_CANNOT_RETRY 异常
*/ */
// TODO @li这种一次性的方法不复用的其实一步一定要抽成小方法
private void validateUpgradeRecordCanRetry(IotOtaUpgradeRecordDO upgradeRecord) { private void validateUpgradeRecordCanRetry(IotOtaUpgradeRecordDO upgradeRecord) {
// 检查升级记录的状态是否为 PENDINGPUSHED UPGRADING // 检查升级记录的状态是否为 PENDINGPUSHED UPGRADING
if (ObjectUtils.equalsAny(upgradeRecord.getStatus(), if (ObjectUtils.equalsAny(upgradeRecord.getStatus(),

View File

@ -27,6 +27,7 @@ import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*; import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.*;
// TODO @li完善注释注解顺序
@Slf4j @Slf4j
@Service @Service
@Validated @Validated
@ -54,9 +55,11 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
IotOtaFirmwareDO firmware = firmwareService.validateFirmwareExists(createReqVO.getFirmwareId()); IotOtaFirmwareDO firmware = firmwareService.validateFirmwareExists(createReqVO.getFirmwareId());
// 1.3 补全设备范围信息并且校验是否又设备可以升级如果没有设备可以升级则报错 // 1.3 补全设备范围信息并且校验是否又设备可以升级如果没有设备可以升级则报错
validateScopeAndDevice(createReqVO.getScope(), createReqVO.getDeviceIds(), firmware.getProductId()); validateScopeAndDevice(createReqVO.getScope(), createReqVO.getDeviceIds(), firmware.getProductId());
// 2. 保存 OTA 升级任务信息到数据库 // 2. 保存 OTA 升级任务信息到数据库
IotOtaUpgradeTaskDO upgradeTask = initOtaUpgradeTask(createReqVO, firmware.getProductId()); IotOtaUpgradeTaskDO upgradeTask = initOtaUpgradeTask(createReqVO, firmware.getProductId());
upgradeTaskMapper.insert(upgradeTask); upgradeTaskMapper.insert(upgradeTask);
// 3. 生成设备升级记录信息并存储等待定时任务轮询 // 3. 生成设备升级记录信息并存储等待定时任务轮询
upgradeRecordService.createOtaUpgradeRecordBatch(upgradeTask.getDeviceIds(), firmware.getId(), upgradeTask.getId()); upgradeRecordService.createOtaUpgradeRecordBatch(upgradeTask.getDeviceIds(), firmware.getId(), upgradeTask.getId());
return upgradeTask.getId(); return upgradeTask.getId();
@ -68,15 +71,16 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
// 1.1 校验升级任务是否存在 // 1.1 校验升级任务是否存在
IotOtaUpgradeTaskDO upgradeTask = validateUpgradeTaskExists(id); IotOtaUpgradeTaskDO upgradeTask = validateUpgradeTaskExists(id);
// 1.2 校验升级任务是否可以取消 // 1.2 校验升级任务是否可以取消
// 检查升级任务的状态是否为进行中只有此状态下的任务才允许取消 // TODO @liObjUtil notequals
if (!Objects.equals(upgradeTask.getStatus(), IotOtaUpgradeTaskStatusEnum.IN_PROGRESS.getStatus())) { if (!Objects.equals(upgradeTask.getStatus(), IotOtaUpgradeTaskStatusEnum.IN_PROGRESS.getStatus())) {
// 只有进行中的任务才可以取消
throw exception(OTA_UPGRADE_TASK_CANNOT_CANCEL); throw exception(OTA_UPGRADE_TASK_CANNOT_CANCEL);
} }
// 2. 更新 OTA 升级任务状态为已取消 // 2. 更新 OTA 升级任务状态为已取消
upgradeTaskMapper.updateById(IotOtaUpgradeTaskDO.builder() upgradeTaskMapper.updateById(IotOtaUpgradeTaskDO.builder()
.id(id).status(IotOtaUpgradeTaskStatusEnum.CANCELED.getStatus()) .id(id).status(IotOtaUpgradeTaskStatusEnum.CANCELED.getStatus())
.build()); .build());
// 3. 更新 OTA 升级记录状态为已取消 // 3. 更新 OTA 升级记录状态为已取消
upgradeRecordService.cancelUpgradeRecordByTaskId(id); upgradeRecordService.cancelUpgradeRecordByTaskId(id);
} }
@ -98,11 +102,10 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
@Override @Override
public void updateUpgradeTaskStatus(Long id, Integer status) { public void updateUpgradeTaskStatus(Long id, Integer status) {
upgradeTaskMapper.updateById(IotOtaUpgradeTaskDO.builder() upgradeTaskMapper.updateById(IotOtaUpgradeTaskDO.builder().id(id).status(status).build());
.id(id).status(status)
.build());
} }
// TODO @li注释有点冗余
/** /**
* 校验固件升级任务是否重复 * 校验固件升级任务是否重复
* <p> * <p>
@ -123,6 +126,7 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
} }
} }
// TODO @li注释有点冗余
/** /**
* 验证升级任务的范围和设备列表的有效性 * 验证升级任务的范围和设备列表的有效性
* <p> * <p>
@ -135,6 +139,7 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
* @throws cn.iocoder.yudao.framework.common.exception.ServiceException抛出相应的异常 * @throws cn.iocoder.yudao.framework.common.exception.ServiceException抛出相应的异常
*/ */
private void validateScopeAndDevice(Integer scope, List<Long> deviceIds, String productId) { private void validateScopeAndDevice(Integer scope, List<Long> deviceIds, String productId) {
// TODO @liif return
// 验证范围为选择设备设备列表不能为空 // 验证范围为选择设备设备列表不能为空
if (Objects.equals(scope, IotOtaUpgradeTaskScopeEnum.SELECT.getScope())) { if (Objects.equals(scope, IotOtaUpgradeTaskScopeEnum.SELECT.getScope())) {
if (CollUtil.isEmpty(deviceIds)) { if (CollUtil.isEmpty(deviceIds)) {
@ -149,6 +154,7 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
} }
} }
// TODO @li注释有点冗余
/** /**
* 验证升级任务是否存在 * 验证升级任务是否存在
* <p> * <p>
@ -167,6 +173,7 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
return upgradeTask; return upgradeTask;
} }
// TODO @li注释有点冗余
/** /**
* 初始化升级任务 * 初始化升级任务
* <p> * <p>
@ -177,6 +184,7 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
* @param createReqVO 升级任务保存请求对象包含创建升级任务所需的信息 * @param createReqVO 升级任务保存请求对象包含创建升级任务所需的信息
* @return 返回初始化后的升级任务对象 * @return 返回初始化后的升级任务对象
*/ */
// TODO @li一次性的方法不用特别抽小方法
private IotOtaUpgradeTaskDO initOtaUpgradeTask(IotOtaUpgradeTaskSaveReqVO createReqVO, String productId) { private IotOtaUpgradeTaskDO initOtaUpgradeTask(IotOtaUpgradeTaskSaveReqVO createReqVO, String productId) {
// 将请求参数转换为升级任务对象 // 将请求参数转换为升级任务对象
IotOtaUpgradeTaskDO upgradeTask = BeanUtils.toBean(createReqVO, IotOtaUpgradeTaskDO.class); IotOtaUpgradeTaskDO upgradeTask = BeanUtils.toBean(createReqVO, IotOtaUpgradeTaskDO.class);

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.iot.dal.mysql.ota.IotOtaUpgradeRecordMapper">
</mapper>