diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceStatusUpdateReqDTO.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceStatusUpdateReqDTO.java index 111427a03c..e6fea60c37 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceStatusUpdateReqDTO.java +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/api/device/dto/IotDeviceStatusUpdateReqDTO.java @@ -1,7 +1,7 @@ package cn.iocoder.yudao.module.iot.api.device.dto; import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStatusEnum; +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; import jakarta.validation.constraints.NotEmpty; import lombok.Data; import lombok.NoArgsConstructor; @@ -19,7 +19,7 @@ public class IotDeviceStatusUpdateReqDTO extends IotDeviceUpstreamAbstractReqDTO * 设备状态 */ @NotEmpty(message = "设备状态不能为空") - @InEnum(IotDeviceStatusEnum.class) // 只使用:在线、离线 + @InEnum(IotDeviceStateEnum.class) // 只使用:在线、离线 private Integer status; } diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/DictTypeConstants.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/DictTypeConstants.java index c8e6c70c1f..04df143bed 100644 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/DictTypeConstants.java +++ b/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 { public static final String DATA_FORMAT = "iot_data_format"; public static final String VALIDATE_TYPE = "iot_validate_type"; - public static final String DEVICE_STATUS = "iot_device_status"; + public static final String DEVICE_STATE = "iot_device_state"; } diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStateEnum.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStateEnum.java new file mode 100644 index 0000000000..a1e528ed82 --- /dev/null +++ b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStateEnum.java @@ -0,0 +1,38 @@ +package cn.iocoder.yudao.module.iot.enums.device; + +import cn.iocoder.yudao.framework.common.core.ArrayValuable; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +import java.util.Arrays; + +/** + * IoT 设备状态枚举 + * + * @author haohao + */ +@RequiredArgsConstructor +@Getter +public enum IotDeviceStateEnum implements ArrayValuable { + + INACTIVE(0, "未激活"), + ONLINE(1, "在线"), + OFFLINE(2, "离线"); + + public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotDeviceStateEnum::getState).toArray(Integer[]::new); + + /** + * 状态 + */ + private final Integer state; + /** + * 状态名 + */ + private final String name; + + @Override + public Integer[] array() { + return ARRAYS; + } + +} diff --git a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStatusEnum.java b/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStatusEnum.java deleted file mode 100644 index 0ec2ac776b..0000000000 --- a/yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/device/IotDeviceStatusEnum.java +++ /dev/null @@ -1,55 +0,0 @@ -package cn.iocoder.yudao.module.iot.enums.device; - -import cn.iocoder.yudao.framework.common.core.ArrayValuable; -import lombok.Getter; - -import java.util.Arrays; - -/** - * IoT 设备状态枚举 - * - * @author haohao - */ -@Getter -public enum IotDeviceStatusEnum implements ArrayValuable { - - INACTIVE(0, "未激活"), - ONLINE(1, "在线"), - OFFLINE(2, "离线"), - DISABLED(3, "已禁用"); - - public static final Integer[] ARRAYS = Arrays.stream(values()).map(IotDeviceStatusEnum::getStatus).toArray(Integer[]::new); - - /** - * 状态 - */ - private final Integer status; - /** - * 状态名 - */ - private final String name; - - IotDeviceStatusEnum(Integer status, String name) { - this.status = status; - this.name = name; - } - - public static IotDeviceStatusEnum fromStatus(Integer status) { - for (IotDeviceStatusEnum value : values()) { - if (value.getStatus().equals(status)) { - return value; - } - } - return null; - } - - public static boolean isValidStatus(Integer status) { - return fromStatus(status) != null; - } - - @Override - public Integer[] array() { - return ARRAYS; - } - -} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java index 5080881acf..a7180803d2 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceController.java +++ b/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 { return success(deviceService.createDevice(createReqVO)); } - @PutMapping("/update-status") - @Operation(summary = "更新设备状态") - @PreAuthorize("@ss.hasPermission('iot:device:update')") - public CommonResult updateDeviceStatus(@Valid @RequestBody IotDeviceStatusUpdateReqVO updateReqVO) { - deviceService.updateDeviceStatus(updateReqVO); - return success(true); - } - @PutMapping("/update") @Operation(summary = "更新设备") @PreAuthorize("@ss.hasPermission('iot:device:update')") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDevicePageReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDevicePageReqVO.java index dcea2b0ba5..6862677328 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDevicePageReqVO.java +++ b/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; import cn.iocoder.yudao.framework.common.pojo.PageParam; import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStatusEnum; +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; import cn.iocoder.yudao.module.iot.enums.product.IotProductDeviceTypeEnum; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -25,7 +25,7 @@ public class IotDevicePageReqVO extends PageParam { private Integer deviceType; @Schema(description = "设备状态", example = "1") - @InEnum(IotDeviceStatusEnum.class) + @InEnum(IotDeviceStateEnum.class) private Integer status; @Schema(description = "设备分组编号", example = "1024") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceRespVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceRespVO.java index 1516637590..38e41de70d 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceRespVO.java +++ b/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; import java.time.LocalDateTime; import java.util.Set; -import static cn.iocoder.yudao.module.iot.enums.DictTypeConstants.DEVICE_STATUS; +import static cn.iocoder.yudao.module.iot.enums.DictTypeConstants.DEVICE_STATE; @Schema(description = "管理后台 - IoT 设备 Response VO") @Data @@ -60,20 +60,16 @@ public class IotDeviceRespVO { @Schema(description = "设备状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") @ExcelProperty(value = "设备状态", converter = DictConvert.class) - @DictFormat(DEVICE_STATUS) - private Integer status; - - @Schema(description = "设备状态最后更新时间") - @ExcelProperty("设备状态最后更新时间") - private LocalDateTime statusLastUpdateTime; + @DictFormat(DEVICE_STATE) + private Integer state; @Schema(description = "最后上线时间") @ExcelProperty("最后上线时间") - private LocalDateTime lastOnlineTime; + private LocalDateTime onlineTime; @Schema(description = "最后离线时间") @ExcelProperty("最后离线时间") - private LocalDateTime lastOfflineTime; + private LocalDateTime offlineTime; @Schema(description = "设备激活时间") @ExcelProperty("设备激活时间") diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceStatusUpdateReqVO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceStatusUpdateReqVO.java deleted file mode 100644 index daa1efde80..0000000000 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/device/IotDeviceStatusUpdateReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.device; - -import cn.iocoder.yudao.framework.common.validation.InEnum; -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStatusEnum; -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; -import lombok.Data; - -@Schema(description = "管理后台 - IoT 设备状态更新 Request VO") -@Data -public class IotDeviceStatusUpdateReqVO { - - @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "设备编号不能为空") - private Long id; - - @Schema(description = "设备状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "设备状态不能为空") - @InEnum(IotDeviceStatusEnum.class) - private Integer status; -} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/IotDeviceDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/IotDeviceDO.java index f1d5f9792f..defb0c2f0a 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/IotDeviceDO.java +++ b/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; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.type.LongSetTypeHandler; import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStatusEnum; +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; import com.baomidou.mybatisplus.annotation.KeySequence; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -94,22 +94,17 @@ public class IotDeviceDO extends BaseDO { /** * 设备状态 *

