Bläddra i källkod

【代码评审】IoT:物模型的管理

YunaiV 6 månader sedan
förälder
incheckning
76ab64a255
11 ändrade filer med 42 tillägg och 83 borttagningar
  1. 1 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelEvent.java
  2. 1 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelParam.java
  3. 1 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelProperty.java
  4. 0 50
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelRespVO.java
  5. 1 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelService.java
  6. 6 5
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelListReqVO.java
  7. 5 4
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelPageReqVO.java
  8. 1 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelRespVO.java
  9. 1 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelSaveReqVO.java
  10. 1 0
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thingmodel/IotThingModelService.java
  11. 24 24
      yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thingmodel/IotThingModelServiceImpl.java

+ 1 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelEvent.java

@@ -5,6 +5,7 @@ import lombok.Data;
 
 import java.util.List;
 
+// TODO @puhui999:必要的参数校验
 /**
  * 物模型中的事件
  *

+ 1 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelParam.java

@@ -6,6 +6,7 @@ import lombok.Data;
 
 import java.util.List;
 
+// TODO @puhui999:必要的参数校验
 /**
  * IOT 产品物模型中的参数
  *

+ 1 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelProperty.java

@@ -6,6 +6,7 @@ import lombok.Data;
 
 import java.util.List;
 
+// TODO @puhui999:必要的参数校验
 /**
  * 物模型中的属性
  *

+ 0 - 50
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelRespVO.java

@@ -1,50 +0,0 @@
-package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model;
-
-import lombok.*;
-
-import java.util.List;
-
-@Data
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-@ToString
-public class ThingModelRespVO {
-
-    /**
-     * 产品编号
-     */
-    private Long id;
-
-    /**
-     * 产品标识
-     */
-    private String productKey;
-
-    /**
-     * 物模型
-     */
-    private Model model;
-
-    /**
-     * 物模型
-     */
-    @Data
-    public static class Model {
-
-        /**
-         * 属性列表
-         */
-        private List<ThingModelProperty> properties;
-
-        /**
-         * 服务列表
-         */
-        private List<ThingModelService> services;
-
-        /**
-         * 事件列表
-         */
-        private List<ThingModelEvent> events;
-    }
-}

+ 1 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelService.java

@@ -5,6 +5,7 @@ import lombok.Data;
 
 import java.util.List;
 
+// TODO @puhui999:必要的参数校验
 /**
  * 物模型中的服务
  *

+ 6 - 5
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelListReqVO.java

@@ -6,10 +6,15 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
-@Schema(description = "管理后台 - IoT 产品物模型List Request VO")
+// TODO @puhui999:部分字段,可以用 cursor 加上 example
+@Schema(description = "管理后台 - IoT 产品物模型 List Request VO")
 @Data
 public class IotThingModelListReqVO {
 
+    @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "产品编号不能为空")
+    private Long productId;
+
     @Schema(description = "功能标识")
     private String identifier;
 
@@ -20,8 +25,4 @@ public class IotThingModelListReqVO {
     @InEnum(IotThingModelTypeEnum.class)
     private Integer type;
 
-    @Schema(description = "产品 ID", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotNull(message = "产品 ID 不能为空")
-    private Long productId;
-
 }

+ 5 - 4
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelPageReqVO.java

@@ -9,12 +9,17 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
 
+// TODO @puhui999:部分字段,可以用 cursor 加上 example
 @Schema(description = "管理后台 - IoT 产品物模型分页 Request VO")
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
 public class IotThingModelPageReqVO extends PageParam {
 
+    @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "产品编号不能为空")
+    private Long productId;
+
     @Schema(description = "功能标识")
     private String identifier;
 
@@ -25,8 +30,4 @@ public class IotThingModelPageReqVO extends PageParam {
     @InEnum(IotThingModelTypeEnum.class)
     private Integer type;
 
-    @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotNull(message = "产品ID不能为空")
-    private Long productId;
-
 }

+ 1 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelRespVO.java

@@ -10,6 +10,7 @@ import lombok.Data;
 
 import java.time.LocalDateTime;
 
+// TODO @puhui999:部分字段,可以用 cursor 加上 example
 @Schema(description = "管理后台 - IoT 产品物模型 Response VO")
 @Data
 @ExcelIgnoreUnannotated

+ 1 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelSaveReqVO.java

@@ -10,6 +10,7 @@ import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
+// TODO @puhui999:部分字段,可以用 cursor 加上 example
 @Schema(description = "管理后台 - IoT 产品物模型新增/修改 Request VO")
 @Data
 public class IotThingModelSaveReqVO {

+ 1 - 0
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thingmodel/IotThingModelService.java

@@ -79,4 +79,5 @@ public interface IotThingModelService {
      * @return 产品物模型列表
      */
     List<IotThingModelDO> getThingModelList(IotThingModelListReqVO reqVO);
+
 }

