From eac80fa4c1bd3af514d91fddee2bd2ac4f609acd Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期三, 05 八月 2026 15:29:18 +0800
Subject: [PATCH] fix: 平台总收入分析-数据分类与电站收入分析同口径(近6月+当月)

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java |  172 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 165 insertions(+), 7 deletions(-)

diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
index cf2ff8b..7317c42 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -15,7 +15,6 @@
 import com.ruoyi.order.api.vo.ChargingOrderBalanceIncomeDetailVO;
 import com.ruoyi.order.api.vo.TChargingOrderVo;
 import com.ruoyi.order.dto.*;
-import com.ruoyi.order.vo.OrderCountByDate;
 import com.ruoyi.order.vo.LargeChargingPowerVo;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -111,10 +110,69 @@
 
     List<Map<String, Object>> enterpriseChargingPeriodCounts(@Param("orderIds") List<Long> orderIds);
 
-    List<TChargingOrderRefund> getRefundList(@Param("pageInfo") PageInfo<TChargingOrderRefund> pageInfo, @Param("data") ChargingRefundDto chargingRefundDto);
+    /**
+     * 退款列表(分片下推版)。不带 IPage 参数,避免分页拦截器对 UNION 全量 COUNT。
+     * 每个 UNION 分支内联 ORDER BY refund_time DESC LIMIT branchLimit(=offset+pageSize),MyCat 可下推到各分片表,
+     * 代理层只归并 3×branchLimit 行再按外层 LIMIT offset,pageSize 取页。
+     *
+     * @param offset      跳过行数(pageCurr-1)×pageSize
+     * @param limit       每页行数 pageSize
+     * @param branchLimit 每个 UNION 分支的最大取数 offset+pageSize
+     */
+    List<TChargingOrderRefund> getRefundListPage(@Param("data") ChargingRefundDto chargingRefundDto,
+                                                 @Param("offset") long offset, @Param("limit") int limit,
+                                                 @Param("branchLimit") int branchLimit);
 
-    List<TChargingOrderRefund> getRefundListWithoutOrderJoin(@Param("pageInfo") PageInfo<TChargingOrderRefund> pageInfo,
-                                                             @Param("data") ChargingRefundDto chargingRefundDto);
+    /**
+     * 退款总数(分片下推版)。三分支分别 COUNT 再 SUM,每个 COUNT 可下推到各分片表。
+     */
+    long countRefundList(@Param("data") ChargingRefundDto chargingRefundDto);
+
+    /**
+     * 退款列表(筛选逆反查版)。serialNumber/siteIds 筛选时先按条件查订单 id(可路由/走索引),
+     * 再按各类型订单 id IN 过滤退款表(分片键路由),替代跨分片 LEFT JOIN。
+     * type1/type2/type3 订单 id 列表:null = 该类型不过滤;空列表 = 该类型无匹配(返回空)。
+     *
+     * @param branchLimit 每个 UNION 分支的最大取数 offset+pageSize
+     */
+    List<TChargingOrderRefund> getRefundListByOrderIds(@Param("data") ChargingRefundDto chargingRefundDto,
+                                                       @Param("type1OrderIds") List<Long> type1OrderIds,
+                                                       @Param("type2OrderIds") List<Long> type2OrderIds,
+                                                       @Param("type3OrderIds") List<Long> type3OrderIds,
+                                                       @Param("offset") long offset, @Param("limit") int limit,
+                                                       @Param("branchLimit") int branchLimit);
+
+    /**
+     * 退款总数(筛选逆反查版),与 getRefundListByOrderIds 同构。
+     */
+    long countRefundListByOrderIds(@Param("data") ChargingRefundDto chargingRefundDto,
+                                   @Param("type1OrderIds") List<Long> type1OrderIds,
+                                   @Param("type2OrderIds") List<Long> type2OrderIds,
+                                   @Param("type3OrderIds") List<Long> type3OrderIds);
+
+    /**
+     * 按支付流水号模糊匹配充电订单 id(t_charging_order 按 app_user_id 分片,recharge_serial_number 走新增索引)。
+     */
+    List<Long> listChargingOrderIdsBySerialNumber(@Param("serialNumber") String serialNumber,
+                                                  @Param("limit") int limit);
+
+    /**
+     * 按支付流水号模糊匹配商城订单 id。
+     */
+    List<Long> listShoppingOrderIdsBySerialNumber(@Param("serialNumber") String serialNumber,
+                                                  @Param("limit") int limit);
+
+    /**
+     * 按支付流水号模糊匹配会员订单 id。
+     */
+    List<Long> listVipOrderIdsBySerialNumber(@Param("serialNumber") String serialNumber,
+                                             @Param("limit") int limit);
+
+    /**
+     * 按站点 id 匹配充电订单 id(t_charging_order 的 site_id 走新增索引)。
+     */
+    List<Long> listChargingOrderIdsBySiteIds(@Param("siteIds") List<Integer> siteIds,
+                                             @Param("limit") int limit);
 
     List<ChargingOrderGroup> chargingOrderGroup(@Param("chargingPercentProvinceDto") ChargingPercentProvinceDto chargingPercentProvinceDto);
 