- * 枚举 {@link IotDeviceStatusEnum} + * 枚举 {@link IotDeviceStateEnum} */ - private Integer status; - - /** - * 设备状态最后更新时间 - */ - private LocalDateTime statusLastUpdateTime; + private Integer state; /** * 最后上线时间 */ - private LocalDateTime lastOnlineTime; + private LocalDateTime onlineTime; /** * 最后离线时间 */ - private LocalDateTime lastOfflineTime; + private LocalDateTime offlineTime; /** * 设备激活时间 */ diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/IotDeviceMapper.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/IotDeviceMapper.java index 2ed10eee55..ea80667e05 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/IotDeviceMapper.java +++ b/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 { .eqIfPresent(IotDeviceDO::getProductId, reqVO.getProductId()) .eqIfPresent(IotDeviceDO::getDeviceType, reqVO.getDeviceType()) .likeIfPresent(IotDeviceDO::getNickname, reqVO.getNickname()) - .eqIfPresent(IotDeviceDO::getStatus, reqVO.getStatus()) + .eqIfPresent(IotDeviceDO::getState, reqVO.getStatus()) .apply(ObjectUtil.isNotNull(reqVO.getGroupId()), "FIND_IN_SET(" + reqVO.getGroupId() + ",group_ids) > 0") .orderByDesc(IotDeviceDO::getId)); } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java index 5fbaa2f285..0e46733bf8 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java +++ b/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 { /** * 更新设备状态 * - * @param updateReqVO 更新信息 + * @param id 编号 + * @param state 状态 */ - void updateDeviceStatus(IotDeviceStatusUpdateReqVO updateReqVO); + void updateDeviceState(Long id, Integer state); /** * 更新设备分组 diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java index 12c6939e93..640ebb7207 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java +++ b/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; import cn.iocoder.yudao.module.iot.dal.mysql.device.IotDeviceMapper; import cn.iocoder.yudao.module.iot.dal.redis.RedisKeyConstants; import cn.iocoder.yudao.module.iot.enums.device.IotDeviceMessageTypeEnum; -import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStatusEnum; +import cn.iocoder.yudao.module.iot.enums.device.IotDeviceStateEnum; import cn.iocoder.yudao.module.iot.enums.product.IotProductDeviceTypeEnum; import cn.iocoder.yudao.module.iot.service.device.upstream.IotDeviceUpstreamService; import cn.iocoder.yudao.module.iot.service.product.IotProductService; @@ -89,7 +89,6 @@ public class IotDeviceServiceImpl implements IotDeviceService { deviceGroupService.validateDeviceGroupExists(createReqVO.getGroupIds()); // 2.1 转换 VO 为 DO - // TODO @芋艿:state 相关的参数。另外,到底叫 state,还是 status 好! // TODO @芋艿:各种 mqtt 是不是可以简化! IotDeviceDO device = BeanUtils.toBean(createReqVO, IotDeviceDO.class, o -> { o.setProductKey(product.getProductKey()).setDeviceType(product.getDeviceType()); @@ -99,7 +98,7 @@ public class IotDeviceServiceImpl implements IotDeviceService { .setMqttUsername(generateMqttUsername(o.getDeviceName(), o.getProductKey())) .setMqttPassword(generateMqttPassword()); // 设置设备状态为未激活 - o.setStatus(IotDeviceStatusEnum.INACTIVE.getStatus()).setStatusLastUpdateTime(LocalDateTime.now()); + o.setState(IotDeviceStateEnum.INACTIVE.getState()); }); // 2.2 插入到数据库 deviceMapper.insert(device); @@ -232,29 +231,22 @@ public class IotDeviceServiceImpl implements IotDeviceService { } @Override - public void updateDeviceStatus(IotDeviceStatusUpdateReqVO updateReqVO) { - // TODO @芋艿:state 相关的参数。另外,到底叫 state,还是 status 好! - // TODO @芋艿:各种时间,需要 check 下,优化处理下! + public void updateDeviceState(Long id, Integer state) { // 1. 校验存在 - IotDeviceDO device = validateDeviceExists(updateReqVO.getId()); + IotDeviceDO device = validateDeviceExists(id); - // 2.1 更新状态和更新时间 - IotDeviceDO updateDevice = BeanUtils.toBean(updateReqVO, IotDeviceDO.class) - .setStatusLastUpdateTime(LocalDateTime.now()); - // 2.2 更新状态相关时间 - if (Objects.equals(device.getStatus(), IotDeviceStatusEnum.INACTIVE.getStatus()) - && Objects.equals(updateDevice.getStatus(), IotDeviceStatusEnum.ONLINE.getStatus())) { - // 从未激活到在线,设置激活时间和最后上线时间 - updateDevice.setActiveTime(LocalDateTime.now()).setLastOnlineTime(LocalDateTime.now()); - } else if (Objects.equals(updateDevice.getStatus(), IotDeviceStatusEnum.ONLINE.getStatus())) { - // 如果是上线,设置最后上线时间 - updateDevice.setLastOnlineTime(LocalDateTime.now()); - } else if (Objects.equals(updateDevice.getStatus(), IotDeviceStatusEnum.OFFLINE.getStatus())) { - // 如果是离线,设置最后离线时间 - updateDevice.setLastOfflineTime(LocalDateTime.now()); + // 2. 更新状态和时间 + IotDeviceDO updateObj = new IotDeviceDO().setId(id).setState(state); + if (device.getOnlineTime() == null + && Objects.equals(state, IotDeviceStateEnum.ONLINE.getState())) { + updateObj.setActiveTime(LocalDateTime.now()); } - // 2.3 更新到数据库 - deviceMapper.updateById(updateDevice); + if (Objects.equals(state, IotDeviceStateEnum.ONLINE.getState())) { + updateObj.setOnlineTime(LocalDateTime.now()); + } else if (Objects.equals(state, IotDeviceStateEnum.OFFLINE.getState())) { + updateObj.setOfflineTime(LocalDateTime.now()); + } + deviceMapper.updateById(updateObj); // 3. 清空对应缓存 deleteDeviceCache(device); @@ -417,8 +409,8 @@ public class IotDeviceServiceImpl implements IotDeviceService { // 2.3 情况三:状态变更 if (Objects.equals(reportReqVO.getType(), IotDeviceMessageTypeEnum.STATE.getType())) { // TODO 芋艿:待实现 - updateDeviceStatus(new IotDeviceStatusUpdateReqVO().setId(device.getId()) - .setStatus((Integer) reportReqVO.getData())); +// updateDeviceState(new IotDeviceStatusUpdateReqVO().setId(device.getId()) +// .setStatus((Integer) reportReqVO.getData())); return; } throw new IllegalArgumentException("未知的类型:" + reportReqVO.getType());