reactor:【IoT 物联网】调整 ota 的 task 实体定义(暂时未处理 controller)

This commit is contained in:
YunaiV
2025-07-01 00:33:02 +08:00
parent f9d782c701
commit 5399e5bba0
19 changed files with 177 additions and 392 deletions

View File

@@ -21,7 +21,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - IoT OTA 固件")
@RestController
@RequestMapping("/iot/ota-firmware")
@RequestMapping("/iot/ota/firmware")
@Validated
public class IotOtaFirmwareController {

View File

@@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record.IotOtaUpgradeRecordPageReqVO;
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record.IotOtaUpgradeRecordRespVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeRecordDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskRecordDO;
import cn.iocoder.yudao.module.iot.service.ota.IotOtaUpgradeRecordService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -50,7 +50,7 @@ public class IotOtaUpgradeRecordController {
@PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')")
public CommonResult<PageResult<IotOtaUpgradeRecordRespVO>> getUpgradeRecordPage(
@Valid IotOtaUpgradeRecordPageReqVO pageReqVO) {
PageResult<IotOtaUpgradeRecordDO> pageResult = upgradeRecordService.getUpgradeRecordPage(pageReqVO);
PageResult<IotOtaTaskRecordDO> pageResult = upgradeRecordService.getUpgradeRecordPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, IotOtaUpgradeRecordRespVO.class));
}
@@ -59,17 +59,8 @@ public class IotOtaUpgradeRecordController {
@PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:query')")
@Parameter(name = "id", description = "升级记录编号", required = true, example = "1024")
public CommonResult<IotOtaUpgradeRecordRespVO> getUpgradeRecord(@RequestParam("id") Long id) {
IotOtaUpgradeRecordDO upgradeRecord = upgradeRecordService.getUpgradeRecord(id);
IotOtaTaskRecordDO upgradeRecord = upgradeRecordService.getUpgradeRecord(id);
return success(BeanUtils.toBean(upgradeRecord, IotOtaUpgradeRecordRespVO.class));
}
@PutMapping("/retry")
@Operation(summary = "重试升级记录")
@PreAuthorize("@ss.hasPermission('iot:ota-upgrade-record:retry')")
@Parameter(name = "id", description = "升级记录编号", required = true, example = "1024")
public CommonResult<Boolean> retryUpgradeRecord(@RequestParam("id") Long id) {
upgradeRecordService.retryUpgradeRecord(id);
return success(true);
}
}

View File

