Pārlūkot izejas kodu

[功能添加]:物模型日志表创建

alwayssuper 7 mēneši atpakaļ
vecāks
revīzija
eaee4642d6

+ 11 - 13
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;
 import lombok.NoArgsConstructor;
 
 // TODO @芋艿:纠结下字段
+@Deprecated
 /**
  * TD 物模型消息日志的数据库
  */
@@ -17,26 +18,17 @@ public class ThingModelMessageDO {
 
 
 
-    // TODO @haohao:superTableName 和 tableName 是不是合并。因为每个 mapper 操作的时候,有且只会使用到其中一个。
-    /**
-     * 超级表名称
-     */
-    private String superTableName;
-
-    /**
-     * 表名称
-     */
-    private String tableName;
-
     /**
      * 消息 ID
      */
     private String id;
 
     /**
-     * 扩展功能的参数
+     * 系统扩展参数
+     * 
+     * 例如:设备状态、系统时间、固件版本等系统级信息
      */
-    private Object sys;
+    private Object system;
 
     /**
      * 请求方法
@@ -55,6 +47,12 @@ public class ThingModelMessageDO {
      */
     private Long time;
 
+    /**
+     * 设备信息
+     */
+    private String productKey;
+
+
     /**
      * 设备 key
      */

+ 4 - 2
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/tdengine/TdThingModelMessageMapper.java

@@ -1,11 +1,13 @@
 package cn.iocoder.yudao.module.iot.dal.tdengine;
 
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.ThingModelMessage;
 import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.ThingModelMessageDO;
 import cn.iocoder.yudao.module.iot.framework.tdengine.core.annotation.TDengineDS;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 处理 TD 中物模型消息日志的操作
@@ -20,13 +22,13 @@ public interface TdThingModelMessageMapper {
      *
      */
 
-    void createSuperTable(ThingModelMessageDO superTable);
+    void createSuperTable(@Param("productKey") String productKey);
 
     /**
      * 创建子表
      *
      */
 
-    void createTableWithTag(ThingModelMessageDO table);
+    void createTableWithTag(@Param("productKey") String productKey,@Param("deviceKey") String deviceKey);
 
 }

+ 7 - 0
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;
 import cn.iocoder.yudao.module.iot.dal.tdengine.IotDevicePropertyDataMapper;
 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.dal.tdengine.TdThingModelMessageMapper;
 import cn.iocoder.yudao.module.iot.enums.IotConstants;
 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotDataSpecsDataTypeEnum;
 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum;
@@ -84,6 +85,9 @@ public class IotDevicePropertyDataServiceImpl implements IotDevicePropertyDataSe
     @Resource
     private IotDevicePropertyDataMapper devicePropertyDataMapper;
 
+    @Resource
+    private TdThingModelMessageMapper tdThingModelMessageMapper;
+
     @Override
     public void defineDevicePropertyData(Long productId) {
         // 1.1 查询产品和物模型
@@ -108,7 +112,10 @@ public class IotDevicePropertyDataServiceImpl implements IotDevicePropertyDataSe
                 return;
             }
             newFields.add(0, new TDengineTableField(TDengineTableField.FIELD_TS, TDengineTableField.TYPE_TIMESTAMP));
+            // 2.1.1 创建产品超级表
             devicePropertyDataMapper.createProductPropertySTable(product.getProductKey(), newFields);
+            // 2.1.2 创建物模型日志超级表
+            tdThingModelMessageMapper.createSuperTable(product.getProductKey());
             return;
         }
         // 2.2 情况二:如果是修改的时候,需要更新表

+ 1 - 5
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductServiceImpl.java

@@ -34,9 +34,6 @@ public class IotProductServiceImpl implements IotProductService {
     @Resource
     private IotProductMapper productMapper;
 
-    @Resource
-    @Lazy  // 延迟加载,解决循环依赖
-    private IotThingModelMessageService thingModelMessageService;
     @Resource
     @Lazy  // 延迟加载,解决循环依赖
     private IotDevicePropertyDataService devicePropertyDataService;
@@ -125,8 +122,7 @@ public class IotProductServiceImpl implements IotProductService {
         if (Objects.equals(status, IotProductStatusEnum.PUBLISHED.getStatus())) {
             // 3.1 创建产品超级表数据模型
             devicePropertyDataService.defineDevicePropertyData(id);
-            // 3.2 创建物模型日志超级表数据模型 TODO 待定:message 要不要分;
-            thingModelMessageService.createSuperTable(id);
+
         }
         productMapper.updateById(updateObj);
     }

+ 1 - 6
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 {
      */
     void saveThingModelMessage(IotDeviceDO device, ThingModelMessage thingModelMessage);
 
-    /**
-     * 创建物模型消息日志超级表
-     *
-     * @param productId 产品编号
-     */
-    void createSuperTable(Long productId);
+
 
 }

+ 30 - 34
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
             iotDeviceService.updateDeviceStatus(new IotDeviceStatusUpdateReqVO()
                     .setId(device.getId()).setStatus(IotDeviceStatusEnum.ONLINE.getStatus()));
             // 1.2 创建物模型日志设备表
-            createThingModelMessageDeviceTable(device.getProductKey(), device.getDeviceKey());
+            tdThingModelMessageMapper.createTableWithTag(device.getProductKey(), device.getDeviceKey());
         }
 
         // 2. 获取设备属性并进行物模型校验,过滤非物模型属性
@@ -108,32 +108,34 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ
                 thingModel -> IotThingModelTypeEnum.PROPERTY.getType().equals(thingModel.getType()));
     }
 
