diff --git a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java index e73d3806..6650afd0 100644 --- a/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java +++ b/blade-service/blade-transport/src/main/java/org/springblade/transport/service/impl/PaymentApplicationServiceImpl.java @@ -1600,42 +1600,73 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl relations = settlementRelationMapper.selectList( + Wrappers.lambdaQuery() + .eq(PaymentApplicationSettlement::getPaymentApplicationId, entity.getId()) + .isNotNull(PaymentApplicationSettlement::getPreSettlementId) + .eq(PaymentApplicationSettlement::getIsDeleted, 0)); + if (relations.isEmpty()) { + PaymentApplicationSettlement single = new PaymentApplicationSettlement(); + single.setPreSettlementId(entity.getPreSettlementId()); + single.setAppliedAmount(entity.getAppliedAmount()); + relations = List.of(single); + } + BigDecimal remainingPaid = money(paidAmount); + for (int index = 0; index < relations.size(); index++) { + PaymentApplicationSettlement relation = relations.get(index); + BigDecimal paid = index == relations.size() - 1 ? remainingPaid + : money(relation.getAppliedAmount()).min(remainingPaid); + remainingPaid = remainingPaid.subtract(paid); + relation.setPaidAmount(paid); + syncOnePreSettlementAdvance(entity, relation, billStatus); + } + } + + /** + * 按预结算单逐单建档/更新预付记录:金蝶付款申请单生成成功(synced)即回显预付信息,付款完成回写(paid)更新为已付款 + * + * @param relation 预结算关联行,携带预结算单id、申请金额与本次分摊的已付金额 + */ + private void syncOnePreSettlementAdvance(PaymentApplication entity, PaymentApplicationSettlement relation, String billStatus) { + Long preSettlementId = relation.getPreSettlementId(); PreSettlementAdvance advance = preSettlementAdvanceMapper.selectList( Wrappers.lambdaQuery() - .eq(PreSettlementAdvance::getPreSettlementId, entity.getPreSettlementId()) + .eq(PreSettlementAdvance::getPreSettlementId, preSettlementId) .eq(PreSettlementAdvance::getIsDeleted, 0) .ne(PreSettlementAdvance::getBillStatus, TransportBusiConstant.VOIDED) .eq(PreSettlementAdvance::getAdvanceNo, entity.getPaymentNo()) .last("limit 1")).stream().findFirst().orElse(null); if (advance == null) { advance = preSettlementAdvanceMapper.selectList(Wrappers.lambdaQuery() - .eq(PreSettlementAdvance::getPreSettlementId, entity.getPreSettlementId()) + .eq(PreSettlementAdvance::getPreSettlementId, preSettlementId) .eq(PreSettlementAdvance::getIsDeleted, 0) .ne(PreSettlementAdvance::getBillStatus, TransportBusiConstant.VOIDED) .eq(PreSettlementAdvance::getPaidAmount, BigDecimal.ZERO) - .eq(PreSettlementAdvance::getAppliedAmount, money(entity.getAppliedAmount())) + .eq(PreSettlementAdvance::getAppliedAmount, money(relation.getAppliedAmount())) .orderByDesc(PreSettlementAdvance::getCreateTime).last("limit 1")).stream().findFirst().orElse(null); } if (advance == null) { advance = new PreSettlementAdvance(); - advance.setPreSettlementId(entity.getPreSettlementId()); + advance.setPreSettlementId(preSettlementId); advance.setAdvanceNo(entity.getPaymentNo()); - advance.setAppliedAmount(money(entity.getAppliedAmount())); + advance.setAppliedAmount(money(relation.getAppliedAmount())); } - advance.setPaidAmount(paidAmount); + advance.setPaidAmount(money(relation.getPaidAmount())); advance.setBillStatus(billStatus); advance.setKingdeeAdvanceNo(entity.getKingdeeBillNo()); if (advance.getId() == null) preSettlementAdvanceMapper.insert(advance); else preSettlementAdvanceMapper.updateById(advance); - refreshPreSettlementAdvanceSummary(entity.getPreSettlementId()); + refreshPreSettlementAdvanceSummary(preSettlementId); formalSettlementSourceMapper.selectList(Wrappers.lambdaQuery() - .eq(FormalSettlementSource::getPreSettlementId, entity.getPreSettlementId()) + .eq(FormalSettlementSource::getPreSettlementId, preSettlementId) .eq(FormalSettlementSource::getIsDeleted, 0)).forEach(source -> { - source.setAdvanceAppliedAmount(findPreSettlementApplied(entity.getPreSettlementId())); - source.setAdvancePaidAmount(findPreSettlementPaid(entity.getPreSettlementId())); + source.setAdvanceAppliedAmount(findPreSettlementApplied(preSettlementId)); + source.setAdvancePaidAmount(findPreSettlementPaid(preSettlementId)); formalSettlementSourceMapper.updateById(source); }); - formalSettlementService.refreshPaymentSummariesForPreSettlement(entity.getPreSettlementId()); + formalSettlementService.refreshPaymentSummariesForPreSettlement(preSettlementId); } /** @@ -1645,13 +1676,21 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl preSettlementIds = new ArrayList<>(List.of(entity.getPreSettlementId())); + settlementRelationMapper.selectList(Wrappers.lambdaQuery() + .eq(PaymentApplicationSettlement::getPaymentApplicationId, entity.getId()) + .isNotNull(PaymentApplicationSettlement::getPreSettlementId) + .eq(PaymentApplicationSettlement::getIsDeleted, 0)) + .stream().map(PaymentApplicationSettlement::getPreSettlementId).filter(Objects::nonNull).distinct() + .forEach(preSettlementIds::add); preSettlementAdvanceMapper.update(null, Wrappers.lambdaUpdate() - .eq(PreSettlementAdvance::getPreSettlementId, entity.getPreSettlementId()) + .in(PreSettlementAdvance::getPreSettlementId, preSettlementIds) .eq(PreSettlementAdvance::getAdvanceNo, entity.getPaymentNo()) .eq(PreSettlementAdvance::getIsDeleted, 0) .ne(PreSettlementAdvance::getBillStatus, "paid") .set(PreSettlementAdvance::getBillStatus, TransportBusiConstant.VOIDED)); - refreshPreSettlementAdvanceSummary(entity.getPreSettlementId()); + preSettlementIds.forEach(this::refreshPreSettlementAdvanceSummary); } private BigDecimal findPreSettlementPaid(Long preSettlementId) {