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