From 702e6b12a8f72b81cfbdc799c956afc7f80492f6 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, 29 Oct 2026 02:19:11 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=A2=84=E7=BB=93=E7=AE=97=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E6=8C=89=E4=BB=98=E6=AC=BE=E7=94=B3=E8=AF=B7=E5=85=B3?= =?UTF-8?q?=E8=81=94=E8=A1=8C=E5=BD=92=E9=9B=86=E9=A2=84=E4=BB=98=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E4=B8=8E=E5=B7=B2=E4=BB=98=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 多选预结算单时付款申请主表只存第一张单,原汇总逻辑按主表 pre_settlement_id 归集, 导致第二张及之后单据的预付申请金额恒为 0。改为按 blade_payment_application_settlement 关联行逐单归集,已付金额按关联行顺序分摊,与金蝶预付建档口径一致;无关联行的历史单据仍按主表兜底。 --- .../impl/PreSettlementServiceImpl.java | 62 +++++++++++++++---- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java index 6b0247ca..20e911d6 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PreSettlementServiceImpl.java @@ -44,6 +44,7 @@ import org.springblade.transport.mapper.PreSettlementDetailMapper; import org.springblade.transport.mapper.PreSettlementMapper; import org.springblade.transport.mapper.PreSettlementSummaryFeeMapper; import org.springblade.transport.mapper.PaymentApplicationMapper; +import org.springblade.transport.mapper.PaymentApplicationSettlementMapper; import org.springblade.transport.mapper.ReceivablePayableCargoFeeMapper; import org.springblade.transport.mapper.ReceivablePayableDetailMapper; import org.springblade.transport.pojo.dto.PreSettlementAdvanceRequest; @@ -59,6 +60,7 @@ import org.springblade.transport.pojo.entity.PreSettlementDetail; import org.springblade.transport.pojo.entity.PreSettlementDetailFee; import org.springblade.transport.pojo.entity.PreSettlementSummaryFee; import org.springblade.transport.pojo.entity.PaymentApplication; +import org.springblade.transport.pojo.entity.PaymentApplicationSettlement; import org.springblade.transport.pojo.entity.ProjectApply; import org.springblade.transport.pojo.entity.ReceivablePayableCargoFee; import org.springblade.transport.pojo.entity.ReceivablePayableDetail; @@ -118,6 +120,7 @@ public class PreSettlementServiceImpl extends BaseServiceImpl preSettlementIds = records.stream().map(PreSettlementVO::getId) .filter(Objects::nonNull).collect(Collectors.toSet()); if (preSettlementIds.isEmpty()) return; - List applications = paymentApplicationMapper.selectList( - Wrappers.lambdaQuery() - .select(PaymentApplication::getPreSettlementId, PaymentApplication::getAppliedAmount, - PaymentApplication::getPaidAmount) - .eq(PaymentApplication::getPaymentType, "progress_advance") - .in(PaymentApplication::getPreSettlementId, preSettlementIds) - .eq(PaymentApplication::getApprovalStatus, STATUS_APPROVED) - .eq(PaymentApplication::getIsDeleted, 0)); Map appliedAmounts = new HashMap<>(); Map paidAmounts = new HashMap<>(); - applications.forEach(application -> { - Long preSettlementId = application.getPreSettlementId(); - appliedAmounts.merge(preSettlementId, money(application.getAppliedAmount()), BigDecimal::add); - paidAmounts.merge(preSettlementId, money(application.getPaidAmount()), BigDecimal::add); - }); + // 多选预结算单时付款申请主表只存第一张,按关联行逐单归集;已付金额按关联行顺序分摊实付金额, + // 与同步金蝶预付建档(syncPreSettlementAdvance)同一口径,避免第二张及之后的单据金额恒为0 + List relations = settlementRelationMapper.selectList( + Wrappers.lambdaQuery() + .in(PaymentApplicationSettlement::getPreSettlementId, preSettlementIds) + .eq(PaymentApplicationSettlement::getIsDeleted, 0) + .orderByAsc(PaymentApplicationSettlement::getId)); + Set relationPaymentIds = relations.stream() + .map(PaymentApplicationSettlement::getPaymentApplicationId).filter(Objects::nonNull) + .collect(Collectors.toSet()); + Map relationPayments = relationPaymentIds.isEmpty() ? new HashMap<>() + : paymentApplicationMapper.selectBatchIds(relationPaymentIds).stream() + .filter(application -> !Objects.equals(application.getIsDeleted(), 1)) + .filter(application -> TransportBusiConstant.APPROVED.equals(application.getApprovalStatus())) + .filter(application -> "progress_advance".equals(application.getPaymentType())) + .collect(Collectors.toMap(PaymentApplication::getId, Function.identity(), (left, right) -> left)); + relations.stream() + .filter(relation -> relationPayments.containsKey(relation.getPaymentApplicationId())) + .collect(Collectors.groupingBy(PaymentApplicationSettlement::getPaymentApplicationId, + LinkedHashMap::new, Collectors.toList())) + .forEach((paymentId, paymentRelations) -> { + BigDecimal remainingPaid = money(relationPayments.get(paymentId).getPaidAmount()); + for (int index = 0; index < paymentRelations.size(); index++) { + PaymentApplicationSettlement relation = paymentRelations.get(index); + BigDecimal applied = money(relation.getAppliedAmount()); + BigDecimal paid = index == paymentRelations.size() - 1 ? remainingPaid + : applied.min(remainingPaid); + remainingPaid = remainingPaid.subtract(paid); + appliedAmounts.merge(relation.getPreSettlementId(), applied, BigDecimal::add); + paidAmounts.merge(relation.getPreSettlementId(), paid, BigDecimal::add); + } + }); + // 历史仅写主表、无关联行的付款申请按主表兜底 + paymentApplicationMapper.selectList( + Wrappers.lambdaQuery() + .select(PaymentApplication::getId, PaymentApplication::getPreSettlementId, + PaymentApplication::getAppliedAmount, PaymentApplication::getPaidAmount) + .in(PaymentApplication::getPreSettlementId, preSettlementIds) + .eq(PaymentApplication::getPaymentType, "progress_advance") + .eq(PaymentApplication::getApprovalStatus, STATUS_APPROVED) + .eq(PaymentApplication::getIsDeleted, 0) + .notIn(!relationPaymentIds.isEmpty(), PaymentApplication::getId, relationPaymentIds)) + .forEach(application -> { + appliedAmounts.merge(application.getPreSettlementId(), money(application.getAppliedAmount()), BigDecimal::add); + paidAmounts.merge(application.getPreSettlementId(), money(application.getPaidAmount()), BigDecimal::add); + }); records.forEach(record -> { record.setAdvanceAppliedAmount(money(appliedAmounts.get(record.getId()))); record.setAdvancePaidAmount(money(paidAmounts.get(record.getId())));