mirror of
				https://gitee.com/hhyykk/ipms-sjy.git
				synced 2025-11-04 12:18:42 +08:00 
			
		
		
		
	【功能优化】IOT 物模型接口
This commit is contained in:
		@@ -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}}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -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<IotThinkModelFunctionDO> 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<IotThinkModelFunctionDO> 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<IotThinkModelFunctionDO> 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<IotThinkModelFunctionDO> propertyList) {
 | 
			
		||||
        // 1. 生成新的事件和服务列表
 | 
			
		||||
    public void createDefaultEventsAndServices(Long productId, String productKey) {
 | 
			
		||||
        // 1. 获取当前属性列表
 | 
			
		||||
        List<IotThinkModelFunctionDO> propertyList = thinkModelFunctionMapper
 | 
			
		||||
                .selectListByProductIdAndType(productId, IotThingModelTypeEnum.PROPERTY.getType());
 | 
			
		||||
 | 
			
		||||
        // 2. 生成新的事件和服务列表
 | 
			
		||||
        List<IotThinkModelFunctionDO> newFunctionList = new ArrayList<>();
 | 
			
		||||
        // 生成属性上报事件
 | 
			
		||||
        ThingModelEvent propertyPostEvent = generatePropertyPostEvent(propertyList);
 | 
			
		||||
@@ -175,7 +161,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe
 | 
			
		||||
            newFunctionList.add(getServiceFunction);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // 2. 获取数据库中的默认的旧事件和服务列表
 | 
			
		||||
        // 3. 获取数据库中的默认的旧事件和服务列表
 | 
			
		||||
        List<IotThinkModelFunctionDO> oldFunctionList = thinkModelFunctionMapper.selectListByProductIdAndIdentifiersAndTypes(
 | 
			
		||||
                productId,
 | 
			
		||||
                Arrays.asList("post", "set", "get"),
 | 
			
		||||
@@ -185,6 +171,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe
 | 
			
		||||
        // 3.1 使用 diffList 方法比较新旧列表
 | 
			
		||||
        List<List<IotThinkModelFunctionDO>> 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<IotThinkModelFunctionDO> createList = diffResult.get(0); // 需要新增的
 | 
			
		||||
@@ -206,8 +193,7 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        if (CollUtil.isNotEmpty(deleteList)) {
 | 
			
		||||
            // TODO @haohao:使用 convertSet 简化。
 | 
			
		||||
            List<Long> idsToDelete = deleteList.stream().map(IotThinkModelFunctionDO::getId).collect(Collectors.toList());
 | 
			
		||||
            Set<Long> idsToDelete = CollectionUtils.convertSet(deleteList, IotThinkModelFunctionDO::getId);
 | 
			
		||||
            thinkModelFunctionMapper.deleteByIds(idsToDelete);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
@@ -217,11 +203,8 @@ public class IotThinkModelFunctionServiceImpl implements IotThinkModelFunctionSe
 | 
			
		||||
     */
 | 
			
		||||
    private IotThinkModelFunctionDO findFunctionByIdentifierAndType(List<IotThinkModelFunctionDO> 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<ThingModelArgument> 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())
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user