diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettlePayRecordServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettlePayRecordServiceImpl.java index bd5674035..9adde5c62 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettlePayRecordServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettlePayRecordServiceImpl.java @@ -613,8 +613,71 @@ public class EmisSettlePayRecordServiceImpl extends EmisBaseService implements I // 删除收款记录 emisSettlePayRecordMapper.deleteEmisSettlePayRecordById(id); - // 重新计算账单收款 - emisSettleBillService.reCalcSettleBillPayStatus(payRecordOld.getSettleBillNo()); + // 重新计算账单收款(账单号可能为逗号分隔的多个) + if (StringUtils.isNotBlank(payRecordOld.getSettleBillNo())) { + List settleBillNos = Arrays.stream(payRecordOld.getSettleBillNo().split(",")) + .map(String::trim) + .filter(org.apache.commons.lang3.StringUtils::isNotBlank) + .distinct() + .collect(Collectors.toList()); + for (String settleBillNo : settleBillNos) { + emisSettleBillService.reCalcSettleBillPayStatus(settleBillNo); + } + } + + // 重新计算对应发票的已收金额与付款状态 + // 规则:发票新的已收金额 = 发票历史已收金额 - 本次(payId)对应的金额汇总 + // 1) 查询本次收款的运单收款明细(包含applySeqNo) + EmisSettlePayRel query = new EmisSettlePayRel(); + query.setPayId(payRecordOld.getPayId()); + List thisPayRelList = emisSettlePayRelMapper.selectEmisSettlePayRelList(query); + if (!CollectionUtils.isEmpty(thisPayRelList)) { + // 2) 按applySeqNo分组汇总本次金额 + Map revokeAmountByApplySeqNo = thisPayRelList.stream() + .filter(rel -> StringUtils.isNotBlank(rel.getApplySeqNo())) + .collect(Collectors.groupingBy(EmisSettlePayRel::getApplySeqNo, + Collectors.mapping(EmisSettlePayRel::getPayMoney, + Collectors.reducing(BigDecimal.ZERO, v -> v == null ? BigDecimal.ZERO : v, + BigDecimal::add)))); + + // 3) 对每个发票applySeqNo执行:历史已收金额 - 本次金额,重算状态 + for (Map.Entry entry : revokeAmountByApplySeqNo.entrySet()) { + String applySeqNo = entry.getKey(); + BigDecimal revokeAmount = entry.getValue() == null ? BigDecimal.ZERO : entry.getValue(); + + EmisSettleInvoiceRecord invoiceRecord = emisSettleInvoiceRecordMapper + .selectInvoiceRecordByApplySeqNo(applySeqNo); + if (invoiceRecord == null) { + continue; + } + + BigDecimal historyReced = invoiceRecord.getRecedMoney() == null ? BigDecimal.ZERO + : invoiceRecord.getRecedMoney(); + BigDecimal applyMoney = invoiceRecord.getApplyMoney() == null ? BigDecimal.ZERO + : invoiceRecord.getApplyMoney(); + + // 新的已收金额 = 历史已收金额 - 本次撤销金额,且不小于0 + BigDecimal newReced = historyReced.subtract(revokeAmount); + if (newReced.compareTo(BigDecimal.ZERO) < 0) { + newReced = BigDecimal.ZERO; + } + + String paymentStatus; + if (newReced.compareTo(BigDecimal.ZERO) == 0) { + paymentStatus = "0"; // 未付款 + } else if (newReced.compareTo(applyMoney) >= 0) { + paymentStatus = "1"; // 已付款 + } else { + paymentStatus = "2"; // 部分付款 + } + + EmisSettleInvoiceRecord upd = new EmisSettleInvoiceRecord(); + upd.setId(invoiceRecord.getId()); + upd.setRecedMoney(newReced); + upd.setPaymentStatus(paymentStatus); + emisSettleInvoiceRecordMapper.updateEmisSettleInvoiceRecord(upd); + } + } return 1; } diff --git a/emis-biz/src/main/resources/mapper/EmisSettlePayRelMapper.xml b/emis-biz/src/main/resources/mapper/EmisSettlePayRelMapper.xml index 2d6236661..0332500af 100644 --- a/emis-biz/src/main/resources/mapper/EmisSettlePayRelMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisSettlePayRelMapper.xml @@ -9,6 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -20,26 +21,40 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, pay_id, bill_no, pay_money, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_settle_pay_rel + select a.id, + a.pay_id, + a.bill_no, + a.pay_money, + a.del_flag, + a.create_by, + a.create_time, + a.update_by, + a.update_time, + a.create_site, + a.update_site, + r.apply_seq_no + from emis_settle_pay_rel a + left join emis_settle_pay_invoice_rel r + on r.pay_id = a.pay_id and r.del_flag = '0'