Commit 043d82e5b6e88c3533974a62911dd7dab796ff07

Authored by YunaiV
1 parent 8e80a53a

【功能优化】IoT:完整实现 saveDeviceProperty 的设备属性日志的保存

yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/tdengine/IotDevicePropertyDataMapper.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.iot.dal.tdengine; @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.iot.dal.tdengine;
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.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; 5 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
  6 +import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
6 import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.SelectVisualDO; 7 import cn.iocoder.yudao.module.iot.dal.dataobject.tdengine.SelectVisualDO;
7 import cn.iocoder.yudao.module.iot.framework.tdengine.core.TDengineTableField; 8 import cn.iocoder.yudao.module.iot.framework.tdengine.core.TDengineTableField;
8 import cn.iocoder.yudao.module.iot.framework.tdengine.core.annotation.TDengineDS; 9 import cn.iocoder.yudao.module.iot.framework.tdengine.core.annotation.TDengineDS;
@@ -77,6 +78,9 @@ public interface IotDevicePropertyDataMapper { @@ -77,6 +78,9 @@ public interface IotDevicePropertyDataMapper {
77 void alterProductPropertySTableDropField(@Param("productKey") String productKey, 78 void alterProductPropertySTableDropField(@Param("productKey") String productKey,
78 @Param("field") TDengineTableField field); 79 @Param("field") TDengineTableField field);
79 80
  81 + void insert(@Param("device") IotDeviceDO device,
  82 + @Param("properties") Map<String, Object> properties);
  83 +
80 // TODO @芋艿:待实现 84 // TODO @芋艿:待实现
81 /** 85 /**
82 * 获取历史数据列表 86 * 获取历史数据列表
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/data/IotDevicePropertyServiceImpl.java
@@ -6,7 +6,7 @@ import cn.hutool.core.util.StrUtil; @@ -6,7 +6,7 @@ import cn.hutool.core.util.StrUtil;
6 import cn.hutool.json.JSONObject; 6 import cn.hutool.json.JSONObject;
7 import cn.hutool.json.JSONUtil; 7 import cn.hutool.json.JSONUtil;
8 import cn.iocoder.yudao.framework.common.pojo.PageResult; 8 import cn.iocoder.yudao.framework.common.pojo.PageResult;
9 -import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils; 9 +import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
10 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.deviceData.IotDeviceDataPageReqVO; 10 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.deviceData.IotDeviceDataPageReqVO;
11 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.deviceData.IotDeviceDataSimulatorSaveReqVO; 11 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.deviceData.IotDeviceDataSimulatorSaveReqVO;
12 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType.ThingModelDateOrTextDataSpecs; 12 import cn.iocoder.yudao.module.iot.controller.admin.thingmodel.model.dataType.ThingModelDateOrTextDataSpecs;
@@ -16,7 +16,6 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; @@ -16,7 +16,6 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO;
16 import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO; 16 import cn.iocoder.yudao.module.iot.dal.dataobject.thingmodel.IotThingModelDO;
17 import cn.iocoder.yudao.module.iot.dal.redis.device.DevicePropertyRedisDAO; 17 import cn.iocoder.yudao.module.iot.dal.redis.device.DevicePropertyRedisDAO;
18 import cn.iocoder.yudao.module.iot.dal.tdengine.IotDevicePropertyDataMapper; 18 import cn.iocoder.yudao.module.iot.dal.tdengine.IotDevicePropertyDataMapper;
19 -import cn.iocoder.yudao.module.iot.enums.IotConstants;  
20 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotDataSpecsDataTypeEnum; 19 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotDataSpecsDataTypeEnum;
21 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum; 20 import cn.iocoder.yudao.module.iot.enums.thingmodel.IotThingModelTypeEnum;
22 import cn.iocoder.yudao.module.iot.framework.tdengine.core.TDengineTableField; 21 import cn.iocoder.yudao.module.iot.framework.tdengine.core.TDengineTableField;
@@ -27,7 +26,6 @@ import cn.iocoder.yudao.module.iot.service.thingmodel.IotThingModelService; @@ -27,7 +26,6 @@ import cn.iocoder.yudao.module.iot.service.thingmodel.IotThingModelService;
27 import jakarta.annotation.Resource; 26 import jakarta.annotation.Resource;
28 import jakarta.validation.Valid; 27 import jakarta.validation.Valid;
29 import lombok.extern.slf4j.Slf4j; 28 import lombok.extern.slf4j.Slf4j;
30 -import org.springframework.beans.factory.annotation.Value;  
31 import org.springframework.stereotype.Service; 29 import org.springframework.stereotype.Service;
32 30
33 import java.util.ArrayList; 31 import java.util.ArrayList;
@@ -63,9 +61,6 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService { @@ -63,9 +61,6 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService {
63 .put(IotDataSpecsDataTypeEnum.ARRAY.getDataType(), TDengineTableField.TYPE_NCHAR) // TODO 芋艿:怎么映射!!!! 61 .put(IotDataSpecsDataTypeEnum.ARRAY.getDataType(), TDengineTableField.TYPE_NCHAR) // TODO 芋艿:怎么映射!!!!
64 .build(); 62 .build();
65 63
66 - @Value("${spring.datasource.dynamic.datasource.tdengine.url}")  
67 - private String url;  
68 -  
69 @Resource 64 @Resource
70 private IotDeviceService deviceService; 65 private IotDeviceService deviceService;
71 @Resource 66 @Resource
@@ -123,22 +118,21 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService { @@ -123,22 +118,21 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService {
123 } 118 }
124 119
125 @Override 120 @Override
  121 + @TenantIgnore // TODO @芋艿:租户的缓存问题,需要考虑下。因为会存在一会又 tenantId,一会没有!
126 public void saveDeviceProperty(IotDeviceMessage message) { 122 public void saveDeviceProperty(IotDeviceMessage message) {
127 if (!(message.getData() instanceof Map)) { 123 if (!(message.getData() instanceof Map)) {
128 log.error("[saveDeviceProperty][消息内容({}) 的 data 类型不正确]", message); 124 log.error("[saveDeviceProperty][消息内容({}) 的 data 类型不正确]", message);
129 return; 125 return;
130 } 126 }
131 // 1. 获得设备信息 127 // 1. 获得设备信息
132 - IotDeviceDO device = TenantUtils.executeIgnore(() ->  
133 - deviceService.getDeviceByProductKeyAndDeviceName(message.getProductKey(), message.getDeviceName())); 128 + IotDeviceDO device = deviceService.getDeviceByProductKeyAndDeviceName(message.getProductKey(), message.getDeviceName());
134 if (device == null) { 129 if (device == null) {
135 log.error("[saveDeviceProperty][消息({}) 对应的设备不存在]", message); 130 log.error("[saveDeviceProperty][消息({}) 对应的设备不存在]", message);
136 return; 131 return;
137 } 132 }
138 133
139 // 2. 根据物模型,拼接合法的属性 134 // 2. 根据物模型,拼接合法的属性
140 - List<IotThingModelDO> thingModels = TenantUtils.executeIgnore(() ->  
141 - thingModelService.getThingModelListByProductId(device.getProductId())); 135 + List<IotThingModelDO> thingModels = thingModelService.getThingModelListByProductId(device.getProductId());
142 Map<String, Object> properties = new HashMap<>(); 136 Map<String, Object> properties = new HashMap<>();
143 ((Map<?, ?>) message.getData()).forEach((key, value) -> { 137 ((Map<?, ?>) message.getData()).forEach((key, value) -> {
144 if (CollUtil.findOne(thingModels, thingModel -> thingModel.getIdentifier().equals(key)) == null) { 138 if (CollUtil.findOne(thingModels, thingModel -> thingModel.getIdentifier().equals(key)) == null) {
@@ -152,10 +146,10 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService { @@ -152,10 +146,10 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService {
152 return; 146 return;
153 } 147 }
154 148
155 - // 3.1 保存属性【数据】  
156 - // TODO 芋艿,未实现 149 + // 3.1 保存设备属性【数据】
  150 + devicePropertyDataMapper.insert(device, properties);
157 151
158 - // 3.2 保存属性【日志】 152 + // 3.2 保存设备属性【日志】
159 deviceDataRedisDAO.set(message.getDeviceKey(), convertMap(properties.entrySet(), Map.Entry::getKey, 153 deviceDataRedisDAO.set(message.getDeviceKey(), convertMap(properties.entrySet(), Map.Entry::getKey,
160 entry -> IotDevicePropertyDO.builder().value(entry.getValue()).updateTime(message.getReportTime()).build())); 154 entry -> IotDevicePropertyDO.builder().value(entry.getValue()).updateTime(message.getReportTime()).build()));
161 } 155 }
@@ -248,12 +242,12 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService { @@ -248,12 +242,12 @@ public class IotDevicePropertyServiceImpl implements IotDevicePropertyService {
248 return null; // TODO 芋艿:晚点实现 242 return null; // TODO 芋艿:晚点实现
249 } 243 }
250 244
251 - private String getDatabaseName() {  
252 - return StrUtil.subAfter(url, "/", true);  
253 - }  
254 -  
255 - private static String getDeviceTableName(String productKey, String deviceName) {  
256 - return String.format(IotConstants.DEVICE_TABLE_NAME_FORMAT, productKey, deviceName);  
257 - } 245 +// private String getDatabaseName() {
  246 +// return StrUtil.subAfter(url, "/", true);
  247 +// }
  248 +//
  249 +// private static String getDeviceTableName(String productKey, String deviceName) {
  250 +// return String.format(IotConstants.DEVICE_TABLE_NAME_FORMAT, productKey, deviceName);
  251 +// }
258 252
259 } 253 }
260 \ No newline at end of file 254 \ No newline at end of file