Commit b2434b7b41b52aefff1de1412f0ebea0064524f1

Authored by YunaiV
1 parent 95067fd6

【代码评审】IoT:模拟设备发送的 review

yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/IotConstants.java
@@ -40,6 +40,6 @@ public interface IotConstants { @@ -40,6 +40,6 @@ public interface IotConstants {
40 * <p> 40 * <p>
41 * 格式为 thing_model_message_{productKey}_{deviceName} 41 * 格式为 thing_model_message_{productKey}_{deviceName}
42 */ 42 */
43 - String THINK_MODEL_MESSAGE_TABLE_NAME_FORMAT = "thing_model_message_%s_%s"; 43 + String THING_MODEL_MESSAGE_TABLE_NAME_FORMAT = "thing_model_message_%s_%s";
44 44
45 } 45 }
46 \ No newline at end of file 46 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/tdengine/ThinkModelMessageDO.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/tdengine/ThingModelMessageDO.java
@@ -4,9 +4,8 @@ import lombok.AllArgsConstructor; @@ -4,9 +4,8 @@ import lombok.AllArgsConstructor;
4 import lombok.Builder; 4 import lombok.Builder;
5 import lombok.Data; 5 import lombok.Data;
6 import lombok.NoArgsConstructor; 6 import lombok.NoArgsConstructor;
7 -import org.apache.xmlbeans.impl.xb.xsdschema.Public;  
8 -  
9 7
  8 +// TODO @芋艿:纠结下字段
