From 2a916d05d9f14d583d89f77aed6f63fd49375f60 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期三, 19 八月 2026 11:38:57 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/2.2' into 2.2

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java |   81 +++++++++++++++++++++-------------------
 1 files changed, 43 insertions(+), 38 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 731ec93..dc8fe97 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
@@ -219,6 +219,7 @@
         List<Integer> siteIds = franchiseeSiteIds(params);
         LocalDateTime[] range = franchiseeRange(params);
         List<FranchiseeDayStat> dayStats = franchiseeDayStats(siteIds, range);
+        List<Map<String, Object>> managementOrderStats = franchiseeManagementOrderStats(siteIds, range);
         Map<String, Object> summary = new LinkedHashMap<>();
         BigDecimal incomeWan = franchiseeIncomeWan(dayStats);
         BigDecimal totalChargingCapacityWan = sum(dayStats, FranchiseeDayStat::getCapacity).divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_UP);
@@ -227,15 +228,15 @@
         summary.put("serviceFeeWan", sum(dayStats, FranchiseeDayStat::getServiceFee).divide(BigDecimal.valueOf(10000), 4, RoundingMode.HALF_UP));
         summary.put("totalChargingCapacityWan", totalChargingCapacityWan);
         summary.put("chargingPowerWan", totalChargingCapacityWan);
-        summary.put("chargingAmount", sum(dayStats, FranchiseeDayStat::getChargingIncome));
-        summary.put("chargingOrderCount", dayStats.stream().mapToLong(stat -> numberValue(stat.getOrderCount())).sum());
+        summary.put("chargingAmount", sumManagementOrderField(managementOrderStats, "paymoney"));
+        summary.put("chargingOrderCount", sumManagementOrderField(managementOrderStats, "orderCount").longValue());
         summary.put("powerUtilizationRate", observedPowerUtilization(dayStats));
         summary.put("demandPowerSatisfactionRate", demandPowerSatisfaction(dayStats));
         Map<String, Object> result = new LinkedHashMap<>();
         result.put("summary", summary);
         result.put("keyDataLine", franchiseeDailyTrend(dayStats, range, "收入合计", FranchiseeDayStat::getChargingIncome));
         result.put("keyDataRing", franchiseePhaseRing(siteIds, range));
-        result.put("orderStats", franchiseeOrderTrend(dayStats, range));
+        result.put("orderStats", franchiseeManagementOrderTrend(managementOrderStats));
         result.put("efficiency", franchiseeEfficiencyTrend(dayStats, range));
         result.put("powerDistribution", franchiseePowerDistribution(siteIds, range));
         return R.ok(result);
@@ -679,48 +680,52 @@
         Map<String, Object> chart = new LinkedHashMap<>(); chart.put("categories", categories);
         Map<String, Object> series = new LinkedHashMap<>(); series.put("name", name); series.put("data", data); chart.put("series", new ArrayList<>(Collections.singletonList(series))); return chart;
     }
