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

This commit is contained in:
YunaiV 2025-01-27 21:32:33 +08:00
parent 043d82e5b6
commit 7745035fa4
4 changed files with 26 additions and 24 deletions

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.iot.dal.tdengine;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.SelectVisualDO;
@ -30,8 +31,8 @@ public interface IotDevicePropertyDataMapper {
default void alterProductPropertySTable(String productKey,
List<TDengineTableField> oldFields,
List<TDengineTableField> newFields) {
oldFields.removeIf(field -> TDengineTableField.FIELD_TS.equals(field.getField())
|| TDengineTableField.FIELD_DEVICE_KEY.equals(field.getField()));
oldFields.removeIf(field -> StrUtil.equalsAny(field.getField(),
TDengineTableField.FIELD_TS, "device_key", "report_time"));
List<TDengineTableField> addFields = newFields.stream().filter( // 新增的字段
newField -> oldFields.stream().noneMatch(oldField -> oldField.getField().equals(newField.getField())))
.collect(Collectors.toList());
@ -79,7 +80,8 @@ public interface IotDevicePropertyDataMapper {
@Param("field") TDengineTableField field);
void insert(@Param("device") IotDeviceDO device,
@Param("properties") Map<String, Object> properties);
@Param("properties") Map<String, Object> properties,
@Param("reportTime") Long reportTime);
// TODO @芋艿待实现
/**

View File

@ -17,11 +17,6 @@ public class TDengineTableField {
*/
public static final String FIELD_TS = "ts";
/**
* 字段名 - 我们系统定义的 device_key 字段 TDengine 默认字段
*/
public static final String FIELD_DEVICE_KEY = "device_key";
public static final String TYPE_TINYINT = "TINYINT";
public static final String TYPE_INT = "INT";
public static final String TYPE_FLOAT = "FLOAT";

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.iot.service.device.data;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
@ -97,7 +98,6 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService {
log.info("[defineDevicePropertyData][productId({}) 没有需要定义的属性]", productId);
return;
}
newFields.add(0, new TDengineTableField(TDengineTableField.FIELD_TS, TDengineTableField.TYPE_TIMESTAMP));
devicePropertyDataMapper.createProductPropertySTable(product.getProductKey(), newFields);
return;
}
@ -147,7 +147,8 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService {
}
// 3.1 保存设备属性数据
devicePropertyDataMapper.insert(device, properties);
devicePropertyDataMapper.insert(device, properties,
LocalDateTimeUtil.toEpochMilli(message.getReportTime())); // TODO @芋艿后续要看看查询的时候能不能用 LocalDateTime
// 3.2 保存设备属性日志
deviceDataRedisDAO.set(message.getDeviceKey(), convertMap(properties.entrySet(), Map.Entry::getKey,

View File

@ -9,13 +9,16 @@
</select>
<update id="createProductPropertySTable">
CREATE STABLE product_property_${productKey}
<foreach item="field" collection="fields" separator="," open="(" close=")">
CREATE STABLE product_property_${productKey} (
ts TIMESTAMP,
report_time TIMESTAMP,
<foreach item="field" collection="fields" separator=",">
${field.field} ${field.type}
<if test="field.length != null and field.length > 0">
(${field.length})
</if>
</foreach>
)
TAGS (
device_key NCHAR(50)
)
@ -42,19 +45,20 @@
DROP COLUMN ${field.field}
</update>
<insert id="insertDevicePropertyData">
INSERT INTO device_property_${deviceKey}
USING product_property_${productKey}
TAGS ('${deviceKey}')
(ts
<foreach item="item" collection="columns" separator=",">
,${item.fieldName}
<!-- TODO 芋艿report_time 需要增加下 -->
<insert id="insert">
INSERT INTO device_property_${device.deviceKey}
USING product_property_${device.productKey}
TAGS ('${device.deviceKey}')
(ts, report_time,
<foreach item="key" collection="properties.keys" separator=",">
${key}
</foreach>
)
VALUES
(NOW
<foreach item="item" collection="columns" separator=",">
,#{item.fieldValue}
(NOW, #{reportTime},
<foreach item="value" collection="properties.values" separator=",">
#{value}
</foreach>
)
</insert>