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