From fd82d9604f3f081729c5ae28aa62ddc113ba90f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B3=89=E4=BD=B3?= <1107186916@qq.com> Date: Thu, 5 Nov 2026 15:09:25 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=8A=BD=E5=8F=96=E6=AD=A3?= =?UTF-8?q?=E5=BC=8F=E7=BB=93=E7=AE=97=E5=8D=95=E6=94=B6=E6=AC=BE=E6=B1=87?= =?UTF-8?q?=E6=80=BB=E6=89=B9=E9=87=8F=E8=A3=85=E8=BD=BD=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E7=BB=9F=E4=B8=80=E8=AF=BB=E5=86=99=E5=8F=A3?= =?UTF-8?q?=E5=BE=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/FormalSettlementServiceImpl.java | 184 +++++++----------- 1 file changed, 71 insertions(+), 113 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java index 84410256..eafc0514 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/FormalSettlementServiceImpl.java @@ -233,8 +233,7 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl(); } - List ids = entities.stream().map(FormalSettlement::getId).toList(); - boolean hasPayable = entities.stream().anyMatch(item -> "payable".equals(item.getSettlementType())); - boolean hasReceivable = entities.stream().anyMatch(item -> "receivable".equals(item.getSettlementType())); + PaymentSummaryBatchData batch = this.loadPaymentSummaryBatchData( + entities.stream().map(FormalSettlement::getId).toList()); + List voList = new ArrayList<>(entities.size()); + for (FormalSettlement entity : entities) { + FormalSettlementVO vo = FormalSettlementWrapper.build().entityVO(entity); + vo.setInvoiceStatus(this.invoiceStatus(entity.getInvoiceAmount(), entity.getSettlementAmount())); + PaymentSummary summary = this.paymentSummaryFor(entity, batch); + vo.setAppliedPaymentAmount(summary.appliedAmount()); + vo.setPaidAmount(summary.paidAmount()); + vo.setRemainingPayableAmount(this.money(entity.getSettlementAmount()).subtract(summary.paidAmount()) + .max(BigDecimal.ZERO)); + vo.setPreSettlementNos(batch.sourcesBySettlement().getOrDefault(entity.getId(), List.of()).stream() + .map(FormalSettlementSource::getPreSettlementNo).collect(Collectors.joining(","))); + voList.add(vo); + } + return voList; + } + + /** + * 批量收款汇总数据装载(列表页 toVOList 读路径与 refreshPaymentSummaries 写回路径共用): + * 固定 6 次查询取回本批结算单全部汇总数据源并按结算单id分组,替代两处各自维护的重复查询块。 + */ + private PaymentSummaryBatchData loadPaymentSummaryBatchData(Collection settlementIds) { + List ids = settlementIds.stream().filter(Objects::nonNull).distinct().toList(); + if (ids.isEmpty()) { + return new PaymentSummaryBatchData(Map.of(), Map.of(), Map.of(), Map.of(), Map.of(), Map.of()); + } // 结算-付款申请关系(全量) Map> relationsBySettlement = paymentApplicationSettlementMapper.selectList( Wrappers.lambdaQuery() @@ -275,53 +298,51 @@ public class FormalSettlementServiceImpl extends BaseServiceImpllambdaQuery() .in(FormalSettlementSource::getFormalSettlementId, ids)).stream() .collect(Collectors.groupingBy(FormalSettlementSource::getFormalSettlementId)); - // 收款认领分摊聚合(仅应收结算单需要) - Map receiptClaimPaidBySettlement = hasReceivable - ? receiptClaimSettlementMapper.selectList(Wrappers.lambdaQuery() + // 收款认领分摊聚合(仅应收结算单消费) + Map receiptClaimPaidBySettlement = receiptClaimSettlementMapper.selectList( + Wrappers.lambdaQuery() .in(ReceiptClaimSettlement::getFormalSettlementId, ids) .eq(ReceiptClaimSettlement::getStatus, 1) .eq(ReceiptClaimSettlement::getIsDeleted, 0)).stream() - .collect(Collectors.groupingBy(ReceiptClaimSettlement::getFormalSettlementId, - Collectors.reducing(BigDecimal.ZERO, - item -> this.money(item.getAllocatedReceiptAmount()), BigDecimal::add))) - : Map.of(); - // 项目预付核销合计(仅应付结算单需要,一次 group-by 避免逐单查询) - Map writeOffAmountsBySettlement = hasPayable - ? this.projectAdvanceWriteOffService.sumBySettlementIds( - TransportBusiConstant.SETTLEMENT_BILL_FORMAL, - entities.stream().filter(item -> "payable".equals(item.getSettlementType())) - .map(FormalSettlement::getId).toList()) - : Map.of(); + .collect(Collectors.groupingBy(ReceiptClaimSettlement::getFormalSettlementId, + Collectors.reducing(BigDecimal.ZERO, + item -> this.money(item.getAllocatedReceiptAmount()), BigDecimal::add))); + // 项目预付核销合计(仅应付结算单消费,一次 group-by 避免逐单查询) + Map writeOffAmountsBySettlement = this.projectAdvanceWriteOffService.sumBySettlementIds( + TransportBusiConstant.SETTLEMENT_BILL_FORMAL, ids); + return new PaymentSummaryBatchData(relationsBySettlement, applicationsBySettlement, relationStatuses, + sourcesBySettlement, receiptClaimPaidBySettlement, writeOffAmountsBySettlement); + } - List voList = new ArrayList<>(entities.size()); - for (FormalSettlement entity : entities) { - FormalSettlementVO vo = FormalSettlementWrapper.build().entityVO(entity); - vo.setInvoiceStatus(this.invoiceStatus(entity.getInvoiceAmount(), entity.getSettlementAmount())); - List relations = relationsBySettlement - .getOrDefault(entity.getId(), List.of()); - // 直挂付款申请需排除该结算单关系表已引用的申请(与单笔版 notIn 语义一致) - Set ownRelationApplicationIds = relations.stream() - .map(PaymentApplicationSettlement::getPaymentApplicationId) - .filter(Objects::nonNull).collect(Collectors.toSet()); - List directApplications = applicationsBySettlement - .getOrDefault(entity.getId(), List.of()).stream() - .filter(item -> !ownRelationApplicationIds.contains(item.getId())) - .toList(); - PaymentSummary summary = this.calculatePaymentSummary(entity, new PaymentSummaryData( - relations, directApplications, relationStatuses, - sourcesBySettlement.getOrDefault(entity.getId(), List.of()).stream() - .filter(item -> Objects.equals(item.getIsDeleted(), 0)).toList(), - receiptClaimPaidBySettlement.getOrDefault(entity.getId(), BigDecimal.ZERO), - writeOffAmountsBySettlement)); - vo.setAppliedPaymentAmount(summary.appliedAmount()); - vo.setPaidAmount(summary.paidAmount()); - vo.setRemainingPayableAmount(this.money(entity.getSettlementAmount()).subtract(summary.paidAmount()) - .max(BigDecimal.ZERO)); - vo.setPreSettlementNos(sourcesBySettlement.getOrDefault(entity.getId(), List.of()).stream() - .map(FormalSettlementSource::getPreSettlementNo).collect(Collectors.joining(","))); - voList.add(vo); - } - return voList; + /** + * 单张结算单收款汇总纯计算:从批量装载数据取数组装 + * (直挂付款申请排除该结算单关系表已引用的申请,与单笔版 notIn 语义一致)。 + */ + private PaymentSummary paymentSummaryFor(FormalSettlement settlement, PaymentSummaryBatchData batch) { + List relations = batch.relationsBySettlement() + .getOrDefault(settlement.getId(), List.of()); + Set ownRelationApplicationIds = relations.stream() + .map(PaymentApplicationSettlement::getPaymentApplicationId) + .filter(Objects::nonNull).collect(Collectors.toSet()); + List directApplications = batch.applicationsBySettlement() + .getOrDefault(settlement.getId(), List.of()).stream() + .filter(item -> !ownRelationApplicationIds.contains(item.getId())) + .toList(); + return this.calculatePaymentSummary(settlement, new PaymentSummaryData( + relations, directApplications, batch.relationStatuses(), + batch.sourcesBySettlement().getOrDefault(settlement.getId(), List.of()).stream() + .filter(item -> Objects.equals(item.getIsDeleted(), 0)).toList(), + batch.receiptClaimPaidBySettlement().getOrDefault(settlement.getId(), BigDecimal.ZERO), + batch.writeOffAmountsBySettlement())); + } + + /** + * 批量收款汇总装载数据(结算单id → 各数据源分组) + */ + private record PaymentSummaryBatchData(Map> relationsBySettlement, + Map> applicationsBySettlement, Map relationStatuses, + Map> sourcesBySettlement, + Map receiptClaimPaidBySettlement, Map writeOffAmountsBySettlement) { } /** @@ -2191,72 +2212,9 @@ public class FormalSettlementServiceImpl extends BaseServiceImpl settledIds = settlements.stream().map(FormalSettlement::getId).toList(); - boolean hasPayable = settlements.stream().anyMatch(item -> "payable".equals(item.getSettlementType())); - boolean hasReceivable = settlements.stream().anyMatch(item -> "receivable".equals(item.getSettlementType())); - - // 结算-付款申请关系(全量) - Map> relationsBySettlement = paymentApplicationSettlementMapper.selectList( - Wrappers.lambdaQuery() - .in(PaymentApplicationSettlement::getFormalSettlementId, settledIds) - .eq(PaymentApplicationSettlement::getIsDeleted, 0)).stream() - .collect(Collectors.groupingBy(PaymentApplicationSettlement::getFormalSettlementId)); - // 付款申请(按结算单直挂,payment_type=结算) - Map> applicationsBySettlement = paymentApplicationMapper.selectList( - Wrappers.lambdaQuery() - .in(PaymentApplication::getSettlementId, settledIds) - .eq(PaymentApplication::getPaymentType, TransportBusiConstant.PAYMENT_TYPE_SETTLEMENT) - .eq(PaymentApplication::getIsDeleted, 0)).stream() - .collect(Collectors.groupingBy(PaymentApplication::getSettlementId)); - // 关系表引用的付款申请状态(全量一次) - Set relationApplicationIds = relationsBySettlement.values().stream() - .flatMap(List::stream).map(PaymentApplicationSettlement::getPaymentApplicationId) - .filter(Objects::nonNull).collect(Collectors.toSet()); - Map relationStatuses = relationApplicationIds.isEmpty() ? Map.of() - : paymentApplicationMapper.selectList(Wrappers.lambdaQuery() - .select(PaymentApplication::getId, PaymentApplication::getApprovalStatus) - .in(PaymentApplication::getId, relationApplicationIds) - .eq(PaymentApplication::getIsDeleted, 0)).stream() - .collect(Collectors.toMap(PaymentApplication::getId, PaymentApplication::getApprovalStatus, - (first, second) -> first)); - // 预收来源(仅应付结算单需要) - Map> sourcesBySettlement = hasPayable - ? sourceMapper.selectList(Wrappers.lambdaQuery() - .in(FormalSettlementSource::getFormalSettlementId, settledIds) - .eq(FormalSettlementSource::getIsDeleted, 0)).stream() - .collect(Collectors.groupingBy(FormalSettlementSource::getFormalSettlementId)) - : Map.of(); - // 收款认领分摊聚合(仅应收结算单需要) - Map receiptClaimPaidBySettlement = hasReceivable - ? receiptClaimSettlementMapper.selectList(Wrappers.lambdaQuery() - .in(ReceiptClaimSettlement::getFormalSettlementId, settledIds) - .eq(ReceiptClaimSettlement::getStatus, 1) - .eq(ReceiptClaimSettlement::getIsDeleted, 0)).stream() - .collect(Collectors.groupingBy(ReceiptClaimSettlement::getFormalSettlementId, - Collectors.reducing(BigDecimal.ZERO, - item -> money(item.getAllocatedReceiptAmount()), BigDecimal::add))) - : Map.of(); - // 项目预付核销合计(仅应付结算单需要,一次 group-by 避免逐单查询) - Map writeOffAmountsBySettlement = hasPayable - ? this.projectAdvanceWriteOffService.sumBySettlementIds( - TransportBusiConstant.SETTLEMENT_BILL_FORMAL, settledIds) - : Map.of(); - + PaymentSummaryBatchData batch = this.loadPaymentSummaryBatchData(settledIds); for (FormalSettlement settlement : settlements) { - List relations = relationsBySettlement - .getOrDefault(settlement.getId(), List.of()); - // 直挂付款申请需排除该结算单关系表已引用的申请(与单笔版 notIn 语义一致) - Set ownRelationApplicationIds = relations.stream() - .map(PaymentApplicationSettlement::getPaymentApplicationId) - .filter(Objects::nonNull).collect(Collectors.toSet()); - List directApplications = applicationsBySettlement - .getOrDefault(settlement.getId(), List.of()).stream() - .filter(item -> !ownRelationApplicationIds.contains(item.getId())) - .toList(); - PaymentSummary summary = calculatePaymentSummary(settlement, new PaymentSummaryData( - relations, directApplications, relationStatuses, - sourcesBySettlement.getOrDefault(settlement.getId(), List.of()), - receiptClaimPaidBySettlement.getOrDefault(settlement.getId(), BigDecimal.ZERO), - writeOffAmountsBySettlement)); + PaymentSummary summary = this.paymentSummaryFor(settlement, batch); settlement.setAppliedPaymentAmount(summary.appliedAmount()); settlement.setPaidAmount(summary.paidAmount()); settlement.setRemainingPayableAmount(money(settlement.getSettlementAmount())