Commit d8d37d1bb94b5d141fdfc91a5a6dc8d293807d55
1 parent
9658ed1a
【功能优化】IOT 物模型接口
Showing
2 changed files
with
59 additions
and
44 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodelfunction/IotThinkModelFunctionController.http
| @@ -19,8 +19,8 @@ Authorization: Bearer {{token}} | @@ -19,8 +19,8 @@ Authorization: Bearer {{token}} | ||
| 19 | "dataType": { | 19 | "dataType": { |
| 20 | "type": "float", | 20 | "type": "float", |
| 21 | "specs": { | 21 | "specs": { |
| 22 | - "min": -40.0, | ||
| 23 | - "max": 125.0, | 22 | + "min": -10.0, |
| 23 | + "max": 100.0, | ||
| 24 | "step": 0.1, | 24 | "step": 0.1, |
| 25 | "unit": "℃" | 25 | "unit": "℃" |
| 26 | } | 26 | } |
| @@ -29,6 +29,39 @@ Authorization: Bearer {{token}} | @@ -29,6 +29,39 @@ Authorization: Bearer {{token}} | ||
| 29 | } | 29 | } |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | +### 请求 /iot/think-model-function/create 接口 => 成功 | ||
| 33 | +POST {{baseUrl}}/iot/think-model-function/create | ||
| 34 | +Content-Type: application/json | ||
| 35 | +tenant-id: {{adminTenentId}} | ||
| 36 | +Authorization: Bearer {{token}} | ||
| 37 | + | ||
| 38 | +{ | ||
| 39 | + "productId": 1001, | ||
| 40 | + "productKey": "smart-sensor-001", | ||
| 41 | + "identifier": "Humidity", | ||
| 42 | + "name": "湿度", | ||
| 43 | + "description": "当前湿度值", | ||
| 44 | + "type": 1, | ||
| 45 | + "property": { | ||
| 46 | + "identifier": "Humidity", | ||
| 47 | + "name": "湿度", | ||
| 48 | + "accessMode": "r", | ||
| 49 | + "required": true, | ||
| 50 | + "dataType": { | ||
| 51 | + "type": "float", | ||
| 52 | + "specs": { | ||
| 53 | + "min": 0.0, | ||
| 54 | + "max": 100.0, | ||
| 55 | + "step": 0.1, | ||
| 56 | + "unit": "%" | ||
| 57 | + } | ||
| 58 | + }, | ||
| 59 | + "description": "当前湿度值" | ||
| 60 | + } | ||
| 61 | +} | ||
| 62 | + | ||
| 63 | + | ||
| 64 | + | ||
| 32 | 65 | ||
| 33 | ### 请求 /iot/think-model-function/update 接口 => 成功 | 66 | ### 请求 /iot/think-model-function/update 接口 => 成功 |
| 34 | PUT {{baseUrl}}/iot/think-model-function/update | 67 | PUT {{baseUrl}}/iot/think-model-function/update |
| @@ -37,7 +70,7 @@ tenant-id: {{adminTenentId}} | @@ -37,7 +70,7 @@ tenant-id: {{adminTenentId}} | ||
| 37 | Authorization: Bearer {{token}} | 70 | Authorization: Bearer {{token}} |
| 38 | 71 | ||
| 39 | { | 72 | { |
| 40 | - "id": 1, | 73 | + "id": 11, |
| 41 | "productId": 1001, | 74 | "productId": 1001, |
| 42 | "productKey": "smart-sensor-001", | 75 | "productKey": "smart-sensor-001", |
| 43 | "identifier": "Temperature", | 76 | "identifier": "Temperature", |
| @@ -52,8 +85,8 @@ Authorization: Bearer {{token}} | @@ -52,8 +85,8 @@ Authorization: Bearer {{token}} | ||
| 52 | "dataType": { | 85 | "dataType": { |
| 53 | "type": "float", | 86 | "type": "float", |
| 54 | "specs": { | 87 | "specs": { |
| 55 | - "min": -10.0, | ||
| 56 | - "max": 100.0, | 88 | + "min": -111.0, |
| 89 | + "max": 222.0, | ||
| 57 | "step": 0.1, | 90 | "step": 0.1, |
| 58 | "unit": "℃" | 91 | "unit": "℃" |
| 59 | } | 92 | } |
| @@ -63,12 +96,12 @@ Authorization: Bearer {{token}} | @@ -63,12 +96,12 @@ Authorization: Bearer {{token}} | ||
| 63 | } | 96 | } |
| 64 | 97 | ||
| 65 | ### 请求 /iot/think-model-function/delete 接口 => 成功 | 98 | ### 请求 /iot/think-model-function/delete 接口 => 成功 |
| 66 | -DELETE {{baseUrl}}/iot/think-model-function/delete?id=1 | 99 | +DELETE {{baseUrl}}/iot/think-model-function/delete?id=7 |
| 67 | tenant-id: {{adminTenentId}} | 100 | tenant-id: {{adminTenentId}} |
| 68 | Authorization: Bearer {{token}} | 101 | Authorization: Bearer {{token}} |
| 69 | 102 | ||
| 70 | ### 请求 /iot/think-model-function/get 接口 => 成功 | 103 | ### 请求 /iot/think-model-function/get 接口 => 成功 |
| 71 | -GET {{baseUrl}}/iot/think-model-function/get?id=4 | 104 | +GET {{baseUrl}}/iot/think-model-function/get?id=10 |
| 72 | tenant-id: {{adminTenentId}} | 105 | tenant-id: {{adminTenentId}} |
| 73 | Authorization: Bearer {{token}} | 106 | Authorization: Bearer {{token}} |
| 74 | 107 |
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; | @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.iot.service.thinkmodelfunction; | ||
| 2 | 2 | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.util.ObjectUtil; | 4 | import cn.hutool.core.util.ObjectUtil; |
| 5 | +import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | ||
| 6 | +import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | ||
| 5 | import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelEvent; | 7 | import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelEvent; |
| 6 | import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelProperty; | 8 | import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelProperty; |
| 7 | import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelService; | 9 | import cn.iocoder.yudao.module.iot.controller.admin.thinkmodelfunction.thingModel.ThingModelService; |
| @@ -22,7 +24,6 @@ import org.springframework.transaction.annotation.Transactional; | @@ -22,7 +24,6 @@ import org.springframework.transaction.annotation.Transactional; | ||
| 22 | import org.springframework.validation.annotation.Validated; | 24 | import org.springframework.validation.annotation.Validated; |
| 23 | 25 | ||
| 24 | import java.util.*; | 26 | import java.util.*; |
| 25 | -import java.util.stream.Collectors; | ||
| 26 | 27 | ||
| 27 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | 28 | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; |
| 28 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList; | 29 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList; |
| @@ -54,12 +55,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | @@ -54,12 +55,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | ||
| 54 | 55 | ||
| 55 | // 3. 如果创建的是属性,需要更新默认的事件和服务 | 56 | // 3. 如果创建的是属性,需要更新默认的事件和服务 |
| 56 | if (Objects.equals(createReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { | 57 | if (Objects.equals(createReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { |
| 57 | - // 获取当前属性列表,并添加新插入的属性 | ||
| 58 | - // TODO @haohao:是不是插入后,查询已经包含了 function | ||
| 59 | - List<IotThinkModelFunctionDO> propertyList = thinkModelFunctionMapper | ||
| 60 | - .selectListByProductIdAndType(createReqVO.getProductId(), IotThingModelTypeEnum.PROPERTY.getType()); | ||
| 61 | - propertyList.add(function); | ||
| 62 | - createDefaultEventsAndServices(createReqVO.getProductId(), createReqVO.getProductKey(), propertyList); | 58 | + createDefaultEventsAndServices(createReqVO.getProductId(), createReqVO.getProductKey()); |
| 63 | } | 59 | } |
| 64 | return function.getId(); | 60 | return function.getId(); |
| 65 | } | 61 | } |
| @@ -76,6 +72,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | @@ -76,6 +72,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | ||
| 76 | public void updateThinkModelFunction(IotThinkModelFunctionSaveReqVO updateReqVO) { | 72 | public void updateThinkModelFunction(IotThinkModelFunctionSaveReqVO updateReqVO) { |
| 77 | // 1. 校验功能是否存在 | 73 | // 1. 校验功能是否存在 |
| 78 | validateThinkModelFunctionExists(updateReqVO.getId()); | 74 | validateThinkModelFunctionExists(updateReqVO.getId()); |
| 75 | + | ||
| 79 | // 2. 校验功能标识符是否唯一 | 76 | // 2. 校验功能标识符是否唯一 |
| 80 | validateIdentifierUniqueForUpdate(updateReqVO.getId(), updateReqVO.getProductId(), updateReqVO.getIdentifier()); | 77 | validateIdentifierUniqueForUpdate(updateReqVO.getId(), updateReqVO.getProductId(), updateReqVO.getIdentifier()); |
| 81 | 78 | ||
| @@ -85,17 +82,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | @@ -85,17 +82,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | ||
| 85 | 82 | ||
| 86 | // 4. 如果更新的是属性,需要更新默认的事件和服务 | 83 | // 4. 如果更新的是属性,需要更新默认的事件和服务 |
| 87 | if (Objects.equals(updateReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { | 84 | if (Objects.equals(updateReqVO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { |
| 88 | - // 获取当前属性列表,更新其中的属性 | ||
| 89 | - // TODO @haohao:是不是更新后,查询出来的,已经是最新的 thinkModelFunction | ||
| 90 | - List<IotThinkModelFunctionDO> propertyList = thinkModelFunctionMapper | ||
| 91 | - .selectListByProductIdAndType(updateReqVO.getProductId(), IotThingModelTypeEnum.PROPERTY.getType()); | ||
| 92 | - for (int i = 0; i < propertyList.size(); i++) { | ||
| 93 | - if (propertyList.get(i).getId().equals(thinkModelFunction.getId())) { | ||
| 94 | - propertyList.set(i, thinkModelFunction); | ||
| 95 | - break; | ||
| 96 | - } | ||
| 97 | - } | ||
| 98 | - createDefaultEventsAndServices(updateReqVO.getProductId(), updateReqVO.getProductKey(), propertyList); | 85 | + createDefaultEventsAndServices(updateReqVO.getProductId(), updateReqVO.getProductKey()); |
| 99 | } | 86 | } |
| 100 | } | 87 | } |
| 101 | 88 | ||
| @@ -120,12 +107,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | @@ -120,12 +107,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | ||
| 120 | 107 | ||
| 121 | // 3. 如果删除的是属性,需要更新默认的事件和服务 | 108 | // 3. 如果删除的是属性,需要更新默认的事件和服务 |
| 122 | if (Objects.equals(functionDO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { | 109 | if (Objects.equals(functionDO.getType(), IotThingModelTypeEnum.PROPERTY.getType())) { |
| 123 | - // 获取当前属性列表,移除已删除的属性 | ||
| 124 | - // TODO @haohao:是不是删除后,已经没有 id 对应的记录啦? | ||
| 125 | - List<IotThinkModelFunctionDO> propertyList = thinkModelFunctionMapper | ||
| 126 | - .selectListByProductIdAndType(functionDO.getProductId(), IotThingModelTypeEnum.PROPERTY.getType()); | ||
| 127 | - propertyList.removeIf(property -> property.getId().equals(id)); | ||
| 128 | - createDefaultEventsAndServices(functionDO.getProductId(), functionDO.getProductKey(), propertyList); | 110 | + createDefaultEventsAndServices(functionDO.getProductId(), functionDO.getProductKey()); |
| 129 | } | 111 | } |
| 130 | } | 112 | } |
| 131 | 113 | ||
| @@ -153,8 +135,12 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | @@ -153,8 +135,12 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | ||
| 153 | /** | 135 | /** |
| 154 | * 创建默认的事件和服务 | 136 | * 创建默认的事件和服务 |
| 155 | */ | 137 | */ |
| 156 | - public void createDefaultEventsAndServices(Long productId, String productKey, List<IotThinkModelFunctionDO> propertyList) { | ||
| 157 | - // 1. 生成新的事件和服务列表 | 138 | + public void createDefaultEventsAndServices(Long productId, String productKey) { |
| 139 | + // 1. 获取当前属性列表 | ||
| 140 | + List<IotThinkModelFunctionDO> propertyList = thinkModelFunctionMapper | ||
| 141 | + .selectListByProductIdAndType(productId, IotThingModelTypeEnum.PROPERTY.getType()); | ||
| 142 | + | ||
| 143 | + // 2. 生成新的事件和服务列表 | ||
| 158 | List<IotThinkModelFunctionDO> newFunctionList = new ArrayList<>(); | 144 | List<IotThinkModelFunctionDO> newFunctionList = new ArrayList<>(); |
| 159 | // 生成属性上报事件 | 145 | // 生成属性上报事件 |
| 160 | ThingModelEvent propertyPostEvent = generatePropertyPostEvent(propertyList); | 146 | ThingModelEvent propertyPostEvent = generatePropertyPostEvent(propertyList); |
| @@ -175,7 +161,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | @@ -175,7 +161,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | ||
| 175 | newFunctionList.add(getServiceFunction); | 161 | newFunctionList.add(getServiceFunction); |
| 176 | } | 162 | } |
| 177 | 163 | ||
| 178 | - // 2. 获取数据库中的默认的旧事件和服务列表 | 164 | + // 3. 获取数据库中的默认的旧事件和服务列表 |
| 179 | List<IotThinkModelFunctionDO> oldFunctionList = thinkModelFunctionMapper.selectListByProductIdAndIdentifiersAndTypes( | 165 | List<IotThinkModelFunctionDO> oldFunctionList = thinkModelFunctionMapper.selectListByProductIdAndIdentifiersAndTypes( |
| 180 | productId, | 166 | productId, |
| 181 | Arrays.asList("post", "set", "get"), | 167 | Arrays.asList("post", "set", "get"), |
| @@ -185,6 +171,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | @@ -185,6 +171,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | ||
| 185 | // 3.1 使用 diffList 方法比较新旧列表 | 171 | // 3.1 使用 diffList 方法比较新旧列表 |
| 186 | List<List<IotThinkModelFunctionDO>> diffResult = diffList(oldFunctionList, newFunctionList, | 172 | List<List<IotThinkModelFunctionDO>> diffResult = diffList(oldFunctionList, newFunctionList, |
| 187 | // TODO @haohao:是不是用 id 比较相同就 ok 哈。如果可以的化,下面的 update 可以更简单 | 173 | // TODO @haohao:是不是用 id 比较相同就 ok 哈。如果可以的化,下面的 update 可以更简单 |
| 174 | + // 继续使用 identifier 和 type 进行比较:这样可以准确地匹配对应的功能对象。 | ||
| 188 | (oldFunc, newFunc) -> Objects.equals(oldFunc.getIdentifier(), newFunc.getIdentifier()) | 175 | (oldFunc, newFunc) -> Objects.equals(oldFunc.getIdentifier(), newFunc.getIdentifier()) |
| 189 | && Objects.equals(oldFunc.getType(), newFunc.getType())); | 176 | && Objects.equals(oldFunc.getType(), newFunc.getType())); |
| 190 | List<IotThinkModelFunctionDO> createList = diffResult.get(0); // 需要新增的 | 177 | List<IotThinkModelFunctionDO> createList = diffResult.get(0); // 需要新增的 |
| @@ -206,8 +193,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | @@ -206,8 +193,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | ||
| 206 | } | 193 | } |
| 207 | } | 194 | } |
| 208 | if (CollUtil.isNotEmpty(deleteList)) { | 195 | if (CollUtil.isNotEmpty(deleteList)) { |
| 209 | - // TODO @haohao:使用 convertSet 简化。 | ||
| 210 | - List<Long> idsToDelete = deleteList.stream().map(IotThinkModelFunctionDO::getId).collect(Collectors.toList()); | 196 | + Set<Long> idsToDelete = CollectionUtils.convertSet(deleteList, IotThinkModelFunctionDO::getId); |
| 211 | thinkModelFunctionMapper.deleteByIds(idsToDelete); | 197 | thinkModelFunctionMapper.deleteByIds(idsToDelete); |
| 212 | } | 198 | } |
| 213 | } | 199 | } |
| @@ -217,11 +203,8 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | @@ -217,11 +203,8 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | ||
| 217 | */ | 203 | */ |
| 218 | private IotThinkModelFunctionDO findFunctionByIdentifierAndType(List<IotThinkModelFunctionDO> functionList, | 204 | private IotThinkModelFunctionDO findFunctionByIdentifierAndType(List<IotThinkModelFunctionDO> functionList, |
| 219 | String identifier, Integer type) { | 205 | String identifier, Integer type) { |
| 220 | - // TODO @haohao:这个可以使用 CollUtil.findOne 简化只有一行 | ||
| 221 | - return functionList.stream() | ||
| 222 | - .filter(func -> Objects.equals(func.getIdentifier(), identifier) && Objects.equals(func.getType(), type)) | ||
| 223 | - .findFirst() | ||
| 224 | - .orElse(null); | 206 | + return CollUtil.findOne(functionList, func -> |
| 207 | + Objects.equals(func.getIdentifier(), identifier) && Objects.equals(func.getType(), type)); | ||
| 225 | } | 208 | } |
| 226 | 209 | ||
| 227 | /** | 210 | /** |
| @@ -332,9 +315,8 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | @@ -332,9 +315,8 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe | ||
| 332 | List<ThingModelArgument> outputData = new ArrayList<>(); | 315 | List<ThingModelArgument> outputData = new ArrayList<>(); |
| 333 | for (IotThinkModelFunctionDO functionDO : propertyList) { | 316 | for (IotThinkModelFunctionDO functionDO : propertyList) { |
| 334 | ThingModelProperty property = functionDO.getProperty(); | 317 | ThingModelProperty property = functionDO.getProperty(); |
| 335 | - // TODO @haohao:ObjectUtils.equalsAny(),进一步简化判断 | ||
| 336 | - if (IotAccessModeEnum.READ.getMode().equals(property.getAccessMode()) | ||
| 337 | - || IotAccessModeEnum.READ_WRITE.getMode().equals(property.getAccessMode())) { | 318 | + if (ObjectUtils.equalsAny(property.getAccessMode(), |
| 319 | + IotAccessModeEnum.READ.getMode(), IotAccessModeEnum.READ_WRITE.getMode())) { | ||
| 338 | ThingModelArgument arg = new ThingModelArgument() | 320 | ThingModelArgument arg = new ThingModelArgument() |
| 339 | .setIdentifier(property.getIdentifier()) | 321 | .setIdentifier(property.getIdentifier()) |
| 340 | .setName(property.getName()) | 322 | .setName(property.getName()) |