From 27021fdc85fee6e7539c25d7b498537cc4736b72 Mon Sep 17 00:00:00 2001
From: longz <longzhaoz@qq.com>
Date: 星期三, 29 七月 2026 20:59:46 +0800
Subject: [PATCH] 各类修复

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |  105 +++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 103 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 fd8980a..d611237 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
@@ -141,6 +141,8 @@
 	private static final String SPECIAL_REFUND_TITLE = "特殊退款处理";
 	private static final int RESERVATION_RECOMMENDATION_HISTORY_DAYS = 30;
 	private static final int ENTERPRISE_DETAIL_PERIOD_BATCH_SIZE = 500;
+	private static final int ENTERPRISE_INVOICE_BATCH_SIZE = 500;
+	private static final int ENTERPRISE_ORDER_ID_BATCH_SIZE = 500;
 
 	@Override
 	public ReservationRecommendationVO getReservationRecommendation(Integer siteId) {
@@ -3139,7 +3141,22 @@
 	@Override
 	public R<PageInfo<EnterpriseChargingDetailVO>> enterpriseChargingDetail(EnterpriseChargingAnalysisQuery query) {
 		PageInfo<EnterpriseChargingDetailVO> pageInfo = new PageInfo<>(query.getPageCurr(), query.getPageSize());
-		List<EnterpriseChargingDetailVO> list = this.baseMapper.enterpriseChargingDetail(pageInfo, query);
+		Map<Long, TOrderInvoiceDetail> invoiceDetailMap = getEnterpriseInvoiceDetailMap(query);
+		if (invoiceDetailMap.isEmpty()) {
+			pageInfo.setTotal(0L);
+			pageInfo.setRecords(Collections.emptyList());
+			return R.ok(pageInfo);
+		}
+		List<Long> orderIds = new ArrayList<>(invoiceDetailMap.keySet());
+		long total = countEnterpriseChargingDetails(orderIds, query);
+		pageInfo.setTotal(total);
+		if (total == 0L) {
+			pageInfo.setRecords(Collections.emptyList());
+			return R.ok(pageInfo);
+		}
+		List<EnterpriseChargingDetailVO> list = queryEnterpriseChargingDetailPage(
+				orderIds, query, pageInfo.offset(), pageInfo.getSize());
+		fillEnterpriseInvoiceAmounts(list, invoiceDetailMap);
 		fillEnterpriseChargingPeriodCounts(list);
 		pageInfo.setRecords(list);
 		return R.ok(pageInfo);
@@ -3147,11 +3164,95 @@
 
 	@Override
 	public List<EnterpriseChargingDetailVO> enterpriseChargingDetailExport(EnterpriseChargingAnalysisQuery query) {
-		List<EnterpriseChargingDetailVO> list = this.baseMapper.enterpriseChargingDetailExport(query);
+		Map<Long, TOrderInvoiceDetail> invoiceDetailMap = getEnterpriseInvoiceDetailMap(query);
+		if (invoiceDetailMap.isEmpty()) {
+			return Collections.emptyList();
+		}
+		List<EnterpriseChargingDetailVO> list = queryEnterpriseChargingDetailPage(
+				new ArrayList<>(invoiceDetailMap.keySet()), query, 0L, Long.MAX_VALUE);
+		fillEnterpriseInvoiceAmounts(list, invoiceDetailMap);
 		fillEnterpriseChargingPeriodCounts(list);
 		return list;
 	}
 
+	private long countEnterpriseChargingDetails(List<Long> orderIds, EnterpriseChargingAnalysisQuery query) {
+		long total = 0L;
+		for (int start = 0; start < orderIds.size(); start += ENTERPRISE_ORDER_ID_BATCH_SIZE) {
+			int end = Math.min(start + ENTERPRISE_ORDER_ID_BATCH_SIZE, orderIds.size());
+			Long batchTotal = this.baseMapper.enterpriseChargingDetailCount(orderIds.subList(start, end), query);
+			if (batchTotal != null) {
+				total += batchTotal;
+			}
+		}
+		return total;
+	}
+
+	private List<EnterpriseChargingDetailVO> queryEnterpriseChargingDetailPage(List<Long> orderIds,
+			EnterpriseChargingAnalysisQuery query, long offset, long pageSize) {
+		if (orderIds == null || orderIds.isEmpty() || pageSize <= 0L) {
+			return Collections.emptyList();
+		}
+		long requiredRows = pageSize == Long.MAX_VALUE || offset > Long.MAX_VALUE - pageSize
+				? Long.MAX_VALUE : offset + pageSize;
+		List<EnterpriseChargingDetailVO> candidates = new ArrayList<>();
+		for (int start = 0; start < orderIds.size(); start += ENTERPRISE_ORDER_ID_BATCH_SIZE) {
+			int end = Math.min(start + ENTERPRISE_ORDER_ID_BATCH_SIZE, orderIds.size());
+			List<Long> batchOrderIds = orderIds.subList(start, end);
+			long batchLimit = Math.min(requiredRows, batchOrderIds.size());
+			candidates.addAll(this.baseMapper.enterpriseChargingDetail(batchOrderIds, query, 0L, batchLimit));
+		}
+		candidates.sort(Comparator
+				.comparing(EnterpriseChargingDetailVO::getCreateTime,
+						Comparator.nullsLast(Comparator.reverseOrder()))
+				.thenComparing(EnterpriseChargingDetailVO::getId,
+						Comparator.nullsLast(Comparator.reverseOrder())));
+		int fromIndex = (int) Math.min(offset, candidates.size());
+		long requestedEnd = pageSize == Long.MAX_VALUE || fromIndex > Long.MAX_VALUE - pageSize
+				? Long.MAX_VALUE : fromIndex + pageSize;
+		int toIndex = (int) Math.min(requestedEnd, candidates.size());
+		return new ArrayList<>(candidates.subList(fromIndex, toIndex));
+	}
+
+	private Map<Long, TOrderInvoiceDetail> getEnterpriseInvoiceDetailMap(EnterpriseChargingAnalysisQuery query) {
+		List<Long> invoiceIds = this.baseMapper.enterpriseInvoiceIds(query);
+		if (invoiceIds == null || invoiceIds.isEmpty()) {
+			return Collections.emptyMap();
+		}
+		Map<Long, TOrderInvoiceDetail> detailMap = new LinkedHashMap<>();
+		for (int start = 0; start < invoiceIds.size(); start += ENTERPRISE_INVOICE_BATCH_SIZE) {
+			int end = Math.min(start + ENTERPRISE_INVOICE_BATCH_SIZE, invoiceIds.size());
+			List<TOrderInvoiceDetail> details = this.baseMapper.enterpriseInvoiceChargingDetails(invoiceIds.subList(start, end));
+			if (details == null) {
+				continue;
+			}
+			for (TOrderInvoiceDetail detail : details) {
+				if (detail == null || detail.getOrderId() == null) {
+					continue;
+				}
+				detailMap.merge(detail.getOrderId(), detail, this::mergeEnterpriseInvoiceDetail);
+			}
+		}
+		return detailMap;
+	}
+
+	private TOrderInvoiceDetail mergeEnterpriseInvoiceDetail(TOrderInvoiceDetail current, TOrderInvoiceDetail addition) {
+		current.setElectrovalence(nullToZero(current.getElectrovalence()).add(nullToZero(addition.getElectrovalence())));
+		current.setServiceCharge(nullToZero(current.getServiceCharge()).add(nullToZero(addition.getServiceCharge())));
+		return current;
+	}
+
+	private void fillEnterpriseInvoiceAmounts(List<EnterpriseChargingDetailVO> list,
+			Map<Long, TOrderInvoiceDetail> invoiceDetailMap) {
+		if (list == null || list.isEmpty()) {
+			return;
+		}
+		for (EnterpriseChargingDetailVO detail : list) {
+			TOrderInvoiceDetail invoiceDetail = invoiceDetailMap.get(detail.getId());
+			detail.setElectrovalence(invoiceDetail == null ? BigDecimal.ZERO : nullToZero(invoiceDetail.getElectrovalence()));
+			detail.setServiceCharge(invoiceDetail == null ? BigDecimal.ZERO : nullToZero(invoiceDetail.getServiceCharge()));
+		}
+	}
+
 	private void fillEnterpriseChargingPeriodCounts(List<EnterpriseChargingDetailVO> list) {
 		if (list == null || list.isEmpty()) {
 			return;

--
Gitblit v1.7.1