From 65060c7bc81507fc234977e03a31bccc723b43cb Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期三, 05 八月 2026 19:29:46 +0800
Subject: [PATCH] Merge branch 'fix/franchisee-income-align' into 2.2
---
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 67 ++++++++++++++++++++++++++++++++-
1 files changed, 65 insertions(+), 2 deletions(-)
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
index 11bfda3..30ca3b7 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -2693,12 +2693,28 @@
String startTime2 = timeRange[1];
String endTime1 = timeRange[2];
String endTime2 = timeRange[3];
- PageInfo<ChargingOrderVO> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
+ int pageCurr = dto.getPageCurr() == null ? 1 : dto.getPageCurr();
+ int pageSize = dto.getPageSize() == null ? 50 : dto.getPageSize();
+ PageInfo<ChargingOrderVO> pageInfo = new PageInfo<>(pageCurr, pageSize);
Long userId = tokenService.getLoginUser().getUserid();
SysUser sysUser = sysUserClient.getSysUser(userId).getData();
Integer roleType = sysUser.getRoleType();
setChargingOrderAuthSiteIds(dto, sysUser, userId, roleType);
- List<ChargingOrderVO> list = this.baseMapper.chargingOrder(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
+ if (StringUtils.hasLength(dto.getPhone()) && (dto.getUserIds() == null || dto.getUserIds().isEmpty())) {
+ List<Long> data = appUserClient.getUserIdsByPhone(dto.getPhone()).getData();
+ if (data == null || data.isEmpty()) {
+ pageInfo.setTotal(0L);
+ pageInfo.setRecords(Collections.emptyList());
+ return pageInfo;
+ }
+ dto.setUserIds(data);
+ }
+ // 手动分页:不传 IPage(避免分页拦截器生成无法下推的全量 COUNT),COUNT 与 ORDER BY + LIMIT 均由 SQL 下推到分片
+ long offset = (long) (pageCurr - 1) * pageSize;
+ long total = this.baseMapper.chargingOrderCount(dto, startTime1, startTime2, endTime1, endTime2);
+ pageInfo.setTotal(total);
+ List<ChargingOrderVO> list = total == 0L ? Collections.emptyList()
+ : this.baseMapper.chargingOrder(dto, startTime1, startTime2, endTime1, endTime2, offset, pageSize);
fillChargingOrderBalanceIncome(list);
fillChargingOrderShareIncome(list);
fillChargingOrderPageExtra(list, dto.getSiteIds(), sysUser, roleType);
@@ -2710,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];
@@ -2758,6 +2779,23 @@
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) {
if (list == null || list.isEmpty()) {
return;
@@ -2777,6 +2815,25 @@
Map<Integer, Site> siteMap = pageSites.stream()
.filter(item -> item.getId() != null)
.collect(Collectors.toMap(Site::getId, item -> item, (a, b) -> a));
+ // 列表 SQL 不再跨库 JOIN app_user/partner(避免分片表无筛选全量广播),手机号与合作商名在此回填
+ Map<Long, String> phoneMap = new HashMap<>();
+ List<Long> pageUserIds = list.stream().map(ChargingOrderVO::getAppUserId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+ if (!pageUserIds.isEmpty()) {
+ List<TAppUser> pageUsers = Optional.ofNullable(appUserClient.getUserByIds(pageUserIds).getData()).orElse(new ArrayList<>());
+ for (TAppUser user : pageUsers) {
+ if (user != null && user.getId() != null) {
+ phoneMap.put(user.getId(), user.getPhone());
+ }
+ }
+ }
+ Map<Integer, String> partnerNameMap = new HashMap<>();
+ List<Integer> pagePartnerIds = siteMap.values().stream().map(Site::getPartnerId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+ for (Integer partnerId : pagePartnerIds) {
+ Partner partner = Optional.ofNullable(partnerClient.getPartnerById(partnerId).getData()).orElse(null);
+ if (partner != null && partner.getId() != null) {
+ partnerNameMap.put(partner.getId(), partner.getName());
+ }
+ }
Map<Long, List<TChargingOrderAccountingStrategy>> strategyMap = orderIds.isEmpty() ? new HashMap<>() :
chargingOrderAccountingStrategyService.lambdaQuery()
.in(TChargingOrderAccountingStrategy::getChargingOrderId, orderIds)
@@ -2794,12 +2851,14 @@
if (roleType == 2 && chargingOrderVO.getSiteId() != null) {
chargingOrderVO.setAuthRecord(Boolean.TRUE.equals(authRecordMap.get(chargingOrderVO.getSiteId())));
}
+ chargingOrderVO.setPhone(phoneMap.get(chargingOrderVO.getAppUserId()));
chargingOrderVO.setCommissionAmount(chargingOrderVO.getRechargeAmount() != null ? chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")) : new BigDecimal("0"));
chargingOrderVO.setPlatFormMoney(chargingOrderVO.getRechargeAmount() != null ? chargingOrderVO.getRechargeAmount().multiply(new BigDecimal("0.006")).setScale(2, BigDecimal.ROUND_DOWN) : new BigDecimal("0"));
chargingOrderVO.setUid(chargingOrderVO.getId() + "");
Site site = siteMap.get(chargingOrderVO.getSiteId());
if (site != null) {
chargingOrderVO.setSiteName(site.getName());
+ chargingOrderVO.setPartnerName(partnerNameMap.get(site.getPartnerId()));
}
TChargingGun gun = gunMap.get(chargingOrderVO.getChargingGunId());
TChargingPile pile = pileMap.get(chargingOrderVO.getChargingPileId());
@@ -2890,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;
--
Gitblit v1.7.1