mirror of
				https://github.com/YunaiV/ruoyi-vue-pro.git
				synced 2025-11-04 08:06:12 +08:00 
			
		
		
		
	[功能添加]:物模型日志表创建
This commit is contained in:
		@ -6,6 +6,7 @@ import lombok.Data;
 | 
				
			|||||||
import lombok.NoArgsConstructor;
 | 
					import lombok.NoArgsConstructor;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// TODO @芋艿:纠结下字段
 | 
					// TODO @芋艿:纠结下字段
 | 
				
			||||||
 | 
					@Deprecated
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * TD 物模型消息日志的数据库
 | 
					 * TD 物模型消息日志的数据库
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
@ -17,26 +18,17 @@ public class ThingModelMessageDO {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // TODO @haohao:superTableName 和 tableName 是不是合并。因为每个 mapper 操作的时候,有且只会使用到其中一个。
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 超级表名称
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private String superTableName;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					 | 
				
			||||||
     * 表名称
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    private String tableName;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 消息 ID
 | 
					     * 消息 ID
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private String id;
 | 
					    private String id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 扩展功能的参数
 | 
					     * 系统扩展参数
 | 
				
			||||||
 | 
					     * 
 | 
				
			||||||
 | 
					     * 例如:设备状态、系统时间、固件版本等系统级信息
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private Object sys;
 | 
					    private Object system;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 请求方法
 | 
					     * 请求方法
 | 
				
			||||||
@ -55,6 +47,12 @@ public class ThingModelMessageDO {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    private Long time;
 | 
					    private Long time;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * 设备信息
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    private String productKey;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * 设备 key
 | 
					     * 设备 key
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,13 @@
 | 
				
			|||||||
package cn.iocoder.yudao.module.iot.dal.tdengine;
 | 
					package cn.iocoder.yudao.module.iot.dal.tdengine;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 | 
					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.dal.dataobject.tdengine.ThingModelMessageDO;
 | 
				
			||||||
import cn.iocoder.yudao.module.iot.framework.tdengine.core.annotation.TDengineDS;
 | 
					import cn.iocoder.yudao.module.iot.framework.tdengine.core.annotation.TDengineDS;
 | 
				
			||||||
import com.baomidou.dynamic.datasource.annotation.DS;
 | 
					import com.baomidou.dynamic.datasource.annotation.DS;
 | 
				
			||||||
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 | 
					import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
 | 
				
			||||||
import org.apache.ibatis.annotations.Mapper;
 | 
					import org.apache.ibatis.annotations.Mapper;
 | 
				
			||||||
 | 
					import org.apache.ibatis.annotations.Param;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * 处理 TD 中物模型消息日志的操作
 | 
					 * 处理 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);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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.tdengine.IotDevicePropertyDataMapper;
 | 
				
			||||||
import cn.iocoder.yudao.module.iot.dal.redis.deviceData.DeviceDataRedisDAO;
 | 
					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.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.IotConstants;
 | 
				
			||||||
import cn.iocoder.yudao.module.iot.enums.thingmodel.IotDataSpecsDataTypeEnum;
 | 
					import cn.iocoder.yudao.module.iot.enums.thingmodel.IotDataSpecsDataTypeEnum;
 | 
				
			||||||
import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum;
 | 
					import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum;
 | 
				
			||||||
@ -84,6 +85,9 @@ public class IotDevicePropertyDataServiceImpl implements IotDevicePropertyDataSe
 | 
				
			|||||||
    @Resource
 | 
					    @Resource
 | 
				
			||||||
    private IotDevicePropertyDataMapper devicePropertyDataMapper;
 | 
					    private IotDevicePropertyDataMapper devicePropertyDataMapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @Resource
 | 
				
			||||||
 | 
					    private TdThingModelMessageMapper tdThingModelMessageMapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					    @Override
 | 
				
			||||||
    public void defineDevicePropertyData(Long productId) {
 | 
					    public void defineDevicePropertyData(Long productId) {
 | 
				
			||||||
        // 1.1 查询产品和物模型
 | 
					        // 1.1 查询产品和物模型
 | 
				
			||||||
@ -108,7 +112,10 @@ public class IotDevicePropertyDataServiceImpl implements IotDevicePropertyDataSe
 | 
				
			|||||||
                return;
 | 
					                return;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            newFields.add(0, new TDengineTableField(TDengineTableField.FIELD_TS, TDengineTableField.TYPE_TIMESTAMP));
 | 
					            newFields.add(0, new TDengineTableField(TDengineTableField.FIELD_TS, TDengineTableField.TYPE_TIMESTAMP));
 | 
				
			||||||
 | 
					            // 2.1.1 创建产品超级表
 | 
				
			||||||
            devicePropertyDataMapper.createProductPropertySTable(product.getProductKey(), newFields);
 | 
					            devicePropertyDataMapper.createProductPropertySTable(product.getProductKey(), newFields);
 | 
				
			||||||
 | 
					            // 2.1.2 创建物模型日志超级表
 | 
				
			||||||
 | 
					            tdThingModelMessageMapper.createSuperTable(product.getProductKey());
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        // 2.2 情况二:如果是修改的时候,需要更新表
 | 
					        // 2.2 情况二:如果是修改的时候,需要更新表
 | 
				
			||||||
 | 
				
			|||||||
@ -34,9 +34,6 @@ public class IotProductServiceImpl implements IotProductService {
 | 
				
			|||||||
    @Resource
 | 
					    @Resource
 | 
				
			||||||
    private IotProductMapper productMapper;
 | 
					    private IotProductMapper productMapper;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Resource
 | 
					 | 
				
			||||||
    @Lazy  // 延迟加载,解决循环依赖
 | 
					 | 
				
			||||||
    private IotThingModelMessageService thingModelMessageService;
 | 
					 | 
				
			||||||
    @Resource
 | 
					    @Resource
 | 
				
			||||||
    @Lazy  // 延迟加载,解决循环依赖
 | 
					    @Lazy  // 延迟加载,解决循环依赖
 | 
				
			||||||
    private IotDevicePropertyDataService devicePropertyDataService;
 | 
					    private IotDevicePropertyDataService devicePropertyDataService;
 | 
				
			||||||
@ -125,8 +122,7 @@ public class IotProductServiceImpl implements IotProductService {
 | 
				
			|||||||
        if (Objects.equals(status, IotProductStatusEnum.PUBLISHED.getStatus())) {
 | 
					        if (Objects.equals(status, IotProductStatusEnum.PUBLISHED.getStatus())) {
 | 
				
			||||||
            // 3.1 创建产品超级表数据模型
 | 
					            // 3.1 创建产品超级表数据模型
 | 
				
			||||||
            devicePropertyDataService.defineDevicePropertyData(id);
 | 
					            devicePropertyDataService.defineDevicePropertyData(id);
 | 
				
			||||||
            // 3.2 创建物模型日志超级表数据模型 TODO 待定:message 要不要分;
 | 
					
 | 
				
			||||||
            thingModelMessageService.createSuperTable(id);
 | 
					 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        productMapper.updateById(updateObj);
 | 
					        productMapper.updateById(updateObj);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -16,11 +16,6 @@ public interface IotThingModelMessageService {
 | 
				
			|||||||
     */
 | 
					     */
 | 
				
			||||||
    void saveThingModelMessage(IotDeviceDO device, ThingModelMessage thingModelMessage);
 | 
					    void saveThingModelMessage(IotDeviceDO device, ThingModelMessage thingModelMessage);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					
 | 
				
			||||||
     * 创建物模型消息日志超级表
 | 
					 | 
				
			||||||
     *
 | 
					 | 
				
			||||||
     * @param productId 产品编号
 | 
					 | 
				
			||||||
     */
 | 
					 | 
				
			||||||
    void createSuperTable(Long productId);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -79,7 +79,7 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ
 | 
				
			|||||||
            iotDeviceService.updateDeviceStatus(new IotDeviceStatusUpdateReqVO()
 | 
					            iotDeviceService.updateDeviceStatus(new IotDeviceStatusUpdateReqVO()
 | 
				
			||||||
                    .setId(device.getId()).setStatus(IotDeviceStatusEnum.ONLINE.getStatus()));
 | 
					                    .setId(device.getId()).setStatus(IotDeviceStatusEnum.ONLINE.getStatus()));
 | 
				
			||||||
            // 1.2 创建物模型日志设备表
 | 
					            // 1.2 创建物模型日志设备表
 | 
				
			||||||
            createThingModelMessageDeviceTable(device.getProductKey(), device.getDeviceKey());
 | 
					            tdThingModelMessageMapper.createTableWithTag(device.getProductKey(), device.getDeviceKey());
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // 2. 获取设备属性并进行物模型校验,过滤非物模型属性
 | 
					        // 2. 获取设备属性并进行物模型校验,过滤非物模型属性
 | 
				
			||||||
@ -108,32 +108,34 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ
 | 
				
			|||||||
                thingModel -> IotThingModelTypeEnum.PROPERTY.getType().equals(thingModel.getType()));
 | 
					                thingModel -> IotThingModelTypeEnum.PROPERTY.getType().equals(thingModel.getType()));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @Override
 | 
					//    @Override
 | 
				
			||||||
    @TenantIgnore
 | 
					//    @TenantIgnore
 | 
				
			||||||
    public void createSuperTable(Long productId) {
 | 
					//    public void createSuperTable(Long productId) {
 | 
				
			||||||
        // 1. 查询产品
 | 
					//        // 1. 查询产品
 | 
				
			||||||
        IotProductDO product = productService.getProduct(productId);
 | 
					//        IotProductDO product = productService.getProduct(productId);
 | 
				
			||||||
 | 
					//        // 2. 创建日志超级表
 | 
				
			||||||
        // 2. 获取超级表的名称和数据库名称
 | 
					//        tdThingModelMessageMapper.createSuperTable(product.getProductKey());
 | 
				
			||||||
        // TODO @alwayssuper:最好 databaseName、superTableName 的处理,放到 tdThinkModelMessageMapper 里。可以考虑,弄个 default 方法
 | 
					//
 | 
				
			||||||
        String databaseName = IotTdDatabaseUtils.getDatabaseName(url);
 | 
					//        // 2. 获取超级表的名称和数据库名称
 | 
				
			||||||
        String superTableName = IotTdDatabaseUtils.getThingModelMessageSuperTableName(product.getProductKey());
 | 
					//        // 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(),
 | 
					////        List<TdFieldDO> schemaFields = List.of(
 | 
				
			||||||
                TdFieldDO.builder().fieldName("sys").dataType("NCHAR").dataLength(2048).build(),
 | 
					////                TdFieldDO.builder().fieldName("time").dataType("TIMESTAMP").build(),
 | 
				
			||||||
                TdFieldDO.builder().fieldName("method").dataType("NCHAR").dataLength(256).build(),
 | 
					////                TdFieldDO.builder().fieldName("id").dataType("NCHAR").dataLength(64).build(),
 | 
				
			||||||
                TdFieldDO.builder().fieldName("params").dataType("NCHAR").dataLength(2048).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()
 | 
					////        // 设置超级表的标签
 | 
				
			||||||
        );
 | 
					////        List<TdFieldDO> tagsFields = List.of(
 | 
				
			||||||
        // 3. 创建超级表
 | 
					////                TdFieldDO.builder().fieldName("device_key").dataType("NCHAR").dataLength(64).build()
 | 
				
			||||||
        tdEngineDDLMapper.createSuperTable(new TdTableDO(databaseName, superTableName, schemaFields, tagsFields));
 | 
					////        );
 | 
				
			||||||
    }
 | 
					////        // 3. 创建超级表
 | 
				
			||||||
 | 
					////        tdEngineDDLMapper.createSuperTable(new TdTableDO(databaseName, superTableName, schemaFields, tagsFields));
 | 
				
			||||||
 | 
					//    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private List<IotThingModelDO> getValidFunctionList(String productKey) {
 | 
					    private List<IotThingModelDO> getValidFunctionList(String productKey) {
 | 
				
			||||||
        return filterList(iotThingModelService.getProductThingModelListByProductKey(productKey),
 | 
					        return filterList(iotThingModelService.getProductThingModelListByProductKey(productKey),
 | 
				
			||||||
@ -237,13 +239,7 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ
 | 
				
			|||||||
     *
 | 
					     *
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    private void createThingModelMessageDeviceTable(String productKey,  String deviceKey){
 | 
					    private void createThingModelMessageDeviceTable(String productKey,  String deviceKey){
 | 
				
			||||||
 | 
					        tdThingModelMessageMapper.createTableWithTag(productKey, deviceKey);
 | 
				
			||||||
 | 
					 | 
				
			||||||
        // 2. 创建物模型日志设备数据表
 | 
					 | 
				
			||||||
//        tdThingModelMessageMapper.createTableWithTag(ThingModelMessageDO.builder().build()
 | 
					 | 
				
			||||||
//                .setSuperTableName(productKey)
 | 
					 | 
				
			||||||
//                .setTableName(deviceKey)
 | 
					 | 
				
			||||||
//                .setDeviceKey(deviceKey));
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
 | 
				
			|||||||
@ -42,7 +42,7 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    <!-- 根据标签获取最新数据 -->
 | 
					    <!-- 根据标签获取最新数据 -->
 | 
				
			||||||
    <select id="selectLastDataListByTags" parameterType="cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.TagsSelectDO"
 | 
					    <select id="selectLastDataListByTags" parameterType="cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.TagsSelectDO"
 | 
				
			||||||
            resultType="Map">
 | 
					            resultType="java.util.Map">
 | 
				
			||||||
        SELECT LAST(*)
 | 
					        SELECT LAST(*)
 | 
				
			||||||
        FROM ${dataBaseName}.${stableName}
 | 
					        FROM ${dataBaseName}.${stableName}
 | 
				
			||||||
        GROUP BY ${tagsName}
 | 
					        GROUP BY ${tagsName}
 | 
				
			||||||
 | 
				
			|||||||
@ -6,12 +6,13 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    <!-- 创建物模型消息日志超级表 -->
 | 
					    <!-- 创建物模型消息日志超级表 -->
 | 
				
			||||||
    <update id="createSuperTable">
 | 
					    <update id="createSuperTable">
 | 
				
			||||||
        CREATE STABLE thing_model_message_${superTableName}(
 | 
					        CREATE STABLE thing_model_message_${productKey}(
 | 
				
			||||||
            ts TIMESTAMP,
 | 
					            ts TIMESTAMP,
 | 
				
			||||||
            id NCHAR(64),
 | 
					            id NCHAR(64),
 | 
				
			||||||
            sys NCHAR(2048),
 | 
					            sys NCHAR(2048),
 | 
				
			||||||
            method NCHAR(255),
 | 
					            method NCHAR(255),
 | 
				
			||||||
            params NCHAR(2048)
 | 
					            params NCHAR(2048),
 | 
				
			||||||
 | 
					            device_name NCHAR(64)
 | 
				
			||||||
        )TAGS (
 | 
					        )TAGS (
 | 
				
			||||||
            device_key NCHAR(50)
 | 
					            device_key NCHAR(50)
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
@ -19,13 +20,14 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    <!-- 创建物模型消息日志子表,带有deviceKey的TAG -->
 | 
					    <!-- 创建物模型消息日志子表,带有deviceKey的TAG -->
 | 
				
			||||||
    <update id="createTableWithTag">
 | 
					    <update id="createTableWithTag">
 | 
				
			||||||
        CREATE STABLE ${tableName}
 | 
					        CREATE STABLE ${deviceKey}
 | 
				
			||||||
        USING thing_model_message_${superTableName}(
 | 
					        USING thing_model_message_${productKey}(
 | 
				
			||||||
            ts,
 | 
					            ts,
 | 
				
			||||||
            id ,
 | 
					            id ,
 | 
				
			||||||
            sys ,
 | 
					            sys ,
 | 
				
			||||||
            method ,
 | 
					            method ,
 | 
				
			||||||
            params
 | 
					            params ,
 | 
				
			||||||
 | 
					            device_name
 | 
				
			||||||
        )TAGS(
 | 
					        )TAGS(
 | 
				
			||||||
            #{device_key}
 | 
					            #{device_key}
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user