Commit f6366d9b550117a450915a2dd1ce9fde01939419
1 parent
f14cc470
【功能修改】IoT:设备状态从 status 到 state,移除已禁用
Showing
11 changed files
with
42 additions
and
104 deletions
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceStatusUpdateReqDTO.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.api.device.dto; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| 4 | -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStatusEnum; | |
| 4 | +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; | |
| 5 | 5 | import jakarta.validation.constraints.NotEmpty; |
| 6 | 6 | import lombok.Data; |
| 7 | 7 | import lombok.NoArgsConstructor; |
| ... | ... | @@ -19,7 +19,7 @@ public class IotDeviceStatusUpdateReqDTO extends IotDeviceUpstreamAbstractReqDTO |
| 19 | 19 | * 设备状态 |
| 20 | 20 | */ |
| 21 | 21 | @NotEmpty(message = "设备状态不能为空") |
| 22 | - @InEnum(IotDeviceStatusEnum.class) // 只使用:在线、离线 | |
| 22 | + @InEnum(IotDeviceStateEnum.class) // 只使用:在线、离线 | |
| 23 | 23 | private Integer status; |
| 24 | 24 | |
| 25 | 25 | } | ... | ... |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/DictTypeConstants.java
| ... | ... | @@ -14,6 +14,6 @@ public class DictTypeConstants { |
| 14 | 14 | public static final String DATA_FORMAT = "iot_data_format"; |
| 15 | 15 | public static final String VALIDATE_TYPE = "iot_validate_type"; |
| 16 | 16 | |
| 17 | - public static final String DEVICE_STATUS = "iot_device_status"; | |
| 17 | + public static final String DEVICE_STATE = "iot_device_state"; | |
| 18 | 18 | |
| 19 | 19 | } | ... | ... |
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStatusEnum.java renamed to yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStateEnum.java
| ... | ... | @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.iot.enums.device; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.core.ArrayValuable; |
| 4 | 4 | import lombok.Getter; |
| 5 | +import lombok.RequiredArgsConstructor; | |
| 5 | 6 | |
| 6 | 7 | import java.util.Arrays; |
| 7 | 8 | |
| ... | ... | @@ -10,43 +11,25 @@ import java.util.Arrays; |
| 10 | 11 | * |
| 11 | 12 | * @author haohao |
| 12 | 13 | */ |
| 14 | +@RequiredArgsConstructor | |
| 13 | 15 | @Getter |
| 14 | -public enum IotDeviceStatusEnum implements ArrayValuable<Integer> { | |
| 16 | +public enum IotDeviceStateEnum implements ArrayValuable<Integer> { | |
| 15 | 17 | |
| 16 | 18 | INACTIVE(0, "未激活"), |
| 17 | 19 | ONLINE(1, "在线"), |
| 18 | - OFFLINE(2, "离线"), | |
| 19 | - DISABLED(3, "已禁用"); | |
| 20 | + OFFLINE(2, "离线"); | |
| 20 | 21 | |
| 21 | - public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotDeviceStatusEnum::getStatus).toArray(Integer[]::new); | |
| 22 | + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotDeviceStateEnum::getState).toArray(Integer[]::new); | |
| 22 | 23 | |
| 23 | 24 | /** |
| 24 | 25 | * 状态 |
| 25 | 26 | */ |
| 26 | - private final Integer status; | |
| 27 | + private final Integer state; | |
| 27 | 28 | /** |
| 28 | 29 | * 状态名 |
| 29 | 30 | */ |
| 30 | 31 | private final String name; |
| 31 | 32 | |
| 32 | - IotDeviceStatusEnum(Integer status, String name) { | |
| 33 | - this.status = status; | |
| 34 | - this.name = name; | |
| 35 | - } | |
| 36 | - | |
| 37 | - public static IotDeviceStatusEnum fromStatus(Integer status) { | |
| 38 | - for (IotDeviceStatusEnum value : values()) { | |
| 39 | - if (value.getStatus().equals(status)) { | |
| 40 | - return value; | |
| 41 | - } | |
| 42 | - } | |
| 43 | - return null; | |
| 44 | - } | |
| 45 | - | |
| 46 | - public static boolean isValidStatus(Integer status) { | |
| 47 | - return fromStatus(status) != null; | |
| 48 | - } | |
| 49 | - | |
| 50 | 33 | @Override |
| 51 | 34 | public Integer[] array() { |
| 52 | 35 | return ARRAYS; | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java
| ... | ... | @@ -45,14 +45,6 @@ public class IotDeviceController { |
| 45 | 45 | return success(deviceService.createDevice(createReqVO)); |
| 46 | 46 | } |
| 47 | 47 | |
| 48 | - @PutMapping("/update-status") | |
| 49 | - @Operation(summary = "更新设备状态") | |
| 50 | - @PreAuthorize("@ss.hasPermission('iot:device:update')") | |
| 51 | - public CommonResult<Boolean> updateDeviceStatus(@Valid @RequestBody IotDeviceStatusUpdateReqVO updateReqVO) { | |
| 52 | - deviceService.updateDeviceStatus(updateReqVO); | |
| 53 | - return success(true); | |
| 54 | - } | |
| 55 | - | |
| 56 | 48 | @PutMapping("/update") |
| 57 | 49 | @Operation(summary = "更新设备") |
| 58 | 50 | @PreAuthorize("@ss.hasPermission('iot:device:update')") | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDevicePageReqVO.java
| ... | ... | @@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 4 | 4 | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| 5 | -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStatusEnum; | |
| 5 | +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; | |
| 6 | 6 | import cn.iocoder.yudao.module.iot.enums.product.IotProductDeviceTypeEnum; |
| 7 | 7 | import io.swagger.v3.oas.annotations.media.Schema; |
| 8 | 8 | import lombok.Data; |
| ... | ... | @@ -25,7 +25,7 @@ public class IotDevicePageReqVO extends PageParam { |
| 25 | 25 | private Integer deviceType; |
| 26 | 26 | |
| 27 | 27 | @Schema(description = "设备状态", example = "1") |
| 28 | - @InEnum(IotDeviceStatusEnum.class) | |
| 28 | + @InEnum(IotDeviceStateEnum.class) | |
| 29 | 29 | private Integer status; |
| 30 | 30 | |
| 31 | 31 | @Schema(description = "设备分组编号", example = "1024") | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceRespVO.java
| ... | ... | @@ -10,7 +10,7 @@ import lombok.Data; |
| 10 | 10 | import java.time.LocalDateTime; |
| 11 | 11 | import java.util.Set; |
| 12 | 12 | |
| 13 | -import static cn.iocoder.yudao.module.iot.enums.DictTypeConstants.DEVICE_STATUS; | |
| 13 | +import static cn.iocoder.yudao.module.iot.enums.DictTypeConstants.DEVICE_STATE; | |
| 14 | 14 | |
| 15 | 15 | @Schema(description = "管理后台 - IoT 设备 Response VO") |
| 16 | 16 | @Data |
| ... | ... | @@ -60,20 +60,16 @@ public class IotDeviceRespVO { |
| 60 | 60 | |
| 61 | 61 | @Schema(description = "设备状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 62 | 62 | @ExcelProperty(value = "设备状态", converter = DictConvert.class) |
| 63 | - @DictFormat(DEVICE_STATUS) | |
| 64 | - private Integer status; | |
| 65 | - | |
| 66 | - @Schema(description = "设备状态最后更新时间") | |
| 67 | - @ExcelProperty("设备状态最后更新时间") | |
| 68 | - private LocalDateTime statusLastUpdateTime; | |
| 63 | + @DictFormat(DEVICE_STATE) | |
| 64 | + private Integer state; | |
| 69 | 65 | |
| 70 | 66 | @Schema(description = "最后上线时间") |
| 71 | 67 | @ExcelProperty("最后上线时间") |
| 72 | - private LocalDateTime lastOnlineTime; | |
| 68 | + private LocalDateTime onlineTime; | |
| 73 | 69 | |
| 74 | 70 | @Schema(description = "最后离线时间") |
| 75 | 71 | @ExcelProperty("最后离线时间") |
| 76 | - private LocalDateTime lastOfflineTime; | |
| 72 | + private LocalDateTime offlineTime; | |
| 77 | 73 | |
| 78 | 74 | @Schema(description = "设备激活时间") |
| 79 | 75 | @ExcelProperty("设备激活时间") | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceStatusUpdateReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; | |
| 2 | - | |
| 3 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | |
| 4 | -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStatusEnum; | |
| 5 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 6 | -import jakarta.validation.constraints.NotNull; | |
| 7 | -import lombok.Data; | |
| 8 | - | |
| 9 | -@Schema(description = "管理后台 - IoT 设备状态更新 Request VO") | |
| 10 | -@Data | |
| 11 | -public class IotDeviceStatusUpdateReqVO { | |
| 12 | - | |
| 13 | - @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 14 | - @NotNull(message = "设备编号不能为空") | |
| 15 | - private Long id; | |
| 16 | - | |
| 17 | - @Schema(description = "设备状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | |
| 18 | - @NotNull(message = "设备状态不能为空") | |
| 19 | - @InEnum(IotDeviceStatusEnum.class) | |
| 20 | - private Integer status; | |
| 21 | -} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/IotDeviceDO.java
| ... | ... | @@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.iot.dal.dataobject.device; |
| 3 | 3 | import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; |
| 4 | 4 | import cn.iocoder.yudao.framework.mybatis.core.type.LongSetTypeHandler; |
| 5 | 5 | import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; |
| 6 | -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStatusEnum; | |
| 6 | +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; | |
| 7 | 7 | import com.baomidou.mybatisplus.annotation.KeySequence; |
| 8 | 8 | import com.baomidou.mybatisplus.annotation.TableField; |
| 9 | 9 | import com.baomidou.mybatisplus.annotation.TableId; |
| ... | ... | @@ -94,22 +94,17 @@ public class IotDeviceDO extends BaseDO { |
| 94 | 94 | /** |
| 95 | 95 | * 设备状态 |
| 96 | 96 | * <p> |
| 97 | - * 枚举 {@link IotDeviceStatusEnum} | |
| 97 | + * 枚举 {@link IotDeviceStateEnum} | |
| 98 | 98 | */ |
| 99 | - private Integer status; | |
| 100 | - | |
| 101 | - /** | |
| 102 | - * 设备状态最后更新时间 | |
| 103 | - */ | |
| 104 | - private LocalDateTime statusLastUpdateTime; | |
| 99 | + private Integer state; | |
| 105 | 100 | /** |
| 106 | 101 | * 最后上线时间 |
| 107 | 102 | */ |
| 108 | - private LocalDateTime lastOnlineTime; | |
| 103 | + private LocalDateTime onlineTime; | |
| 109 | 104 | /** |
| 110 | 105 | * 最后离线时间 |
| 111 | 106 | */ |
| 112 | - private LocalDateTime lastOfflineTime; | |
| 107 | + private LocalDateTime offlineTime; | |
| 113 | 108 | /** |
| 114 | 109 | * 设备激活时间 |
| 115 | 110 | */ | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/IotDeviceMapper.java
| ... | ... | @@ -25,7 +25,7 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> { |
| 25 | 25 | .eqIfPresent(IotDeviceDO::getProductId, reqVO.getProductId()) |
| 26 | 26 | .eqIfPresent(IotDeviceDO::getDeviceType, reqVO.getDeviceType()) |
| 27 | 27 | .likeIfPresent(IotDeviceDO::getNickname, reqVO.getNickname()) |
| 28 | - .eqIfPresent(IotDeviceDO::getStatus, reqVO.getStatus()) | |
| 28 | + .eqIfPresent(IotDeviceDO::getState, reqVO.getStatus()) | |
| 29 | 29 | .apply(ObjectUtil.isNotNull(reqVO.getGroupId()), "FIND_IN_SET(" + reqVO.getGroupId() + ",group_ids) > 0") |
| 30 | 30 | .orderByDesc(IotDeviceDO::getId)); |
| 31 | 31 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java
| ... | ... | @@ -34,9 +34,10 @@ public interface IotDeviceService { |
| 34 | 34 | /** |
| 35 | 35 | * 更新设备状态 |
| 36 | 36 | * |
| 37 | - * @param updateReqVO 更新信息 | |
| 37 | + * @param id 编号 | |
| 38 | + * @param state 状态 | |
| 38 | 39 | */ |
| 39 | - void updateDeviceStatus(IotDeviceStatusUpdateReqVO updateReqVO); | |
| 40 | + void updateDeviceState(Long id, Integer state); | |
| 40 | 41 | |
| 41 | 42 | /** |
| 42 | 43 | * 更新设备分组 | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java
| ... | ... | @@ -19,7 +19,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; |
| 19 | 19 | import cn.iocoder.yudao.module.iot.dal.mysql.device.IotDeviceMapper; |
| 20 | 20 | import cn.iocoder.yudao.module.iot.dal.redis.RedisKeyConstants; |
| 21 | 21 | import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; |
| 22 | -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStatusEnum; | |
| 22 | +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; | |
| 23 | 23 | import cn.iocoder.yudao.module.iot.enums.product.IotProductDeviceTypeEnum; |
| 24 | 24 | import cn.iocoder.yudao.module.iot.service.device.upstream.IotDeviceUpstreamService; |
| 25 | 25 | import cn.iocoder.yudao.module.iot.service.product.IotProductService; |
| ... | ... | @@ -89,7 +89,6 @@ public class IotDeviceServiceImpl implements IotDeviceService { |
| 89 | 89 | deviceGroupService.validateDeviceGroupExists(createReqVO.getGroupIds()); |
| 90 | 90 | |
| 91 | 91 | // 2.1 转换 VO 为 DO |
| 92 | - // TODO @芋艿:state 相关的参数。另外,到底叫 state,还是 status 好! | |
| 93 | 92 | // TODO @芋艿:各种 mqtt 是不是可以简化! |
| 94 | 93 | IotDeviceDO device = BeanUtils.toBean(createReqVO, IotDeviceDO.class, o -> { |
| 95 | 94 | o.setProductKey(product.getProductKey()).setDeviceType(product.getDeviceType()); |
| ... | ... | @@ -99,7 +98,7 @@ public class IotDeviceServiceImpl implements IotDeviceService { |
| 99 | 98 | .setMqttUsername(generateMqttUsername(o.getDeviceName(), o.getProductKey())) |
| 100 | 99 | .setMqttPassword(generateMqttPassword()); |
| 101 | 100 | // 设置设备状态为未激活 |
| 102 | - o.setStatus(IotDeviceStatusEnum.INACTIVE.getStatus()).setStatusLastUpdateTime(LocalDateTime.now()); | |
| 101 | + o.setState(IotDeviceStateEnum.INACTIVE.getState()); | |
| 103 | 102 | }); |
| 104 | 103 | // 2.2 插入到数据库 |
| 105 | 104 | deviceMapper.insert(device); |
| ... | ... | @@ -232,29 +231,22 @@ public class IotDeviceServiceImpl implements IotDeviceService { |
| 232 | 231 | } |
| 233 | 232 | |
| 234 | 233 | @Override |
| 235 | - public void updateDeviceStatus(IotDeviceStatusUpdateReqVO updateReqVO) { | |
| 236 | - // TODO @芋艿:state 相关的参数。另外,到底叫 state,还是 status 好! | |
| 237 | - // TODO @芋艿:各种时间,需要 check 下,优化处理下! | |
| 234 | + public void updateDeviceState(Long id, Integer state) { | |
| 238 | 235 | // 1. 校验存在 |
| 239 | - IotDeviceDO device = validateDeviceExists(updateReqVO.getId()); | |
| 236 | + IotDeviceDO device = validateDeviceExists(id); | |
| 240 | 237 | |
| 241 | - // 2.1 更新状态和更新时间 | |
| 242 | - IotDeviceDO updateDevice = BeanUtils.toBean(updateReqVO, IotDeviceDO.class) | |
| 243 | - .setStatusLastUpdateTime(LocalDateTime.now()); | |
| 244 | - // 2.2 更新状态相关时间 | |
| 245 | - if (Objects.equals(device.getStatus(), IotDeviceStatusEnum.INACTIVE.getStatus()) | |
| 246 | - && Objects.equals(updateDevice.getStatus(), IotDeviceStatusEnum.ONLINE.getStatus())) { | |
| 247 | - // 从未激活到在线,设置激活时间和最后上线时间 | |
| 248 | - updateDevice.setActiveTime(LocalDateTime.now()).setLastOnlineTime(LocalDateTime.now()); | |
| 249 | - } else if (Objects.equals(updateDevice.getStatus(), IotDeviceStatusEnum.ONLINE.getStatus())) { | |
| 250 | - // 如果是上线,设置最后上线时间 | |
| 251 | - updateDevice.setLastOnlineTime(LocalDateTime.now()); | |
| 252 | - } else if (Objects.equals(updateDevice.getStatus(), IotDeviceStatusEnum.OFFLINE.getStatus())) { | |
| 253 | - // 如果是离线,设置最后离线时间 | |
| 254 | - updateDevice.setLastOfflineTime(LocalDateTime.now()); | |
| 238 | + // 2. 更新状态和时间 | |
| 239 | + IotDeviceDO updateObj = new IotDeviceDO().setId(id).setState(state); | |
| 240 | + if (device.getOnlineTime() == null | |
| 241 | + && Objects.equals(state, IotDeviceStateEnum.ONLINE.getState())) { | |
| 242 | + updateObj.setActiveTime(LocalDateTime.now()); | |
| 255 | 243 | } |
| 256 | - // 2.3 更新到数据库 | |
| 257 | - deviceMapper.updateById(updateDevice); | |
| 244 | + if (Objects.equals(state, IotDeviceStateEnum.ONLINE.getState())) { | |
| 245 | + updateObj.setOnlineTime(LocalDateTime.now()); | |
| 246 | + } else if (Objects.equals(state, IotDeviceStateEnum.OFFLINE.getState())) { | |
| 247 | + updateObj.setOfflineTime(LocalDateTime.now()); | |
| 248 | + } | |
| 249 | + deviceMapper.updateById(updateObj); | |
| 258 | 250 | |
| 259 | 251 | // 3. 清空对应缓存 |
| 260 | 252 | deleteDeviceCache(device); |
| ... | ... | @@ -417,8 +409,8 @@ public class IotDeviceServiceImpl implements IotDeviceService { |
| 417 | 409 | // 2.3 情况三:状态变更 |
| 418 | 410 | if (Objects.equals(reportReqVO.getType(), IotDeviceMessageTypeEnum.STATE.getType())) { |
| 419 | 411 | // TODO 芋艿:待实现 |
| 420 | - updateDeviceStatus(new IotDeviceStatusUpdateReqVO().setId(device.getId()) | |
| 421 | - .setStatus((Integer) reportReqVO.getData())); | |
| 412 | +// updateDeviceState(new IotDeviceStatusUpdateReqVO().setId(device.getId()) | |
| 413 | +// .setStatus((Integer) reportReqVO.getData())); | |
| 422 | 414 | return; |
| 423 | 415 | } |
| 424 | 416 | throw new IllegalArgumentException("未知的类型:" + reportReqVO.getType()); | ... | ... |