fix: 修复付款申请多选预结算单时仅首张单回填预付信息
This commit is contained in:
+52
-13
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user