From d2ab6f7153e604bac7bc4ad58f27f368b65d8a1e Mon Sep 17 00:00:00 2001
From: yuan <123@>
Date: 星期二, 16 六月 2026 13:54:58 +0800
Subject: [PATCH] feat: 添加能耗数据综合分析功能,支持按天和周维度的趋势分析

---
 src/main/java/com/ruoyi/http/service/impl/TqdianbiaoMeterSyncServiceImpl.java |  112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 112 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/ruoyi/http/service/impl/TqdianbiaoMeterSyncServiceImpl.java b/src/main/java/com/ruoyi/http/service/impl/TqdianbiaoMeterSyncServiceImpl.java
new file mode 100644
index 0000000..33adca4
--- /dev/null
+++ b/src/main/java/com/ruoyi/http/service/impl/TqdianbiaoMeterSyncServiceImpl.java
@@ -0,0 +1,112 @@
+package com.ruoyi.http.service.impl;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.utils.http.HttpUtils;
+import com.ruoyi.http.config.TqdianbiaoConfig;
+import com.ruoyi.http.mapper.TqdianbiaoMeterMapper;
+import com.ruoyi.http.pojo.TqdianbiaoMeter;
+import com.ruoyi.http.service.TqdianbiaoMeterSyncService;
+import com.ruoyi.http.service.TqdianbiaoSyncLogService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.time.LocalDateTime;
+
+@Service
+@Slf4j
+@RequiredArgsConstructor
+public class TqdianbiaoMeterSyncServiceImpl implements TqdianbiaoMeterSyncService {
+
+    private final TqdianbiaoConfig config;
+    private final TqdianbiaoMeterMapper meterMapper;
+    private final TqdianbiaoSyncLogService syncLogService;
+
+    @Override
+    public int syncMeters() {
+        String syncType = "meter";
+        try {
+            String url = config.getBaseUrl() + "/Api/Meter";
+            String param = "auth=" + config.getAuth();
+            String raw = HttpUtils.sendGet(url, param);
+            JSONArray list = parseList(raw);
+            LocalDateTime now = LocalDateTime.now();
+            int count = 0;
+            for (int i = 0; i < list.size(); i++) {
+                JSONObject item = list.getJSONObject(i);
+                if (!"0".equals(String.valueOf(item.get("device_type")))) {
+                    continue;
+                }
+                Long meterId = item.getLong("id");
+                if (meterId == null) {
+                    continue;
+                }
+                TqdianbiaoMeter entity = meterMapper.selectOne(
+                        Wrappers.<TqdianbiaoMeter>lambdaQuery()
+                                .eq(TqdianbiaoMeter::getMeterId, meterId)
+                                .last("LIMIT 1"));
+                boolean isNew = entity == null;
+                if (isNew) {
+                    entity = new TqdianbiaoMeter();
+                    entity.setMeterId(meterId);
+                    entity.setSource("sync");
+                }
+                String savedName = entity.getMeterName();
+                String savedAddress = entity.getAddress();
+                String savedDesc = entity.getDescription();
+                String savedRelay = entity.getRelayState();
+
+                entity.setCollectorId(item.getString("cid"));
+                entity.setCollectorNo(item.getString("collectorid"));
+                entity.setMeterType(item.getString("type"));
+                entity.setCsq(item.getInteger("csq"));
+                entity.setRate(item.getInteger("rate"));
+                entity.setSyncTime(now);
+
+                if (isNew) {
+                    entity.setAddress(item.getString("address"));
+                    entity.setRelayState(item.getString("relay_state"));
+                    entity.setDescription(item.getString("description"));
+                    entity.setMeterName(StringUtils.hasText(savedName) ? savedName : item.getString("address"));
+                } else {
+                    entity.setMeterName(savedName);
+                    entity.setAddress(savedAddress);
+                    entity.setDescription(savedDesc);
+                    entity.setRelayState(savedRelay);
+                }
+                if (entity.getId() == null) {
+                    meterMapper.insert(entity);
+                } else {
+                    meterMapper.updateById(entity);
+                }
+                count++;
+            }
+            syncLogService.logSuccess(syncType, null, null, count);
+            return count;
+        } catch (Exception e) {
+            log.error("鐢佃〃鍚屾澶辫触", e);
+            syncLogService.logFailure(syncType, null, null, e.getMessage());
+            throw e;
+        }
+    }
+
+    private JSONArray parseList(String raw) {
+        Object parsed = JSON.parse(raw);
+        if (parsed instanceof JSONArray) {
+            return (JSONArray) parsed;
+        }
+        JSONObject root = (JSONObject) parsed;
+        if (root.getIntValue("status") != 1) {
+            throw new IllegalStateException("鐢佃〃鎺ュ彛杩斿洖寮傚父: " + raw);
+        }
+        Object data = root.get("data");
+        if (data instanceof JSONArray) {
+            return (JSONArray) data;
+        }
+        return new JSONArray();
+    }
+}

--
Gitblit v1.9.3