From b9b2447a76477c0ea184f0e3a76585b5fb7017c0 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期三, 05 八月 2026 14:35:14 +0800
Subject: [PATCH] fix: 加盟商收支分析与平台总收入分析同站点口径一致

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java |   76 ++++++++++++++++++++++++++-----------
 1 files changed, 53 insertions(+), 23 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
index e721394..51e0c42 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -241,23 +241,47 @@
     @PostMapping("/app/franchisee/income")
     public R<Map<String, Object>> franchiseeIncome(@RequestBody(required = false) Map<String, Object> params) {
         List<Integer> siteIds = franchiseeSiteIds(params);
-        LocalDate firstMonth = YearMonth.now().minusMonths(5).atDay(1);
-        LocalDate nextMonth = YearMonth.now().plusMonths(1).atDay(1);
-        List<FranchiseeDayStat> dayStats = franchiseeDayStats(siteIds,
-                new LocalDateTime[]{firstMonth.atStartOfDay(), nextMonth.atStartOfDay()});
+        List<SixChargingDto> sixChargingDtos;
+        if (siteIds.isEmpty()) {
+            // 无授权站点:返回近6月全零骨架,避免空 IN 导致全站点统计
+            sixChargingDtos = generateLastSixMonths(LocalDate.now());
+        } else {
+            // 与后台 数据分析-平台总收入分析 电站收入分析口径一致:历史月读结算账单、当月补原始订单
+            LocalDate sixBefore = PreviousSixMonths.get();
+            List<SixChargingDto> chargingDtos = chargingOrderService.charge(sixBefore, siteIds, false);
+            LocalDate statisticsEndMonth = resolveStatisticsEndMonth(LocalDate.now(), chargingDtos);
+            sixChargingDtos = generateLastSixMonths(statisticsEndMonth);
+            for (SixChargingDto sixChargingDto : sixChargingDtos) {
+                for (SixChargingDto chargingDto : chargingDtos) {
+                    if (sixChargingDto.getMonth().equals(chargingDto.getMonth())) {
+                        BeanUtils.copyProperties(chargingDto, sixChargingDto);
+                    }
+                }
+            }
+        }
+        BigDecimal electricity = sixChargingDtos.stream()
+                .filter(Objects::nonNull)
+                .map(SixChargingDto::getElectrovalence)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal service = sixChargingDtos.stream()
+                .filter(Objects::nonNull)
+                .map(SixChargingDto::getServiceCharge)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
         Map<String, Object> result = new LinkedHashMap<>();
-        result.put("totalIncome", sum(dayStats, FranchiseeDayStat::getPaymentAmount));
-        result.put("electricityFee", sum(dayStats, FranchiseeDayStat::getElectrovalence));
-        result.put("serviceFee", sum(dayStats, FranchiseeDayStat::getServiceFee));
-        result.put("incomeColumn", franchiseeIncomeTrend(dayStats, firstMonth, 6));
+        result.put("totalIncome", electricity.add(service));
+        result.put("electricityFee", electricity);
+        result.put("serviceFee", service);
+        result.put("incomeColumn", franchiseeIncomeTrendFromSix(sixChargingDtos));
         List<Map<String, Object>> incomePie = new ArrayList<>();
         Map<String, Object> electricityItem = new LinkedHashMap<>();
         electricityItem.put("name", "充电费");
-        electricityItem.put("value", sum(dayStats, FranchiseeDayStat::getElectrovalence));
+        electricityItem.put("value", electricity);
         incomePie.add(electricityItem);
         Map<String, Object> serviceItem = new LinkedHashMap<>();
         serviceItem.put("name", "服务费");
-        serviceItem.put("value", sum(dayStats, FranchiseeDayStat::getServiceFee));
+        serviceItem.put("value", service);
         incomePie.add(serviceItem);
         result.put("incomePie", incomePie);
         return R.ok(result);
@@ -763,22 +787,28 @@
         List<Map<String, Object>> data = new ArrayList<>(); for (int i = 0; i < names.length; i++) { Map<String, Object> item = new LinkedHashMap<>(); item.put("name", names[i]); item.put("value", counts[i]); data.add(item); }
         return Collections.singletonMap("series", Collections.singletonList(Collections.singletonMap("data", data)));
     }
-    private Map<String, Object> franchiseeIncomeTrend(List<FranchiseeDayStat> stats, LocalDate firstMonth, int monthCount) {
+    /** 收支分析近6月柱状图:与后台 电站收入分析 一致(历史月结算账单 + 当月原始订单)。 */
+    private Map<String, Object> franchiseeIncomeTrendFromSix(List<SixChargingDto> months) {
         List<String> categories = new ArrayList<>();
         List<BigDecimal> electricity = new ArrayList<>(), service = new ArrayList<>();
-        Map<YearMonth, List<FranchiseeDayStat>> byMonth = stats.stream().filter(stat -> stat != null && stat.getStatDay() != null)
-                .collect(Collectors.groupingBy(stat -> YearMonth.from(stat.getStatDay())));
-        for (int i = 0; i < monthCount; i++) {
-            YearMonth month = YearMonth.from(firstMonth).plusMonths(i);
-            categories.add(String.format("%02d月", month.getMonthValue()));
-            List<FranchiseeDayStat> monthStats = byMonth.getOrDefault(month, Collections.emptyList());
-            electricity.add(sum(monthStats, FranchiseeDayStat::getElectrovalence));
-            service.add(sum(monthStats, FranchiseeDayStat::getServiceFee));
+        for (SixChargingDto month : months) {
+            if (month == null) {
+                continue;
+            }
+            categories.add(month.getMonth() + "月");
+            electricity.add(month.getElectrovalence() == null ? BigDecimal.ZERO : month.getElectrovalence());
+            service.add(month.getServiceCharge() == null ? BigDecimal.ZERO : month.getServiceCharge());
         }
-        Map<String, Object> chart = new LinkedHashMap<>(); chart.put("categories", categories);
-        Map<String, Object> electricitySeries = new LinkedHashMap<>(); electricitySeries.put("name", "充电费"); electricitySeries.put("data", electricity);
-        Map<String, Object> serviceSeries = new LinkedHashMap<>(); serviceSeries.put("name", "服务费"); serviceSeries.put("data", service);
-        chart.put("series", new ArrayList<>(Arrays.asList(electricitySeries, serviceSeries))); return chart;
+        Map<String, Object> chart = new LinkedHashMap<>();
+        chart.put("categories", categories);
+        Map<String, Object> electricitySeries = new LinkedHashMap<>();
+        electricitySeries.put("name", "充电费");
+        electricitySeries.put("data", electricity);
+        Map<String, Object> serviceSeries = new LinkedHashMap<>();
+        serviceSeries.put("name", "服务费");
+        serviceSeries.put("data", service);
+        chart.put("series", new ArrayList<>(Arrays.asList(electricitySeries, serviceSeries)));
+        return chart;
     }
 
 

--
Gitblit v1.7.1