@@ -126,9 +184,9 @@
 
     List<SixCircleDto> circle(@Param("siteIds") List<Integer> siteIds, @Param("sixBefore") LocalDate sixBefore, @Param("partnerView") Boolean partnerView);
 
-    BigDecimal sumSuccessfulShareAmount(@Param("siteIds") List<Integer> siteIds);
+    BigDecimal sumSuccessfulShareAmount(@Param("siteIds") List<Integer> siteIds, @Param("sixBefore") LocalDate sixBefore);
 
-    Map<String, Object> countAll(@Param("siteIds") List<Integer> siteIds, @Param("partnerView") Boolean partnerView);
+    Map<String, Object> countAll(@Param("siteIds") List<Integer> siteIds, @Param("partnerView") Boolean partnerView, @Param("sixBefore") LocalDate sixBefore);
 
     List<Map<String, Object>> chargingOrderShareIncomeByPayChannel(@Param("sixBefore") LocalDate sixBefore, @Param("siteIds") List<Integer> siteIds);
 
@@ -207,6 +265,53 @@
 
     Map<String, Object> getLargeScreenSummary(@Param("siteIds") List<Integer> siteIds);
 
+    // ==================== 大屏预聚合表 t_large_screen_site_stat ====================
+    // 任务用: 按月切片聚合(与 getLargeScreenSummary 相同口径, 按站点分组)
+    List<Map<String, Object>> monthSliceAgg(@Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    // 任务用: 按月切片统计充电用户数(工作台口径: 所有订单的去重用户, 不区分状态/删除标记)
+    List<Map<String, Object>> monthSliceUserAgg(@Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    // 任务用: 按时间切片取 (site_id, app_user_id) 对(所有订单)
+    List<Map<String, Object>> userSitePairsAgg(@Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    // 任务用: 批量写入用户-站点对(幂等)
+    int insertUserSitePairs(@Param("rows") List<Map<String, Object>> rows);
+
+    // 接口用: 充电用户数精确去重(对表)
+    Long userCountFromStat(@Param("siteIds") List<Integer> siteIds);
+
+    // 任务用: 对表行数(启动回填判断)
+    Long userSiteTableCount();
+
+    // 任务用: 按日切片聚合(与 getLargeScreenChargingPower 相同口径, 按站点分组)
+    List<Map<String, Object>> daySliceAgg(@Param("startTime") String startTime, @Param("endTime") String endTime);
+
+    // 任务用: 注册用户总数
+    Long globalRegisteredUsers();
+
+    // 任务用: 批量写入聚合行(REPLACE INTO)
+    int replaceSiteStatBatch(@Param("rows") List<Map<String, Object>> rows);
+
+    // 任务用: 表行数(判断是否需要启动回填)
+    Long statTableCount();
+
+    // 接口用: 累计指标(M 行汇总)
+    Map<String, Object> summaryFromStat(@Param("siteIds") List<Integer> siteIds);
+
+    // 接口用: 近 N 月收入趋势(M 行按 period 分组)
+    List<SixChargingDto> incomeTrendFromStat(@Param("siteIds") List<Integer> siteIds, @Param("sixBefore") String sixBefore);
+
+    // 接口用: 日功率曲线(D 行按 period 分组)
+    List<Map<String, Object>> powerFromStat(@Param("siteIds") List<Integer> siteIds,
+                                            @Param("dayStart") String dayStart, @Param("dayEnd") String dayEnd);
+
+    // 接口用: 注册用户数(G 行)
+    Long registeredFromStat();
+
+    // 接口用: 大屏累计充电量(M 行汇总, 与 summaryFromStat 同源)
+    BigDecimal capacityFromStat(@Param("siteIds") List<Integer> siteIds);
+
     SixChargingDto getLargeScreenSettlementIncome(@Param("siteIdsCsv") String siteIdsCsv,
                                                   @Param("startTime") String startTime,
                                                   @Param("endTime") String endTime);
@@ -236,7 +341,9 @@
 
     Long countCar(@Param("brands") List<String> brands);
 
-    List<OrderCountByDate> countOrdersByDate(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime, @Param("gunIds") List<Integer> gunIds);
+    Long countOrdersInRangeByGunIds(@Param("startTime") LocalDateTime startTime,
+                                    @Param("endTime") LocalDateTime endTime,
+                                    @Param("gunIds") List<Integer> gunIds);
 
     Double getSumDegreeBySiteIds(@Param("siteIds") List<Integer> siteIds);
 
@@ -305,4 +412,55 @@
      */
     List<Map<String, Object>> getAccountSettlementStatement(@Param("startTime") String startTime,
                                                             @Param("endTime") String endTime);
+
+    // ==================== 加盟商看板聚合查询(SQL 聚合下推,替代全量拉订单到 JVM) ====================
+    // 均为单表 GROUP BY,MyCat 可把聚合下推到各分片表后由代理合并少量行;不带 IPage 参数。
+    // 口径与 TChargingOrderController franchisee* 原 Java 求和逻辑一致。
+
+    /**
+     * 按 end_time 日聚合:订单数/金额/服务费/电费/电量/功率/需求满足率/利用率。
+     */
+    List<FranchiseeDayStat> franchiseeDayStats(@Param("siteIds") List<Integer> siteIds,
+                                               @Param("start") LocalDateTime start,
+                                               @Param("end") LocalDateTime end);
+
+    /**
+     * 功率分布直方图(0-30/30-60/60-120/120-300/300kW以上,按 IFNULL(charging_power, power) 分桶)。
+     */
+    List<FranchiseePowerBucket> franchiseePowerBuckets(@Param("siteIds") List<Integer> siteIds,
+                                                       @Param("start") LocalDateTime start,
+                                                       @Param("end") LocalDateTime end);
+
+    /**
+     * 尖峰平谷阶段电量(按 charging_order_id IN 路由到对应分片,分组返回 type/电量)。
+     */
+    List<FranchiseePhaseStat> franchiseePhaseStatsByOrderIds(@Param("orderIds") List<Long> orderIds);
+
+    /**
+     * 站点+时间范围内订单 id 列表(仅 id 投影,供尖峰平谷分块反查使用)。
+     */
+    List<Long> franchiseeOrderIds(@Param("siteIds") List<Integer> siteIds,
+                                  @Param("start") LocalDateTime start,
+                                  @Param("end") LocalDateTime end);
+
+    /**
+     * 用户维度聚合(仅 status=5 已结束订单,按 app_user_id/app_user_car_id/结束日 分组)。
+     */
+    List<FranchiseeUserAgg> franchiseeUserAggs(@Param("siteIds") List<Integer> siteIds,
+                                               @Param("start") LocalDateTime start,
+                                               @Param("end") LocalDateTime end);
+
+    /**
+     * 流量来源统计(按 tripartite_platform_name 分组,仅 status=5 已结束订单)。
+     */
+    List<FranchiseeSourceStat> franchiseeTrafficStats(@Param("siteIds") List<Integer> siteIds,
+                                                      @Param("start") LocalDateTime start,
+                                                      @Param("end") LocalDateTime end);
+
+    /**
+     * 按充电枪的需求满足率聚合(含空枪 id 行,服务端过滤)。
+     */
+    List<FranchiseeGunSat> franchiseeGunSatisfaction(@Param("siteIds") List<Integer> siteIds,
+                                                     @Param("start") LocalDateTime start,
+                                                     @Param("end") LocalDateTime end);
 }

--
Gitblit v1.7.1