From 6ced33fcb2f7454242fb7debceb66ae7d748a3f1 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期一, 03 八月 2026 14:40:44 +0800
Subject: [PATCH] 修复光伏收益同步未刷新当天数据

---
 ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TStationEarnServiceImplTest.java |   40 ++++++++++++++++++++
 ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TStationEarnServiceImpl.java     |   61 ++++++++++++++++--------------
 2 files changed, 72 insertions(+), 29 deletions(-)

diff --git a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TStationEarnServiceImpl.java b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TStationEarnServiceImpl.java
index 8dfabb2..90704a4 100644
--- a/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TStationEarnServiceImpl.java
+++ b/ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TStationEarnServiceImpl.java
@@ -28,11 +28,9 @@
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeParseException;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * 电站发电量统计服务实现。
@@ -63,25 +61,11 @@
             return false;
         }
 
-        Set<String> existingKeys = getExistingEarnKeys();
-        Set<String> pendingKeys = new HashSet<>();
-        List<TStationEarn> earnList = new ArrayList<>(stationEarnList.size());
-        for (Object item : stationEarnList) {
-            JSONObject jsonObject = JSONObject.parseObject(item.toString());
-            TStationEarn stationEarn = buildStationEarn(jsonObject);
-            if (stationEarn == null) {
-                continue;
-            }
-            String earnKey = buildEarnKey(stationEarn);
-            if (existingKeys.contains(earnKey) || !pendingKeys.add(earnKey)) {
-                continue;
-            }
-            earnList.add(stationEarn);
-        }
+        List<TStationEarn> earnList = buildStationEarnSyncList(stationEarnList, getExistingEarnByKey());
 
-        if(CollectionUtils.isNotEmpty(earnList)) {
+        if (CollectionUtils.isNotEmpty(earnList)) {
             List<List<TStationEarn>> earnAllList = Lists.partition(earnList, 500);
-            earnAllList.forEach(this::saveBatch);
+            earnAllList.forEach(this::saveOrUpdateBatch);
         }
         return true;
     }
@@ -246,7 +230,24 @@
     }
 
 
-    private TStationEarn buildStationEarn(JSONObject jsonObject) {
+    static List<TStationEarn> buildStationEarnSyncList(JSONArray stationEarnList,
+                                                        Map<String, TStationEarn> existingByKey) {
+        Map<String, TStationEarn> recordsByKey = new LinkedHashMap<>();
+        for (Object item : stationEarnList) {
+            TStationEarn stationEarn = buildStationEarn(JSONObject.parseObject(item.toString()));
+            if (stationEarn == null) {
+                continue;
+            }
+            TStationEarn existing = existingByKey.get(buildEarnKey(stationEarn));
+            if (existing != null) {
+                stationEarn.setId(existing.getId());
+            }
+            recordsByKey.put(buildEarnKey(stationEarn), stationEarn);
+        }
+        return new ArrayList<>(recordsByKey.values());
+    }
+
+    private static TStationEarn buildStationEarn(JSONObject jsonObject) {
         String stationId = jsonObject.getString("stationId");
         LocalDate saveTime = parseSaveTime(jsonObject.getString("saveTime"));
         if (StringUtils.isBlank(stationId) || saveTime == null) {
@@ -270,19 +271,21 @@
         return stationEarn;
     }
 
-    private Set<String> getExistingEarnKeys() {
-        List<TStationEarn> existingList = lambdaQuery().select(TStationEarn::getStationId, TStationEarn::getSaveTime).list();
-        Set<String> existingKeys = new HashSet<>();
+    private Map<String, TStationEarn> getExistingEarnByKey() {
+        List<TStationEarn> existingList = lambdaQuery()
+                .select(TStationEarn::getId, TStationEarn::getPlatformId, TStationEarn::getStationId, TStationEarn::getSaveTime)
+                .list();
+        Map<String, TStationEarn> existingByKey = new LinkedHashMap<>();
         for (TStationEarn stationEarn : existingList) {
             if (StringUtils.isNotBlank(stationEarn.getStationId()) && stationEarn.getSaveTime() != null) {
-                existingKeys.add(buildEarnKey(stationEarn));
+                existingByKey.put(buildEarnKey(stationEarn), stationEarn);
             }
         }
-        return existingKeys;
+        return existingByKey;
     }
 
-    private String buildEarnKey(TStationEarn stationEarn) {
-        return stationEarn.getStationId() + "|" + stationEarn.getSaveTime();
+    private static String buildEarnKey(TStationEarn stationEarn) {
+        return stationEarn.getPlatformId() + "|" + stationEarn.getStationId() + "|" + stationEarn.getSaveTime();
     }
 
     private void validate(TStationEarn stationEarn) {
@@ -300,7 +303,7 @@
         return value == null ? BigDecimal.ZERO : value;
     }
 
-    private BigDecimal parseBigDecimal(String value) {
+    private static BigDecimal parseBigDecimal(String value) {
         if (StringUtils.isBlank(value)) {
             return BigDecimal.ZERO;
         }
@@ -311,7 +314,7 @@
         }
     }
 
-    private LocalDate parseSaveTime(String value) {
+    private static LocalDate parseSaveTime(String value) {
         if (StringUtils.isBlank(value)) {
             return null;
         }
diff --git a/ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TStationEarnServiceImplTest.java b/ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TStationEarnServiceImplTest.java
new file mode 100644
index 0000000..5f88557
--- /dev/null
+++ b/ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TStationEarnServiceImplTest.java
@@ -0,0 +1,40 @@
+package com.ruoyi.other.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.ruoyi.other.api.domain.TStationEarn;
+import org.junit.jupiter.api.Test;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+class TStationEarnServiceImplTest {
+
+    @Test
+    void refreshesExistingDailyEarnInsteadOfDroppingIt() {
+        TStationEarn existing = new TStationEarn();
+        existing.setId(9L);
+        existing.setPlatformId(0L);
+        existing.setStationId("station-1");
+        existing.setSaveTime(LocalDate.of(2026, 7, 28));
+        Map<String, TStationEarn> existingByKey = new LinkedHashMap<>();
+        existingByKey.put("0|station-1|2026-07-28", existing);
+
+        JSONArray records = JSONArray.parseArray("["
+                + "{\"stationId\":\"station-1\",\"stationName\":\"光伏1号\",\"saveTime\":\"2026-07-28 12:00:00\",\"elecTotal\":\"611.5\",\"earnTotal\":\"611.5\"},"
+                + "{\"stationId\":\"station-2\",\"stationName\":\"光伏2号\",\"saveTime\":\"2026-07-28 12:00:00\",\"elecTotal\":\"694.2\",\"earnTotal\":\"694.2\"}"
+                + "]");
+
+        List<TStationEarn> merged = TStationEarnServiceImpl.buildStationEarnSyncList(records, existingByKey);
+
+        assertEquals(2, merged.size());
+        assertEquals(9L, merged.get(0).getId());
+        assertEquals(new BigDecimal("611.5"), merged.get(0).getElecTotal());
+        assertEquals(new BigDecimal("694.2"), merged.get(1).getElecTotal());
+        assertEquals(null, merged.get(1).getId());
+    }
+}

--
Gitblit v1.7.1