Commit 76ab64a255c311a354060eb2580f57a37aa29b7f
1 parent
0b16f167
【代码评审】IoT:物模型的管理
Showing
11 changed files
with
42 additions
and
83 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelEvent.java
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelParam.java
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelProperty.java
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelRespVO.java deleted
| 1 | -package cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model; | |
| 2 | - | |
| 3 | -import lombok.*; | |
| 4 | - | |
| 5 | -import java.util.List; | |
| 6 | - | |
| 7 | -@Data | |
| 8 | -@Builder | |
| 9 | -@NoArgsConstructor | |
| 10 | -@AllArgsConstructor | |
| 11 | -@ToString | |
| 12 | -public class ThingModelRespVO { | |
| 13 | - | |
| 14 | - /** | |
| 15 | - * 产品编号 | |
| 16 | - */ | |
| 17 | - private Long id; | |
| 18 | - | |
| 19 | - /** | |
| 20 | - * 产品标识 | |
| 21 | - */ | |
| 22 | - private String productKey; | |
| 23 | - | |
| 24 | - /** | |
| 25 | - * 物模型 | |
| 26 | - */ | |
| 27 | - private Model model; | |
| 28 | - | |
| 29 | - /** | |
| 30 | - * 物模型 | |
| 31 | - */ | |
| 32 | - @Data | |
| 33 | - public static class Model { | |
| 34 | - | |
| 35 | - /** | |
| 36 | - * 属性列表 | |
| 37 | - */ | |
| 38 | - private List<ThingModelProperty> properties; | |
| 39 | - | |
| 40 | - /** | |
| 41 | - * 服务列表 | |
| 42 | - */ | |
| 43 | - private List<ThingModelService> services; | |
| 44 | - | |
| 45 | - /** | |
| 46 | - * 事件列表 | |
| 47 | - */ | |
| 48 | - private List<ThingModelEvent> events; | |
| 49 | - } | |
| 50 | -} |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/model/ThingModelService.java
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; |
| 6 | 6 | import jakarta.validation.constraints.NotNull; |
| 7 | 7 | import lombok.Data; |
| 8 | 8 | |
| 9 | -@Schema(description = "管理后台 - IoT 产品物模型List Request VO") | |
| 9 | +// TODO @puhui999:部分字段,可以用 cursor 加上 example | |
| 10 | +@Schema(description = "管理后台 - IoT 产品物模型 List Request VO") | |
| 10 | 11 | @Data |
| 11 | 12 | public class IotThingModelListReqVO { |
| 12 | 13 | |
| 14 | + @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 15 | + @NotNull(message = "产品编号不能为空") | |
| 16 | + private Long productId; | |
| 17 | + | |
| 13 | 18 | @Schema(description = "功能标识") |
| 14 | 19 | private String identifier; |
| 15 | 20 | |
| ... | ... | @@ -20,8 +25,4 @@ public class IotThingModelListReqVO { |
| 20 | 25 | @InEnum(IotThingModelTypeEnum.class) |
| 21 | 26 | private Integer type; |
| 22 | 27 | |
| 23 | - @Schema(description = "产品 ID", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 24 | - @NotNull(message = "产品 ID 不能为空") | |
| 25 | - private Long productId; | |
| 26 | - | |
| 27 | 28 | } | ... | ... |
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; |
| 9 | 9 | import lombok.EqualsAndHashCode; |
| 10 | 10 | import lombok.ToString; |
| 11 | 11 | |
| 12 | +// TODO @puhui999:部分字段,可以用 cursor 加上 example | |
| 12 | 13 | @Schema(description = "管理后台 - IoT 产品物模型分页 Request VO") |
| 13 | 14 | @Data |
| 14 | 15 | @EqualsAndHashCode(callSuper = true) |
| 15 | 16 | @ToString(callSuper = true) |
| 16 | 17 | public class IotThingModelPageReqVO extends PageParam { |
| 17 | 18 | |
| 19 | + @Schema(description = "产品编号", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 20 | + @NotNull(message = "产品编号不能为空") | |
| 21 | + private Long productId; | |
| 22 | + | |
| 18 | 23 | @Schema(description = "功能标识") |
| 19 | 24 | private String identifier; |
| 20 | 25 | |
| ... | ... | @@ -25,8 +30,4 @@ public class IotThingModelPageReqVO extends PageParam { |
| 25 | 30 | @InEnum(IotThingModelTypeEnum.class) |
| 26 | 31 | private Integer type; |
| 27 | 32 | |
| 28 | - @Schema(description = "产品ID", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 29 | - @NotNull(message = "产品ID不能为空") | |
| 30 | - private Long productId; | |
| 31 | - | |
| 32 | 33 | } |
| 33 | 34 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thingmodel/vo/IotThingModelRespVO.java
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; |
| 10 | 10 | import jakarta.validation.constraints.NotNull; |
| 11 | 11 | import lombok.Data; |
| 12 | 12 | |
| 13 | +// TODO @puhui999:部分字段,可以用 cursor 加上 example | |
| 13 | 14 | @Schema(description = "管理后台 - IoT 产品物模型新增/修改 Request VO") |
| 14 | 15 | @Data |
| 15 | 16 | public class IotThingModelSaveReqVO { | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thingmodel/IotThingModelService.java
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; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | 4 | import cn.hutool.core.util.ObjectUtil; |
| 5 | +import cn.hutool.core.util.StrUtil; | |
| 5 | 6 | import cn.hutool.extra.spring.SpringUtil; |
| 6 | 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | 8 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| ... | ... | @@ -54,29 +55,26 @@ public class IotThingModelServiceImpl implements IotThingModelService { |
| 54 | 55 | @Override |
| 55 | 56 | @Transactional(rollbackFor = Exception.class) |
| 56 | 57 | public Long createThingModel(IotThingModelSaveReqVO createReqVO) { |
| 57 | - // 1. 校验功能标识符在同一产品下是否唯一 | |
| 58 | + // 1.1 校验功能标识符在同一产品下是否唯一 | |
| 58 | 59 | validateIdentifierUnique(createReqVO.getProductId(), createReqVO.getIdentifier()); |
| 59 | - | |
| 60 | - // 2. 功能名称在同一产品下是否唯一 | |
| 60 | + // 1.2 功能名称在同一产品下是否唯一 | |
| 61 | 61 | validateNameUnique(createReqVO.getProductId(), createReqVO.getName()); |
| 62 | - | |
| 63 | - // 3. 系统保留字段,不能用于标识符定义 | |
| 62 | + // 1.3 系统保留字段,不能用于标识符定义 | |
| 64 | 63 | validateNotDefaultEventAndService(createReqVO.getIdentifier()); |
| 65 | - | |
| 66 | - // 4. 校验产品状态,发布状态下,不允许新增功能 | |
| 64 | + // 1.4 校验产品状态,发布状态下,不允许新增功能 | |
| 67 | 65 | validateProductStatus(createReqVO.getProductId()); |
| 68 | 66 | |
| 69 | - // 5. 插入数据库 | |
| 67 | + // 2. 插入数据库 | |
| 70 | 68 | IotThingModelDO thingModel = IotThingModelConvert.INSTANCE.convert(createReqVO); |
| 71 | 69 | thingModelMapper.insert(thingModel); |
| 72 | 70 | |
| 73 | - // 6. 如果创建的是属性,需要更新默认的事件和服务 | |
| 71 | + // 3. 如果创建的是属性,需要更新默认的事件和服务 | |
| 74 | 72 | if (Objects.equals(createReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { |
| 75 | 73 | createDefaultEventsAndServices(createReqVO.getProductId(), createReqVO.getProductKey()); |
| 76 | 74 | } |
| 77 | 75 | // TODO @puhui999: 服务和事件的情况 method 怎么设置?在前端设置还是后端设置? |
| 78 | 76 | |
| 79 | - // 7. 删除缓存 | |
| 77 | + // 4. 删除缓存 | |
| 80 | 78 | deleteThingModelListCache(createReqVO.getProductKey()); |
| 81 | 79 | return thingModel.getId(); |
| 82 | 80 | } |
| ... | ... | @@ -84,38 +82,35 @@ public class IotThingModelServiceImpl implements IotThingModelService { |
| 84 | 82 | @Override |
| 85 | 83 | @Transactional(rollbackFor = Exception.class) |
| 86 | 84 | public void updateThingModel(IotThingModelSaveReqVO updateReqVO) { |
| 87 | - // 1. 校验功能是否存在 | |
| 85 | + // 1.1 校验功能是否存在 | |
| 88 | 86 | validateProductThingModelMapperExists(updateReqVO.getId()); |
| 89 | - | |
| 90 | - // 2. 校验功能标识符是否唯一 | |
| 87 | + // 1.2 校验功能标识符是否唯一 | |
| 91 | 88 | validateIdentifierUniqueForUpdate(updateReqVO.getId(), updateReqVO.getProductId(), updateReqVO.getIdentifier()); |
| 92 | - | |
| 93 | - // 3. 校验产品状态,发布状态下,不允许操作功能 | |
| 89 | + // 1.3 校验产品状态,发布状态下,不允许操作功能 | |
| 94 | 90 | validateProductStatus(updateReqVO.getProductId()); |
| 95 | 91 | |
| 96 | - // 4. 更新数据库 | |
| 92 | + // 2. 更新数据库 | |
| 97 | 93 | IotThingModelDO thingModel = IotThingModelConvert.INSTANCE.convert(updateReqVO); |
| 98 | 94 | thingModelMapper.updateById(thingModel); |
| 99 | 95 | |
| 100 | - // 5. 如果更新的是属性,需要更新默认的事件和服务 | |
| 96 | + // 3. 如果更新的是属性,需要更新默认的事件和服务 | |
| 101 | 97 | if (Objects.equals(updateReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { |
| 102 | 98 | createDefaultEventsAndServices(updateReqVO.getProductId(), updateReqVO.getProductKey()); |
| 103 | 99 | } |
| 104 | 100 | |
| 105 | - // 6. 删除缓存 | |
| 101 | + // 4. 删除缓存 | |
| 106 | 102 | deleteThingModelListCache(updateReqVO.getProductKey()); |
| 107 | 103 | } |
| 108 | 104 | |
| 109 | 105 | @Override |
| 110 | 106 | @Transactional(rollbackFor = Exception.class) |
| 111 | 107 | public void deleteThingModel(Long id) { |
| 112 | - // 1. 校验功能是否存在 | |
| 108 | + // 1.1 校验功能是否存在 | |
| 113 | 109 | IotThingModelDO thingModel = thingModelMapper.selectById(id); |
| 114 | 110 | if (thingModel == null) { |
| 115 | 111 | throw exception(THING_MODEL_NOT_EXISTS); |
| 116 | 112 | } |
| 117 | - | |
| 118 | - // 3. 校验产品状态,发布状态下,不允许操作功能 | |
| 113 | + // 1.2 校验产品状态,发布状态下,不允许操作功能 | |
| 119 | 114 | validateProductStatus(thingModel.getProductId()); |
| 120 | 115 | |
| 121 | 116 | // 2. 删除功能 |
| ... | ... | @@ -168,6 +163,7 @@ public class IotThingModelServiceImpl implements IotThingModelService { |
| 168 | 163 | } |
| 169 | 164 | } |
| 170 | 165 | |
| 166 | + // TODO @puhui999:这个方法,和 validateIdentifierUnique 可以融合下 | |
| 171 | 167 | private void validateIdentifierUniqueForUpdate(Long id, Long productId, String identifier) { |
| 172 | 168 | IotThingModelDO thingModel = thingModelMapper.selectByProductIdAndIdentifier(productId, identifier); |
| 173 | 169 | if (thingModel != null && ObjectUtil.notEqual(thingModel.getId(), id)) { |
| ... | ... | @@ -176,15 +172,16 @@ public class IotThingModelServiceImpl implements IotThingModelService { |
| 176 | 172 | } |
| 177 | 173 | |
| 178 | 174 | private void validateProductStatus(Long createReqVO) { |
| 179 | - IotProductDO product = productService.getProduct(createReqVO); | |
| 175 | + IotProductDO product = productService.validateProductExists(createReqVO); | |
| 180 | 176 | if (Objects.equals(product.getStatus(), IotProductStatusEnum.PUBLISHED.getStatus())) { |
| 181 | 177 | throw exception(PRODUCT_STATUS_NOT_ALLOW_THING_MODEL); |
| 182 | 178 | } |
| 183 | 179 | } |
| 184 | 180 | |
| 181 | + // TODO @芋艿:在 review 下 | |
| 185 | 182 | private void validateNotDefaultEventAndService(String identifier) { |
| 186 | - // set, get, post, property, event, time, value 是系统保留字段,不能用于标识符定义 | |
| 187 | - if (CollUtil.containsAny(Arrays.asList("set", "get", "post", "property", "event", "time", "value"), Collections.singletonList(identifier))) { | |
| 183 | + // 系统保留字段,不能用于标识符定义 | |
| 184 | + if (StrUtil.equalsAny(identifier, "set", "get", "post", "property", "event", "time", "value")) { | |
| 188 | 185 | throw exception(THING_MODEL_IDENTIFIER_INVALID); |
| 189 | 186 | } |
| 190 | 187 | } |
| ... | ... | @@ -205,6 +202,9 @@ public class IotThingModelServiceImpl implements IotThingModelService { |
| 205 | 202 | |
| 206 | 203 | /** |
| 207 | 204 | * 创建默认的事件和服务 |
| 205 | + * | |
| 206 | + * @param productId 产品编号 | |
| 207 | + * @param productKey 产品标识 | |
| 208 | 208 | */ |
| 209 | 209 | public void createDefaultEventsAndServices(Long productId, String productKey) { |
| 210 | 210 | // 1. 获取当前属性列表 | ... | ... |