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