diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisSettleInvoiceRel.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisSettleInvoiceRel.java index 13398f2e3..cb800ba7e 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisSettleInvoiceRel.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisSettleInvoiceRel.java @@ -23,16 +23,14 @@ import java.math.BigDecimal; import java.util.Date; import lombok.Data; - /** * @ClassName EmisSettleInvoiceRel * @Description 开票子账单关联表 * @author linfso * @date 2024-07-21 13:31:27 */ - @Data -public class EmisSettleInvoiceRel extends BaseEntity -{ +@Data +public class EmisSettleInvoiceRel extends BaseEntity { private static final long serialVersionUID = 1L; /* id */ @@ -46,8 +44,10 @@ public class EmisSettleInvoiceRel extends BaseEntity private String billNo; /* 申请开票金额 */ private BigDecimal money; + /* 已收金额 */ + private BigDecimal recedMoney; - // 扩展参数 + // 扩展参数 private EmisWaybill waybillDetail; } 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 32c95ffbe..94ab7c7f7 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 @@ -1,12 +1,12 @@ - /** - * @Project: emis - * @Title: EmisSettlePayRecordServiceImpl.java - * @author linfso - * @date 2024-07-21 13:31:24 - * @Copyright: ShangHai Duta 2022 All rights reserved. - * @version v1.0 - * @Description:

账单收退款记录 实体类

- */ +/** +* @Project: emis +* @Title: EmisSettlePayRecordServiceImpl.java +* @author linfso +* @date 2024-07-21 13:31:24 +* @Copyright: ShangHai Duta 2022 All rights reserved. +* @version v1.0 +* @Description:

账单收退款记录 实体类

+*/ package com.xdadan.erp.emis.service.impl; @@ -15,8 +15,11 @@ import java.time.LocalDate; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -75,6 +78,12 @@ public class EmisSettlePayRecordServiceImpl extends EmisBaseService implements I @Autowired private EmisSettlePayInvoiceRelMapper emisSettlePayInvoiceRelMapper; + @Autowired + private EmisSettleSubBillMapper emisSettleSubBillMapper; + + @Autowired + private EmisWaybillMapper emisWaybillMapper; + /** * 查询账单收退款记录 * @@ -82,8 +91,7 @@ public class EmisSettlePayRecordServiceImpl extends EmisBaseService implements I * @return 账单收退款记录 */ @Override - public EmisSettlePayRecord selectEmisSettlePayRecordById(Long id) - { + public EmisSettlePayRecord selectEmisSettlePayRecordById(Long id) { return emisSettlePayRecordMapper.selectEmisSettlePayRecordById(id); } @@ -446,7 +454,8 @@ public class EmisSettlePayRecordServiceImpl extends EmisBaseService implements I emisSettlePayRecord.setSettleBillNo(WaybillHelper.formatQueryValue(emisSettlePayRecord.getSettleBillNo())); // 多账单合并收款 - List settleBillNoArr = Arrays.stream(emisSettlePayRecord.getSettleBillNo().split(",")).distinct().collect(Collectors.toList()); + List settleBillNoArr = Arrays.stream(emisSettlePayRecord.getSettleBillNo().split(",")).distinct() + .collect(Collectors.toList()); for (int i = 0; i < settleBillNoArr.size(); i++) { String settleBillNo = settleBillNoArr.get(i); @@ -514,13 +523,17 @@ public class EmisSettlePayRecordServiceImpl extends EmisBaseService implements I // 插入数据 emisSettlePayRecordMapper.insertEmisSettlePayRecord(emisSettlePayRecord); - // 重新计算账单收款信息 - for (int i = 0; i < settleBillNoArr.size(); i++) { - String settleBillNo = settleBillNoArr.get(i); - if (!StringUtils.isEmpty(settleBillNo)) { - emisSettleBillService.reCalcSettleBillPayStatus(settleBillNo); - } - } + // // 重新计算账单收款信息 + // for (int i = 0; i < settleBillNoArr.size(); i++) { + // String settleBillNo = settleBillNoArr.get(i); + // if (!StringUtils.isEmpty(settleBillNo)) { + // emisSettleBillService.reCalcSettleBillPayStatus(settleBillNo); + // } + // } + + // 处理部分收款逻辑 - 更新各个维度的收款状态 + updatePartialPaymentStatus(emisSettlePayRecord, settleBillNoArr); + return 1; } @@ -661,4 +674,288 @@ public class EmisSettlePayRecordServiceImpl extends EmisBaseService implements I } } + /** + * 更新部分收款状态 + * 根据emis_settle_sub_bill的已收金额和本次运单的申请金额加起来与运费比较 + * 更新emis_settle_sub_bill、emis_waybill的收款状态、已收金额 + * 从账单维度更新emis_settle_bill、从发票维度更新emis_settle_invoice_record的对应字段 + * + * @param emisSettlePayRecord 收款记录 + * @param settleBillNoArr 账单号数组 + */ + private void updatePartialPaymentStatus(EmisSettlePayRecord emisSettlePayRecord, List settleBillNoArr) { + try { + // 处理运单收款关联 + List payRelList = emisSettlePayRecord.getPayRelList(); + if (!CollectionUtils.isEmpty(payRelList)) { + for (EmisSettlePayRel payRel : payRelList) { + updateWaybillPaymentStatus(payRel); + } + } + + // 处理发票收款关联 + List payInvoiceRelList = emisSettlePayRecord.getPayInvoiceRelList(); + if (!CollectionUtils.isEmpty(payInvoiceRelList)) { + for (EmisSettlePayInvoiceRel payInvoiceRel : payInvoiceRelList) { + updateInvoicePaymentStatus(payInvoiceRel, payRelList); + } + } + + // 处理账单收款状态 + for (String settleBillNo : settleBillNoArr) { + if (!StringUtils.isEmpty(settleBillNo)) { + updateSettleBillPaymentStatus(settleBillNo); + } + } + + } catch (Exception e) { + log.error("更新部分收款状态失败", e); + throw new RuntimeException("更新收款状态失败:" + e.getMessage()); + } + } + + /** + * 更新运单收款状态 + * + * @param payRel 运单收款关联 + */ + private void updateWaybillPaymentStatus(EmisSettlePayRel payRel) { + try { + String billCode = payRel.getBillNo(); + if (StringUtils.isEmpty(billCode)) { + return; + } + + // 获取子账单信息 + List subBillList = emisSettleSubBillMapper.selectSettleSubBillListByBillCode(billCode); + if (CollectionUtils.isEmpty(subBillList)) { + log.warn("未找到运单号 {} 对应的子账单", billCode); + return; + } + + // 获取运单信息 + EmisWaybill waybill = emisWaybillMapper.selectEmisWaybillByBillCode(billCode); + if (waybill == null) { + log.warn("未找到运单号 {} 对应的运单信息", billCode); + return; + } + + // 计算本次收款金额 + BigDecimal currentPayMoney = payRel.getPayMoney() != null ? payRel.getPayMoney() : BigDecimal.ZERO; + + // 获取唯一的子账单(一个运单只对应一个子账单) + EmisSettleSubBill subBill = subBillList.get(0); + + // 获取子账单的已收金额 + BigDecimal currentRecedMoney = subBill.getRecedMoney() != null ? subBill.getRecedMoney() + : BigDecimal.ZERO; + + // 计算新的已收金额 + BigDecimal newRecedMoney = currentRecedMoney.add(currentPayMoney); + + // 获取子账单的运费 + BigDecimal billFee = subBill.getBillFee() != null ? subBill.getBillFee() : BigDecimal.ZERO; + + // 根据已收金额和运费比较,确定收款状态 + String paymentStatus; + if (newRecedMoney.compareTo(BigDecimal.ZERO) == 0) { + paymentStatus = "0"; // 未付款 + } else if (newRecedMoney.compareTo(billFee) >= 0) { + paymentStatus = "1"; // 已付款 + } else { + paymentStatus = "2"; // 部分付款 + } + + // 更新子账单收款状态和已收金额 + EmisSettleSubBill updateSubBill = new EmisSettleSubBill(); + updateSubBill.setBillCode(subBill.getBillCode()); + updateSubBill.setPaymentStatus(paymentStatus); + updateSubBill.setRecedMoney(newRecedMoney); + emisSettleSubBillMapper.updatePayedStatus(updateSubBill); + + // 更新运单收款状态 + EmisWaybill updateWaybill = new EmisWaybill(); + updateWaybill.setBillCode(billCode); + updateWaybill.setPaymentStatus(paymentStatus); + emisWaybillMapper.updatePayedStatus(updateWaybill); + + log.info("更新运单收款状态成功,运单号: {}, 子账单号: {}, 收款状态: {}, 已收金额: {}, 运费: {}", + billCode, subBill.getBillNo(), paymentStatus, newRecedMoney, billFee); + + } catch (Exception e) { + log.error("更新运单收款状态失败,运单号: {}", payRel.getBillNo(), e); + throw e; + } + } + + /** + * 更新发票收款状态 + * + * @param payInvoiceRel 发票收款关联 + * @param payRelList 收款关联列表 + */ + private void updateInvoicePaymentStatus(EmisSettlePayInvoiceRel payInvoiceRel, List payRelList) { + try { + String applySeqNo = payInvoiceRel.getApplySeqNo(); + if (StringUtils.isEmpty(applySeqNo)) { + return; + } + + // 获取发票记录 + EmisSettleInvoiceRecord invoiceRecord = emisSettleInvoiceRecordMapper + .selectInvoiceRecordByApplySeqNo(applySeqNo); + if (invoiceRecord == null) { + log.warn("未找到申请序号 {} 对应的发票记录", applySeqNo); + return; + } + BigDecimal money = invoiceRecord.getApplyMoney() != null ? invoiceRecord.getApplyMoney() + : BigDecimal.ZERO; + + // 获取发票之前的收款金额 + BigDecimal previousRecedMoney = invoiceRecord.getRecedMoney() != null ? invoiceRecord.getRecedMoney() + : BigDecimal.ZERO; + + // 计算当前收款记录中与该发票相关的运单收款金额 + BigDecimal currentInvoicePayMoney = calculateCurrentInvoicePayment(invoiceRecord, payRelList); + + // 计算新的总收款金额 = 之前的收款金额 + 当前收款金额 + BigDecimal totalRecedMoney = previousRecedMoney.add(currentInvoicePayMoney); + + String paymentStatus; + if (totalRecedMoney.compareTo(BigDecimal.ZERO) == 0) { + paymentStatus = "0"; // 未付款 + } else if (totalRecedMoney.compareTo(money) >= 0) { + paymentStatus = "1"; // 已付款 + } else { + paymentStatus = "2"; // 部分付款 + } + + // 更新发票记录收款状态 + EmisSettleInvoiceRecord updateInvoiceRecord = new EmisSettleInvoiceRecord(); + updateInvoiceRecord.setId(invoiceRecord.getId()); + updateInvoiceRecord.setPaymentStatus(paymentStatus); + updateInvoiceRecord.setRecedMoney(totalRecedMoney); + emisSettleInvoiceRecordMapper.updateEmisSettleInvoiceRecord(updateInvoiceRecord); + + log.info("更新发票收款状态成功,申请序号: {}, 收款状态: {}, 总收款金额: {}, 当前收款金额: {}, 申请金额: {}", + applySeqNo, paymentStatus, totalRecedMoney, currentInvoicePayMoney, money); + + } catch (Exception e) { + log.error("更新发票收款状态失败,申请序号: {}", payInvoiceRel.getApplySeqNo(), e); + throw e; + } + } + + /** + * 计算当前收款记录中与该发票相关的运单收款金额 + * + * @param invoiceRecord 发票记录 + * @param payRelList 当前收款记录中的运单收款列表 + * @return 当前收款金额 + */ + private BigDecimal calculateCurrentInvoicePayment(EmisSettleInvoiceRecord invoiceRecord, + List payRelList) { + try { + String settleBillNo = invoiceRecord.getSettleBillNo(); + if (StringUtils.isEmpty(settleBillNo)) { + return BigDecimal.ZERO; + } + + // 处理多个账单号的情况(用逗号分隔) + String[] settleBillNos = settleBillNo.split(","); + Set allBillCodes = new HashSet<>(); + + for (String billNo : settleBillNos) { + String trimmedBillNo = billNo.trim(); + if (StringUtils.isNotEmpty(trimmedBillNo)) { + // 通过账单号找到该账单下的所有运单 + List subBillList = emisSettleSubBillMapper + .selectSubBillListBySettleBillNo(trimmedBillNo); + if (CollectionUtils.isNotEmpty(subBillList)) { + // 收集该账单下的所有运单号 + Set billCodes = subBillList.stream() + .map(EmisSettleSubBill::getBillCode) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + allBillCodes.addAll(billCodes); + } + } + } + + if (allBillCodes.isEmpty()) { + return BigDecimal.ZERO; + } + + // 计算当前收款记录中属于该发票相关运单的收款金额 + BigDecimal currentPayment = BigDecimal.ZERO; + for (EmisSettlePayRel payRel : payRelList) { + if (payRel.getBillNo() != null && allBillCodes.contains(payRel.getBillNo()) + && payRel.getPayMoney() != null) { + currentPayment = currentPayment.add(payRel.getPayMoney()); + } + } + + return currentPayment; + + } catch (Exception e) { + log.error("计算当前发票收款金额失败,申请序号: {}", invoiceRecord.getApplySeqNo(), e); + return BigDecimal.ZERO; + } + } + + /** + * 更新账单收款状态 + * + * @param settleBillNo 账单号 + */ + private void updateSettleBillPaymentStatus(String settleBillNo) { + try { + // 获取账单信息 + EmisSettleBill settleBill = emisSettleBillMapper.selectSettleBillBySettleBillNo(settleBillNo); + if (settleBill == null) { + log.warn("未找到账单号 {} 对应的账单信息", settleBillNo); + return; + } + + // 获取账单下的所有子账单 + List subBillList = emisSettleSubBillMapper.selectSubBillListBySettleBillNo(settleBillNo); + if (CollectionUtils.isEmpty(subBillList)) { + log.warn("账单号 {} 下没有子账单", settleBillNo); + return; + } + + // 计算总已收金额 + BigDecimal totalRecedMoney = BigDecimal.ZERO; + for (EmisSettleSubBill subBill : subBillList) { + BigDecimal recedMoney = subBill.getRecedMoney() != null ? subBill.getRecedMoney() : BigDecimal.ZERO; + totalRecedMoney = totalRecedMoney.add(recedMoney); + } + + // 根据已收金额和应收金额比较,确定收款状态 + BigDecimal recMoney = settleBill.getRecMoney() != null ? settleBill.getRecMoney() : BigDecimal.ZERO; + String paymentStatus; + if (totalRecedMoney.compareTo(BigDecimal.ZERO) == 0) { + paymentStatus = "0"; // 未付款 + } else if (totalRecedMoney.compareTo(recMoney) >= 0) { + paymentStatus = "1"; // 已付款 + } else { + paymentStatus = "2"; // 部分付款 + } + + // 更新账单收款状态和已收金额 + EmisSettleBill updateSettleBill = new EmisSettleBill(); + updateSettleBill.setId(settleBill.getId()); + updateSettleBill.setPaymentStatus(paymentStatus); + updateSettleBill.setRecedMoney(totalRecedMoney); + emisSettleBillMapper.updateEmisSettleBill(updateSettleBill); + + log.info("更新账单收款状态成功,账单号: {}, 收款状态: {}, 已收金额: {}, 应收金额: {}", + settleBillNo, paymentStatus, totalRecedMoney, recMoney); + + } catch (Exception e) { + log.error("更新账单收款状态失败,账单号: {}", settleBillNo, e); + throw e; + } + } + } diff --git a/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml b/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml index 90dc49859..ca2f0fac0 100644 --- a/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRecordMapper.xml @@ -223,7 +223,7 @@ diff --git a/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRelMapper.xml b/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRelMapper.xml index 760da47df..6d918f6ea 100644 --- a/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRelMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisSettleInvoiceRelMapper.xml @@ -10,6 +10,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -21,29 +22,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, apply_seq_no, pay_id, bill_no, money, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_settle_invoice_rel + select r.id, r.apply_seq_no, r.pay_id, r.bill_no, r.money, + COALESCE(s.reced_money, 0) as reced_money, + r.del_flag, r.create_by, r.create_time, r.update_by, r.update_time, r.create_site, r.update_site + from emis_settle_invoice_rel r + left join emis_settle_sub_bill s on r.bill_no = s.bill_no and s.del_flag = '0' - select id, apply_seq_no, pay_id, bill_no, money, del_flag, create_by, create_time, update_by, update_time, create_site, update_site - from emis_settle_invoice_rel a - where a.id = #{id} + select r.id, r.apply_seq_no, r.pay_id, r.bill_no, r.money, + COALESCE(s.reced_money, 0) as reced_money, + r.del_flag, r.create_by, r.create_time, r.update_by, r.update_time, r.create_site, r.update_site + from emis_settle_invoice_rel r + left join emis_settle_sub_bill s on r.bill_no = s.bill_no and s.del_flag = '0' + where r.id = #{id}