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())));