demand: 合并收款相关逻辑

This commit is contained in:
aike 2026-03-30 16:44:09 +08:00
parent ae7684f61a
commit 9307f5f20e
4 changed files with 124 additions and 15 deletions

View File

@ -102,21 +102,21 @@ public class EmisSettlePayRecord extends BaseEntity
private String refundRegisterSiteCode;
/* 退款登记人 */
private String refundRegisterManCode;
/* 安全金额 */
/* 理赔金额 */
private BigDecimal satisfyMoney;
/* 安全原因 */
/* 理赔原因 */
private String satisfyReason;
/* allowance_money */
/* 折让金额 */
private BigDecimal allowanceMoney;
/* allowance_reason */
/* 折让原因 */
private String allowanceReason;
/* deduction_money */
/* 抵扣金额 */
private BigDecimal deductionMoney;
/* deduction_reason */
/* 抵扣原因 */
private String deductionReason;
/* other_money */
/* 其他金额 */
private BigDecimal otherMoney;
/* other_reason */
/* 其他原因 */
private String otherReason;
/* 交易时间 */
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")

View File

@ -897,16 +897,81 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
// refund_money
BigDecimal refundMoney = BigDecimal.ZERO;
// 理赔/折让/抵扣/其他原因聚合(可能一个回款记录关联多个账单号)
StringBuilder satisfyReasonSb = new StringBuilder();
StringBuilder allowanceReasonSb = new StringBuilder();
StringBuilder deductionReasonSb = new StringBuilder();
StringBuilder otherReasonSb = new StringBuilder();
log.debug("reCalcSettleBillPayStatus===>应收:{}", oldBill.getRecMoney());
for (EmisSettlePayRecord item : payRecordList) {
// 一个收退款记录可能关联多个账单号,这里按账单号数量分摊理赔/折让/抵扣/其他金额
int length = 1;
String itemSettleBillNo = item.getSettleBillNo();
if (StringUtils.isNotBlank(itemSettleBillNo)) {
String[] billNoArr = itemSettleBillNo.split("[,,]");
int cnt = 0;
for (String no : billNoArr) {
if (StringUtils.isNotBlank(no)) {
cnt++;
}
}
if (cnt > 0) {
length = cnt;
}
}
totalHasPayMoney = totalHasPayMoney.add(item.getPayMoney());
satisfyMoney = satisfyMoney.add(item.getSatisfyMoney() == null ? BigDecimal.ZERO : item.getSatisfyMoney());
allowanceMoney = allowanceMoney
.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());
BigDecimal curSatisfyMoney = item.getSatisfyMoney() == null ? BigDecimal.ZERO : item.getSatisfyMoney();
if (length > 1) {
curSatisfyMoney = curSatisfyMoney.divide(BigDecimal.valueOf(length), 2, BigDecimal.ROUND_HALF_UP);
}
satisfyMoney = satisfyMoney.add(curSatisfyMoney);
BigDecimal curAllowanceMoney = item.getAllowanceMoney() == null ? BigDecimal.ZERO : item.getAllowanceMoney();
if (length > 1) {
curAllowanceMoney = curAllowanceMoney.divide(BigDecimal.valueOf(length), 2, BigDecimal.ROUND_HALF_UP);
}
allowanceMoney = allowanceMoney.add(curAllowanceMoney);
BigDecimal curDeductionMoney = item.getDeductionMoney() == null ? BigDecimal.ZERO : item.getDeductionMoney();
if (length > 1) {
curDeductionMoney = curDeductionMoney.divide(BigDecimal.valueOf(length), 2, BigDecimal.ROUND_HALF_UP);
}
deductionMoney = deductionMoney.add(curDeductionMoney);
BigDecimal curOtherMoney = item.getOtherMoney() == null ? BigDecimal.ZERO : item.getOtherMoney();
if (length > 1) {
curOtherMoney = curOtherMoney.divide(BigDecimal.valueOf(length), 2, BigDecimal.ROUND_HALF_UP);
}
otherMoney = otherMoney.add(curOtherMoney);
// 原因字段从收退款明细聚合
if (StringUtils.isNotBlank(item.getSatisfyReason())) {
if (satisfyReasonSb.length() > 0) {
satisfyReasonSb.append(",");
}
satisfyReasonSb.append(item.getSatisfyReason());
}
if (StringUtils.isNotBlank(item.getAllowanceReason())) {
if (allowanceReasonSb.length() > 0) {
allowanceReasonSb.append(",");
}
allowanceReasonSb.append(item.getAllowanceReason());
}
if (StringUtils.isNotBlank(item.getDeductionReason())) {
if (deductionReasonSb.length() > 0) {
deductionReasonSb.append(",");
}
deductionReasonSb.append(item.getDeductionReason());
}
if (StringUtils.isNotBlank(item.getOtherReason())) {
if (otherReasonSb.length() > 0) {
otherReasonSb.append(",");
}
otherReasonSb.append(item.getOtherReason());
}
if ("2".equals(item.getRecType())) {
refundMoney = refundMoney.add(item.getRefundMoney() == null ? BigDecimal.ZERO : item.getRefundMoney());
@ -992,6 +1057,10 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
newBill.setOtherMoney(otherMoney);
// 退款金额
newBill.setRefundMoney(refundMoney);
newBill.setSatisfyReason(satisfyReasonSb.length() > 0 ? satisfyReasonSb.toString() : null);
newBill.setAllowanceReason(allowanceReasonSb.length() > 0 ? allowanceReasonSb.toString() : null);
newBill.setDeductionReason(deductionReasonSb.length() > 0 ? deductionReasonSb.toString() : null);
newBill.setOtherReason(otherReasonSb.length() > 0 ? otherReasonSb.toString() : null);
// 更新账单收款状态 收款金额
log.debug("reCalcSettleBillPayStatus===>收款金额:{},应收:{}", totalMoney, oldBill.getRecMoney());
@ -1036,6 +1105,10 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
newBill.setOtherMoney(otherMoney);
// 退款金额
newBill.setRefundMoney(refundMoney);
newBill.setSatisfyReason(satisfyReasonSb.length() > 0 ? satisfyReasonSb.toString() : null);
newBill.setAllowanceReason(allowanceReasonSb.length() > 0 ? allowanceReasonSb.toString() : null);
newBill.setDeductionReason(deductionReasonSb.length() > 0 ? deductionReasonSb.toString() : null);
newBill.setOtherReason(otherReasonSb.length() > 0 ? otherReasonSb.toString() : null);
// 更新账单收款状态 收款金额
log.debug("reCalcSettleBillPayStatus===>收款金额:{},应收:{}", totalMoney, oldBill.getRecMoney());
@ -1117,6 +1190,10 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS
newBill.setOtherMoney(otherMoney);
// 退款金额
newBill.setRefundMoney(refundMoney);
newBill.setSatisfyReason(satisfyReasonSb.length() > 0 ? satisfyReasonSb.toString() : null);
newBill.setAllowanceReason(allowanceReasonSb.length() > 0 ? allowanceReasonSb.toString() : null);
newBill.setDeductionReason(deductionReasonSb.length() > 0 ? deductionReasonSb.toString() : null);
newBill.setOtherReason(otherReasonSb.length() > 0 ? otherReasonSb.toString() : null);
// 更新账单收款状态 收款金额
log.debug("reCalcSettleBillPayStatus===>收款金额:{},应收:{}", totalMoney, oldBill.getRecMoney());

View File

@ -34,8 +34,10 @@ 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.Set;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -472,6 +474,9 @@ public class EmisSettlePayRecordServiceImpl extends EmisBaseService implements I
List<String> settleBillNoArr = Arrays.stream(emisSettlePayRecord.getSettleBillNo().split(",")).distinct()
.collect(Collectors.toList());
// 现金结算多账单合并收款时,校验每条运单的 moneyUserId 必须一致
validateMoneyUserIdForMergeCashSettle(emisSettlePayRecord);
for (int i = 0; i < settleBillNoArr.size(); i++) {
String settleBillNo = settleBillNoArr.get(i);
if (!StringUtils.isEmpty(settleBillNo)) {
@ -573,6 +578,33 @@ public class EmisSettlePayRecordServiceImpl extends EmisBaseService implements I
return 1;
}
private void validateMoneyUserIdForMergeCashSettle(EmisSettlePayRecord emisSettlePayRecord) throws EmisBizError {
if (!"1".equals(emisSettlePayRecord.getSettleType())
|| StringUtils.isBlank(emisSettlePayRecord.getSettleBillNo())
|| !emisSettlePayRecord.getSettleBillNo().contains(",")) {
return;
}
List<EmisSettlePayRel> payRelList = emisSettlePayRecord.getPayRelList();
if (CollectionUtils.isEmpty(payRelList)) {
return;
}
Set<Long> moneyUserIdSet = new HashSet<>();
for (EmisSettlePayRel payRel : payRelList) {
Long moneyUserId = null;
if (payRel != null
&& payRel.getWaybillDetail() != null
&& payRel.getWaybillDetail().getWaybillOther() != null) {
moneyUserId = payRel.getWaybillDetail().getWaybillOther().getMoneyUserId();
}
moneyUserIdSet.add(moneyUserId);
if (moneyUserIdSet.size() > 1) {
throw new EmisBizError(EmisBizErrorType.FAIL, "不同现金客户不允许合并收款");
}
}
}
private static void checkParam(EmisSettlePayRecord emisSettlePayRecord) throws EmisBizError {
if (StringUtils.isEmpty(emisSettlePayRecord.getSettleBillNo())) {
throw new EmisBizError(EmisBizErrorType.FAIL, "账单编号不能为空");

View File

@ -54,7 +54,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<association property="waybillDetail"
column="bill_code"
select="com.xdadan.erp.emis.mapper.EmisWaybillMapper.selectWaybillBaseInfoByBillCode"
select="com.xdadan.erp.emis.mapper.EmisWaybillMapper.selectEmisWaybillByBillCode"
fetchType="lazy"
/>