update 重新计算分账扣除金额

This commit is contained in:
2023-08-31 16:47:18 +08:00
parent 82e6a5b42a
commit d8f16ac471
5 changed files with 73 additions and 1 deletions

View File

@@ -42,5 +42,19 @@ public interface MemberAdapayRecordMapper {
MemberAdapayRecord selectByPaymentId(@Param("paymentId") String paymentId);
/**
* 查询可用余额的充值记录
* 用于支付订单/余额退款场景
* @param memberId 会员id
* @return
*/
List<MemberAdapayRecord> selectAvailableBalance(@Param("memberId") String memberId);
/**
* 查询存在冻结金额的充值记录
* 用于订单分账的场景
* @param memberId 会员id
* @return
*/
List<MemberAdapayRecord> selectAvailableFreeze(@Param("memberId") String memberId);
}

View File

@@ -49,4 +49,6 @@ public interface MemberAdapayRecordService{
void updateFreezeAmount(String paymentId, BigDecimal amount);
void commonUpdateAmountMethod(String paymentId, BigDecimal SpendAmount, BigDecimal RefundAmount, BigDecimal freezeAmount);
List<MemberAdapayRecord> selectAvailableFreeze(String memberId);
}

View File

@@ -201,4 +201,9 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService
log.error("更新MemberAdapayRecord金额error", e);
}
}
@Override
public List<MemberAdapayRecord> selectAvailableFreeze(String memberId) {
return memberAdapayRecordMapper.selectAvailableFreeze(memberId);
}
}

View File

@@ -1382,7 +1382,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
String status = null; // 状态
// 获取余额支付扣除金额 也许存在一笔不够扣,需要扣多笔的情况
List<BalanceDeductionAmountVO> list = calculateTheBalanceDeductionAmount(orderBasicInfo.getMemberId(), settleAmount);
List<BalanceDeductionAmountVO> list = calculateSplitTheBillAmount(orderBasicInfo.getMemberId(), settleAmount);
for (BalanceDeductionAmountVO vo : list) {
String paymentId = vo.getPaymentId();
BigDecimal deductionAmount = vo.getDeductionAmount();
@@ -1415,6 +1415,47 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
return result;
}
/**
* 计算分账扣除金额
*/
public List<BalanceDeductionAmountVO> calculateSplitTheBillAmount(String memberId, BigDecimal amount) {
List<BalanceDeductionAmountVO> resultList = Lists.newArrayList();
// 查询会员的余额充值记录 按照充值时间正序
// List<MemberAdapayRecord> memberAdapayRecords = memberAdapayRecordService.selectAvailableBalance(memberId);
List<MemberAdapayRecord> memberAdapayRecords = memberAdapayRecordService.selectAvailableFreeze(memberId);
// 定义一个临时金额等于消费金额
BigDecimal tempAmount = new BigDecimal(amount.toString());
for (MemberAdapayRecord memberAdapayRecord : memberAdapayRecords) {
// 该笔支付冻结金额 取出一笔判断是否冻结金额够分账
BigDecimal freezeAmt = memberAdapayRecord.getFreezeAmt();
// 该笔支付扣除金额
BigDecimal deductionAmount;
// 临时消费金额 = 临时消费金额 - 该笔交易的剩余金额
tempAmount = tempAmount.subtract(freezeAmt);
if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) {
// 计算以后大于等于0说明这笔支付剩余金额需要扣完还要继续扣下一笔
deductionAmount = freezeAmt;
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
.memberId(memberId)
.paymentId(memberAdapayRecord.getPaymentId())
.deductionAmount(deductionAmount)
.build();
resultList.add(build);
} else {
// 如果小于0则说明该笔交易的剩余金额用不完扣除金额等于临时消费金额并结束循环
deductionAmount = freezeAmt.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
.memberId(memberId)
.paymentId(memberAdapayRecord.getPaymentId())
.deductionAmount(deductionAmount)
.build();
resultList.add(build);
break;
}
}
return resultList;
}
/**
* 计算余额扣除金额
*