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) {
|
private void syncPreSettlementAdvance(PaymentApplication entity, String billStatus, BigDecimal paidAmount) {
|
||||||
if (entity.getPreSettlementId() == null) return;
|
if (entity.getPreSettlementId() == null) return;
|
||||||
if (!List.of("progress_advance", "settlement_payment").contains(entity.getPaymentType())) 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(
|
PreSettlementAdvance advance = preSettlementAdvanceMapper.selectList(
|
||||||
Wrappers.<PreSettlementAdvance>lambdaQuery()
|
Wrappers.<PreSettlementAdvance>lambdaQuery()
|
||||||
.eq(PreSettlementAdvance::getPreSettlementId, entity.getPreSettlementId())
|
.eq(PreSettlementAdvance::getPreSettlementId, preSettlementId)
|
||||||
.eq(PreSettlementAdvance::getIsDeleted, 0)
|
.eq(PreSettlementAdvance::getIsDeleted, 0)
|
||||||
.ne(PreSettlementAdvance::getBillStatus, TransportBusiConstant.VOIDED)
|
.ne(PreSettlementAdvance::getBillStatus, TransportBusiConstant.VOIDED)
|
||||||
.eq(PreSettlementAdvance::getAdvanceNo, entity.getPaymentNo())
|
.eq(PreSettlementAdvance::getAdvanceNo, entity.getPaymentNo())
|
||||||
.last("limit 1")).stream().findFirst().orElse(null);
|
.last("limit 1")).stream().findFirst().orElse(null);
|
||||||
if (advance == null) {
|
if (advance == null) {
|
||||||
advance = preSettlementAdvanceMapper.selectList(Wrappers.<PreSettlementAdvance>lambdaQuery()
|
advance = preSettlementAdvanceMapper.selectList(Wrappers.<PreSettlementAdvance>lambdaQuery()
|
||||||
.eq(PreSettlementAdvance::getPreSettlementId, entity.getPreSettlementId())
|
.eq(PreSettlementAdvance::getPreSettlementId, preSettlementId)
|
||||||
.eq(PreSettlementAdvance::getIsDeleted, 0)
|
.eq(PreSettlementAdvance::getIsDeleted, 0)
|
||||||
.ne(PreSettlementAdvance::getBillStatus, TransportBusiConstant.VOIDED)
|
.ne(PreSettlementAdvance::getBillStatus, TransportBusiConstant.VOIDED)
|
||||||
.eq(PreSettlementAdvance::getPaidAmount, BigDecimal.ZERO)
|
.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);
|
.orderByDesc(PreSettlementAdvance::getCreateTime).last("limit 1")).stream().findFirst().orElse(null);
|
||||||
}
|
}
|
||||||
if (advance == null) {
|
if (advance == null) {
|
||||||
advance = new PreSettlementAdvance();
|
advance = new PreSettlementAdvance();
|
||||||
advance.setPreSettlementId(entity.getPreSettlementId());
|
advance.setPreSettlementId(preSettlementId);
|
||||||
advance.setAdvanceNo(entity.getPaymentNo());
|
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.setBillStatus(billStatus);
|
||||||
advance.setKingdeeAdvanceNo(entity.getKingdeeBillNo());
|
advance.setKingdeeAdvanceNo(entity.getKingdeeBillNo());
|
||||||
if (advance.getId() == null) preSettlementAdvanceMapper.insert(advance);
|
if (advance.getId() == null) preSettlementAdvanceMapper.insert(advance);
|
||||||
else preSettlementAdvanceMapper.updateById(advance);
|
else preSettlementAdvanceMapper.updateById(advance);
|
||||||
refreshPreSettlementAdvanceSummary(entity.getPreSettlementId());
|
refreshPreSettlementAdvanceSummary(preSettlementId);
|
||||||
formalSettlementSourceMapper.selectList(Wrappers.<FormalSettlementSource>lambdaQuery()
|
formalSettlementSourceMapper.selectList(Wrappers.<FormalSettlementSource>lambdaQuery()
|
||||||
.eq(FormalSettlementSource::getPreSettlementId, entity.getPreSettlementId())
|
.eq(FormalSettlementSource::getPreSettlementId, preSettlementId)
|
||||||
.eq(FormalSettlementSource::getIsDeleted, 0)).forEach(source -> {
|
.eq(FormalSettlementSource::getIsDeleted, 0)).forEach(source -> {
|
||||||
source.setAdvanceAppliedAmount(findPreSettlementApplied(entity.getPreSettlementId()));
|
source.setAdvanceAppliedAmount(findPreSettlementApplied(preSettlementId));
|
||||||
source.setAdvancePaidAmount(findPreSettlementPaid(entity.getPreSettlementId()));
|
source.setAdvancePaidAmount(findPreSettlementPaid(preSettlementId));
|
||||||
formalSettlementSourceMapper.updateById(source);
|
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) {
|
private void voidPreSettlementAdvance(PaymentApplication entity) {
|
||||||
if (entity.getPreSettlementId() == null) return;
|
if (entity.getPreSettlementId() == null) return;
|
||||||
if (!List.of("progress_advance", "settlement_payment").contains(entity.getPaymentType())) 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()
|
preSettlementAdvanceMapper.update(null, Wrappers.<PreSettlementAdvance>lambdaUpdate()
|
||||||
.eq(PreSettlementAdvance::getPreSettlementId, entity.getPreSettlementId())
|
.in(PreSettlementAdvance::getPreSettlementId, preSettlementIds)
|
||||||
.eq(PreSettlementAdvance::getAdvanceNo, entity.getPaymentNo())
|
.eq(PreSettlementAdvance::getAdvanceNo, entity.getPaymentNo())
|
||||||
.eq(PreSettlementAdvance::getIsDeleted, 0)
|
.eq(PreSettlementAdvance::getIsDeleted, 0)
|
||||||
.ne(PreSettlementAdvance::getBillStatus, "paid")
|
.ne(PreSettlementAdvance::getBillStatus, "paid")
|
||||||
.set(PreSettlementAdvance::getBillStatus, TransportBusiConstant.VOIDED));
|
.set(PreSettlementAdvance::getBillStatus, TransportBusiConstant.VOIDED));
|
||||||
refreshPreSettlementAdvanceSummary(entity.getPreSettlementId());
|
preSettlementIds.forEach(this::refreshPreSettlementAdvanceSummary);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BigDecimal findPreSettlementPaid(Long preSettlementId) {
|
private BigDecimal findPreSettlementPaid(Long preSettlementId) {
|
||||||
|
|||||||
Reference in New Issue
Block a user