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'