10 /** 9 /**
11 * TD 物模型消息日志的数据库 10 * TD 物模型消息日志的数据库
12 */ 11 */
@@ -14,7 +13,8 @@ import org.apache.xmlbeans.impl.xb.xsdschema.Public; @@ -14,7 +13,8 @@ import org.apache.xmlbeans.impl.xb.xsdschema.Public;
14 @Builder 13 @Builder
15 @NoArgsConstructor 14 @NoArgsConstructor
16 @AllArgsConstructor 15 @AllArgsConstructor
17 -public class ThinkModelMessageDO { 16 +public class ThingModelMessageDO {
  17 +
18 /** 18 /**
19 * 数据库名称 19 * 数据库名称
20 */ 20 */
@@ -32,7 +32,7 @@ public class ThinkModelMessageDO { @@ -32,7 +32,7 @@ public class ThinkModelMessageDO {
32 private String tableName; 32 private String tableName;
33 33
34 /** 34 /**
35 - * 消息ID 35 + * 消息 ID
36 */ 36 */
37 private String id; 37 private String id;
38 38
@@ -42,7 +42,9 @@ public class ThinkModelMessageDO { @@ -42,7 +42,9 @@ public class ThinkModelMessageDO {
42 private Object sys; 42 private Object sys;
43 43
44 /** 44 /**
45 - * 请求方法 例如:thing.event.property.post 45 + * 请求方法
  46 + *
  47 + * 例如:thing.event.property.post
46 */ 48 */
47 private String method; 49 private String method;
48 50
@@ -56,11 +58,9 @@ public class ThinkModelMessageDO { @@ -56,11 +58,9 @@ public class ThinkModelMessageDO {
56 */ 58 */
57 private Long time; 59 private Long time;
58 60
59 -  
60 /** 61 /**
61 * 设备 key 62 * 设备 key
62 */ 63 */
63 private String deviceKey; 64 private String deviceKey;
64 65
65 -  
66 } 66 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/tdengine/TdThinkModelMessageMapper.java
1 package cn.iocoder.yudao.module.iot.dal.tdengine; 1 package cn.iocoder.yudao.module.iot.dal.tdengine;
2 2
3 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; 3 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
4 -import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.ThinkModelMessageDO; 4 +import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.ThingModelMessageDO;
5 import com.baomidou.dynamic.datasource.annotation.DS; 5 import com.baomidou.dynamic.datasource.annotation.DS;
6 import org.apache.ibatis.annotations.Mapper; 6 import org.apache.ibatis.annotations.Mapper;
7 7
@@ -17,12 +17,13 @@ public interface TdThinkModelMessageMapper { @@ -17,12 +17,13 @@ public interface TdThinkModelMessageMapper {
17 * 17 *
18 */ 18 */
19 @TenantIgnore 19 @TenantIgnore
20 - void createSuperTable(ThinkModelMessageDO superTable); 20 + void createSuperTable(ThingModelMessageDO superTable);
21 21
22 /** 22 /**
23 * 创建子表 23 * 创建子表
24 * 24 *
25 */ 25 */
26 @TenantIgnore 26 @TenantIgnore
27 - void createTableWithTag(ThinkModelMessageDO table); 27 + void createTableWithTag(ThingModelMessageDO table);
  28 +
28 } 29 }
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mq/producer/simulatesend/SimulateSendProducer.java
@@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j; @@ -5,6 +5,7 @@ import lombok.extern.slf4j.Slf4j;
5 import org.springframework.context.ApplicationContext; 5 import org.springframework.context.ApplicationContext;
6 import org.springframework.stereotype.Component; 6 import org.springframework.stereotype.Component;
7 7
  8 +// TODO @alwayssuper:是不是还没用起来哈?Producer 最好属于某个模块;
8 /** 9 /**
9 * SimulateSend 模拟设备上报的 Producer 10 * SimulateSend 模拟设备上报的 Producer
10 * 11 *
@@ -14,6 +15,7 @@ import org.springframework.stereotype.Component; @@ -14,6 +15,7 @@ import org.springframework.stereotype.Component;
14 @Slf4j 15 @Slf4j
15 @Component 16 @Component
16 public class SimulateSendProducer { 17 public class SimulateSendProducer {
  18 +
17 @Resource 19 @Resource
18 private ApplicationContext applicationContext; 20 private ApplicationContext applicationContext;
19 21
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductServiceImpl.java
@@ -122,7 +122,7 @@ public class IotProductServiceImpl implements IotProductService { @@ -122,7 +122,7 @@ public class IotProductServiceImpl implements IotProductService {
122 thingModelFunctionService.createSuperTableDataModel(id); 122 thingModelFunctionService.createSuperTableDataModel(id);
123 // 3.2 创建物模型日志超级表数据模型 123 // 3.2 创建物模型日志超级表数据模型
124 thingModelMessageService.createSuperTable(id); 124 thingModelMessageService.createSuperTable(id);
125 - } 125 + }x
126 productMapper.updateById(updateObj); 126 productMapper.updateById(updateObj);
127 } 127 }
128 128
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/tdengine/IotThingModelMessageServiceImpl.java
@@ -58,11 +58,13 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ @@ -58,11 +58,13 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ
58 @Resource 58 @Resource
59 private IotDeviceService iotDeviceService; 59 private IotDeviceService iotDeviceService;
60 @Resource 60 @Resource
  61 + private IotProductService productService;
  62 +
  63 + @Resource
61 private TdEngineDDLMapper tdEngineDDLMapper; 64 private TdEngineDDLMapper tdEngineDDLMapper;
62 @Resource 65 @Resource
63 private TdEngineDMLMapper tdEngineDMLMapper; 66 private TdEngineDMLMapper tdEngineDMLMapper;
64 - @Resource  
65 - private IotProductService productService; 67 +
66 @Resource 68 @Resource
67 private DeviceDataRedisDAO deviceDataRedisDAO; 69 private DeviceDataRedisDAO deviceDataRedisDAO;
68 70
@@ -119,11 +121,12 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ @@ -119,11 +121,12 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ
119 IotProductDO product = productService.getProduct(productId); 121 IotProductDO product = productService.getProduct(productId);
120 122
121 // 2. 获取超级表的名称和数据库名称 123 // 2. 获取超级表的名称和数据库名称
  124 + // TODO @alwayssuper:最好 databaseName、superTableName 的处理,放到 tdThinkModelMessageMapper 里。可以考虑,弄个 default 方法
122 String databaseName = iotTdDatabaseUtils.getDatabaseName(); 125 String databaseName = iotTdDatabaseUtils.getDatabaseName();
123 - String superTableName = IotTdDatabaseUtils.getThinkModelMessageSuperTableName(product.getProductKey()); 126 + String superTableName = IotTdDatabaseUtils.getThingModelMessageSuperTableName(product.getProductKey());
124 127
125 // 3. 创建超级表 128 // 3. 创建超级表
126 - tdThinkModelMessageMapper.createSuperTable(ThinkModelMessageDO.builder().build() 129 + tdThinkModelMessageMapper.createSuperTable(ThingModelMessageDO.builder().build()
127 .setDataBaseName(databaseName) 130 .setDataBaseName(databaseName)
128 .setSuperTableName(superTableName)); 131 .setSuperTableName(superTableName));
129 } 132 }
@@ -238,16 +241,16 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ @@ -238,16 +241,16 @@ public class IotThingModelMessageServiceImpl implements IotThingModelMessageServ
238 241
239 // 1. 获取超级表的名称、数据库名称、设备日志表名称 242 // 1. 获取超级表的名称、数据库名称、设备日志表名称
240 String databaseName = iotTdDatabaseUtils.getDatabaseName(); 243 String databaseName = iotTdDatabaseUtils.getDatabaseName();
241 - String superTableName = IotTdDatabaseUtils.getThinkModelMessageSuperTableName(productKey); 244 + String superTableName = IotTdDatabaseUtils.getThingModelMessageSuperTableName(productKey);
  245 + // TODO @alwayssuper:最好 databaseName、superTableName、thinkModelMessageDeviceTableName 的处理,放到 tdThinkModelMessageMapper 里。可以考虑,弄个 default 方法
242 String thinkModelMessageDeviceTableName = IotTdDatabaseUtils.getThinkModelMessageDeviceTableName(productKey, deviceName); 246 String thinkModelMessageDeviceTableName = IotTdDatabaseUtils.getThinkModelMessageDeviceTableName(productKey, deviceName);
243 247
244 // 2. 创建物模型日志设备数据表 248 // 2. 创建物模型日志设备数据表
245 - tdThinkModelMessageMapper.createTableWithTag(ThinkModelMessageDO.builder().build() 249 + tdThinkModelMessageMapper.createTableWithTag(ThingModelMessageDO.builder().build()
246 .setDataBaseName(databaseName) 250 .setDataBaseName(databaseName)
247 .setSuperTableName(superTableName) 251 .setSuperTableName(superTableName)
248 .setTableName(thinkModelMessageDeviceTableName) 252 .setTableName(thinkModelMessageDeviceTableName)
249 .setDeviceKey(deviceKey)); 253 .setDeviceKey(deviceKey));
250 -  
251 } 254 }
252 255
253 /** 256 /**
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/util/IotTdDatabaseUtils.java
@@ -4,8 +4,10 @@ import cn.iocoder.yudao.module.iot.enums.IotConstants; @@ -4,8 +4,10 @@ import cn.iocoder.yudao.module.iot.enums.IotConstants;
4 import org.springframework.beans.factory.annotation.Value; 4 import org.springframework.beans.factory.annotation.Value;
5 import org.springframework.stereotype.Component; 5 import org.springframework.stereotype.Component;
6 6
  7 +// TODO @芋艿:可能要思索下,有没更好的处理方式
  8 +// TODO @芋艿:怎么改成无状态
7 /** 9 /**
8 - * TD数据库工具类 10 + * TD 数据库工具类
9 * 11 *
10 * @author AlwaysSuper 12 * @author AlwaysSuper
11 */ 13 */
@@ -19,6 +21,7 @@ public class IotTdDatabaseUtils { @@ -19,6 +21,7 @@ public class IotTdDatabaseUtils {
19 * 获取数据库名称 21 * 获取数据库名称
20 */ 22 */
21 public String getDatabaseName() { 23 public String getDatabaseName() {
  24 +// TODO @alwayssuper:StrUtil.subAfter("/")
22 int index = url.lastIndexOf("/"); 25 int index = url.lastIndexOf("/");
23 return index != -1 ? url.substring(index + 1) : url; 26 return index != -1 ? url.substring(index + 1) : url;
24 } 27 }
@@ -31,6 +34,7 @@ public class IotTdDatabaseUtils { @@ -31,6 +34,7 @@ public class IotTdDatabaseUtils {
31 * @return 产品超级表表名 34 * @return 产品超级表表名
32 */ 35 */
33 public static String getProductSuperTableName(Integer deviceType, String productKey) { 36 public static String getProductSuperTableName(Integer deviceType, String productKey) {
  37 + // TODO @alwayssuper:枚举字段,不要 1、2、3;不符合预期,抛出异常
34 return switch (deviceType) { 38 return switch (deviceType) {
35 case 1 -> String.format(IotConstants.GATEWAY_SUB_STABLE_NAME_FORMAT, productKey).toLowerCase(); 39 case 1 -> String.format(IotConstants.GATEWAY_SUB_STABLE_NAME_FORMAT, productKey).toLowerCase();
36 case 2 -> String.format(IotConstants.GATEWAY_STABLE_NAME_FORMAT, productKey).toLowerCase(); 40 case 2 -> String.format(IotConstants.GATEWAY_STABLE_NAME_FORMAT, productKey).toLowerCase();
@@ -45,7 +49,8 @@ public class IotTdDatabaseUtils { @@ -45,7 +49,8 @@ public class IotTdDatabaseUtils {
45 * @return 物模型日志超级表表名 49 * @return 物模型日志超级表表名
46 * 50 *
47 */ 51 */
48 - public static String getThinkModelMessageSuperTableName(String productKey) { 52 + public static String getThingModelMessageSuperTableName(String productKey) {
  53 + // TODO @alwayssuper:是不是应该 + 拼接就好,不用 format
49 return String.format("thing_model_message_", productKey).toLowerCase(); 54 return String.format("thing_model_message_", productKey).toLowerCase();
50 } 55 }
51 56
@@ -57,7 +62,7 @@ public class IotTdDatabaseUtils { @@ -57,7 +62,7 @@ public class IotTdDatabaseUtils {
57 * @return 物模型日志设备表名 62 * @return 物模型日志设备表名
58 */ 63 */
59 public static String getThinkModelMessageDeviceTableName(String productKey, String deviceName) { 64 public static String getThinkModelMessageDeviceTableName(String productKey, String deviceName) {
60 - return String.format(IotConstants.THINK_MODEL_MESSAGE_TABLE_NAME_FORMAT, productKey.toLowerCase(), deviceName.toLowerCase()); 65 + return String.format(IotConstants.THING_MODEL_MESSAGE_TABLE_NAME_FORMAT, productKey.toLowerCase(), deviceName.toLowerCase());
61 } 66 }
62 67
63 } 68 }
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/tdengine/TdThinkModelMessageMapper.xml
@@ -4,17 +4,17 @@ @@ -4,17 +4,17 @@
4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <mapper namespace="cn.iocoder.yudao.module.iot.dal.tdengine.TdThinkModelMessageMapper"> 5 <mapper namespace="cn.iocoder.yudao.module.iot.dal.tdengine.TdThinkModelMessageMapper">
6 6
7 -  
8 <!-- 创建物模型消息日志超级表 --> 7 <!-- 创建物模型消息日志超级表 -->
  8 + <!-- TODO @芋艿:捉摸下字段,特别是 sys、ts 这种缩写 -->
9 <update id="createSuperTable"> 9 <update id="createSuperTable">
10 CREATE STABLE ${dataBaseName}.${superTableName}( 10 CREATE STABLE ${dataBaseName}.${superTableName}(
11 - ts TIMESTAMP,  
12 - id VARCHAR(255),  
13 - sys VARCHAR(2048),  
14 - method VARCHAR(255),  
15 - params VARCHAR(2048) 11 + ts TIMESTAMP,
  12 + id VARCHAR(255),
  13 + sys VARCHAR(2048),
  14 + method VARCHAR(255),
  15 + params VARCHAR(2048)
16 )TAGS ( 16 )TAGS (
17 - deviceKey VARCHAR(255) 17 + deviceKey VARCHAR(255)
18 ) 18 )
19 </update> 19 </update>
20 20