Commit f6366d9b550117a450915a2dd1ce9fde01939419

Authored by YunaiV
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&lt;IotDeviceDO&gt; {
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());
... ...