-    private Map<String, Object> franchiseeOrderTrend(List<FranchiseeDayStat> stats, LocalDateTime[] range) {
-        if (franchiseeUseMonthlyTrend(range)) {
-            return franchiseeMonthlyOrderTrend(stats, range);
+    private List<Map<String, Object>> franchiseeManagementOrderStats(List<Integer> siteIds, LocalDateTime[] range) {
+        if (siteIds == null || siteIds.isEmpty() || range == null || range.length < 2
+                || range[0] == null || range[1] == null || !range[1].isAfter(range[0])) {
+            return Collections.emptyList();
         }
-        Map<String, Object> chart = franchiseeDailyTrend(stats, range, "充电金额", FranchiseeDayStat::getOrderAmountEffective);
-        ((List<Map<String, Object>>) chart.get("series")).get(0).put("type", "column");
-        Map<LocalDate, FranchiseeDayStat> byDay = dayStatByDay(stats);
-        List<BigDecimal> countData = new ArrayList<>(); List<String> categories = (List<String>) chart.get("categories");
-        LocalDate start = range[0] == null ? LocalDate.now() : range[0].toLocalDate();
-        for (int i = 0; i < categories.size(); i++) { LocalDate day = start.plusDays(i); FranchiseeDayStat stat = byDay.get(day); countData.add(BigDecimal.valueOf(stat == null ? 0L : numberValue(stat.getOrderCount()))); }
-        Map<String, Object> countSeries = new LinkedHashMap<>(); countSeries.put("name", "充电订单"); countSeries.put("data", countData); countSeries.put("type", "line"); countSeries.put("style", "curve"); countSeries.put("index", 1); ((List<Map<String, Object>>) chart.get("series")).add(countSeries); return chart;
-    }
-
-    /** Ranges longer than 31 days use monthly buckets so the mobile chart stays readable. */
-    private boolean franchiseeUseMonthlyTrend(LocalDateTime[] range) {
-        if (range == null || range.length < 2 || range[0] == null || range[1] == null) {
-            return false;
-        }
-        return range[0].toLocalDate().plusDays(31).isBefore(range[1].toLocalDate());
-    }
-
-    private Map<String, Object> franchiseeMonthlyOrderTrend(List<FranchiseeDayStat> stats, LocalDateTime[] range) {
-        Map<YearMonth, List<FranchiseeDayStat>> statsByMonth = stats.stream()
-                .filter(stat -> stat != null && stat.getStatDay() != null)
-                .collect(Collectors.groupingBy(stat -> YearMonth.from(stat.getStatDay())));
         LocalDate start = range[0].toLocalDate();
-        LocalDate end = range[1].toLocalDate();
-        YearMonth firstMonth = YearMonth.from(start);
-        YearMonth lastMonth = YearMonth.from(end.minusDays(1));
+        LocalDate end = range[1].minusNanos(1).toLocalDate();
+        return safeList(chargingOrderService.getByDate(start, end, siteIds));
+    }
+
+    private BigDecimal sumManagementOrderField(List<Map<String, Object>> stats, String field) {
+        return safeList(stats).stream()
+                .map(row -> decimalValue(row == null ? null : row.get(field)))
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+    }
+
+    private BigDecimal decimalValue(Object value) {
+        if (value == null) return BigDecimal.ZERO;
+        try {
+            return new BigDecimal(String.valueOf(value));
+        } catch (NumberFormatException ignored) {
+            return BigDecimal.ZERO;
+        }
+    }
+
+    private Map<String, Object> franchiseeManagementOrderTrend(List<Map<String, Object>> stats) {
         List<String> categories = new ArrayList<>();
         List<BigDecimal> amountData = new ArrayList<>();
         List<BigDecimal> countData = new ArrayList<>();
-        for (YearMonth month = firstMonth; !month.isAfter(lastMonth); month = month.plusMonths(1)) {
-            List<FranchiseeDayStat> monthStats = statsByMonth.getOrDefault(month, Collections.emptyList());
-            categories.add(month.toString());
-            amountData.add(sum(monthStats, FranchiseeDayStat::getOrderAmountEffective));
-            countData.add(BigDecimal.valueOf(monthStats.stream().mapToLong(stat -> numberValue(stat.getOrderCount())).sum()));
+        for (Map<String, Object> row : safeList(stats)) {
+            if (row == null) continue;
+            categories.add(String.valueOf(row.get("time")));
+            amountData.add(decimalValue(row.get("paymoney")));
+            countData.add(decimalValue(row.get("orderCount")));
         }
-        Map<String, Object> amountSeries = new LinkedHashMap<>(); amountSeries.put("name", "充电金额"); amountSeries.put("data", amountData); amountSeries.put("type", "column");
-        Map<String, Object> countSeries = new LinkedHashMap<>(); countSeries.put("name", "充电订单"); countSeries.put("data", countData); countSeries.put("type", "line"); countSeries.put("style", "curve"); countSeries.put("index", 1);
-        Map<String, Object> chart = new LinkedHashMap<>(); chart.put("categories", categories); chart.put("series", new ArrayList<>(Arrays.asList(amountSeries, countSeries))); return chart;
+        Map<String, Object> amountSeries = new LinkedHashMap<>();
+        amountSeries.put("name", "充电金额"); amountSeries.put("data", amountData); amountSeries.put("type", "column");
+        Map<String, Object> countSeries = new LinkedHashMap<>();
+        countSeries.put("name", "充电订单"); countSeries.put("data", countData); countSeries.put("type", "line");
+        countSeries.put("style", "curve"); countSeries.put("index", 1);
+        Map<String, Object> chart = new LinkedHashMap<>();
+        chart.put("categories", categories);
+        chart.put("series", new ArrayList<>(Arrays.asList(amountSeries, countSeries)));
+        return chart;
     }
+
     private Map<String, Object> franchiseePhaseRing(List<Integer> siteIds, LocalDateTime[] range) {
         Map<Integer, BigDecimal> phase = new LinkedHashMap<>(); phase.put(1, BigDecimal.ZERO); phase.put(2, BigDecimal.ZERO); phase.put(3, BigDecimal.ZERO); phase.put(4, BigDecimal.ZERO);
         if (siteIds != null && !siteIds.isEmpty() && range != null && range[0] != null && range[1] != null) {

--
Gitblit v1.7.1