Commit eaee4642d628ecfb146ac5a1e1826a3c9cbaad6a
1 parent
9c3aa5d9
[功能添加]:物模型日志表创建
Showing
8 changed files
with
62 additions
and
66 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/tdengine/ThingModelMessageDO.java
| ... | ... | @@ -6,6 +6,7 @@ import lombok.Data; |
| 6 | 6 | import lombok.NoArgsConstructor; |
| 7 | 7 | |
| 8 | 8 | // TODO @芋艿:纠结下字段 |
| 9 | +@Deprecated | |
| 9 | 10 | /** |
| 10 | 11 | * TD 物模型消息日志的数据库 |
| 11 | 12 | */ |
| ... | ... | @@ -17,26 +18,17 @@ public class ThingModelMessageDO { |
| 17 | 18 | |
| 18 | 19 | |
| 19 | 20 | |
| 20 | - // TODO @haohao:superTableName 和 tableName 是不是合并。因为每个 mapper 操作的时候,有且只会使用到其中一个。 | |
| 21 | - /** | |
| 22 | - * 超级表名称 | |
| 23 | - */ | |
| 24 | - private String superTableName; | |
| 25 | - | |
| 26 | - /** | |
| 27 | - * 表名称 | |
| 28 | - */ | |
| 29 | - private String tableName; | |
| 30 | - | |
| 31 | 21 | /** |
| 32 | 22 | * 消息 ID |
| 33 | 23 | */ |
| 34 | 24 | private String id; |
| 35 | 25 | |
| 36 | 26 | /** |
| 37 | - * 扩展功能的参数 | |
| 27 | + * 系统扩展参数 | |
| 28 | + * | |
| 29 | + * 例如:设备状态、系统时间、固件版本等系统级信息 | |
| 38 | 30 | */ |
| 39 | - private Object sys; | |
| 31 | + private Object system; | |
| 40 | 32 | |
| 41 | 33 | /** |
| 42 | 34 | * 请求方法 |
| ... | ... | @@ -56,6 +48,12 @@ public class ThingModelMessageDO { |
| 56 | 48 | private Long time; |
| 57 | 49 | |
| 58 | 50 | /** |
| 51 | + * 设备信息 | |
| 52 | + */ | |
| 53 | + private String productKey; | |
| 54 | + | |
| 55 | + | |
| 56 | + /** | |
| 59 | 57 | * 设备 key |
| 60 | 58 | */ |
| 61 | 59 | private String deviceKey; | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/tdengine/TdThingModelMessageMapper.java
| 1 | 1 | package cn.iocoder.yudao.module.iot.dal.tdengine; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; |
| 4 | +import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.ThingModelMessage; | |
| 4 | 5 | import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.ThingModelMessageDO; |
| 5 | 6 | import cn.iocoder.yudao.module.iot.framework.tdengine.core.annotation.TDengineDS; |
| 6 | 7 | import com.baomidou.dynamic.datasource.annotation.DS; |
| 7 | 8 | import com.baomidou.mybatisplus.annotation.InterceptorIgnore; |
| 8 | 9 | import org.apache.ibatis.annotations.Mapper; |
| 10 | +import org.apache.ibatis.annotations.Param; | |
| 9 | 11 | |
| 10 | 12 | /** |
| 11 | 13 | * 处理 TD 中物模型消息日志的操作 |
| ... | ... | @@ -20,13 +22,13 @@ public interface TdThingModelMessageMapper { |
| 20 | 22 | * |
| 21 | 23 | */ |
| 22 | 24 | |
| 23 | - void createSuperTable(ThingModelMessageDO superTable); | |
| 25 | + void createSuperTable(@Param("productKey") String productKey); | |
| 24 | 26 | |
| 25 | 27 | /** |
| 26 | 28 | * 创建子表 |
| 27 | 29 | * |
| 28 | 30 | */ |
| 29 | 31 | |
| 30 | - void createTableWithTag(ThingModelMessageDO table); | |
| 32 | + void createTableWithTag(@Param("productKey") String productKey,@Param("deviceKey") String deviceKey); | |
| 31 | 33 | |
| 32 | 34 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDevicePropertyDataServiceImpl.java
| ... | ... | @@ -17,6 +17,7 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO; |
| 17 | 17 | import cn.iocoder.yudao.module.iot.dal.tdengine.IotDevicePropertyDataMapper; |
| 18 | 18 | import cn.iocoder.yudao.module.iot.dal.redis.deviceData.DeviceDataRedisDAO; |
| 19 | 19 | import cn.iocoder.yudao.module.iot.dal.tdengine.TdEngineDMLMapper; |
| 20 | +import cn.iocoder.yudao.module.iot.dal.tdengine.TdThingModelMessageMapper; | |
| 20 | 21 | import cn.iocoder.yudao.module.iot.enums.IotConstants; |
| 21 | 22 | import cn.iocoder.yudao.module.iot.enums.thingmodel.IotDataSpecsDataTypeEnum; |
| 22 | 23 | import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum; |
| ... | ... | @@ -84,6 +85,9 @@ public class IotDevicePropertyDataServiceImpl implements IotDevicePropertyDataSe |
| 84 | 85 | @Resource |
| 85 | 86 | private IotDevicePropertyDataMapper devicePropertyDataMapper; |
| 86 | 87 | |
| 88 | + @Resource | |
| 89 | + private TdThingModelMessageMapper tdThingModelMessageMapper; | |
| 90 | + | |
| 87 | 91 | @Override |
| 88 | 92 | public void defineDevicePropertyData(Long productId) { |
| 89 | 93 | // 1.1 查询产品和物模型 |
| ... | ... | @@ -108,7 +112,10 @@ public class IotDevicePropertyDataServiceImpl implements IotDevicePropertyDataSe |
| 108 | 112 | return; |
| 109 | 113 | } |
| 110 | 114 | newFields.add(0, new TDengineTableField(TDengineTableField.FIELD_TS, TDengineTableField.TYPE_TIMESTAMP)); |
| 115 | + // 2.1.1 创建产品超级表 | |
| 111 | 116 | devicePropertyDataMapper.createProductPropertySTable(product.getProductKey(), newFields); |
| 117 | + // 2.1.2 创建物模型日志超级表 | |
| 118 | + tdThingModelMessageMapper.createSuperTable(product.getProductKey()); | |
| 112 | 119 | return; |
| 113 | 120 | } |
| 114 | 121 | // 2.2 情况二:如果是修改的时候,需要更新表 | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductServiceImpl.java
| ... | ... | @@ -36,9 +36,6 @@ public class IotProductServiceImpl implements IotProductService { |
| 36 | 36 | |
| 37 | 37 | @Resource |
| 38 | 38 | @Lazy // 延迟加载,解决循环依赖 |
| 39 | - private IotThingModelMessageService thingModelMessageService; | |
| 40 | - @Resource | |
| 41 | - @Lazy // 延迟加载,解决循环依赖 | |
| 42 | 39 | private IotDevicePropertyDataService devicePropertyDataService; |
| 43 | 40 | |
| 44 | 41 | @Override |
| ... | ... | @@ -125,8 +122,7 @@ public class IotProductServiceImpl implements IotProductService { |
| 125 | 122 | if (Objects.equals(status, IotProductStatusEnum.PUBLISHED.getStatus())) { |
| 126 | 123 | // 3.1 创建产品超级表数据模型 |
| 127 | 124 | devicePropertyDataService.defineDevicePropertyData(id); |
| 128 | - // 3.2 创建物模型日志超级表数据模型 TODO 待定:message 要不要分; | |
| 129 | - thingModelMessageService.createSuperTable(id); | |
| 125 | + | |
| 130 | 126 | } |
| 131 | 127 | productMapper.updateById(updateObj); |
| 132 | 128 | } | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/tdengine/IotThingModelMessageService.java
| ... | ... | @@ -16,11 +16,6 @@ public interface IotThingModelMessageService { |
| 16 | 16 | */ |
| 17 | 17 | void saveThingModelMessage(IotDeviceDO device, ThingModelMessage thingModelMessage); |
| 18 | 18 | |
| 19 | - /** | |
| 20 | - * 创建物模型消息日志超级表 | |
| 21 | - * | |
| 22 | - * @param productId 产品编号 | |
| 23 | - */ | |
| 24 | - void createSuperTable(Long productId); | |
| 19 | + | |
| 25 | 20 | |
| 26 | 21 | } |
| 27 | 22 | \ No newline at end of file | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/tdengine/IotThingModelMessageServiceImpl.java
| ... | ... | @@ -79,7 +79,7 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ |
| 79 | 79 | iotDeviceService.updateDeviceStatus(new IotDeviceStatusUpdateReqVO() |
| 80 | 80 | .setId(device.getId()).setStatus(IotDeviceStatusEnum.ONLINE.getStatus())); |
| 81 | 81 | // 1.2 创建物模型日志设备表 |
| 82 | - createThingModelMessageDeviceTable(device.getProductKey(), device.getDeviceKey()); | |
| 82 | + tdThingModelMessageMapper.createTableWithTag(device.getProductKey(), device.getDeviceKey()); | |
| 83 | 83 | } |
| 84 | 84 | |
| 85 | 85 | // 2. 获取设备属性并进行物模型校验,过滤非物模型属性 |
| ... | ... | @@ -108,32 +108,34 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ |
| 108 | 108 | thingModel -> IotThingModelTypeEnum.PROPERTY.getType().equals(thingModel.getType())); |
| 109 | 109 | } |
| 110 | 110 | |
| 111 | - @Override | |
| 112 | - @TenantIgnore | |
| 113 | - public void createSuperTable(Long productId) { | |
| 114 | - // 1. 查询产品 | |
| 115 | - IotProductDO product = productService.getProduct(productId); | |
| 116 | - | |
| 117 | - // 2. 获取超级表的名称和数据库名称 | |
| 118 | - // TODO @alwayssuper:最好 databaseName、superTableName 的处理,放到 tdThinkModelMessageMapper 里。可以考虑,弄个 default 方法 | |
| 119 | - String databaseName = IotTdDatabaseUtils.getDatabaseName(url); | |
| 120 | - String superTableName = IotTdDatabaseUtils.getThingModelMessageSuperTableName(product.getProductKey()); | |
| 121 | - | |
| 122 | - // 解析物模型,获取字段列表 | |
| 123 | - List<TdFieldDO> schemaFields = List.of( | |
| 124 | - TdFieldDO.builder().fieldName("time").dataType("TIMESTAMP").build(), | |
| 125 | - TdFieldDO.builder().fieldName("id").dataType("NCHAR").dataLength(64).build(), | |
| 126 | - TdFieldDO.builder().fieldName("sys").dataType("NCHAR").dataLength(2048).build(), | |
| 127 | - TdFieldDO.builder().fieldName("method").dataType("NCHAR").dataLength(256).build(), | |
| 128 | - TdFieldDO.builder().fieldName("params").dataType("NCHAR").dataLength(2048).build() | |
| 129 | - ); | |
| 130 | - // 设置超级表的标签 | |
| 131 | - List<TdFieldDO> tagsFields = List.of( | |
| 132 | - TdFieldDO.builder().fieldName("device_key").dataType("NCHAR").dataLength(64).build() | |
| 133 | - ); | |
| 134 | - // 3. 创建超级表 | |
| 135 | - tdEngineDDLMapper.createSuperTable(new TdTableDO(databaseName, superTableName, schemaFields, tagsFields)); | |
| 136 | - } | |
| 111 | +// @Override | |
| 112 | +// @TenantIgnore | |
| 113 | +// public void createSuperTable(Long productId) { | |
| 114 | +// // 1. 查询产品 | |
| 115 | +// IotProductDO product = productService.getProduct(productId); | |
| 116 | +// // 2. 创建日志超级表 | |
| 117 | +// tdThingModelMessageMapper.createSuperTable(product.getProductKey()); | |
| 118 | +// | |
| 119 | +// // 2. 获取超级表的名称和数据库名称 | |
| 120 | +// // TODO @alwayssuper:最好 databaseName、superTableName 的处理,放到 tdThinkModelMessageMapper 里。可以考虑,弄个 default 方法 | |
| 121 | +//// String databaseName = IotTdDatabaseUtils.getDatabaseName(url); | |
| 122 | +//// String superTableName = IotTdDatabaseUtils.getThingModelMessageSuperTableName(product.getProductKey()); | |
| 123 | +//// | |
| 124 | +//// // 解析物模型,获取字段列表 | |
| 125 | +//// List<TdFieldDO> schemaFields = List.of( | |
| 126 | +//// TdFieldDO.builder().fieldName("time").dataType("TIMESTAMP").build(), | |
| 127 | +//// TdFieldDO.builder().fieldName("id").dataType("NCHAR").dataLength(64).build(), | |
| 128 | +//// TdFieldDO.builder().fieldName("sys").dataType("NCHAR").dataLength(2048).build(), | |
| 129 | +//// TdFieldDO.builder().fieldName("method").dataType("NCHAR").dataLength(256).build(), | |
| 130 | +//// TdFieldDO.builder().fieldName("params").dataType("NCHAR").dataLength(2048).build() | |
| 131 | +//// ); | |
| 132 | +//// // 设置超级表的标签 | |
| 133 | +//// List<TdFieldDO> tagsFields = List.of( | |
| 134 | +//// TdFieldDO.builder().fieldName("device_key").dataType("NCHAR").dataLength(64).build() | |
| 135 | +//// ); | |
| 136 | +//// // 3. 创建超级表 | |
| 137 | +//// tdEngineDDLMapper.createSuperTable(new TdTableDO(databaseName, superTableName, schemaFields, tagsFields)); | |
| 138 | +// } | |
| 137 | 139 | |
| 138 | 140 | private List<IotThingModelDO> getValidFunctionList(String productKey) { |
| 139 | 141 | return filterList(iotThingModelService.getProductThingModelListByProductKey(productKey), |
| ... | ... | @@ -237,13 +239,7 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ |
| 237 | 239 | * |
| 238 | 240 | */ |
| 239 | 241 | private void createThingModelMessageDeviceTable(String productKey, String deviceKey){ |
| 240 | - | |
| 241 | - | |
| 242 | - // 2. 创建物模型日志设备数据表 | |
| 243 | -// tdThingModelMessageMapper.createTableWithTag(ThingModelMessageDO.builder().build() | |
| 244 | -// .setSuperTableName(productKey) | |
| 245 | -// .setTableName(deviceKey) | |
| 246 | -// .setDeviceKey(deviceKey)); | |
| 242 | + tdThingModelMessageMapper.createTableWithTag(productKey, deviceKey); | |
| 247 | 243 | } |
| 248 | 244 | |
| 249 | 245 | /** | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/tdengine/TdEngineDMLMapper.xml
| ... | ... | @@ -42,7 +42,7 @@ |
| 42 | 42 | |
| 43 | 43 | <!-- 根据标签获取最新数据 --> |
| 44 | 44 | <select id="selectLastDataListByTags" parameterType="cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.TagsSelectDO" |
| 45 | - resultType="Map"> | |
| 45 | + resultType="java.util.Map"> | |
| 46 | 46 | SELECT LAST(*) |
| 47 | 47 | FROM ${dataBaseName}.${stableName} |
| 48 | 48 | GROUP BY ${tagsName} | ... | ... |
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/tdengine/TdThinkModelMessageMapper.xml
| ... | ... | @@ -6,12 +6,13 @@ |
| 6 | 6 | |
| 7 | 7 | <!-- 创建物模型消息日志超级表 --> |
| 8 | 8 | <update id="createSuperTable"> |
| 9 | - CREATE STABLE thing_model_message_${superTableName}( | |
| 9 | + CREATE STABLE thing_model_message_${productKey}( | |
| 10 | 10 | ts TIMESTAMP, |
| 11 | 11 | id NCHAR(64), |
| 12 | 12 | sys NCHAR(2048), |
| 13 | 13 | method NCHAR(255), |
| 14 | - params NCHAR(2048) | |
| 14 | + params NCHAR(2048), | |
| 15 | + device_name NCHAR(64) | |
| 15 | 16 | )TAGS ( |
| 16 | 17 | device_key NCHAR(50) |
| 17 | 18 | ) |
| ... | ... | @@ -19,13 +20,14 @@ |
| 19 | 20 | |
| 20 | 21 | <!-- 创建物模型消息日志子表,带有deviceKey的TAG --> |
| 21 | 22 | <update id="createTableWithTag"> |
| 22 | - CREATE STABLE ${tableName} | |
| 23 | - USING thing_model_message_${superTableName}( | |
| 23 | + CREATE STABLE ${deviceKey} | |
| 24 | + USING thing_model_message_${productKey}( | |
| 24 | 25 | ts, |
| 25 | 26 | id , |
| 26 | 27 | sys , |
| 27 | 28 | method , |
| 28 | - params | |
| 29 | + params , | |
| 30 | + device_name | |
| 29 | 31 | )TAGS( |
| 30 | 32 | #{device_key} |
| 31 | 33 | ) | ... | ... |