From be00ddc83f86599916eb8d0f581f448aa74c9d51 Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期四, 19 六月 2025 08:55:57 +0800
Subject: [PATCH] feat(mqtt): 增加对空调设备数据的处理

---
 src/main/java/com/zhitan/service/impl/DataServiceImpl.java |  137 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 136 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..1b31f0d 100644
--- a/src/main/java/com/zhitan/service/impl/DataServiceImpl.java
+++ b/src/main/java/com/zhitan/service/impl/DataServiceImpl.java
@@ -11,6 +11,8 @@
 import com.zhitan.model.entity.ElectricPower;
 import com.zhitan.influxdb.InfluxdbRepository;
 import com.zhitan.mapper.CommonMapper;
+import com.zhitan.model.entity.KtDataEntity;
+import com.zhitan.model.entity.PowerEntity;
 import com.zhitan.redis.RedisCache;
 import com.zhitan.service.IDataService;
 import lombok.extern.slf4j.Slf4j;
@@ -23,6 +25,7 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 /**
  * 鏁版嵁service
@@ -118,6 +121,138 @@
         repository.writePoints(points);
     }
 
+
+    /**
+     * 鍐欏叆鐢靛姏鐩稿叧鏁版嵁-鍥哄畾鏍煎紡锛屽彲鑷畾涔変慨鏀�
+     *
+     * @param powerEntity 鍥哄畾鏍煎紡鐨勬暟鎹�
+     */
+    @Override
+    public void writeTimeSeriesData(@NotNull PowerEntity powerEntity) {
+        List<IndexTemplate> templates = getIndexTemplate();
+        // 鍒ゆ柇鎬绘湁鍔熸槸鍚︿负绌猴紝濡傛灉涓虹┖鍒ゆ柇姝e悜鏈夊姛鍜屽弽鍚戞湁鍔熸槸鍚︿负绌猴紝濡傛灉鍚庝袱涓换鎰忎竴涓笉涓虹┖锛屽垯浠庢椂搴忔暟鎹簱涓幏鍙栦负绌虹殑閭d竴涓紝鐒跺悗灏嗘�绘湁鍔熻兘鐢佃兘璧嬪�间负姝e悜鏈夊姛鑳界數鑳藉噺鍘诲弽鍚戞湁鍔熻兘鐢佃兘
+        if (powerEntity.getEps() == null) {
+            if (powerEntity.getEpsp() != null && powerEntity.getEpsn() != null) {
+                powerEntity.setEps(powerEntity.getEpsp() - powerEntity.getEpsn());
+            } else if (powerEntity.getEpsp() != null) {
+                double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),
+                        TAG, powerEntity.getSn() + "_" + "Exp");
+                powerEntity.setEps(powerEntity.getEpsp() - lastValue);
+
+            } else if (powerEntity.getEpsn() != null) {
+                double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),
+                        TAG, powerEntity.getSn() + "_" + "ActiveZT");
+                powerEntity.setEps(lastValue - powerEntity.getEpsn());
+            }
+        }
+        // 鍒ゆ柇鎬绘棤鍔熸槸鍚︿负绌猴紝濡傛灉涓虹┖鍒ゆ柇姝e悜鏃犲姛鍜屽弽鍚戞棤鍔熸槸鍚︿负绌猴紝濡傛灉鍚庝袱涓换鎰忎竴涓笉涓虹┖锛屽垯浠庢椂搴忔暟鎹簱涓幏鍙栦负绌虹殑閭d竴涓紝鐒跺悗灏嗘�绘棤鍔熺數鑳借祴鍊间负姝e悜鏃犲姛鐢佃兘鍜屽弽鍚戞棤鍔熺數鑳界殑缁濆鍊间箣鍜�
+        if (powerEntity.getEqs() == null) {
+            if (powerEntity.getEqsp() != null && powerEntity.getEqsn() != null) {
+                powerEntity.setEqs(Math.abs(powerEntity.getEqsp()) + Math.abs(powerEntity.getEqsn()));
+            } else if (powerEntity.getEqsp() != null) {
+                double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),
+                        TAG, powerEntity.getSn() + "_" + "ExpZN");
+                powerEntity.setEqs(Math.abs(lastValue) + Math.abs(powerEntity.getEqsp()));
+            } else if (powerEntity.getEqsn() != null) {
+                double lastValue = repository.getLastPoint(influxdbConfig.getMeasurement(),
+                        TAG, powerEntity.getSn() + "_" + "ActiveZN");
+                powerEntity.setEqs(Math.abs(lastValue) + Math.abs(powerEntity.getEqsn()));
+            }
+        }
+        // 鑾峰彇绫讳腑鎵�鏈夊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);
+    }
+
+
+    /**
+     * 鍐欏叆KT鏁版嵁
+     *
+     * @param ktDataEntity 鍥哄畾鏍煎紡鐨勬暟鎹�
+     */
+    @Override
+    public void writeTimeSeriesData(KtDataEntity ktDataEntity) {
+        List<IndexTemplate> templates = getIndexTemplate();
+        // 鑾峰彇绫讳腑鎵�鏈夊0鏄庣殑瀛楁
+        Field[] fields = ktDataEntity.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, ktDataEntity.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(ktDataEntity);
+                                if (o!=null) {
+                                    // 瀹夊叏绫诲瀷杞崲
+                                    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) {
+                                throw new RuntimeException(e);
+                            }
+                        }
+                    }
+
+
+        }
+        repository.writePoints(points);
+    }
+
     /**
      * 鑾峰彇鐐逛綅妯℃澘
      */
@@ -126,7 +261,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