From d8d37d1bb94b5d141fdfc91a5a6dc8d293807d55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=89=E6=B5=A9=E6=B5=A9?= <1036606149@qq.com> Date: Wed, 18 Sep 2024 08:22:33 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E3=80=91IOT=20=E7=89=A9=E6=A8=A1=E5=9E=8B=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IotThinkModelFunctionController.http | 103 ++++++++++++------ .../IotThinkModelFunctionServiceImpl.java | 56 ++++------ 2 files changed, 87 insertions(+), 72 deletions(-) diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodelfunction/IotThinkModelFunctionController.http b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodelfunction/IotThinkModelFunctionController.http index 6b9032fc6..56464dd80 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodelfunction/IotThinkModelFunctionController.http +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodelfunction/IotThinkModelFunctionController.http @@ -5,39 +5,6 @@ tenant-id: {{adminTenentId}} Authorization: Bearer {{token}} { - "productId": 1001, - "productKey": "smart-sensor-001", - "identifier": "Temperature", - "name": "温度", - "description": "当前温度值", - "type": 1, - "property": { - "identifier": "Temperature", - "name": "温度", - "accessMode": "r", - "required": true, - "dataType": { - "type": "float", - "specs": { - "min": -40.0, - "max": 125.0, - "step": 0.1, - "unit": "℃" - } - }, - "description": "当前温度值" - } -} - - -### 请求 /iot/think-model-function/update 接口 => 成功 -PUT {{baseUrl}}/iot/think-model-function/update -Content-Type: application/json -tenant-id: {{adminTenentId}} -Authorization: Bearer {{token}} - -{ - "id": 1, "productId": 1001, "productKey": "smart-sensor-001", "identifier": "Temperature", @@ -62,13 +29,79 @@ Authorization: Bearer {{token}} } } +### 请求 /iot/think-model-function/create 接口 => 成功 +POST {{baseUrl}}/iot/think-model-function/create +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} + +{ + "productId": 1001, + "productKey": "smart-sensor-001", + "identifier": "Humidity", + "name": "湿度", + "description": "当前湿度值", + "type": 1, + "property": { + "identifier": "Humidity", + "name": "湿度", + "accessMode": "r", + "required": true, + "dataType": { + "type": "float", + "specs": { + "min": 0.0, + "max": 100.0, + "step": 0.1, + "unit": "%" + } + }, + "description": "当前湿度值" + } +} + + + + +### 请求 /iot/think-model-function/update 接口 => 成功 +PUT {{baseUrl}}/iot/think-model-function/update +Content-Type: application/json +tenant-id: {{adminTenentId}} +Authorization: Bearer {{token}} + +{ + "id": 11, + "productId": 1001, + "productKey": "smart-sensor-001", + "identifier": "Temperature", + "name": "温度", + "description": "当前温度值", + "type": 1, + "property": { + "identifier": "Temperature", + "name": "温度", + "accessMode": "r", + "required": true, + "dataType": { + "type": "float", + "specs": { + "min": -111.0, + "max": 222.0, + "step": 0.1, + "unit": "℃" + } + }, + "description": "当前温度值" + } +} + ### 请求 /iot/think-model-function/delete 接口 => 成功 -DELETE {{baseUrl}}/iot/think-model-function/delete?id=1 +DELETE {{baseUrl}}/iot/think-model-function/delete?id=7 tenant-id: {{adminTenentId}} Authorization: Bearer {{token}} ### 请求 /iot/think-model-function/get 接口 => 成功 -GET {{baseUrl}}/iot/think-model-function/get?id=4 +GET {{baseUrl}}/iot/think-model-function/get?id=10 tenant-id: {{adminTenentId}} Authorization: Bearer {{token}} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thinkmodelfunction/IotThinkModelFunctionServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thinkmodelfunction/IotThinkModelFunctionServiceImpl.java index 0edb96db2..9dc803e66 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thinkmodelfunction/IotThinkModelFunctionServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thinkmodelfunction/IotThinkModelFunctionServiceImpl.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.iot.service.thinkmodelfunction; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelEvent; import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelProperty; import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelService; @@ -22,7 +24,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.util.*; -import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList; @@ -54,12 +55,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe // 3. 如果创建的是属性,需要更新默认的事件和服务 if (Objects.equals(createReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { - // 获取当前属性列表,并添加新插入的属性 - // TODO @haohao:是不是插入后,查询已经包含了 function - List propertyList = thinkModelFunctionMapper - .selectListByProductIdAndType(createReqVO.getProductId(), IotThingModelTypeEnum.PROPERTY.getType()); - propertyList.add(function); - createDefaultEventsAndServices(createReqVO.getProductId(), createReqVO.getProductKey(), propertyList); + createDefaultEventsAndServices(createReqVO.getProductId(), createReqVO.getProductKey()); } return function.getId(); } @@ -76,6 +72,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe public void updateThinkModelFunction(IotThinkModelFunctionSaveReqVO updateReqVO) { // 1. 校验功能是否存在 validateThinkModelFunctionExists(updateReqVO.getId()); + // 2. 校验功能标识符是否唯一 validateIdentifierUniqueForUpdate(updateReqVO.getId(), updateReqVO.getProductId(), updateReqVO.getIdentifier()); @@ -85,17 +82,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe // 4. 如果更新的是属性,需要更新默认的事件和服务 if (Objects.equals(updateReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { - // 获取当前属性列表,更新其中的属性 - // TODO @haohao:是不是更新后,查询出来的,已经是最新的 thinkModelFunction - List propertyList = thinkModelFunctionMapper - .selectListByProductIdAndType(updateReqVO.getProductId(), IotThingModelTypeEnum.PROPERTY.getType()); - for (int i = 0; i < propertyList.size(); i++) { - if (propertyList.get(i).getId().equals(thinkModelFunction.getId())) { - propertyList.set(i, thinkModelFunction); - break; - } - } - createDefaultEventsAndServices(updateReqVO.getProductId(), updateReqVO.getProductKey(), propertyList); + createDefaultEventsAndServices(updateReqVO.getProductId(), updateReqVO.getProductKey()); } } @@ -120,12 +107,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe // 3. 如果删除的是属性,需要更新默认的事件和服务 if (Objects.equals(functionDO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { - // 获取当前属性列表,移除已删除的属性 - // TODO @haohao:是不是删除后,已经没有 id 对应的记录啦? - List propertyList = thinkModelFunctionMapper - .selectListByProductIdAndType(functionDO.getProductId(), IotThingModelTypeEnum.PROPERTY.getType()); - propertyList.removeIf(property -> property.getId().equals(id)); - createDefaultEventsAndServices(functionDO.getProductId(), functionDO.getProductKey(), propertyList); + createDefaultEventsAndServices(functionDO.getProductId(), functionDO.getProductKey()); } } @@ -153,8 +135,12 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe /** * 创建默认的事件和服务 */ - public void createDefaultEventsAndServices(Long productId, String productKey, List propertyList) { - // 1. 生成新的事件和服务列表 + public void createDefaultEventsAndServices(Long productId, String productKey) { + // 1. 获取当前属性列表 + List propertyList = thinkModelFunctionMapper + .selectListByProductIdAndType(productId, IotThingModelTypeEnum.PROPERTY.getType()); + + // 2. 生成新的事件和服务列表 List newFunctionList = new ArrayList<>(); // 生成属性上报事件 ThingModelEvent propertyPostEvent = generatePropertyPostEvent(propertyList); @@ -175,7 +161,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe newFunctionList.add(getServiceFunction); } - // 2. 获取数据库中的默认的旧事件和服务列表 + // 3. 获取数据库中的默认的旧事件和服务列表 List oldFunctionList = thinkModelFunctionMapper.selectListByProductIdAndIdentifiersAndTypes( productId, Arrays.asList("post", "set", "get"), @@ -185,6 +171,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe // 3.1 使用 diffList 方法比较新旧列表 List> diffResult = diffList(oldFunctionList, newFunctionList, // TODO @haohao:是不是用 id 比较相同就 ok 哈。如果可以的化,下面的 update 可以更简单 + // 继续使用 identifier 和 type 进行比较:这样可以准确地匹配对应的功能对象。 (oldFunc, newFunc) -> Objects.equals(oldFunc.getIdentifier(), newFunc.getIdentifier()) && Objects.equals(oldFunc.getType(), newFunc.getType())); List createList = diffResult.get(0); // 需要新增的 @@ -206,8 +193,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe } } if (CollUtil.isNotEmpty(deleteList)) { - // TODO @haohao:使用 convertSet 简化。 - List idsToDelete = deleteList.stream().map(IotThinkModelFunctionDO::getId).collect(Collectors.toList()); + Set idsToDelete = CollectionUtils.convertSet(deleteList, IotThinkModelFunctionDO::getId); thinkModelFunctionMapper.deleteByIds(idsToDelete); } } @@ -217,11 +203,8 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe */ private IotThinkModelFunctionDO findFunctionByIdentifierAndType(List functionList, String identifier, Integer type) { - // TODO @haohao:这个可以使用 CollUtil.findOne 简化只有一行 - return functionList.stream() - .filter(func -> Objects.equals(func.getIdentifier(), identifier) && Objects.equals(func.getType(), type)) - .findFirst() - .orElse(null); + return CollUtil.findOne(functionList, func -> + Objects.equals(func.getIdentifier(), identifier) && Objects.equals(func.getType(), type)); } /** @@ -332,9 +315,8 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe List outputData = new ArrayList<>(); for (IotThinkModelFunctionDO functionDO : propertyList) { ThingModelProperty property = functionDO.getProperty(); - // TODO @haohao:ObjectUtils.equalsAny(),进一步简化判断 - if (IotAccessModeEnum.READ.getMode().equals(property.getAccessMode()) - || IotAccessModeEnum.READ_WRITE.getMode().equals(property.getAccessMode())) { + if (ObjectUtils.equalsAny(property.getAccessMode(), + IotAccessModeEnum.READ.getMode(), IotAccessModeEnum.READ_WRITE.getMode())) { ThingModelArgument arg = new ThingModelArgument() .setIdentifier(property.getIdentifier()) .setName(property.getName())