+ 24 - 24
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thingmodel/IotThingModelServiceImpl.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.iot.service.thingmodel;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.extra.spring.SpringUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -54,29 +55,26 @@ public class IotThingModelServiceImpl implements IotThingModelService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createThingModel(IotThingModelSaveReqVO createReqVO) {
-        // 1. 校验功能标识符在同一产品下是否唯一
+        // 1.1 校验功能标识符在同一产品下是否唯一
         validateIdentifierUnique(createReqVO.getProductId(), createReqVO.getIdentifier());
-
-        // 2. 功能名称在同一产品下是否唯一
+        // 1.2 功能名称在同一产品下是否唯一
         validateNameUnique(createReqVO.getProductId(), createReqVO.getName());
-
-        // 3. 系统保留字段,不能用于标识符定义
+        // 1.3 系统保留字段,不能用于标识符定义
         validateNotDefaultEventAndService(createReqVO.getIdentifier());
-
-        // 4. 校验产品状态,发布状态下,不允许新增功能
+        // 1.4 校验产品状态,发布状态下,不允许新增功能
         validateProductStatus(createReqVO.getProductId());
 
-        // 5. 插入数据库
+        // 2. 插入数据库
         IotThingModelDO thingModel = IotThingModelConvert.INSTANCE.convert(createReqVO);
         thingModelMapper.insert(thingModel);
 
-        // 6. 如果创建的是属性,需要更新默认的事件和服务
+        // 3. 如果创建的是属性,需要更新默认的事件和服务
         if (Objects.equals(createReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) {
             createDefaultEventsAndServices(createReqVO.getProductId(), createReqVO.getProductKey());
         }
         // TODO @puhui999: 服务和事件的情况 method 怎么设置?在前端设置还是后端设置?
 
-        // 7. 删除缓存
+        // 4. 删除缓存
         deleteThingModelListCache(createReqVO.getProductKey());
         return thingModel.getId();
     }
@@ -84,38 +82,35 @@ public class IotThingModelServiceImpl implements IotThingModelService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateThingModel(IotThingModelSaveReqVO updateReqVO) {
-        // 1. 校验功能是否存在
+        // 1.1 校验功能是否存在
         validateProductThingModelMapperExists(updateReqVO.getId());
-
-        // 2. 校验功能标识符是否唯一
+        // 1.2 校验功能标识符是否唯一
         validateIdentifierUniqueForUpdate(updateReqVO.getId(), updateReqVO.getProductId(), updateReqVO.getIdentifier());
-
-        // 3. 校验产品状态,发布状态下,不允许操作功能
+        // 1.3 校验产品状态,发布状态下,不允许操作功能
         validateProductStatus(updateReqVO.getProductId());
 
-        // 4. 更新数据库
+        // 2. 更新数据库
         IotThingModelDO thingModel = IotThingModelConvert.INSTANCE.convert(updateReqVO);
         thingModelMapper.updateById(thingModel);
 
-        // 5. 如果更新的是属性,需要更新默认的事件和服务
+        // 3. 如果更新的是属性,需要更新默认的事件和服务
         if (Objects.equals(updateReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) {
             createDefaultEventsAndServices(updateReqVO.getProductId(), updateReqVO.getProductKey());
         }
 
-        // 6. 删除缓存
+        // 4. 删除缓存
         deleteThingModelListCache(updateReqVO.getProductKey());
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void deleteThingModel(Long id) {
-        // 1. 校验功能是否存在
+        // 1.1 校验功能是否存在
         IotThingModelDO thingModel = thingModelMapper.selectById(id);
         if (thingModel == null) {
             throw exception(THING_MODEL_NOT_EXISTS);
         }
-
-        // 3. 校验产品状态,发布状态下,不允许操作功能
+        // 1.2 校验产品状态,发布状态下,不允许操作功能
         validateProductStatus(thingModel.getProductId());
 
         // 2. 删除功能
@@ -168,6 +163,7 @@ public class IotThingModelServiceImpl implements IotThingModelService {
         }
     }
 
+    // TODO @puhui999:这个方法,和 validateIdentifierUnique 可以融合下
     private void validateIdentifierUniqueForUpdate(Long id, Long productId, String identifier) {
         IotThingModelDO thingModel = thingModelMapper.selectByProductIdAndIdentifier(productId, identifier);
         if (thingModel != null && ObjectUtil.notEqual(thingModel.getId(), id)) {
@@ -176,15 +172,16 @@ public class IotThingModelServiceImpl implements IotThingModelService {
     }
 
     private void validateProductStatus(Long createReqVO) {
-        IotProductDO product = productService.getProduct(createReqVO);
+        IotProductDO product = productService.validateProductExists(createReqVO);
         if (Objects.equals(product.getStatus(), IotProductStatusEnum.PUBLISHED.getStatus())) {
             throw exception(PRODUCT_STATUS_NOT_ALLOW_THING_MODEL);
         }
     }
 
+    // TODO @芋艿:在 review 下
     private void validateNotDefaultEventAndService(String identifier) {
-        // set, get, post, property, event, time, value 是系统保留字段,不能用于标识符定义
-        if (CollUtil.containsAny(Arrays.asList("set", "get", "post", "property", "event", "time", "value"), Collections.singletonList(identifier))) {
+        // 系统保留字段,不能用于标识符定义
+        if (StrUtil.equalsAny(identifier, "set", "get", "post", "property", "event", "time", "value")) {
             throw exception(THING_MODEL_IDENTIFIER_INVALID);
         }
     }
@@ -205,6 +202,9 @@ public class IotThingModelServiceImpl implements IotThingModelService {
 
     /**
      * 创建默认的事件和服务
+     *
+     * @param productId 产品编号
+     * @param productKey 产品标识
      */
     public void createDefaultEventsAndServices(Long productId, String productKey) {
         // 1. 获取当前属性列表