From 91379c1d07d3878840ea3d38b7c42d6d62ea75aa Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期二, 21 七月 2026 17:26:12 +0800
Subject: [PATCH] 充电时段统计fix
---
ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 114 ++++++++++++--------------------------
ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml | 10 +-
2 files changed, 41 insertions(+), 83 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 3efecde..b0d733f 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
@@ -3371,7 +3371,6 @@
PageInfo<ChargingOrderListVO> pageInfo = new PageInfo<>(dto.getPageCurr(), dto.getPageSize());
List<ChargingOrderListVO> list = new ArrayList<>();
- Map<Integer, BigDecimal> siteServiceShareRatioMap = loadSiteServiceShareRatioMap();
List<Map<String, Object>> maps = this.baseMapper.chargingList1(pageInfo, dto, startTime1, startTime2, endTime1, endTime2);
Map<Integer, Site> siteMap = loadChargingPeriodSites(maps);
Map<Integer, TChargingPile> pileMap = loadChargingPeriodPiles(maps);
@@ -3426,7 +3425,6 @@
chargingOrderListVO.setSharingAmount(BigDecimal.ZERO);
}
chargingOrderListVO.setElectrovalence(null == map.get("electrovalence") ? BigDecimal.ZERO : new BigDecimal(map.get("electrovalence").toString()));
- fillChargingPeriodIncome(chargingOrderListVO, siteServiceShareRatioMap);
if(null != map.get("tripartitePlatformName")){
chargingOrderListVO.setTripartitePlatformName(map.get("tripartitePlatformName").toString());
}
@@ -3482,6 +3480,7 @@
}
list.add(chargingOrderListVO);
}
+ fillChargingPeriodShareIncome(list);
@@ -3539,23 +3538,15 @@
chargingOrderTimeVO.setPaymentAmount(paymentAmount.setScale(2, BigDecimal.ROUND_HALF_EVEN));
chargingOrderTimeVO.setElectrovalence(electrovalence.setScale(2, BigDecimal.ROUND_HALF_EVEN));
chargingOrderTimeVO.setServiceCharge(serviceCharge.setScale(2, BigDecimal.ROUND_HALF_EVEN));
- BigDecimal platformIncome = BigDecimal.ZERO;
- BigDecimal partnerIncome = BigDecimal.ZERO;
- for (Map<String, Object> sumMap : list1) {
- if (sumMap == null) {
- continue;
- }
- ChargingOrderListVO item = new ChargingOrderListVO();
- item.setSiteId(getSummaryLong(sumMap, "siteId").intValue());
- item.setOrderSource(getSummaryLong(sumMap, "orderSource").intValue());
- item.setPaymentAmount(getSummaryDecimal(sumMap, "paymentAmount"));
- item.setServiceCharge(getSummaryDecimal(sumMap, "serviceCharge"));
- fillChargingPeriodIncome(item, siteServiceShareRatioMap);
- platformIncome = platformIncome.add(nullToZero(item.getPlatformIncome()));
- partnerIncome = partnerIncome.add(nullToZero(item.getPartnerIncome()));
- }
- chargingOrderTimeVO.setPlatformIncome(platformIncome.setScale(2, RoundingMode.HALF_UP));
- chargingOrderTimeVO.setPartnerIncome(partnerIncome.setScale(2, RoundingMode.HALF_UP));
+ List<Long> summaryOrderIds = list1.stream()
+ .filter(Objects::nonNull)
+ .map(sumMap -> getSummaryLong(sumMap, "id"))
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ Map<String, Object> shareIncomeMap = getChargingOrderShareIncomeSummary(summaryOrderIds);
+ chargingOrderTimeVO.setPlatformIncome(getSummaryDecimal(shareIncomeMap, "platformIncomeTotal"));
+ chargingOrderTimeVO.setPartnerIncome(getSummaryDecimal(shareIncomeMap, "partnerIncomeTotal"));
// 计算尖峰平谷充电到账占比
BigDecimal add = jianElectronic.add(fengElectronic).add(pingElectronic).add(guElectronic);
// 计算尖峰平谷服务费占比
@@ -3752,78 +3743,45 @@
dto.setSiteIds(siteIds);
List<ChargingOrderListVO> list1 = this.baseMapper.chargingList(dto, startTime1, startTime2, endTime1, endTime2);
fillChargingPeriodExportBalanceIncome(list1);
- fillChargingPeriodIncome(list1);
+ fillChargingPeriodShareIncome(list1);
return list1;
}
- private void fillChargingPeriodIncome(List<ChargingOrderListVO> list) {
+ private void fillChargingPeriodShareIncome(List<ChargingOrderListVO> list) {
if (list == null || list.isEmpty()) {
return;
}
- Map<Integer, BigDecimal> siteServiceShareRatioMap = loadSiteServiceShareRatioMap();
+ List<Long> orderIds = list.stream()
+ .map(ChargingOrderListVO::getId)
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ Map<Long, Map<String, Object>> incomeMap = new HashMap<>();
+ int batchSize = 500;
+ for (int i = 0; i < orderIds.size(); i += batchSize) {
+ List<Long> batchIds = orderIds.subList(i, Math.min(i + batchSize, orderIds.size()));
+ List<Map<String, Object>> rows = this.baseMapper.chargingOrderShareIncomeByOrderIds(batchIds);
+ if (rows == null) {
+ continue;
+ }
+ for (Map<String, Object> row : rows) {
+ Long orderId = getSummaryLong(row, "orderId");
+ if (orderId != null) {
+ incomeMap.put(orderId, row);
+ }
+ }
+ }
for (ChargingOrderListVO item : list) {
- fillChargingPeriodIncome(item, siteServiceShareRatioMap);
+ applyChargingPeriodShareIncome(item, incomeMap.get(item.getId()));
}
}
- private void fillChargingPeriodIncome(ChargingOrderListVO item, Map<Integer, BigDecimal> siteServiceShareRatioMap) {
+ void applyChargingPeriodShareIncome(ChargingOrderListVO item, Map<String, Object> row) {
if (item == null) {
return;
}
- BigDecimal[] income = calculateChargingPeriodIncome(
- item.getPaymentAmount(),
- item.getServiceCharge(),
- siteServiceShareRatioMap.get(item.getSiteId()),
- item.getOrderSource());
- item.setPlatformIncome(income[0]);
- item.setPartnerIncome(income[1]);
- }
-
- static BigDecimal[] calculateChargingPeriodIncome(BigDecimal paymentAmount,
- BigDecimal serviceCharge,
- BigDecimal serviceShareRatio,
- Integer orderSource) {
- BigDecimal paid = zeroIfNull(paymentAmount);
- BigDecimal partnerIncome = BigDecimal.ZERO;
- if (!Integer.valueOf(2).equals(orderSource)
- && serviceShareRatio != null
- && serviceShareRatio.compareTo(BigDecimal.ZERO) > 0) {
- partnerIncome = zeroIfNull(serviceCharge)
- .multiply(serviceShareRatio)
- .divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
- }
- return new BigDecimal[]{
- paid.subtract(partnerIncome).max(BigDecimal.ZERO).setScale(2, RoundingMode.HALF_UP),
- partnerIncome.setScale(2, RoundingMode.HALF_UP)
- };
- }
-
- private static BigDecimal zeroIfNull(BigDecimal amount) {
- return amount == null ? BigDecimal.ZERO : amount;
- }
-
- private Map<Integer, BigDecimal> loadSiteServiceShareRatioMap() {
- Map<Integer, BigDecimal> ratioMap = new HashMap<>();
- R<List<Site>> siteResult = siteClient.getSiteAll();
- R<List<Partner>> partnerResult = siteClient.getAllPartner();
- List<Site> sites = siteResult == null ? Collections.emptyList() : siteResult.getData();
- List<Partner> partners = partnerResult == null ? Collections.emptyList() : partnerResult.getData();
- if (sites == null || sites.isEmpty() || partners == null || partners.isEmpty()) {
- return ratioMap;
- }
- Map<Integer, Partner> partnerMap = partners.stream()
- .filter(partner -> partner != null && partner.getId() != null)
- .collect(Collectors.toMap(Partner::getId, partner -> partner, (left, right) -> left));
- for (Site site : sites) {
- if (site == null || site.getId() == null || site.getPartnerId() == null) {
- continue;
- }
- Partner partner = partnerMap.get(site.getPartnerId());
- if (partner != null && partner.getServiceShareRatio() != null) {
- ratioMap.put(site.getId(), partner.getServiceShareRatio());
- }
- }
- return ratioMap;
+ item.setPlatformIncome(getSummaryDecimal(row, "platformIncome"));
+ item.setPartnerIncome(getSummaryDecimal(row, "partnerIncome"));
}
/**
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
index 5f2715d..35437f1 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -1211,12 +1211,12 @@
and a.site_id = #{req.siteId}
</if>
<if test="startTime1 != null and startTime1!=''">
- and (a.create_time between #{startTime1} and #{startTime2})
+ and (a.pay_time between #{startTime1} and #{startTime2})
</if>
<if test="endTime1 != null and endTime1!=''">
and (a.end_time between #{endTime1} and #{endTime2})
</if>
- and a.start_time IS NOT NULL order by a.create_time desc
+ and a.start_time IS NOT NULL and a.end_time IS NOT NULL order by a.create_time desc
</select>
@@ -1306,7 +1306,7 @@
and b.site_id = #{req.siteId}
</if>
<if test="startTime1 != null and startTime1!=''">
- and b.start_time between #{startTime1} and #{startTime2}
+ and b.pay_time between #{startTime1} and #{startTime2}
</if>
<if test="endTime1 != null and endTime2!=''">
and b.end_time between #{endTime1} and #{endTime2}
@@ -1381,7 +1381,7 @@
and co.site_id = #{req.siteId}
</if>
<if test="startTime1 != null and startTime1!=''">
- and co.start_time between #{startTime1} and #{startTime2}
+ and co.pay_time between #{startTime1} and #{startTime2}
</if>
<if test="endTime1 != null and endTime2!=''">
and co.end_time between #{endTime1} and #{endTime2}
@@ -1437,7 +1437,7 @@
and co.site_id = #{req.siteId}
</if>
<if test="startTime1 != null and startTime1!=''">
- and co.start_time between #{startTime1} and #{startTime2}
+ and co.pay_time between #{startTime1} and #{startTime2}
</if>
<if test="endTime1 != null and endTime2!=''">
and co.end_time between #{endTime1} and #{endTime2}
--
Gitblit v1.7.1