longz
2026-08-03 6ced33fcb2f7454242fb7debceb66ae7d748a3f1
修复光伏收益同步未刷新当天数据
1个文件已添加
1个文件已修改
101 ■■■■■ 已修改文件
ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TStationEarnServiceImpl.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TStationEarnServiceImplTest.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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;
        }
ruoyi-service/ruoyi-other/src/test/java/com/ruoyi/other/service/impl/TStationEarnServiceImplTest.java
New file
@@ -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());
    }
}