diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java index 521509407..1d974efdb 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java @@ -42,5 +42,19 @@ public interface MemberAdapayRecordMapper { MemberAdapayRecord selectByPaymentId(@Param("paymentId") String paymentId); + /** + * 查询可用余额的充值记录 + * 用于支付订单/余额退款场景 + * @param memberId 会员id + * @return + */ List selectAvailableBalance(@Param("memberId") String memberId); + + /** + * 查询存在冻结金额的充值记录 + * 用于订单分账的场景 + * @param memberId 会员id + * @return + */ + List selectAvailableFreeze(@Param("memberId") String memberId); } \ No newline at end of file diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java index 859e5a519..363d9cfb0 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java @@ -49,4 +49,6 @@ public interface MemberAdapayRecordService{ void updateFreezeAmount(String paymentId, BigDecimal amount); void commonUpdateAmountMethod(String paymentId, BigDecimal SpendAmount, BigDecimal RefundAmount, BigDecimal freezeAmount); + + List selectAvailableFreeze(String memberId); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java index 69e46cbc0..f4779d2fc 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java @@ -201,4 +201,9 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService log.error("更新MemberAdapayRecord金额error", e); } } + + @Override + public List selectAvailableFreeze(String memberId) { + return memberAdapayRecordMapper.selectAvailableFreeze(memberId); + } } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index a4deed405..dc77700a8 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -1382,7 +1382,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { String status = null; // 状态 // 获取余额支付扣除金额 也许存在一笔不够扣,需要扣多笔的情况 - List list = calculateTheBalanceDeductionAmount(orderBasicInfo.getMemberId(), settleAmount); + List 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 calculateSplitTheBillAmount(String memberId, BigDecimal amount) { + List resultList = Lists.newArrayList(); + // 查询会员的余额充值记录 按照充值时间正序 + // List memberAdapayRecords = memberAdapayRecordService.selectAvailableBalance(memberId); + List 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; + } /** * 计算余额扣除金额 * diff --git a/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml index b279eeb81..88cf38480 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml @@ -509,4 +509,14 @@ and balance_amt > '0.00' and member_id = #{memberId,jdbcType=VARCHAR} + + \ No newline at end of file