diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodel/model/dataType/ThinkModelArgument.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodel/model/dataType/ThinkModelArgument.java index 9192fc28d9..6a223286ac 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodel/model/dataType/ThinkModelArgument.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/thinkmodel/model/dataType/ThinkModelArgument.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.iot.controller.admin.thinkmodel.model.dataType; +import cn.iocoder.yudao.module.iot.controller.admin.thinkmodel.model.ThinkModelProperty; import lombok.Data; @Data @@ -7,7 +8,10 @@ public class ThinkModelArgument { private String identifier; private String name; - private ThinkModelDataSpecs dataType; + /** + * 物模型中的属性 + */ + private ThinkModelProperty property; /** * 用于区分输入或输出参数,"input" 或 "output" */ diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/IotDeviceDataDO.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/IotDeviceDataDO.java index 8ff9b13527..c3ed4863ee 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/IotDeviceDataDO.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/IotDeviceDataDO.java @@ -32,7 +32,7 @@ public class IotDeviceDataDO { *

* 关联 {@link IotProductThinkModelDO#getId()} */ - private Long thinkModelFunctionId; + private Long thinkModelId; /** * 产品标识 diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/tdengine/FieldParser.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/tdengine/FieldParser.java index 065d9bfedf..81bfed068f 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/tdengine/FieldParser.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/tdengine/FieldParser.java @@ -35,19 +35,16 @@ public class FieldParser { */ public static TdFieldDO parse(ThinkModelProperty property) { String fieldName = property.getIdentifier().toLowerCase(); - //// TODO @puhui999: 需要重构 - //ThinkModelDataSpecs type = property.getDataType(); - // - //// 将物模型字段类型映射为td字段类型 - //String fType = TYPE_MAPPING.get(type.getDataType().toUpperCase()); - // - //// 如果字段类型为NCHAR,默认长度为64 - //int dataLength = 0; - //if ("NCHAR".equals(fType)) { - // dataLength = 64; - //} - //return new TdFieldDO(fieldName, fType, dataLength); - return null; + + // 将物模型字段类型映射为td字段类型 + String fType = TYPE_MAPPING.get(property.getDataType().toUpperCase()); + + // 如果字段类型为NCHAR,默认长度为64 + int dataLength = 0; + if ("NCHAR".equals(fType)) { + dataLength = 64; + } + return new TdFieldDO(fieldName, fType, dataLength); } /** diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceDataServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceDataServiceImpl.java index ed2e32f2d6..71780824a0 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceDataServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceDataServiceImpl.java @@ -7,9 +7,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.deviceData.IotDeviceDataPageReqVO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDataDO; -import cn.iocoder.yudao.module.iot.dal.dataobject.thinkmodel.IotProductThinkModelDO; import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.SelectVisualDO; import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.ThinkModelMessage; +import cn.iocoder.yudao.module.iot.dal.dataobject.thinkmodel.IotProductThinkModelDO; import cn.iocoder.yudao.module.iot.dal.redis.deviceData.DeviceDataRedisDAO; import cn.iocoder.yudao.module.iot.dal.tdengine.TdEngineDMLMapper; import cn.iocoder.yudao.module.iot.enums.IotConstants; @@ -28,6 +28,8 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; + @Slf4j @Service public class IotDeviceDataServiceImpl implements IotDeviceDataService { @@ -73,35 +75,31 @@ public class IotDeviceDataServiceImpl implements IotDeviceDataService { // 1. 获取设备信息 IotDeviceDO device = deviceService.getDevice(deviceDataReqVO.getDeviceId()); // 2. 获取设备属性最新数据 - List thinkModelFunctionList = thinkModelFunctionService.getProductThinkModelListByProductKey(device.getProductKey()); - thinkModelFunctionList = thinkModelFunctionList.stream() - .filter(function -> IotProductThinkModelTypeEnum.PROPERTY.getType() - .equals(function.getType())).toList(); + List thinkModelList = thinkModelFunctionService.getProductThinkModelListByProductKey(device.getProductKey()); + thinkModelList = filterList(thinkModelList, thinkModel -> IotProductThinkModelTypeEnum.PROPERTY.getType() + .equals(thinkModel.getType())); // 3. 过滤标识符和属性名称 if (deviceDataReqVO.getIdentifier() != null) { - thinkModelFunctionList = thinkModelFunctionList.stream() - .filter(function -> function.getIdentifier().toLowerCase().contains(deviceDataReqVO.getIdentifier().toLowerCase())) - .toList(); + thinkModelList = filterList(thinkModelList, thinkModel -> thinkModel.getIdentifier() + .toLowerCase().contains(deviceDataReqVO.getIdentifier().toLowerCase())); } if (deviceDataReqVO.getName() != null) { - thinkModelFunctionList = thinkModelFunctionList.stream() - .filter(function -> function.getName().toLowerCase().contains(deviceDataReqVO.getName().toLowerCase())) - .toList(); + thinkModelList = filterList(thinkModelList, thinkModel -> thinkModel.getName() + .toLowerCase().contains(deviceDataReqVO.getName().toLowerCase())); } // 4. 获取设备属性最新数据 - // TODO @puhui999: 需要重构 - thinkModelFunctionList.forEach(function -> { - IotDeviceDataDO deviceData = deviceDataRedisDAO.get(device.getProductKey(), device.getDeviceName(), function.getIdentifier()); + thinkModelList.forEach(thinkModel -> { + IotDeviceDataDO deviceData = deviceDataRedisDAO.get(device.getProductKey(), device.getDeviceName(), thinkModel.getIdentifier()); if (deviceData == null) { deviceData = new IotDeviceDataDO(); deviceData.setProductKey(device.getProductKey()); deviceData.setDeviceName(device.getDeviceName()); - deviceData.setIdentifier(function.getIdentifier()); + deviceData.setIdentifier(thinkModel.getIdentifier()); deviceData.setDeviceId(deviceDataReqVO.getDeviceId()); - deviceData.setThinkModelFunctionId(function.getId()); - deviceData.setName(function.getName()); - //deviceData.setDataType(function.getProperty().getDataType().getDataType()); + deviceData.setThinkModelId(thinkModel.getId()); + deviceData.setName(thinkModel.getName()); + deviceData.setDataType(thinkModel.getProperty().getDataType()); } list.add(deviceData); }); diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/tdengine/IotThinkModelMessageServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/tdengine/IotThinkModelMessageServiceImpl.java index eaaa3efebd..3c2debfa49 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/tdengine/IotThinkModelMessageServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/tdengine/IotThinkModelMessageServiceImpl.java @@ -129,7 +129,6 @@ public class IotThinkModelMessageServiceImpl implements IotThinkModelMessageServ * @param time 时间 */ private void setDeviceDataCache(IotDeviceDO device, IotProductThinkModelDO iotProductThinkModelDO, Object val, Long time) { - // TODO @puhui999: 需要重构 IotDeviceDataDO deviceData = IotDeviceDataDO.builder() .productKey(device.getProductKey()) .deviceName(device.getDeviceName()) @@ -137,9 +136,9 @@ public class IotThinkModelMessageServiceImpl implements IotThinkModelMessageServ .value(val != null ? val.toString() : null) .updateTime(DateUtil.toLocalDateTime(new Date(time))) .deviceId(device.getId()) - .thinkModelFunctionId(iotProductThinkModelDO.getId()) + .thinkModelId(iotProductThinkModelDO.getId()) .name(iotProductThinkModelDO.getName()) - //.dataType(iotProductThinkModelDO.getProperty().getDataType().getDataType()) + .dataType(iotProductThinkModelDO.getProperty().getDataType()) .build(); deviceDataRedisDAO.set(deviceData); } diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thinkmodel/IotProductThinkModelServiceImpl.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thinkmodel/IotProductThinkModelServiceImpl.java index 862d8b95c3..fa15083f02 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thinkmodel/IotProductThinkModelServiceImpl.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/thinkmodel/IotProductThinkModelServiceImpl.java @@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; 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.thinkmodel.model.ThinkModelEvent; import cn.iocoder.yudao.module.iot.controller.admin.thinkmodel.model.ThinkModelProperty; import cn.iocoder.yudao.module.iot.controller.admin.thinkmodel.model.ThinkModelService; @@ -17,6 +18,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; import cn.iocoder.yudao.module.iot.dal.dataobject.thinkmodel.IotProductThinkModelDO; import cn.iocoder.yudao.module.iot.dal.mysql.thinkmodel.IotProductThinkModelMapper; import cn.iocoder.yudao.module.iot.enums.product.IotProductStatusEnum; +import cn.iocoder.yudao.module.iot.enums.thinkmodel.IotProductThinkModelAccessModeEnum; import cn.iocoder.yudao.module.iot.enums.thinkmodel.IotProductThinkModelTypeEnum; import cn.iocoder.yudao.module.iot.service.product.IotProductService; import cn.iocoder.yudao.module.iot.service.tdengine.IotSuperTableService; @@ -72,7 +74,7 @@ public class IotProductThinkModelServiceImpl implements IotProductThinkModelServ // 6. 如果创建的是属性,需要更新默认的事件和服务 if (Objects.equals(createReqVO.getType(), IotProductThinkModelTypeEnum.PROPERTY.getType())) { - //createDefaultEventsAndServices(createReqVO.getProductId(), createReqVO.getProductKey()); + createDefaultEventsAndServices(createReqVO.getProductId(), createReqVO.getProductKey()); } return function.getId(); } @@ -112,7 +114,7 @@ public class IotProductThinkModelServiceImpl implements IotProductThinkModelServ @Transactional(rollbackFor = Exception.class) public void updateProductThinkModel(IotProductThinkModelSaveReqVO updateReqVO) { // 1. 校验功能是否存在 - validateproductThinkModelMapperExists(updateReqVO.getId()); + validateProductThinkModelMapperExists(updateReqVO.getId()); // 2. 校验功能标识符是否唯一 validateIdentifierUniqueForUpdate(updateReqVO.getId(), updateReqVO.getProductId(), updateReqVO.getIdentifier()); @@ -163,7 +165,7 @@ public class IotProductThinkModelServiceImpl implements IotProductThinkModelServ * * @param id 功能编号 */ - private void validateproductThinkModelMapperExists(Long id) { + private void validateProductThinkModelMapperExists(Long id) { if (productThinkModelMapper.selectById(id) == null) { throw exception(THINK_MODEL_FUNCTION_NOT_EXISTS); } @@ -201,7 +203,6 @@ public class IotProductThinkModelServiceImpl implements IotProductThinkModelServ return productThinkModelMapper.selectListByProductKey(productKey); } - // TODO @puhui999: 需要重构 /** * 创建默认的事件和服务 */ @@ -333,14 +334,12 @@ public class IotProductThinkModelServiceImpl implements IotProductThinkModelServ // 将属性列表转换为事件的输出参数 List outputData = new ArrayList<>(); - // TODO @puhui999: 需要重构 - for (IotProductThinkModelDO functionDO : propertyList) { - ThinkModelProperty property = functionDO.getProperty(); + for (IotProductThinkModelDO thinkModel : propertyList) { ThinkModelArgument arg = new ThinkModelArgument() - .setIdentifier(property.getIdentifier()) - .setName(property.getName()) - //.setDataType(property.getDataType()) - .setDescription(property.getDescription()) + .setIdentifier(thinkModel.getIdentifier()) + .setName(thinkModel.getName()) + .setProperty(thinkModel.getProperty()) + .setDescription(thinkModel.getDescription()) .setDirection("output"); // 设置为输出参数 outputData.add(arg); } @@ -357,18 +356,17 @@ public class IotProductThinkModelServiceImpl implements IotProductThinkModelServ } List inputData = new ArrayList<>(); - // TODO @puhui999: 需要重构 - for (IotProductThinkModelDO functionDO : propertyList) { - ThinkModelProperty property = functionDO.getProperty(); - //if (IotProductThinkModelAccessModeEnum.WRITE.getMode().equals(property.getAccessMode()) || IotProductThinkModelAccessModeEnum.READ_WRITE.getMode().equals(property.getAccessMode())) { - // ThinkModelArgument arg = new ThinkModelArgument() - // .setIdentifier(property.getIdentifier()) - // .setName(property.getName()) - // .setDataType(property.getDataType()) - // .setDescription(property.getDescription()) - // .setDirection("input"); // 设置为输入参数 - // inputData.add(arg); - //} + for (IotProductThinkModelDO thinkModel : propertyList) { + ThinkModelProperty property = thinkModel.getProperty(); + if (IotProductThinkModelAccessModeEnum.READ_WRITE.getMode().equals(property.getAccessMode())) { + ThinkModelArgument arg = new ThinkModelArgument() + .setIdentifier(property.getIdentifier()) + .setName(property.getName()) + .setProperty(property) + .setDescription(property.getDescription()) + .setDirection("input"); // 设置为输入参数 + inputData.add(arg); + } } if (inputData.isEmpty()) { // 如果没有可写属性,不生成属性设置服务 @@ -394,20 +392,20 @@ public class IotProductThinkModelServiceImpl implements IotProductThinkModelServ if (propertyList == null || propertyList.isEmpty()) { return null; } - // TODO @puhui999: 需要重构 + List outputData = new ArrayList<>(); for (IotProductThinkModelDO functionDO : propertyList) { ThinkModelProperty property = functionDO.getProperty(); - //if (ObjectUtils.equalsAny(property.getAccessMode(), - // IotProductThinkModelAccessModeEnum.READ.getMode(), IotProductThinkModelAccessModeEnum.READ_WRITE.getMode())) { - // ThinkModelArgument arg = new ThinkModelArgument() - // .setIdentifier(property.getIdentifier()) - // .setName(property.getName()) - // .setDataType(property.getDataType()) - // .setDescription(property.getDescription()) - // .setDirection("output"); // 设置为输出参数 - // outputData.add(arg); - //} + if (ObjectUtils.equalsAny(property.getAccessMode(), + IotProductThinkModelAccessModeEnum.READ_ONLY.getMode(), IotProductThinkModelAccessModeEnum.READ_WRITE.getMode())) { + ThinkModelArgument arg = new ThinkModelArgument() + .setIdentifier(property.getIdentifier()) + .setName(property.getName()) + .setProperty(property) + .setDescription(property.getDescription()) + .setDirection("output"); // 设置为输出参数 + outputData.add(arg); + } } if (outputData.isEmpty()) { // 如果没有可读属性,不生成属性获取服务 @@ -428,15 +426,16 @@ public class IotProductThinkModelServiceImpl implements IotProductThinkModelServ .setDescription("需要获取的属性标识符列表") .setDirection("input"); // 设置为输入参数 - // 创建数组类型,元素类型为文本类型(字符串) + // 创建数组类型,元素类型为文本类型(字符串)TODO @puhui999: 还得研究研究 ThinkModelArrayDataSpecs arrayType = new ThinkModelArrayDataSpecs(); arrayType.setDataType("array"); - //ThinkModelArraySpecs arraySpecs = new ThinkModelArraySpecs(); + inputArg.setProperty(new ThinkModelProperty().setIdentifier(inputArg.getIdentifier()).setName(inputArg.getName()) + .setDescription(inputArg.getDescription()).setDataSpecs(arrayType)); + ThinkModelDateOrTextDataSpecs textType = new ThinkModelDateOrTextDataSpecs(); textType.setDataType("text"); - //arraySpecs.setItem(textType); - //arrayType.setSpecs(arraySpecs); - inputArg.setDataType(arrayType); + inputArg.setProperty(new ThinkModelProperty().setIdentifier(inputArg.getIdentifier()).setName(inputArg.getName()) + .setDescription(inputArg.getDescription()).setDataSpecs(textType)); service.setInputData(Collections.singletonList(inputArg)); service.setOutputData(outputData);