Commit 7745035fa4d43bced70a8ea96b35711ac624ea01

Authored by YunaiV
1 parent 043d82e5

【功能优化】IoT:设备属性日志表,增加 report_time 上报时间

yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/tdengine/IotDevicePropertyDataMapper.java
@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.iot.dal.tdengine; @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.iot.dal.tdengine;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
4 import cn.hutool.core.util.ObjectUtil; 4 import cn.hutool.core.util.ObjectUtil;
  5 +import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; 6 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
6 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; 7 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
7 import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.SelectVisualDO; 8 import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.SelectVisualDO;
@@ -30,8 +31,8 @@ public interface IotDevicePropertyDataMapper { @@ -30,8 +31,8 @@ public interface IotDevicePropertyDataMapper {
30 default void alterProductPropertySTable(String productKey, 31 default void alterProductPropertySTable(String productKey,
31 List<TDengineTableField> oldFields, 32 List<TDengineTableField> oldFields,
32 List<TDengineTableField> newFields) { 33 List<TDengineTableField> newFields) {
33 - oldFields.removeIf(field -> TDengineTableField.FIELD_TS.equals(field.getField())  
34 - || TDengineTableField.FIELD_DEVICE_KEY.equals(field.getField())); 34 + oldFields.removeIf(field -> StrUtil.equalsAny(field.getField(),
  35 + TDengineTableField.FIELD_TS, "device_key", "report_time"));
35 List<TDengineTableField> addFields = newFields.stream().filter( // 新增的字段 36 List<TDengineTableField> addFields = newFields.stream().filter( // 新增的字段
36 newField -> oldFields.stream().noneMatch(oldField -> oldField.getField().equals(newField.getField()))) 37 newField -> oldFields.stream().noneMatch(oldField -> oldField.getField().equals(newField.getField())))
37 .collect(Collectors.toList()); 38 .collect(Collectors.toList());
@@ -79,7 +80,8 @@ public interface IotDevicePropertyDataMapper { @@ -79,7 +80,8 @@ public interface IotDevicePropertyDataMapper {
79 @Param("field") TDengineTableField field); 80 @Param("field") TDengineTableField field);
80 81
81 void insert(@Param("device") IotDeviceDO device, 82 void insert(@Param("device") IotDeviceDO device,
82 - @Param("properties") Map<String, Object> properties); 83 + @Param("properties") Map<String, Object> properties,
  84 + @Param("reportTime") Long reportTime);
83 85
84 // TODO @芋艿:待实现 86 // TODO @芋艿:待实现
85 /** 87 /**
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/framework/tdengine/core/TDengineTableField.java
@@ -17,11 +17,6 @@ public class TDengineTableField { @@ -17,11 +17,6 @@ public class TDengineTableField {
17 */ 17 */
18 public static final String FIELD_TS = "ts"; 18 public static final String FIELD_TS = "ts";
19 19
20 - /**  
21 - * 字段名 - 我们系统定义的 device_key 字段,非 TDengine 默认字段  
22 - */  
23 - public static final String FIELD_DEVICE_KEY = "device_key";  
24 -  
25 public static final String TYPE_TINYINT = "TINYINT"; 20 public static final String TYPE_TINYINT = "TINYINT";
26 public static final String TYPE_INT = "INT"; 21 public static final String TYPE_INT = "INT";
27 public static final String TYPE_FLOAT = "FLOAT"; 22 public static final String TYPE_FLOAT = "FLOAT";
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/data/IotDevicePropertyServiceImpl.java
1 package cn.iocoder.yudao.module.iot.service.device.data; 1 package cn.iocoder.yudao.module.iot.service.device.data;
2 2
3 import cn.hutool.core.collection.CollUtil; 3 import cn.hutool.core.collection.CollUtil;
  4 +import cn.hutool.core.date.LocalDateTimeUtil;
4 import cn.hutool.core.map.MapUtil; 5 import cn.hutool.core.map.MapUtil;
5 import cn.hutool.core.util.StrUtil; 6 import cn.hutool.core.util.StrUtil;
6 import cn.hutool.json.JSONObject; 7 import cn.hutool.json.JSONObject;
@@ -97,7 +98,6 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService { @@ -97,7 +98,6 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService {
97 log.info("[defineDevicePropertyData][productId({}) 没有需要定义的属性]", productId); 98 log.info("[defineDevicePropertyData][productId({}) 没有需要定义的属性]", productId);
98 return; 99 return;
99 } 100 }
100 - newFields.add(0, new TDengineTableField(TDengineTableField.FIELD_TS, TDengineTableField.TYPE_TIMESTAMP));  
101 devicePropertyDataMapper.createProductPropertySTable(product.getProductKey(), newFields); 101 devicePropertyDataMapper.createProductPropertySTable(product.getProductKey(), newFields);
102 return; 102 return;
103 } 103 }
@@ -147,7 +147,8 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService { @@ -147,7 +147,8 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService {
147 } 147 }
148 148
149 // 3.1 保存设备属性【数据】 149 // 3.1 保存设备属性【数据】
150 - devicePropertyDataMapper.insert(device, properties); 150 + devicePropertyDataMapper.insert(device, properties,
  151 + LocalDateTimeUtil.toEpochMilli(message.getReportTime())); // TODO @芋艿:后续要看看,查询的时候,能不能用 LocalDateTime
151 152
152 // 3.2 保存设备属性【日志】 153 // 3.2 保存设备属性【日志】
153 deviceDataRedisDAO.set(message.getDeviceKey(), convertMap(properties.entrySet(), Map.Entry::getKey, 154 deviceDataRedisDAO.set(message.getDeviceKey(), convertMap(properties.entrySet(), Map.Entry::getKey,
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/IotDevicePropertyDataMapper.xml
@@ -9,13 +9,16 @@ @@ -9,13 +9,16 @@
9 </select> 9 </select>
10 10
11 <update id="createProductPropertySTable"> 11 <update id="createProductPropertySTable">
12 - CREATE STABLE product_property_${productKey}  
13 - <foreach item="field" collection="fields" separator="," open="(" close=")"> 12 + CREATE STABLE product_property_${productKey} (
  13 + ts TIMESTAMP,
  14 + report_time TIMESTAMP,
  15 + <foreach item="field" collection="fields" separator=",">
14 ${field.field} ${field.type} 16 ${field.field} ${field.type}
15 <if test="field.length != null and field.length > 0"> 17 <if test="field.length != null and field.length > 0">
16 (${field.length}) 18 (${field.length})
17 </if> 19 </if>
18 </foreach> 20 </foreach>
  21 + )
19 TAGS ( 22 TAGS (
20 device_key NCHAR(50) 23 device_key NCHAR(50)
21 ) 24 )
@@ -42,19 +45,20 @@ @@ -42,19 +45,20 @@
42 DROP COLUMN ${field.field} 45 DROP COLUMN ${field.field}
43 </update> 46 </update>
44 47
45 - <insert id="insertDevicePropertyData">  
46 - INSERT INTO device_property_${deviceKey}  
47 - USING product_property_${productKey}  
48 - TAGS ('${deviceKey}')  
49 - (ts  
50 - <foreach item="item" collection="columns" separator=",">  
51 - ,${item.fieldName} 48 + <!-- TODO 芋艿,report_time 需要增加下 -->
  49 + <insert id="insert">
  50 + INSERT INTO device_property_${device.deviceKey}
  51 + USING product_property_${device.productKey}
  52 + TAGS ('${device.deviceKey}')
  53 + (ts, report_time,
  54 + <foreach item="key" collection="properties.keys" separator=",">
  55 + ${key}
52 </foreach> 56 </foreach>
53 - )  
54 - VALUES  
55 - (NOW  
56 - <foreach item="item" collection="columns" separator=",">  
57 - ,#{item.fieldValue} 57 + )
  58 + VALUES
  59 + (NOW, #{reportTime},
  60 + <foreach item="value" collection="properties.values" separator=",">
  61 + #{value}
58 </foreach> 62 </foreach>
59 ) 63 )
60 </insert> 64 </insert>