-    @Override
-    @TenantIgnore
-    public void createSuperTable(Long productId) {
-        // 1. 查询产品
-        IotProductDO product = productService.getProduct(productId);
-
-        // 2. 获取超级表的名称和数据库名称
-        // TODO @alwayssuper:最好 databaseName、superTableName 的处理,放到 tdThinkModelMessageMapper 里。可以考虑,弄个 default 方法
-        String databaseName = IotTdDatabaseUtils.getDatabaseName(url);
-        String superTableName = IotTdDatabaseUtils.getThingModelMessageSuperTableName(product.getProductKey());
-
-        // 解析物模型,获取字段列表
-        List<TdFieldDO> schemaFields = List.of(
-                TdFieldDO.builder().fieldName("time").dataType("TIMESTAMP").build(),
-                TdFieldDO.builder().fieldName("id").dataType("NCHAR").dataLength(64).build(),
-                TdFieldDO.builder().fieldName("sys").dataType("NCHAR").dataLength(2048).build(),
-                TdFieldDO.builder().fieldName("method").dataType("NCHAR").dataLength(256).build(),
-                TdFieldDO.builder().fieldName("params").dataType("NCHAR").dataLength(2048).build()
-        );
-        // 设置超级表的标签
-        List<TdFieldDO> tagsFields = List.of(
-                TdFieldDO.builder().fieldName("device_key").dataType("NCHAR").dataLength(64).build()
-        );
-        // 3. 创建超级表
-        tdEngineDDLMapper.createSuperTable(new TdTableDO(databaseName, superTableName, schemaFields, tagsFields));
-    }
+//    @Override
+//    @TenantIgnore
+//    public void createSuperTable(Long productId) {
+//        // 1. 查询产品
+//        IotProductDO product = productService.getProduct(productId);
+//        // 2. 创建日志超级表
+//        tdThingModelMessageMapper.createSuperTable(product.getProductKey());
+//
+//        // 2. 获取超级表的名称和数据库名称
+//        // TODO @alwayssuper:最好 databaseName、superTableName 的处理,放到 tdThinkModelMessageMapper 里。可以考虑,弄个 default 方法
+////        String databaseName = IotTdDatabaseUtils.getDatabaseName(url);
+////        String superTableName = IotTdDatabaseUtils.getThingModelMessageSuperTableName(product.getProductKey());
+////
+////        // 解析物模型,获取字段列表
+////        List<TdFieldDO> schemaFields = List.of(
+////                TdFieldDO.builder().fieldName("time").dataType("TIMESTAMP").build(),
+////                TdFieldDO.builder().fieldName("id").dataType("NCHAR").dataLength(64).build(),
+////                TdFieldDO.builder().fieldName("sys").dataType("NCHAR").dataLength(2048).build(),
+////                TdFieldDO.builder().fieldName("method").dataType("NCHAR").dataLength(256).build(),
+////                TdFieldDO.builder().fieldName("params").dataType("NCHAR").dataLength(2048).build()
+////        );
+////        // 设置超级表的标签
+////        List<TdFieldDO> tagsFields = List.of(
+////                TdFieldDO.builder().fieldName("device_key").dataType("NCHAR").dataLength(64).build()
+////        );
+////        // 3. 创建超级表
+////        tdEngineDDLMapper.createSuperTable(new TdTableDO(databaseName, superTableName, schemaFields, tagsFields));
+//    }
 
     private List<IotThingModelDO> getValidFunctionList(String productKey) {
         return filterList(iotThingModelService.getProductThingModelListByProductKey(productKey),
@@ -237,13 +239,7 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ
      *
      */
     private void createThingModelMessageDeviceTable(String productKey,  String deviceKey){
-
-
-        // 2. 创建物模型日志设备数据表
-//        tdThingModelMessageMapper.createTableWithTag(ThingModelMessageDO.builder().build()
-//                .setSuperTableName(productKey)
-//                .setTableName(deviceKey)
-//                .setDeviceKey(deviceKey));
+        tdThingModelMessageMapper.createTableWithTag(productKey, deviceKey);
     }
 
     /**

+ 1 - 1
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/tdengine/TdEngineDMLMapper.xml

@@ -42,7 +42,7 @@
 
     <!-- 根据标签获取最新数据 -->
     <select id="selectLastDataListByTags" parameterType="cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.TagsSelectDO"
-            resultType="Map">
+            resultType="java.util.Map">
         SELECT LAST(*)
         FROM ${dataBaseName}.${stableName}
         GROUP BY ${tagsName}

+ 7 - 5
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/tdengine/TdThinkModelMessageMapper.xml

@@ -6,12 +6,13 @@
 
     <!-- 创建物模型消息日志超级表 -->
     <update id="createSuperTable">
-        CREATE STABLE thing_model_message_${superTableName}(
+        CREATE STABLE thing_model_message_${productKey}(
             ts TIMESTAMP,
             id NCHAR(64),
             sys NCHAR(2048),
             method NCHAR(255),
-            params NCHAR(2048)
+            params NCHAR(2048),
+            device_name NCHAR(64)
         )TAGS (
             device_key NCHAR(50)
         )
@@ -19,13 +20,14 @@
 
     <!-- 创建物模型消息日志子表,带有deviceKey的TAG -->
     <update id="createTableWithTag">
-        CREATE STABLE ${tableName}
-        USING thing_model_message_${superTableName}(
+        CREATE STABLE ${deviceKey}
+        USING thing_model_message_${productKey}(
             ts,
             id ,
             sys ,
             method ,
-            params
+            params ,
+            device_name
         )TAGS(
             #{device_key}
         )