mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-20 02:55:04 +08:00
update 重新计算分账扣除金额
This commit is contained in:
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
/**
|
||||
* 计算余额扣除金额
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user