demand: TMS系统 - 客户账单管理 - 现金账单核销/月结账单核销 - 登记收款时:理赔金额有填写,保存成功后 账单对应的理赔金额和收款状态未更新 TMS系统 - 客户账单管理 - 现金账单核销/月结账单核销 - 收款/退款后同步更新账单对应发票的收款状态、已收金额。 TMS系统 - 客户账单管理 - 业务开票申请 - 生成发票时根据发票关联的账单自动计算生成发票的收款状态、已收金额。

committer: heyu
This commit is contained in:
aike 2025-11-03 16:50:15 +08:00
parent 1f3bf7cfd9
commit 08f1f2e0c8
4 changed files with 200 additions and 94 deletions

View File

@ -73,6 +73,9 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
@Autowired @Autowired
private EmisSettleSubBillMapper emisSettleSubBillMapper; private EmisSettleSubBillMapper emisSettleSubBillMapper;
@Autowired
private EmisSettleInvoiceRecordMapper emisSettleInvoiceRecordMapper;
@Autowired @Autowired
private EmisSettleInvoiceRelMapper emisSettleInvoiceRelMapper; private EmisSettleInvoiceRelMapper emisSettleInvoiceRelMapper;
@ -836,6 +839,7 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
/** /**
* 重算账单收款状态 * 重算账单收款状态
*
* @param settleBillNo * @param settleBillNo
* @return * @return
*/ */
@ -844,18 +848,19 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
EmisSettleBill oldBill = getSettleBillBySettleBillNo(settleBillNo); EmisSettleBill oldBill = getSettleBillBySettleBillNo(settleBillNo);
// 获取收款记录 // 获取收款记录
List<EmisSettlePayRecord> payRecordList=emisSettlePayRecordMapper.selectSettlePayRecordListBySettleBillNo(settleBillNo); List<EmisSettlePayRecord> payRecordList = emisSettlePayRecordMapper
.selectSettlePayRecordListBySettleBillNo(settleBillNo);
// 计算已收款金额 // 计算已收款金额
BigDecimal totalHasPayMoney = BigDecimal.ZERO; BigDecimal totalHasPayMoney = BigDecimal.ZERO;
// 抵扣金额 // 理赔金额
BigDecimal satisfyMoney = BigDecimal.ZERO; BigDecimal satisfyMoney = BigDecimal.ZERO;
/* allowance_money */ /* 折让 */
BigDecimal allowanceMoney = BigDecimal.ZERO; BigDecimal allowanceMoney = BigDecimal.ZERO;
/* deduction_money */ /* 折扣 */
BigDecimal deductionMoney = BigDecimal.ZERO; BigDecimal deductionMoney = BigDecimal.ZERO;
/* other_money */ /* 其他 */
BigDecimal otherMoney = BigDecimal.ZERO; BigDecimal otherMoney = BigDecimal.ZERO;
// refund_money // refund_money
BigDecimal refundMoney = BigDecimal.ZERO; BigDecimal refundMoney = BigDecimal.ZERO;
@ -865,8 +870,10 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
for (EmisSettlePayRecord item : payRecordList) { for (EmisSettlePayRecord item : payRecordList) {
totalHasPayMoney = totalHasPayMoney.add(item.getPayMoney()); totalHasPayMoney = totalHasPayMoney.add(item.getPayMoney());
satisfyMoney = satisfyMoney.add(item.getSatisfyMoney() == null ? BigDecimal.ZERO : item.getSatisfyMoney()); satisfyMoney = satisfyMoney.add(item.getSatisfyMoney() == null ? BigDecimal.ZERO : item.getSatisfyMoney());
allowanceMoney = allowanceMoney.add(item.getAllowanceMoney() == null ? BigDecimal.ZERO : item.getAllowanceMoney()); allowanceMoney = allowanceMoney
deductionMoney = deductionMoney.add(item.getDeductionMoney() == null ? BigDecimal.ZERO : item.getDeductionMoney()); .add(item.getAllowanceMoney() == null ? BigDecimal.ZERO : item.getAllowanceMoney());
deductionMoney = deductionMoney
.add(item.getDeductionMoney() == null ? BigDecimal.ZERO : item.getDeductionMoney());
otherMoney = otherMoney.add(item.getOtherMoney() == null ? BigDecimal.ZERO : item.getOtherMoney()); otherMoney = otherMoney.add(item.getOtherMoney() == null ? BigDecimal.ZERO : item.getOtherMoney());
if ("2".equals(item.getRecType())) { if ("2".equals(item.getRecType())) {
@ -924,8 +931,7 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
WaybillOperLogType.SITE_PAYMENT_STATUS_CHANGE, WaybillOperLogType.SITE_PAYMENT_STATUS_CHANGE,
null, null,
null, null,
"收款状态变更["+paymentStatusDesc+"]" "收款状态变更[" + paymentStatusDesc + "]");
);
// 计算占用 // 计算占用
// try { // try {
// EmisWaybill oldBillA = getWaybillByBillCode(subBill.getBillCode()); // EmisWaybill oldBillA = getWaybillByBillCode(subBill.getBillCode());
@ -967,8 +973,7 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
// 已收款 // 已收款
newBill.setPaymentStatus("1"); newBill.setPaymentStatus("1");
emisSettleBillMapper.updateEmisSettleBill(newBill); emisSettleBillMapper.updateEmisSettleBill(newBill);
} } else {
else{
// 部分收款 // 部分收款
newBill.setPaymentStatus("2"); newBill.setPaymentStatus("2");
emisSettleBillMapper.updateEmisSettleBill(newBill); emisSettleBillMapper.updateEmisSettleBill(newBill);
@ -1011,8 +1016,7 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
// 已收款 // 已收款
newBill.setPaymentStatus("1"); newBill.setPaymentStatus("1");
emisSettleBillMapper.updateEmisSettleBill(newBill); emisSettleBillMapper.updateEmisSettleBill(newBill);
} } else {
else{
// 部分收款 // 部分收款
newBill.setPaymentStatus("2"); newBill.setPaymentStatus("2");
emisSettleBillMapper.updateEmisSettleBill(newBill); emisSettleBillMapper.updateEmisSettleBill(newBill);
@ -1058,8 +1062,7 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
} }
} }
} } else {
else{
// 全部收款金额 // 全部收款金额
BigDecimal totalAllPayMoney = BigDecimal.ZERO; BigDecimal totalAllPayMoney = BigDecimal.ZERO;
@ -1094,15 +1097,13 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
// 已收款 // 已收款
newBill.setPaymentStatus("1"); newBill.setPaymentStatus("1");
emisSettleBillMapper.updateEmisSettleBill(newBill); emisSettleBillMapper.updateEmisSettleBill(newBill);
} } else {
else{
// 部分收款 // 部分收款
newBill.setPaymentStatus("2"); newBill.setPaymentStatus("2");
emisSettleBillMapper.updateEmisSettleBill(newBill); emisSettleBillMapper.updateEmisSettleBill(newBill);
} }
} }
// 未收款则更新运单状态未收款状态 // 未收款则更新运单状态未收款状态
List<EmisSettleSubBill> list = emisBaseService.selectSubBillListBySettleBillNo(settleBillNo); List<EmisSettleSubBill> list = emisBaseService.selectSubBillListBySettleBillNo(settleBillNo);
if (!CollectionUtils.isEmpty(list)) { if (!CollectionUtils.isEmpty(list)) {
@ -1143,8 +1144,82 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
} }
} }
// 更新发票收款状态
updateInvoicePaymentStatus(settleBillNo);
return 1; return 1;
} }
/**
* 更新发票收款状态(发票不考虑理赔金额等)
*
* @param settleBillNo 账单号
*/
private void updateInvoicePaymentStatus(String settleBillNo) {
try {
// 获取所有包含当前账单号的发票记录(发票可能对应多个账单号,用逗号分隔)
List<EmisSettleInvoiceRecord> invoiceRecordList = emisSettleInvoiceRecordMapper
.selectInvoiceRecordListBySettleBillNo(settleBillNo);
if (CollectionUtils.isEmpty(invoiceRecordList)) {
log.debug("updateInvoicePaymentStatus===>账单{}没有发票记录", settleBillNo);
return;
}
// 遍历每个发票记录,更新其收款状态
for (EmisSettleInvoiceRecord invoiceRecord : invoiceRecordList) {
String invoiceSettleBillNo = invoiceRecord.getSettleBillNo();
if (StringUtils.isEmpty(invoiceSettleBillNo)) {
continue;
}
// 解析发票对应的所有账单号(可能用逗号分隔)
String[] billNoArray = invoiceSettleBillNo.split(",");
BigDecimal totalRecedMoney = BigDecimal.ZERO;
// 遍历发票对应的每个账单号,计算每个账单的实际收款金额并累加
for (String billNo : billNoArray) {
billNo = billNo.trim();
if (StringUtils.isEmpty(billNo)) {
continue;
}
// 通过账单号查询emis_settle_bill获取reced_money作为已收金额
EmisSettleBill bill = selectEmisSettleBillBySettleBillNo(billNo);
BigDecimal billTotalHasPayMoney = (bill != null && bill.getRecedMoney() != null)
? bill.getRecedMoney()
: BigDecimal.ZERO;
totalRecedMoney = totalRecedMoney.add(billTotalHasPayMoney);
}
// 获取发票申请金额
BigDecimal applyMoney = invoiceRecord.getApplyMoney() != null ? invoiceRecord.getApplyMoney()
: BigDecimal.ZERO;
// 计算收款状态
String paymentStatus;
if (totalRecedMoney.compareTo(BigDecimal.ZERO) == 0) {
paymentStatus = "0"; // 未付款
} else if (totalRecedMoney.compareTo(applyMoney) >= 0) {
paymentStatus = "1"; // 已付款
} else {
paymentStatus = "2"; // 部分付款
}
// 更新发票记录收款状态
EmisSettleInvoiceRecord updateInvoiceRecord = new EmisSettleInvoiceRecord();
updateInvoiceRecord.setId(invoiceRecord.getId());
updateInvoiceRecord.setPaymentStatus(paymentStatus);
updateInvoiceRecord.setRecedMoney(totalRecedMoney);
emisSettleInvoiceRecordMapper.updateEmisSettleInvoiceRecord(updateInvoiceRecord);
log.debug("updateInvoicePaymentStatus===>发票申请序号:{}, 收款状态:{}, 已收金额:{}, 申请金额:{}, 对应账单号:{}",
invoiceRecord.getApplySeqNo(), paymentStatus, totalRecedMoney, applyMoney, invoiceSettleBillNo);
}
} catch (Exception e) {
log.error("updateInvoicePaymentStatus===>更新发票收款状态失败,账单号: {}", settleBillNo, e);
// 不抛出异常,避免影响主流程
}
}
@Override @Override
public void exportSeaWayBill(HttpServletResponse response, EmisSettleBill emisSettleBill) { public void exportSeaWayBill(HttpServletResponse response, EmisSettleBill emisSettleBill) {
try { try {

View File

@ -33,6 +33,7 @@ import org.springframework.stereotype.Service;
import com.xdadan.erp.emis.mapper.EmisSettleInvoiceRecordMapper; import com.xdadan.erp.emis.mapper.EmisSettleInvoiceRecordMapper;
import com.xdadan.erp.emis.service.IEmisSettleInvoiceRecordService; import com.xdadan.erp.emis.service.IEmisSettleInvoiceRecordService;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.xdadan.erp.emis.mapper.EmisSettlePayRecordMapper;
/** /**
* 开票记录表Service业务层处理 * 开票记录表Service业务层处理
@ -62,6 +63,9 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
@Autowired @Autowired
private EmisCustomerInvoiceInfoMapper emisCustomerInvoiceInfoMapper; private EmisCustomerInvoiceInfoMapper emisCustomerInvoiceInfoMapper;
@Autowired
private EmisSettlePayRecordMapper emisSettlePayRecordMapper;
/** /**
* 查询开票记录表 * 查询开票记录表
* *
@ -192,6 +196,29 @@ public class EmisSettleInvoiceRecordServiceImpl extends EmisBaseService implemen
emisSettleInvoiceRecord.setApplyManCode(getCurrentUser().getEmpCode()); emisSettleInvoiceRecord.setApplyManCode(getCurrentUser().getEmpCode());
emisSettleInvoiceRecord.setApplySiteCode(getCurrentUser().getOwnerSiteCode()); emisSettleInvoiceRecord.setApplySiteCode(getCurrentUser().getOwnerSiteCode());
emisSettleInvoiceRecord.setApplyDate(new Date()); emisSettleInvoiceRecord.setApplyDate(new Date());
// 计算发票已收金额与收款状态
BigDecimal totalRecedMoney = BigDecimal.ZERO;
for (String billNoItem : settBillNoArr) {
String billNoTrim = billNoItem == null ? null : billNoItem.trim();
if (StringUtils.isEmpty(billNoTrim)) {
continue;
}
// 通过账单号查询emis_settle_bill获取reced_money作为已收金额
EmisSettleBill bill = getSettleBillBySettleBillNo(billNoTrim);
BigDecimal billRecedMoney = (bill != null && bill.getRecedMoney() != null) ? bill.getRecedMoney()
: BigDecimal.ZERO;
totalRecedMoney = totalRecedMoney.add(billRecedMoney);
}
emisSettleInvoiceRecord.setRecedMoney(totalRecedMoney);
String paymentStatus;
if (totalRecedMoney.compareTo(BigDecimal.ZERO) == 0) {
paymentStatus = "0"; // 未付款
} else if (totalRecedMoney.compareTo(emisSettleInvoiceRecord.getApplyMoney()) >= 0) {
paymentStatus = "1"; // 已付款
} else {
paymentStatus = "2"; // 部分付款
}
emisSettleInvoiceRecord.setPaymentStatus(paymentStatus);
// 插入开票记录 // 插入开票记录
emisSettleInvoiceRecordMapper.insertEmisSettleInvoiceRecord(emisSettleInvoiceRecord); emisSettleInvoiceRecordMapper.insertEmisSettleInvoiceRecord(emisSettleInvoiceRecord);

View File

@ -497,8 +497,8 @@ public class EmisSettlePayRecordServiceImpl extends EmisBaseService implements I
for (EmisSettlePayInvoiceRel itemSettlePayInvoiceRel : emisSettlePayRecord.getPayInvoiceRelList()) { for (EmisSettlePayInvoiceRel itemSettlePayInvoiceRel : emisSettlePayRecord.getPayInvoiceRelList()) {
itemSettlePayInvoiceRel.setPayId(payId); itemSettlePayInvoiceRel.setPayId(payId);
emisSettlePayInvoiceRelMapper.insertEmisSettlePayInvoiceRel(itemSettlePayInvoiceRel); emisSettlePayInvoiceRelMapper.insertEmisSettlePayInvoiceRel(itemSettlePayInvoiceRel);
// 更新收款状态 // // 更新收款状态
emisSettleInvoiceRecordMapper.updateHasPayByApplySeqNo(itemSettlePayInvoiceRel.getApplySeqNo()); // emisSettleInvoiceRecordMapper.updateHasPayByApplySeqNo(itemSettlePayInvoiceRel.getApplySeqNo());
} }
} }
@ -520,16 +520,16 @@ public class EmisSettlePayRecordServiceImpl extends EmisBaseService implements I
// 插入数据 // 插入数据
emisSettlePayRecordMapper.insertEmisSettlePayRecord(emisSettlePayRecord); emisSettlePayRecordMapper.insertEmisSettlePayRecord(emisSettlePayRecord);
// // 重新计算账单收款信息 // 重新计算账单收款信息
// for (int i = 0; i < settleBillNoArr.size(); i++) { for (int i = 0; i < settleBillNoArr.size(); i++) {
// String settleBillNo = settleBillNoArr.get(i); String settleBillNo = settleBillNoArr.get(i);
// if (!StringUtils.isEmpty(settleBillNo)) { if (!StringUtils.isEmpty(settleBillNo)) {
// emisSettleBillService.reCalcSettleBillPayStatus(settleBillNo); emisSettleBillService.reCalcSettleBillPayStatus(settleBillNo);
// } }
// } }
// 处理部分收款逻辑 - 更新各个维度的收款状态 // // 处理部分收款逻辑 - 更新各个维度的收款状态
updatePartialPaymentStatus(emisSettlePayRecord, settleBillNoArr); // updatePartialPaymentStatus(emisSettlePayRecord, settleBillNoArr);
return 1; return 1;
} }

View File

@ -374,6 +374,8 @@
<if test="updateTime != null">update_time,</if> <if test="updateTime != null">update_time,</if>
<if test="createSite != null and createSite != ''">create_site,</if> <if test="createSite != null and createSite != ''">create_site,</if>
<if test="updateSite != null and updateSite != ''">update_site,</if> <if test="updateSite != null and updateSite != ''">update_site,</if>
<if test="paymentStatus != null and paymentStatus != ''">payment_status,</if>
<if test="recedMoney != null">reced_money,</if>
</trim> </trim>
<trim prefix="values (" suffix=")" suffixOverrides=","> <trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="applySeqNo != null and applySeqNo != ''">#{applySeqNo},</if> <if test="applySeqNo != null and applySeqNo != ''">#{applySeqNo},</if>
@ -428,6 +430,8 @@
<if test="updateTime != null">#{updateTime},</if> <if test="updateTime != null">#{updateTime},</if>
<if test="createSite != null and createSite != ''">#{createSite},</if> <if test="createSite != null and createSite != ''">#{createSite},</if>
<if test="updateSite != null and updateSite != ''">#{updateSite},</if> <if test="updateSite != null and updateSite != ''">#{updateSite},</if>
<if test="paymentStatus != null and paymentStatus != ''">#{paymentStatus},</if>
<if test="recedMoney != null">#{recedMoney},</if>
</trim> </trim>
</insert> </insert>