@@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUpgradeTaskPageReqVO;
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUpgradeTaskRespVO;
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUpgradeTaskSaveReqVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeTaskDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskDO;
import cn.iocoder.yudao.module.iot.service.ota.IotOtaUpgradeTaskService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -48,7 +48,7 @@ public class IotOtaUpgradeTaskController {
@Operation(summary = "获得升级任务分页")
@PreAuthorize(value = "@ss.hasPermission('iot:ota-upgrade-task:query')")
public CommonResult<PageResult<IotOtaUpgradeTaskRespVO>> getUpgradeTaskPage(@Valid IotOtaUpgradeTaskPageReqVO pageReqVO) {
PageResult<IotOtaUpgradeTaskDO> pageResult = upgradeTaskService.getUpgradeTaskPage(pageReqVO);
PageResult<IotOtaTaskDO> pageResult = upgradeTaskService.getUpgradeTaskPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, IotOtaUpgradeTaskRespVO.class));
}
@@ -57,7 +57,7 @@ public class IotOtaUpgradeTaskController {
@Parameter(name = "id", description = "升级任务编号", required = true, example = "1024")
@PreAuthorize(value = "@ss.hasPermission('iot:ota-upgrade-task:query')")
public CommonResult<IotOtaUpgradeTaskRespVO> getUpgradeTask(@RequestParam("id") Long id) {
IotOtaUpgradeTaskDO upgradeTask = upgradeTaskService.getUpgradeTask(id);
IotOtaTaskDO upgradeTask = upgradeTaskService.getUpgradeTask(id);
return success(BeanUtils.toBean(upgradeTask, IotOtaUpgradeTaskRespVO.class));
}

View File

@@ -3,7 +3,8 @@ package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeTaskDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskDO;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskRecordStatusEnum;
import com.fhs.core.trans.anno.Trans;
import com.fhs.core.trans.constant.TransType;
import io.swagger.v3.oas.annotations.media.Schema;
@@ -36,7 +37,7 @@ public class IotOtaUpgradeRecordRespVO {
/**
* 任务编号
* <p>
* 关联 {@link IotOtaUpgradeTaskDO#getId()}
* 关联 {@link IotOtaTaskDO#getId()}
*/
@Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long taskId;
@@ -77,7 +78,7 @@ public class IotOtaUpgradeRecordRespVO {
/**
* 升级状态
* <p>
* 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeRecordStatusEnum}
* 关联 {@link IotOtaTaskRecordStatusEnum}
*/
@Schema(description = "升级状态", requiredMode = Schema.RequiredMode.REQUIRED, allowableValues = {"0", "10", "20", "30", "40", "50"})
private Integer status;

View File

@@ -9,17 +9,11 @@ import lombok.Data;
@Schema(description = "管理后台 - IoT OTA 升级任务分页 Request VO")
public class IotOtaUpgradeTaskPageReqVO extends PageParam {
/**
* 任务名称字段,用于描述任务的名称
*/
@Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "固件编号不能为空")
private Long firmwareId;
@Schema(description = "任务名称", example = "升级任务")
private String name;
/**
* 固件编号字段,用于唯一标识固件,不能为空
*/
@NotNull(message = "固件编号不能为空")
@Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long firmwareId;
}

View File

@@ -1,7 +1,5 @@
package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
import com.fhs.core.trans.vo.VO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -13,69 +11,33 @@ import java.util.List;
@Schema(description = "管理后台 - IoT OTA 升级任务 Response VO")
public class IotOtaUpgradeTaskRespVO implements VO {
/**
* 任务编号
*/
@Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
/**
* 任务名称
*/
@Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "升级任务")
private String name;
/**
* 任务描述
*/
@Schema(description = "任务描述", example = "升级任务")
private String description;
/**
* 固件编号
* <p>
* 关联 {@link IotOtaFirmwareDO#getId()}
*/
@Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long firmwareId;
/**
* 任务状态
* <p>
* 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskStatusEnum}
*/
@Schema(description = "任务状态", requiredMode = Schema.RequiredMode.REQUIRED, allowableValues = {"10", "20", "21", "30"})
@Schema(description = "任务状态", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer status;
/**
* 任务状态名称
*/
@Schema(description = "任务状态名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "进行中")
private String statusName;
/**
* 升级范围
* <p>
* 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskScopeEnum}
*/
@Schema(description = "升级范围", requiredMode = Schema.RequiredMode.REQUIRED, allowableValues = {"1", "2"})
private Integer scope;
/**
* 设备数量
*/
@Schema(description = "设备数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long deviceCount;
/**
* 选中的设备编号数组
* <p>
* 关联 {@link IotDeviceDO#getId()}
*/
@Schema(description = "选中的设备编号数组", example = "1024")
private List<Long> deviceIds;
/**
* 选中的设备名字数组
* <p>
* 关联 {@link IotDeviceDO#getDeviceName()}
*/
@Schema(description = "选中的设备名字数组", example = "1024")
private List<String> deviceNames;
/**
* 创建时间
*/
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2022-07-08 07:30:00")
private LocalDateTime createTime;

View File

@@ -1,9 +1,7 @@
package cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskScopeEnum;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskDeviceScopeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
@@ -11,51 +9,27 @@ import lombok.Data;
import java.util.List;
@Data
@Schema(description = "管理后台 - IoT OTA 升级任务创建/修改 Request VO")
@Data
public class IotOtaUpgradeTaskSaveReqVO {
// TODO @li已经有注解不用重复注释
// TODO @li @Schema 写在参数校验前面。先有定义;其他的,也检查下;
/**
* 任务名称
*/
@NotEmpty(message = "任务名称不能为空")
@Schema(description = "任务名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "升级任务")
private String name;
/**
* 任务描述
*/
@Schema(description = "任务描述", example = "升级任务")
private String description;
/**
* 固件编号
* <p>
* 关联 {@link IotOtaFirmwareDO#getId()}
*/
@NotNull(message = "固件编号不能为空")
@Schema(description = "固件编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
@NotNull(message = "固件编号不能为空")
private Long firmwareId;
/**
* 升级范围
* <p>
* 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskScopeEnum}
*/
@NotNull(message = "升级范围不能为空")
@InEnum(value = IotOtaUpgradeTaskScopeEnum.class)
@Schema(description = "升级范围", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "升级范围不能为空")
@InEnum(value = IotOtaTaskDeviceScopeEnum.class)
private Integer scope;
/**
* 选中的设备编号数组
* <p>
* 关联 {@link IotDeviceDO#getId()}
*/
@Schema(description = "选中的设备编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1,2,3,4]")
@Schema(description = "选中的设备编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "1,2,3")
private List<Long> deviceIds;
}

View File

@@ -1,31 +1,28 @@
package cn.iocoder.yudao.module.iot.dal.dataobject.ota;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskDeviceScopeEnum;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskStatusEnum;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* IoT OTA 升级任务 DO
*
* @author 芋道源码
*/
@TableName(value = "iot_ota_upgrade_task", autoResultMap = true)
@KeySequence("iot_ota_upgrade_task_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@TableName(value = "iot_ota_task", autoResultMap = true)
@KeySequence("iot_ota_task_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IotOtaUpgradeTaskDO extends BaseDO {
public class IotOtaTaskDO extends BaseDO {
/**
* 任务编号
@@ -51,26 +48,23 @@ public class IotOtaUpgradeTaskDO extends BaseDO {
/**
* 任务状态
* <p>
* 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskStatusEnum}
* 关联 {@link IotOtaTaskStatusEnum}
*/
private Integer status;
/**
* 升级范围
* 设备升级范围
* <p>
* 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskScopeEnum}
* 关联 {@link IotOtaTaskDeviceScopeEnum}
*/
private Integer scope;
private Integer deviceScope;
/**
* 设备数量
* 设备总数数量
*/
private Long deviceCount;
private Long deviceTotalCount;
/**
* 选中的设备编号数组
* <p>
* 关联 {@link IotDeviceDO#getId()}
* 设备成功数量
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private List<Long> deviceIds;
private Integer deviceSuccessCount;
}

View File

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.iot.dal.dataobject.ota;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskRecordStatusEnum;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
@@ -11,17 +12,17 @@ import lombok.*;
import java.time.LocalDateTime;
/**
* IoT OTA 升级记录 DO
* IoT OTA 升级任务记录 DO
*
* @author 芋道源码
*/
@TableName(value = "iot_ota_upgrade_record", autoResultMap = true)
@KeySequence("iot_ota_upgrade_record_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@TableName(value = "iot_ota_task_record", autoResultMap = true)
@KeySequence("iot_ota_task_record_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class IotOtaUpgradeRecordDO extends BaseDO {
public class IotOtaTaskRecordDO extends BaseDO {
@TableId
private Long id;
@@ -35,28 +36,16 @@ public class IotOtaUpgradeRecordDO extends BaseDO {
/**
* 任务编号
*
* 关联 {@link IotOtaUpgradeTaskDO#getId()}
* 关联 {@link IotOtaTaskDO#getId()}
*/
private Long taskId;
/**
* 产品标识
*
* 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO#getId()}
*/
private String productKey;
/**
* 设备名称
*
* 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO#getId()}
*/
private String deviceName;
/**
* 设备编号
*
* 关联 {@link cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO#getId()}
* 关联 {@link IotDeviceDO#getId()}
*/
private String deviceId;
private Long deviceId;
/**
* 来源的固件编号
*
@@ -67,7 +56,7 @@ public class IotOtaUpgradeRecordDO extends BaseDO {
/**
* 升级状态
*
* 关联 {@link cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeRecordStatusEnum}
* 关联 {@link IotOtaTaskRecordStatusEnum}
*/
private Integer status;
/**

View File

@@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record.IotOtaUpgradeRecordPageReqVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeRecordDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskRecordDO;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -14,7 +14,7 @@ import java.util.List;
import java.util.Map;
@Mapper
public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeRecordDO> {
public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaTaskRecordDO> {
// TODO @liselectByFirmwareIdAndTaskIdAndDeviceId让方法自解释
/**
@@ -25,12 +25,12 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeReco
* @param deviceId 设备ID可选参数用于筛选设备ID匹配的记录
* @return 返回符合条件的单个OTA升级记录如果不存在则返回null
*/
default IotOtaUpgradeRecordDO selectByConditions(Long firmwareId, Long taskId, String deviceId) {
default IotOtaTaskRecordDO selectByConditions(Long firmwareId, Long taskId, String deviceId) {
// 使用LambdaQueryWrapperX构建查询条件根据传入的参数动态添加查询条件
return selectOne(new LambdaQueryWrapperX<IotOtaUpgradeRecordDO>()
.eqIfPresent(IotOtaUpgradeRecordDO::getFirmwareId, firmwareId)
.eqIfPresent(IotOtaUpgradeRecordDO::getTaskId, taskId)
.eqIfPresent(IotOtaUpgradeRecordDO::getDeviceId, deviceId));
return selectOne(new LambdaQueryWrapperX<IotOtaTaskRecordDO>()
.eqIfPresent(IotOtaTaskRecordDO::getFirmwareId, firmwareId)
.eqIfPresent(IotOtaTaskRecordDO::getTaskId, taskId)
.eqIfPresent(IotOtaTaskRecordDO::getDeviceId, deviceId));
}
// TODO @li这个是不是 groupby status 就 ok 拉?
@@ -80,12 +80,12 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeReco
* @return 返回分页查询结果,包含符合条件的 OTA升级记录列表
*/
// TODO @liselectPage 就 ok 拉。
default PageResult<IotOtaUpgradeRecordDO> selectUpgradeRecordPage(IotOtaUpgradeRecordPageReqVO pageReqVO) {
default PageResult<IotOtaTaskRecordDO> selectUpgradeRecordPage(IotOtaUpgradeRecordPageReqVO pageReqVO) {
// TODO @li这里的注释可以去掉哈然后下面的“如果”。。。也没必要注释
// 使用LambdaQueryWrapperX构建查询条件并根据请求参数动态添加查询条件
return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaUpgradeRecordDO>()
.likeIfPresent(IotOtaUpgradeRecordDO::getDeviceName, pageReqVO.getDeviceName()) // 如果设备名称存在,则添加模糊查询条件
.eqIfPresent(IotOtaUpgradeRecordDO::getTaskId, pageReqVO.getTaskId())); // 如果任务ID存在则添加等值查询条件
return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaTaskRecordDO>()
.likeIfPresent(IotOtaTaskRecordDO::getDeviceName, pageReqVO.getDeviceName()) // 如果设备名称存在,则添加模糊查询条件
.eqIfPresent(IotOtaTaskRecordDO::getTaskId, pageReqVO.getTaskId())); // 如果任务ID存在则添加等值查询条件
}
// TODO @li这里的注释可以去掉哈
@@ -101,59 +101,11 @@ public interface IotOtaUpgradeRecordMapper extends BaseMapperX<IotOtaUpgradeReco
// TODO @li改成 updateByTaskIdAndStatus(taskId, status, IotOtaUpgradeRecordDO) 更通用一些。
default void updateUpgradeRecordStatusByTaskIdAndStatus(Integer setStatus, Long taskId, Integer whereStatus) {
// 使用LambdaUpdateWrapper构建更新条件将指定状态的记录更新为指定状态
update(new LambdaUpdateWrapper<IotOtaUpgradeRecordDO>()
.set(IotOtaUpgradeRecordDO::getStatus, setStatus)
.eq(IotOtaUpgradeRecordDO::getTaskId, taskId)
.eq(IotOtaUpgradeRecordDO::getStatus, whereStatus)
update(new LambdaUpdateWrapper<IotOtaTaskRecordDO>()
.set(IotOtaTaskRecordDO::getStatus, setStatus)
.eq(IotOtaTaskRecordDO::getTaskId, taskId)
.eq(IotOtaTaskRecordDO::getStatus, whereStatus)
);
}
// TODO @li参考上面的建议调整下这个方法
/**
* 根据状态查询符合条件的升级记录列表
* <p>
* 该函数使用LambdaQueryWrapperX构建查询条件查询指定状态的升级记录。
*
* @param state 升级记录的状态,用于筛选符合条件的记录
* @return 返回符合指定状态的升级记录列表类型为List<IotOtaUpgradeRecordDO>
*/
default List<IotOtaUpgradeRecordDO> selectUpgradeRecordListByState(Integer state) {
// 使用LambdaQueryWrapperX构建查询条件根据状态查询符合条件的升级记录
return selectList(new LambdaQueryWrapperX<IotOtaUpgradeRecordDO>()
.eq(IotOtaUpgradeRecordDO::getStatus, state));
}
// TODO @li参考上面的建议调整下这个方法
/**
* 更新升级记录状态
* <p>
* 该函数用于批量更新指定ID列表中的升级记录状态。通过传入的ID列表和状态值使用LambdaUpdateWrapper构建更新条件
* 并执行更新操作。
*
* @param ids 需要更新的升级记录ID列表类型为List<Long>。传入的ID列表中的记录将被更新。
* @param status 要更新的状态值类型为Integer。该值将被设置到符合条件的升级记录中。
*/
default void updateUpgradeRecordStatus(List<Long> ids, Integer status) {
// 使用LambdaUpdateWrapper构建更新条件设置状态字段并根据ID列表进行筛选
update(new LambdaUpdateWrapper<IotOtaUpgradeRecordDO>()
.set(IotOtaUpgradeRecordDO::getStatus, status)
.in(IotOtaUpgradeRecordDO::getId, ids)
);
}
// TODO @li参考上面的建议调整下这个方法
/**
* 根据任务ID查询升级记录列表
* <p>
* 该函数通过任务ID查询符合条件的升级记录并返回查询结果列表。
*
* @param taskId 任务ID用于筛选升级记录
* @return 返回符合条件的升级记录列表,若未找到则返回空列表
*/
default List<IotOtaUpgradeRecordDO> selectUpgradeRecordListByTaskId(Long taskId) {
// 使用LambdaQueryWrapperX构建查询条件根据任务ID查询符合条件的升级记录
return selectList(new LambdaQueryWrapperX<IotOtaUpgradeRecordDO>()
.eq(IotOtaUpgradeRecordDO::getTaskId, taskId));
}
}

View File

@@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUpgradeTaskPageReqVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeTaskDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@@ -15,7 +15,7 @@ import java.util.List;
* @author Shelly
*/
@Mapper
public interface IotOtaUpgradeTaskMapper extends BaseMapperX<IotOtaUpgradeTaskDO> {
public interface IotOtaUpgradeTaskMapper extends BaseMapperX<IotOtaTaskDO> {
/**
* 根据固件ID和任务名称查询升级任务列表。
@@ -24,10 +24,10 @@ public interface IotOtaUpgradeTaskMapper extends BaseMapperX<IotOtaUpgradeTaskDO
* @param name 任务名称,用于筛选升级任务
* @return 符合条件的升级任务列表
*/
default List<IotOtaUpgradeTaskDO> selectByFirmwareIdAndName(Long firmwareId, String name) {
return selectList(new LambdaQueryWrapperX<IotOtaUpgradeTaskDO>()
.eqIfPresent(IotOtaUpgradeTaskDO::getFirmwareId, firmwareId)
.eqIfPresent(IotOtaUpgradeTaskDO::getName, name));
default List<IotOtaTaskDO> selectByFirmwareIdAndName(Long firmwareId, String name) {
return selectList(new LambdaQueryWrapperX<IotOtaTaskDO>()
.eqIfPresent(IotOtaTaskDO::getFirmwareId, firmwareId)
.eqIfPresent(IotOtaTaskDO::getName, name));
}
/**
@@ -36,10 +36,10 @@ public interface IotOtaUpgradeTaskMapper extends BaseMapperX<IotOtaUpgradeTaskDO
* @param pageReqVO 分页查询请求对象,包含分页参数和筛选条件
* @return 分页结果,包含符合条件的升级任务列表
*/
default PageResult<IotOtaUpgradeTaskDO> selectUpgradeTaskPage(IotOtaUpgradeTaskPageReqVO pageReqVO) {
return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaUpgradeTaskDO>()
.eqIfPresent(IotOtaUpgradeTaskDO::getFirmwareId, pageReqVO.getFirmwareId())
.likeIfPresent(IotOtaUpgradeTaskDO::getName, pageReqVO.getName()));
default PageResult<IotOtaTaskDO> selectUpgradeTaskPage(IotOtaUpgradeTaskPageReqVO pageReqVO) {
return selectPage(pageReqVO, new LambdaQueryWrapperX<IotOtaTaskDO>()
.eqIfPresent(IotOtaTaskDO::getFirmwareId, pageReqVO.getFirmwareId())
.likeIfPresent(IotOtaTaskDO::getName, pageReqVO.getName()));
}
/**
@@ -50,8 +50,8 @@ public interface IotOtaUpgradeTaskMapper extends BaseMapperX<IotOtaUpgradeTaskDO
* @param status 任务状态,用于筛选升级任务的状态值
* @return 返回符合条件的升级任务列表,列表中的每个元素为 IotOtaUpgradeTaskDO 对象
*/
default List<IotOtaUpgradeTaskDO> selectUpgradeTaskByState(Integer status) {
return selectList(IotOtaUpgradeTaskDO::getStatus, status);
default List<IotOtaTaskDO> selectUpgradeTaskByState(Integer status) {
return selectList(IotOtaTaskDO::getStatus, status);
}
}

View File

@@ -7,18 +7,19 @@ import lombok.RequiredArgsConstructor;
import java.util.Arrays;
/**
* IoT OTA 升级任务的范围枚举
* IoT OTA 升级任务的设备范围枚举
*
* @author haohao
*/
@RequiredArgsConstructor
@Getter
public enum IotOtaUpgradeTaskScopeEnum implements ArrayValuable<Integer> {
public enum IotOtaTaskDeviceScopeEnum implements ArrayValuable<Integer> {
ALL(1), // 全部设备只包括当前产品下的设备不包括未来创建的设备
SELECT(2); // 指定设备
public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotOtaUpgradeTaskScopeEnum::getScope).toArray(Integer[]::new);
public static final Integer[] ARRAYS = Arrays.stream(values())
.map(IotOtaTaskDeviceScopeEnum::getScope).toArray(Integer[]::new);
/**
* 范围

View File

@@ -8,25 +8,26 @@ import lombok.RequiredArgsConstructor;
import java.util.Arrays;
/**
* IoT OTA 升级记录的范围枚举
* IoT OTA 升级任务记录的状态枚举
*
* @author haohao
* @author 芋道源码
*/
@RequiredArgsConstructor
@Getter
public enum IotOtaUpgradeRecordStatusEnum implements ArrayValuable<Integer> {
public enum IotOtaTaskRecordStatusEnum implements ArrayValuable<Integer> {
PENDING(0), // 待推送
PUSHED(10), // 已推送
UPGRADING(20), // 升级中
SUCCESS(30), // 升级成功
FAILURE(40), // 升级失败
CANCELED(50),; // 取消
CANCELED(50),; // 升级取消
public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotOtaUpgradeRecordStatusEnum::getStatus).toArray(Integer[]::new);
public static final Integer[] ARRAYS = Arrays.stream(values())
.map(IotOtaTaskRecordStatusEnum::getStatus).toArray(Integer[]::new);
/**
* 范围
* 状态
*/
private final Integer status;

View File

@@ -0,0 +1,35 @@
package cn.iocoder.yudao.module.iot.enums.ota;
import cn.iocoder.yudao.framework.common.core.ArrayValuable;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
/**
* IoT OTA 升级任务的状态
*
* @author 芋道源码
*/
@RequiredArgsConstructor
@Getter
public enum IotOtaTaskStatusEnum implements ArrayValuable<Integer> {
IN_PROGRESS(10), // 进行中(升级中)
COMPLETED(20), // 已完成(包括全部成功、部分成功)
CANCELED(30),; // 已取消(一般是主动取消任务)
public static final Integer[] ARRAYS = Arrays.stream(values())
.map(IotOtaTaskStatusEnum::getStatus).toArray(Integer[]::new);
/**
* 状态
*/
private final Integer status;
@Override
public Integer[] array() {
return ARRAYS;
}
}

View File

@@ -1,35 +0,0 @@
package cn.iocoder.yudao.module.iot.enums.ota;
import cn.iocoder.yudao.framework.common.core.ArrayValuable;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import java.util.Arrays;
/**
* IoT OTA 升级任务的范围枚举
*
* @author haohao
*/
@RequiredArgsConstructor
@Getter
public enum IotOtaUpgradeTaskStatusEnum implements ArrayValuable<Integer> {
IN_PROGRESS(10), // 进行中:升级中
COMPLETED(20), // 已完成:已结束,全部升级完成
INCOMPLETE(21), // 未完成:已结束,部分升级完成
CANCELED(30),; // 已取消:一般是主动取消任务
public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotOtaUpgradeTaskStatusEnum::getStatus).toArray(Integer[]::new);
/**
* 范围
*/
private final Integer status;
@Override
public Integer[] array() {
return ARRAYS;
}
}

View File

@@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.iot.service.ota;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record.IotOtaUpgradeRecordPageReqVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeRecordDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskRecordDO;
import jakarta.validation.Valid;
import java.util.List;
@@ -39,20 +39,13 @@ public interface IotOtaUpgradeRecordService {
*/
Map<Integer, Long> getOtaUpgradeRecordStatistics(Long firmwareId);
/**
* 重试指定的 OTA 升级记录
*
* @param id 需要重试的升级记录的ID。
*/
void retryUpgradeRecord(Long id);
/**
* 获取指定 ID 的 OTA 升级记录的详细信息。
*
* @param id 需要查询的升级记录的ID。
* @return 返回包含升级记录详细信息的响应对象。
*/
IotOtaUpgradeRecordDO getUpgradeRecord(Long id);
IotOtaTaskRecordDO getUpgradeRecord(Long id);
/**
* 分页查询 OTA 升级记录。
@@ -60,7 +53,7 @@ public interface IotOtaUpgradeRecordService {
* @param pageReqVO 包含分页查询条件的请求对象,必须经过验证。
* @return 返回包含分页查询结果的响应对象。
*/
PageResult<IotOtaUpgradeRecordDO> getUpgradeRecordPage(@Valid IotOtaUpgradeRecordPageReqVO pageReqVO);
PageResult<IotOtaTaskRecordDO> getUpgradeRecordPage(@Valid IotOtaUpgradeRecordPageReqVO pageReqVO);
/**
* 根据任务 ID 取消升级记录
@@ -72,33 +65,4 @@ public interface IotOtaUpgradeRecordService {
*/
void cancelUpgradeRecordByTaskId(Long taskId);
// TODO @li不要的方法可以删除下哈。
/**
* 根据升级状态获取升级记录列表
*
* @param state 升级状态,用于筛选符合条件的升级记录
* @return 返回符合指定状态的升级记录列表,列表中的元素为 {@link IotOtaUpgradeRecordDO} 对象
*/
List<IotOtaUpgradeRecordDO> getUpgradeRecordListByState(Integer state);
/**
* 更新升级记录的状态。
* <p>
* 该函数用于批量更新指定升级记录的状态。通过传入的ID列表和状态值将对应的升级记录的状态更新为指定的值。
*
* @param ids 需要更新状态的升级记录的ID列表。列表中的每个元素代表一个升级记录的ID。
* @param status 要更新的状态值。该值应为有效的状态标识符,通常为整数类型。
*/
void updateUpgradeRecordStatus(List<Long> ids, Integer status);
/**
* 根据任务ID获取升级记录列表
* <p>
* 该函数通过给定的任务ID查询并返回与该任务相关的所有升级记录。
*
* @param taskId 任务ID用于指定需要查询的任务
* @return 返回一个包含升级记录的列表列表中的每个元素为IotOtaUpgradeRecordDO对象
*/
List<IotOtaUpgradeRecordDO> getUpgradeRecordListByTaskId(Long taskId);
}

View File

@@ -6,14 +6,13 @@ import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.record.IotOtaUpgradeRecordPageReqVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeRecordDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeTaskDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskRecordDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskDO;
import cn.iocoder.yudao.module.iot.dal.mysql.ota.IotOtaUpgradeRecordMapper;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeRecordStatusEnum;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskRecordStatusEnum;
import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
@@ -47,18 +46,18 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
deviceIds.forEach(deviceId -> validateUpgradeRecordDuplicate(firmwareId, upgradeTaskId, String.valueOf(deviceId)));
// 2. 初始化OTA升级记录列表信息
IotOtaUpgradeTaskDO upgradeTask = upgradeTaskService.getUpgradeTask(upgradeTaskId);
IotOtaTaskDO upgradeTask = upgradeTaskService.getUpgradeTask(upgradeTaskId);
IotOtaFirmwareDO firmware = firmwareService.getOtaFirmware(firmwareId);
List<IotDeviceDO> deviceList = deviceService.getDeviceListByIdList(deviceIds);
List<IotOtaUpgradeRecordDO> upgradeRecordList = deviceList.stream().map(device -> {
IotOtaUpgradeRecordDO upgradeRecord = new IotOtaUpgradeRecordDO();
List<IotOtaTaskRecordDO> upgradeRecordList = deviceList.stream().map(device -> {
IotOtaTaskRecordDO upgradeRecord = new IotOtaTaskRecordDO();
upgradeRecord.setFirmwareId(firmware.getId());
upgradeRecord.setTaskId(upgradeTask.getId());
upgradeRecord.setProductKey(device.getProductKey());
upgradeRecord.setDeviceName(device.getDeviceName());
upgradeRecord.setDeviceId(Convert.toStr(device.getId()));
upgradeRecord.setFromFirmwareId(Convert.toLong(device.getFirmwareId()));
upgradeRecord.setStatus(IotOtaUpgradeRecordStatusEnum.PENDING.getStatus());
upgradeRecord.setStatus(IotOtaTaskRecordStatusEnum.PENDING.getStatus());
upgradeRecord.setProgress(0);
return upgradeRecord;
}).toList();
@@ -88,14 +87,6 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
entry -> Convert.toLong(entry.getValue())));
}
// TODO @li1方法注释简单写2父类写了注释子类就不用写了。。。
/**
* 获取指定固件ID的OTA升级记录统计信息。
* 该方法通过查询数据库统计不同状态的OTA升级记录数量并返回一个包含各状态数量的映射。
*
* @param firmwareId 固件ID用于指定需要统计的固件升级记录。
* @return 返回一个Map其中键为升级记录状态如PENDING、PUSHED等值为对应状态的记录数量。
*/
@Override
@Transactional
public Map<Integer, Long> getOtaUpgradeRecordStatistics(Long firmwareId) {
@@ -109,26 +100,12 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
}
@Override
public void retryUpgradeRecord(Long id) {
// 1.1 校验升级记录信息是否存在
IotOtaUpgradeRecordDO upgradeRecord = validateUpgradeRecordExists(id);
// 1.2 校验升级记录是否可以重新升级
validateUpgradeRecordCanRetry(upgradeRecord);
// 2. 将一些数据重置,这样定时任务轮询就可以重启任务
// TODO @li更新的时候wherestatus
upgradeRecordMapper.updateById(new IotOtaUpgradeRecordDO()
.setId(upgradeRecord.getId()).setProgress(0)
.setStatus(IotOtaUpgradeRecordStatusEnum.PENDING.getStatus()));
}
@Override
public IotOtaUpgradeRecordDO getUpgradeRecord(Long id) {
public IotOtaTaskRecordDO getUpgradeRecord(Long id) {
return upgradeRecordMapper.selectById(id);
}
@Override
public PageResult<IotOtaUpgradeRecordDO> getUpgradeRecordPage(IotOtaUpgradeRecordPageReqVO pageReqVO) {
public PageResult<IotOtaTaskRecordDO> getUpgradeRecordPage(IotOtaUpgradeRecordPageReqVO pageReqVO) {
return upgradeRecordMapper.selectUpgradeRecordPage(pageReqVO);
}
@@ -136,23 +113,8 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
public void cancelUpgradeRecordByTaskId(Long taskId) {
// 暂定只有待推送的升级记录可以取消 TODO @芋艿:可以看看阿里云,哪些可以取消
upgradeRecordMapper.updateUpgradeRecordStatusByTaskIdAndStatus(
IotOtaUpgradeRecordStatusEnum.CANCELED.getStatus(), taskId,
IotOtaUpgradeRecordStatusEnum.PENDING.getStatus());
}
@Override
public List<IotOtaUpgradeRecordDO> getUpgradeRecordListByState(Integer state) {
return upgradeRecordMapper.selectUpgradeRecordListByState(state);
}
@Override
public void updateUpgradeRecordStatus(List<Long> ids, Integer status) {
upgradeRecordMapper.updateUpgradeRecordStatus(ids, status);
}
@Override
public List<IotOtaUpgradeRecordDO> getUpgradeRecordListByTaskId(Long taskId) {
return upgradeRecordMapper.selectUpgradeRecordListByTaskId(taskId);
IotOtaTaskRecordStatusEnum.CANCELED.getStatus(), taskId,
IotOtaTaskRecordStatusEnum.PENDING.getStatus());
}
/**
@@ -163,9 +125,9 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
* @param id 升级记录的唯一标识符类型为Long。
* @throws cn.iocoder.yudao.framework.common.exception.ServiceException则抛出异常异常类型为OTA_UPGRADE_RECORD_NOT_EXISTS。
*/
private IotOtaUpgradeRecordDO validateUpgradeRecordExists(Long id) {
private IotOtaTaskRecordDO validateUpgradeRecordExists(Long id) {
// 根据ID查询升级记录
IotOtaUpgradeRecordDO upgradeRecord = upgradeRecordMapper.selectById(id);
IotOtaTaskRecordDO upgradeRecord = upgradeRecordMapper.selectById(id);
// 如果查询结果为空,抛出异常
if (upgradeRecord == null) {
throw exception(OTA_UPGRADE_RECORD_NOT_EXISTS);
@@ -185,11 +147,11 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
* @param deviceId 设备ID用于标识特定的设备
*/
private void validateUpgradeRecordDuplicate(Long firmwareId, Long taskId, String deviceId) {
IotOtaUpgradeRecordDO upgradeRecord = upgradeRecordMapper.selectByConditions(firmwareId, taskId, deviceId);
IotOtaTaskRecordDO upgradeRecord = upgradeRecordMapper.selectByConditions(firmwareId, taskId, deviceId);
if (upgradeRecord == null) {
return;
}
if (!Objects.equals(upgradeRecord.getStatus(), IotOtaUpgradeRecordStatusEnum.CANCELED.getStatus())) {
if (!Objects.equals(upgradeRecord.getStatus(), IotOtaTaskRecordStatusEnum.CANCELED.getStatus())) {
throw exception(OTA_UPGRADE_RECORD_DUPLICATE);
}
}
@@ -205,11 +167,11 @@ public class IotOtaUpgradeRecordServiceImpl implements IotOtaUpgradeRecordServic
* @throws cn.iocoder.yudao.framework.common.exception.ServiceException则抛出 OTA_UPGRADE_RECORD_CANNOT_RETRY 异常
*/
// TODO @li这种一次性的方法不复用的其实一步一定要抽成小方法
private void validateUpgradeRecordCanRetry(IotOtaUpgradeRecordDO upgradeRecord) {
private void validateUpgradeRecordCanRetry(IotOtaTaskRecordDO upgradeRecord) {
if (ObjectUtils.equalsAny(upgradeRecord.getStatus(),
IotOtaUpgradeRecordStatusEnum.PENDING.getStatus(),
IotOtaUpgradeRecordStatusEnum.PUSHED.getStatus(),
IotOtaUpgradeRecordStatusEnum.UPGRADING.getStatus())) {
IotOtaTaskRecordStatusEnum.PENDING.getStatus(),
IotOtaTaskRecordStatusEnum.PUSHED.getStatus(),
IotOtaTaskRecordStatusEnum.UPGRADING.getStatus())) {
throw exception(OTA_UPGRADE_RECORD_CANNOT_RETRY);
}
}

View File

@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.service.ota;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUpgradeTaskPageReqVO;
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUpgradeTaskSaveReqVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeTaskDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskDO;
import jakarta.validation.Valid;
import java.util.List;
@@ -36,7 +36,7 @@ public interface IotOtaUpgradeTaskService {
* @param id OTA升级任务的ID
* @return OTA升级任务的详细信息对象
*/
IotOtaUpgradeTaskDO getUpgradeTask(Long id);
IotOtaTaskDO getUpgradeTask(Long id);
/**
* 分页查询OTA升级任务
@@ -44,7 +44,7 @@ public interface IotOtaUpgradeTaskService {
* @param pageReqVO OTA升级任务的分页查询请求对象包含查询条件和分页信息
* @return 分页查询结果包含OTA升级任务列表和总记录数
*/
PageResult<IotOtaUpgradeTaskDO> getUpgradeTaskPage(@Valid IotOtaUpgradeTaskPageReqVO pageReqVO);
PageResult<IotOtaTaskDO> getUpgradeTaskPage(@Valid IotOtaUpgradeTaskPageReqVO pageReqVO);
/**
* 根据任务状态获取升级任务列表
@@ -52,7 +52,7 @@ public interface IotOtaUpgradeTaskService {
* @param state 任务状态,用于筛选符合条件的升级任务
* @return 返回符合指定状态的升级任务列表,列表中的元素为 IotOtaUpgradeTaskDO 对象
*/
List<IotOtaUpgradeTaskDO> getUpgradeTaskByState(Integer state);
List<IotOtaTaskDO> getUpgradeTaskByState(Integer state);
/**
* 更新升级任务的状态。

View File

@@ -8,10 +8,10 @@ import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUp
import cn.iocoder.yudao.module.iot.controller.admin.ota.vo.upgrade.task.IotOtaUpgradeTaskSaveReqVO;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaFirmwareDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaUpgradeTaskDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.ota.IotOtaTaskDO;
import cn.iocoder.yudao.module.iot.dal.mysql.ota.IotOtaUpgradeTaskMapper;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskScopeEnum;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaUpgradeTaskStatusEnum;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskDeviceScopeEnum;
import cn.iocoder.yudao.module.iot.enums.ota.IotOtaTaskStatusEnum;
import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
@@ -61,7 +61,7 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
validateScopeAndDevice(createReqVO.getScope(), createReqVO.getDeviceIds(), firmware.getProductId());
// 2. 保存 OTA 升级任务信息到数据库
IotOtaUpgradeTaskDO upgradeTask = initOtaUpgradeTask(createReqVO, firmware.getProductId());
IotOtaTaskDO upgradeTask = initOtaUpgradeTask(createReqVO, firmware.getProductId());
upgradeTaskMapper.insert(upgradeTask);
// 3. 生成设备升级记录信息并存储,等待定时任务轮询
@@ -73,16 +73,16 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
@Transactional(rollbackFor = Exception.class)
public void cancelUpgradeTask(Long id) {
// 1.1 校验升级任务是否存在
IotOtaUpgradeTaskDO upgradeTask = validateUpgradeTaskExists(id);
IotOtaTaskDO upgradeTask = validateUpgradeTaskExists(id);
// 1.2 校验升级任务是否可以取消
// TODO @liObjUtil notequals
if (!Objects.equals(upgradeTask.getStatus(), IotOtaUpgradeTaskStatusEnum.IN_PROGRESS.getStatus())) {
if (!Objects.equals(upgradeTask.getStatus(), IotOtaTaskStatusEnum.IN_PROGRESS.getStatus())) {
throw exception(OTA_UPGRADE_TASK_CANNOT_CANCEL);
}
// 2. 更新 OTA 升级任务状态为已取消
upgradeTaskMapper.updateById(IotOtaUpgradeTaskDO.builder()
.id(id).status(IotOtaUpgradeTaskStatusEnum.CANCELED.getStatus())
upgradeTaskMapper.updateById(IotOtaTaskDO.builder()
.id(id).status(IotOtaTaskStatusEnum.CANCELED.getStatus())
.build());
// 3. 更新 OTA 升级记录状态为已取消
@@ -90,30 +90,30 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
}
@Override
public IotOtaUpgradeTaskDO getUpgradeTask(Long id) {
public IotOtaTaskDO getUpgradeTask(Long id) {
return upgradeTaskMapper.selectById(id);
}
@Override
public PageResult<IotOtaUpgradeTaskDO> getUpgradeTaskPage(IotOtaUpgradeTaskPageReqVO pageReqVO) {
public PageResult<IotOtaTaskDO> getUpgradeTaskPage(IotOtaUpgradeTaskPageReqVO pageReqVO) {
return upgradeTaskMapper.selectUpgradeTaskPage(pageReqVO);
}
@Override
public List<IotOtaUpgradeTaskDO> getUpgradeTaskByState(Integer state) {
public List<IotOtaTaskDO> getUpgradeTaskByState(Integer state) {
return upgradeTaskMapper.selectUpgradeTaskByState(state);
}
@Override
public void updateUpgradeTaskStatus(Long id, Integer status) {
upgradeTaskMapper.updateById(IotOtaUpgradeTaskDO.builder().id(id).status(status).build());
upgradeTaskMapper.updateById(IotOtaTaskDO.builder().id(id).status(status).build());
}
/**
* 校验固件升级任务是否重复
*/
private void validateFirmwareTaskDuplicate(Long firmwareId, String taskName) {
List<IotOtaUpgradeTaskDO> upgradeTaskList = upgradeTaskMapper.selectByFirmwareIdAndName(firmwareId, taskName);
List<IotOtaTaskDO> upgradeTaskList = upgradeTaskMapper.selectByFirmwareIdAndName(firmwareId, taskName);
if (CollUtil.isNotEmpty(upgradeTaskList)) {
throw exception(OTA_UPGRADE_TASK_NAME_DUPLICATE);
}
@@ -128,14 +128,14 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
* @throws cn.iocoder.yudao.framework.common.exception.ServiceException抛出相应的异常
*/
private void validateScopeAndDevice(Integer scope, List<Long> deviceIds, Long productId) {
if (Objects.equals(scope, IotOtaUpgradeTaskScopeEnum.SELECT.getScope())) {
if (Objects.equals(scope, IotOtaTaskDeviceScopeEnum.SELECT.getScope())) {
if (CollUtil.isEmpty(deviceIds)) {
throw exception(OTA_UPGRADE_TASK_DEVICE_IDS_EMPTY);
}
return;
}
if (Objects.equals(scope, IotOtaUpgradeTaskScopeEnum.ALL.getScope())) {
if (Objects.equals(scope, IotOtaTaskDeviceScopeEnum.ALL.getScope())) {
List<IotDeviceDO> deviceList = deviceService.getDeviceListByProductId(productId);
if (CollUtil.isEmpty(deviceList)) {
throw exception(OTA_UPGRADE_TASK_DEVICE_LIST_EMPTY);
@@ -146,8 +146,8 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
/**
* 验证升级任务是否存在
*/
private IotOtaUpgradeTaskDO validateUpgradeTaskExists(Long id) {
IotOtaUpgradeTaskDO upgradeTask = upgradeTaskMapper.selectById(id);
private IotOtaTaskDO validateUpgradeTaskExists(Long id) {
IotOtaTaskDO upgradeTask = upgradeTaskMapper.selectById(id);
if (Objects.isNull(upgradeTask)) {
throw exception(OTA_UPGRADE_TASK_NOT_EXISTS);
}
@@ -157,14 +157,14 @@ public class IotOtaUpgradeTaskServiceImpl implements IotOtaUpgradeTaskService {
/**
* 初始化升级任务
*/
private IotOtaUpgradeTaskDO initOtaUpgradeTask(IotOtaUpgradeTaskSaveReqVO createReqVO, Long productId) {
IotOtaUpgradeTaskDO upgradeTask = BeanUtils.toBean(createReqVO, IotOtaUpgradeTaskDO.class);
upgradeTask.setDeviceCount(Convert.toLong(CollUtil.size(createReqVO.getDeviceIds())))
.setStatus(IotOtaUpgradeTaskStatusEnum.IN_PROGRESS.getStatus());
if (Objects.equals(createReqVO.getScope(), IotOtaUpgradeTaskScopeEnum.ALL.getScope())) {
private IotOtaTaskDO initOtaUpgradeTask(IotOtaUpgradeTaskSaveReqVO createReqVO, Long productId) {
IotOtaTaskDO upgradeTask = BeanUtils.toBean(createReqVO, IotOtaTaskDO.class);
upgradeTask.setDeviceTotalCount(Convert.toLong(CollUtil.size(createReqVO.getDeviceIds())))
.setStatus(IotOtaTaskStatusEnum.IN_PROGRESS.getStatus());
if (Objects.equals(createReqVO.getScope(), IotOtaTaskDeviceScopeEnum.ALL.getScope())) {
List<IotDeviceDO> deviceList = deviceService.getDeviceListByProductId(productId);
upgradeTask.setDeviceCount((long) deviceList.size());
upgradeTask.setDeviceTotalCount((long) deviceList.size());
upgradeTask.setDeviceIds(
deviceList.stream().map(IotDeviceDO::getId).collect(Collectors.toList()));
}