From 8502fb2a1648d1453f96b4288d68c16dfcf5bae5 Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期一, 12 五月 2025 16:19:49 +0800
Subject: [PATCH] feat(data): 新增mqtt电表数据解析和写入,新增opcua电表和温湿度计数据解析和写入

---
 src/main/java/com/zhitan/service/impl/DataServiceImpl.java |   59 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 58 insertions(+), 1 deletions(-)

diff --git a/src/main/java/com/zhitan/service/impl/DataServiceImpl.java b/src/main/java/com/zhitan/service/impl/DataServiceImpl.java
index fc1af3d..18d8376 100644
--- a/src/main/java/com/zhitan/service/impl/DataServiceImpl.java
+++ b/src/main/java/com/zhitan/service/impl/DataServiceImpl.java
@@ -11,6 +11,7 @@
 import com.zhitan.model.entity.ElectricPower;
 import com.zhitan.influxdb.InfluxdbRepository;
 import com.zhitan.mapper.CommonMapper;
+import com.zhitan.model.entity.PowerEntity;
 import com.zhitan.redis.RedisCache;
 import com.zhitan.service.IDataService;
 import lombok.extern.slf4j.Slf4j;
@@ -23,6 +24,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 鏁版嵁service
@@ -118,6 +120,61 @@
         repository.writePoints(points);
     }
 
+
+    /**
+     * 鍐欏叆鐢靛姏鐩稿叧鏁版嵁-鍥哄畾鏍煎紡锛屽彲鑷畾涔変慨鏀�
+     *
+     * @param powerEntity 鍥哄畾鏍煎紡鐨勬暟鎹�
+     */
+    @Override
+    public void writeTimeSeriesData(@NotNull PowerEntity powerEntity) {
+        List<IndexTemplate> templates = getIndexTemplate();
+        // 鑾峰彇绫讳腑鎵�鏈夊0鏄庣殑瀛楁
+        Field[] fields = powerEntity.getClass().getDeclaredFields();
+        List<Point> points = new ArrayList<>();
+        for (Field field : fields) {
+            IndexTemplate indexTemplate = templates.stream().filter(template ->
+                            field.getName().equalsIgnoreCase(template.getGatewayKey()))
+                    .findFirst().orElse(null);
+            if (indexTemplate != null) {
+                Point point = Point
+                        .measurement(influxdbConfig.getMeasurement())
+                        .addTag(TAG, powerEntity.getSn() + "_" + indexTemplate.getCode())
+                        .time(Instant.now(), WritePrecision.S);
+                // 璁剧疆瀛楁鍙闂紝鍏佽璁块棶绉佹湁瀛楁
+                field.setAccessible(true);
+                if (Number.class.isAssignableFrom(field.getType()) || field.getType().isPrimitive()) {
+                    try {
+                        // 鑾峰彇瀛楁鍊�
+                        Object o = field.get(powerEntity);
+                        if (o==null) {
+                            // 鏌ヨ鍑烘渶鍚庝竴娆″啓鍏nfluxdb鐨勬暟鎹�
+                            double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),
+                                    TAG, powerEntity.getSn() + "_" + indexTemplate.getCode());
+                            if (lastValue>0) {
+                                log.info("鏌ヨ鍑烘渶鍚庝竴娆″啓鍏nfluxdb鐨勬暟鎹�:{}", lastValue);
+                            }
+                            point.addField(FIELD_VALUE, lastValue);
+                        } else {
+                            // 瀹夊叏绫诲瀷杞崲
+                            if (o instanceof Number) {
+                                double value = ((Number) o).doubleValue();
+                                point.addField(FIELD_VALUE, value);
+                                // 浣跨敤 value...
+                            } else {
+                                log.error("瀛楁 {} 绫诲瀷闈炴硶: {}", field.getName(), o.getClass());
+                            }
+                        }
+                        points.add(point);
+                    } catch (IllegalAccessException e) {
+                        log.error("鑾峰彇灞炴�у�煎け璐�:{}", e.getMessage());
+                    }
+                }
+            }
+        }
+        repository.writePoints(points);
+    }
+
     /**
      * 鑾峰彇鐐逛綅妯℃澘
      */
@@ -126,7 +183,7 @@
         List<IndexTemplate> result = redisCache.getCacheList(TEMPLATE_KEY);
         if (result == null || result.isEmpty()) {
             result = commonMapper.getIndexTemplate();
-            redisCache.setCacheList(TEMPLATE_KEY, result);
+            redisCache.setCacheList(TEMPLATE_KEY, result, 120, TimeUnit.SECONDS);
         }
         return result;
     }

--
Gitblit v1.9.3