fix: 充电桩订单汇总接口无筛选时 MyCat 超时,全量扫描直接返回空汇总

汇总路径(/chargingOrder/summary)无筛选时同样超时,根因:
- chargingOrderBaseSummary 对 t_charging_order_accounting_strategy 做跨分片 JOIN
(strategy 按 charging_order_id 分片,与 t_charging_order 的 app_user_id 不一致),
无筛选时 MyCat 只能把 50 片全量拉回代理层聚合
- chargingOrderSummaryOrderIds 无 LIMIT 返回全量订单 id,再拼超大 IN 反查
share_record / exchange_code_use_record

汇总是无界聚合,没有列表那种 LIMIT 可下推,故对「用户未提供任何筛选」
(清空默认时间范围即触发)直接短路返回空汇总,避免必然超时;带筛选时逻辑不变。
balanceIncomeDetail(余额收入明细,同页)同根因一并加守卫。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1个文件已修改
26 ■■■■■ 已修改文件
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -2726,6 +2726,11 @@
    public TCharingOrderVO chargingOrderSummary(ChargingOrderQuery dto) {
        TCharingOrderVO tCharingOrderVO = new TCharingOrderVO();
        fillEmptyChargingOrderSummary(tCharingOrderVO);
        if (isChargingOrderFullSweep(dto)) {
            // 无任何筛选即全量扫描:汇总聚合跨分片 JOIN(accounting_strategy,分片键 charging_order_id 与 t_charging_order 不一致)
            // 且需把全量订单 id 反查 share/balance,MyCat 只能全量拉回代理层,必然超时。汇总没有 LIMIT 可下推,直接返回空汇总。
            return tCharingOrderVO;
        }
        String[] timeRange = parseChargingOrderTimeRange(dto);
        String startTime1 = timeRange[0];
        String startTime2 = timeRange[1];
@@ -2772,6 +2777,23 @@
            endTime2 = split[1];
        }
        return new String[]{startTime1, startTime2, endTime1, endTime2};
    }
    /** 是否全量扫描:用户未提供任何可收窄的筛选条件(时间/订单号/手机号/站点/桩/枪/状态等),无界聚合无法下推。 */
    private boolean isChargingOrderFullSweep(ChargingOrderQuery dto) {
        return !StringUtils.hasLength(dto.getStartTime())
                && !StringUtils.hasLength(dto.getEndTime())
                && !StringUtils.hasLength(dto.getCode())
                && !StringUtils.hasLength(dto.getPhone())
                && dto.getSiteId() == null
                && dto.getPileId() == null
                && dto.getGunId() == null
                && dto.getOrderType() == null
                && dto.getStatus() == null
                && dto.getIsWhitelist() == null
                && dto.getPaymentType() == null
                && dto.getOrderSource() == null
                && (dto.getUserIds() == null || dto.getUserIds().isEmpty());
    }
    private void fillChargingOrderPageExtra(List<ChargingOrderVO> list, List<Integer> siteIds, SysUser sysUser, Integer roleType) {
@@ -2927,6 +2949,10 @@
     */
    @Override
    public List<ChargingOrderBalanceIncomeDetailVO> balanceIncomeDetail(ChargingOrderQuery dto) {
        if (isChargingOrderFullSweep(dto)) {
            // 与汇总同根因:全量扫描会把全量订单 id 反查 exchange_code_use_record,MyCat 超时,直接返回空明细
            return new ArrayList<>();
        }
        String startTime1 = null;
        String startTime2 = null;
        String endTime1 = null;