From d8f16ac471902376907dba1f805df530a9e3d41e Mon Sep 17 00:00:00 2001 From: "autumn.g@foxmail.com" Date: Thu, 31 Aug 2023 16:47:18 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E9=87=8D=E6=96=B0=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E5=88=86=E8=B4=A6=E6=89=A3=E9=99=A4=E9=87=91=E9=A2=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pile/mapper/MemberAdapayRecordMapper.java | 14 ++++++ .../service/MemberAdapayRecordService.java | 2 + .../impl/MemberAdapayRecordServiceImpl.java | 5 +++ .../impl/OrderBasicInfoServiceImpl.java | 43 ++++++++++++++++++- .../mapper/pile/MemberAdapayRecordMapper.xml | 10 +++++ 5 files changed, 73 insertions(+), 1 deletion(-) 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