Browse Source

feat: 设备属性缓存-添加属性修改时间

jay 1 year ago
parent
commit
84179802c9

+ 35 - 0
iot-common/iot-common-dao/iot-common-model/src/main/java/cc/iotkit/model/device/message/DevicePropertyCache.java

@@ -0,0 +1,35 @@
+/*
+ * +----------------------------------------------------------------------
+ * | Copyright (c) 奇特物联 2021-2022 All rights reserved.
+ * +----------------------------------------------------------------------
+ * | Licensed 未经许可不能去掉「奇特物联」相关版权
+ * +----------------------------------------------------------------------
+ * | Author: xw2sy@163.com
+ * +----------------------------------------------------------------------
+ */
+package cc.iotkit.model.device.message;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Map;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class DevicePropertyCache {
+
+
+    // 属性值
+    private Object value;
+
+    // 属性值时间: 设备上报时间
+    private Long occurred;
+
+
+    public Map<String, Object> toMap() {
+        return Map.of("value", value, "occurred", occurred);
+    }
+
+}

+ 4 - 1
iot-common/iot-common-dao/iot-temporal-serviceImpl-es/src/main/java/cc/iotkit/temporal/es/service/DevicePropertyDataImpl.java

@@ -13,6 +13,7 @@ import cc.iotkit.common.utils.MapstructUtils;
 import cc.iotkit.data.manager.IDeviceInfoData;
 import cc.iotkit.model.device.DeviceInfo;
 import cc.iotkit.model.device.message.DeviceProperty;
+import cc.iotkit.model.device.message.DevicePropertyCache;
 import cc.iotkit.temporal.IDevicePropertyData;
 import cc.iotkit.temporal.es.document.DocDeviceProperty;
 import org.elasticsearch.index.query.QueryBuilders;
@@ -63,9 +64,11 @@ public class DevicePropertyDataImpl implements IDevicePropertyData {
     @Override
     public void addProperties(String deviceId, Map<String, Object> properties, long time) {
         properties.forEach((key, val) -> {
+            DevicePropertyCache propertyCache = (DevicePropertyCache) val;
             String index = getIndex(deviceId, key);
+            long occurred =  Objects.nonNull( propertyCache.getOccurred() )? propertyCache.getOccurred() : time;
             template.save(
-                    new DocDeviceProperty(UUID.randomUUID().toString(), deviceId, key, val, time),
+                    new DocDeviceProperty(UUID.randomUUID().toString(), deviceId, key, propertyCache.getValue(), occurred),
                     IndexCoordinates.of(index)
             );
         });

+ 8 - 4
iot-common/iot-common-dao/iot-temproal-serviceImpl-td/src/main/java/cc/iotkit/temporal/td/service/DevicePropertyDataImpl.java

@@ -12,6 +12,7 @@ package cc.iotkit.temporal.td.service;
 import cc.iotkit.data.manager.IDeviceInfoData;
 import cc.iotkit.model.device.DeviceInfo;
 import cc.iotkit.model.device.message.DeviceProperty;
+import cc.iotkit.model.device.message.DevicePropertyCache;
 import cc.iotkit.temporal.IDevicePropertyData;
 import cc.iotkit.temporal.td.config.Constants;
 import cc.iotkit.temporal.td.dao.TdTemplate;
@@ -22,9 +23,7 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Slf4j
@@ -65,10 +64,15 @@ public class DevicePropertyDataImpl implements IDevicePropertyData {
         if (device == null) {
             return;
         }
+        Map<String, Object> propertiesMap = new HashMap<>();
+        properties.forEach((key, val) -> {
+            DevicePropertyCache propertyCache = (DevicePropertyCache) val;
+            propertiesMap.put(key, propertyCache.getValue());
+        });
         //获取设备旧属性
         Map<String, Object> oldProperties = deviceInfoData.getProperties(deviceId);
         //用新属性覆盖
-        oldProperties.putAll(properties);
+        oldProperties.putAll(propertiesMap);
 
         StringBuilder sbFieldNames = new StringBuilder();
         StringBuilder sbFieldPlaces = new StringBuilder();

+ 8 - 2
iot-components/iot-component-server/src/main/java/cc/iotkit/comps/service/DevicePropertyConsumer.java

@@ -15,6 +15,7 @@ import cc.iotkit.common.utils.StringUtils;
 import cc.iotkit.data.manager.IDeviceInfoData;
 import cc.iotkit.data.manager.IThingModelData;
 import cc.iotkit.model.device.DeviceInfo;
+import cc.iotkit.model.device.message.DevicePropertyCache;
 import cc.iotkit.model.device.message.ThingModelMessage;
 import cc.iotkit.model.product.ThingModel;
 import cc.iotkit.mq.ConsumerHandler;
@@ -78,10 +79,14 @@ public class DevicePropertyConsumer implements ConsumerHandler<ThingModelMessage
                 ThingModel.Property::getIdentifier, ThingModel.Property::getDataType));
 
         Map<String, Object> addProperties = new HashMap<>();
+        Long occurred = msg.getOccurred();
         //删除非属性字段
         properties.forEach((key,val)->{
             if (thingModelProperties.containsKey(key)) {
-                addProperties.put(key,val);
+                DevicePropertyCache propertyCache = new DevicePropertyCache();
+                propertyCache.setValue(val);
+                propertyCache.setOccurred(occurred);
+                addProperties.put(key,propertyCache);
                 handleLocate(deviceInfo,val,thingModelProperties.get(key));
             }
         });
@@ -91,12 +96,13 @@ public class DevicePropertyConsumer implements ConsumerHandler<ThingModelMessage
 
         //保存属性记录
         try {
-            devicePropertyData.addProperties(deviceId, addProperties, msg.getOccurred());
+            devicePropertyData.addProperties(deviceId, addProperties, occurred);
         } catch (Throwable e) {
             log.warn("save property data error", e);
         }
     }
 
+
     private  void handleLocate(DeviceInfo deviceInfo,Object data,ThingModel.DataType dataType){
         if("position".equals(dataType.getType())){//如果是定位属性需要做一些处理
             Object specs = dataType.getSpecs();