fix: 修复付款申请多选预结算单时仅首张单回填预付信息

This commit is contained in:
刘泉佳
2026-10-18 14:07:57 +08:00
parent 755d420aa2
commit 32f14b9299
@@ -1600,42 +1600,73 @@ public class PaymentApplicationServiceImpl extends BaseServiceImpl<PaymentApplic
private void syncPreSettlementAdvance(PaymentApplication entity, String billStatus, BigDecimal paidAmount) {
if (entity.getPreSettlementId() == null) return;
if (!List.of("progress_advance", "settlement_payment").contains(entity.getPaymentType())) return;
// 多选预结算单时单据上仅存第一张预结算,全部选中单据在关联表:按关联行逐单回填预付信息,
// 已付金额按关联行申请金额分摊(与 syncFormalSettlementPayments 同口径);单选无关联行,回退单据上的预结算与申请全额
List<PaymentApplicationSettlement> relations = settlementRelationMapper.selectList(
Wrappers.<PaymentApplicationSettlement>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.<PreSettlementAdvance>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.<PreSettlementAdvance>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.<FormalSettlementSource>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<PaymentApplic
private void voidPreSettlementAdvance(PaymentApplication entity) {
if (entity.getPreSettlementId() == null) return;
if (!List.of("progress_advance", "settlement_payment").contains(entity.getPaymentType())) return;
// 多选预结算单的预付记录按关联行逐单作废;单选回退单据上的预结算
List<Long> preSettlementIds = new ArrayList<>(List.of(entity.getPreSettlementId()));
settlementRelationMapper.selectList(Wrappers.<PaymentApplicationSettlement>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.<PreSettlementAdvance>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) {