From bde9d450e9ef4b1c5354979e934245663ad5c266 Mon Sep 17 00:00:00 2001 From: Guoqs <123456@jsowell.com> Date: Thu, 18 Jun 2026 12:29:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BD=99=E9=A2=9D=E9=80=80?= =?UTF-8?q?=E6=AC=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/constant/CacheConstants.java | 3 + .../pile/service/OrderBasicInfoService.java | 5 + .../impl/OrderBasicInfoServiceImpl.java | 148 +++++++++++++----- .../DelayMerchantProgramLogic.java | 123 +-------------- .../NotDelayMerchantProgramLogic.java | 82 +--------- 5 files changed, 118 insertions(+), 243 deletions(-) diff --git a/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java b/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java index 3e52f20c4..e5e285040 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java +++ b/jsowell-common/src/main/java/com/jsowell/common/constant/CacheConstants.java @@ -75,6 +75,9 @@ public class CacheConstants { // 会员余额退款正在进行中 public static final String MEMBER_BALANCE_REFUNDS_ARE_IN_PROGRESS = "member_balance_refunds_are_in_progress:"; + // 余额支付订单退款锁 + public static final String ORDER_BALANCE_PAYMENT_REFUND_LOCK = "order_balance_payment_refund_lock:"; + // 平台测试员 public static final String PLATFORM_TESTER = "platform_tester:"; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java index 8f2e9c7b9..4d924a481 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/OrderBasicInfoService.java @@ -434,6 +434,11 @@ public interface OrderBasicInfoService{ OrderDetail returnUpdateOrderDetail(OrderBasicInfo orderBasicInfo, TransactionRecordsData data); + /** + * 余额支付订单退款统一入口 + */ + void refundBalancePaymentOrder(OrderBasicInfo orderBasicInfo); + /** * 通过站点id修改运营商id * @param stationId 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 aee935de0..164848e2a 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 @@ -50,7 +50,6 @@ import com.jsowell.pile.dto.ningxiajiaotou.NXJTQueryOrdersInfoDTO; import com.jsowell.pile.mapper.OrderBasicInfoMapper; import com.jsowell.pile.service.*; import com.jsowell.pile.service.programlogic.AbstractProgramLogic; -import com.jsowell.pile.service.programlogic.DelayMerchantProgramLogic; import com.jsowell.pile.service.programlogic.ProgramLogicFactory; import com.jsowell.pile.transaction.dto.ClearingBillTransactionDTO; import com.jsowell.pile.transaction.dto.OrderTransactionDTO; @@ -1290,7 +1289,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { String payMode = orderBasicInfo.getPayMode(); if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_PRINCIPAL_BALANCE.getValue())) { // 余额支付 - balancePaymentOrderRefundV2(orderBasicInfo); + SpringUtils.getBean(OrderBasicInfoService.class).refundBalancePaymentOrder(orderBasicInfo); } else if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) { // 微信支付 onlinePaymentOrderRefund(orderBasicInfo); @@ -1318,7 +1317,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { String payMode = orderBasicInfo.getPayMode(); if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_PRINCIPAL_BALANCE.getValue())) { // 余额支付 - balancePaymentOrderRefundV2(orderBasicInfo); + SpringUtils.getBean(OrderBasicInfoService.class).refundBalancePaymentOrder(orderBasicInfo); } else if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) { // 微信支付 onlinePaymentOrderRefund(orderBasicInfo); @@ -1580,81 +1579,150 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { } } + @Override @Transactional(rollbackFor = Exception.class) - public void balancePaymentOrderRefundV2(OrderBasicInfo orderBasicInfo) { - // 订单编号 + public void refundBalancePaymentOrder(OrderBasicInfo orderBasicInfo) { + if (orderBasicInfo == null) { + logger.info("余额支付订单退款-订单信息为空,不执行退款"); + return; + } + String orderCode = orderBasicInfo.getOrderCode(); BigDecimal refundAmount = orderBasicInfo.getRefundAmount(); - if (refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) { - logger.info("balancePaymentOrderRefundV2-退款金额小于等于0,orderCode:{}, 退款金额:{}", orderCode, refundAmount); + if (StringUtils.isBlank(orderCode) || refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) { + logger.info("余额支付订单退款-参数不足,orderCode:{}, 退款金额:{}", orderCode, refundAmount); return; } - // 订单消费金额 - BigDecimal orderAmount = orderBasicInfo.getOrderAmount() == null ? BigDecimal.ZERO : orderBasicInfo.getOrderAmount(); - // 查支付记录 + + if (!StringUtils.equals(orderBasicInfo.getPayMode(), OrderPayModeEnum.PAYMENT_OF_PRINCIPAL_BALANCE.getValue())) { + logger.info("余额支付订单退款-订单:{}支付方式:{}不是余额支付,不执行退款", + orderCode, OrderPayModeEnum.getPayModeDescription(orderBasicInfo.getPayMode())); + return; + } + + String lockKey = CacheConstants.ORDER_BALANCE_PAYMENT_REFUND_LOCK + orderCode; + Boolean locked = redisCache.setnx(lockKey, Constants.ONE, 60); + if (!Boolean.TRUE.equals(locked)) { + logger.info("余额支付订单退款-订单:{}正在退款处理中,本次跳过", orderCode); + return; + } + + try { + doRefundBalancePaymentOrder(orderBasicInfo); + } finally { + redisCache.deleteObject(lockKey); + } + } + + private void doRefundBalancePaymentOrder(OrderBasicInfo orderBasicInfo) { + String orderCode = orderBasicInfo.getOrderCode(); + BigDecimal refundAmount = orderBasicInfo.getRefundAmount(); + BigDecimal orderAmount = positiveOrZero(orderBasicInfo.getOrderAmount()); + BigDecimal discountAmount = positiveOrZero(orderBasicInfo.getDiscountAmount()); + BigDecimal insuranceAmount = positiveOrZero(orderBasicInfo.getInsuranceAmount()); + List payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); if (CollectionUtils.isEmpty(payRecordList)) { - logger.info("balancePaymentOrderRefundV2-订单支付记录为空,orderCode:{}", orderCode); + logger.info("余额支付订单退款-订单支付记录为空,orderCode:{}", orderCode); return; } - // Map payRecordMap = payRecordList.stream() - // .collect(Collectors.toMap(OrderPayRecord::getPayMode, Function.identity(), (k1, k2) -> k1)); Map> payRecordMap = payRecordList.stream().collect(Collectors.groupingBy(OrderPayRecord::getPayMode)); - // 获取本金支付的记录 - List principalPayRecordList = payRecordMap.get(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()); - BigDecimal principalPay = null; - if (CollectionUtils.isNotEmpty(principalPayRecordList)) { - principalPay = principalPayRecordList.stream().map(OrderPayRecord::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal principalPay = sumPayAmount(payRecordMap.get(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue())); + BigDecimal giftPay = sumPayAmount(payRecordMap.get(OrderPayRecordEnum.GIFT_BALANCE_PAYMENT.getValue())); + + if (insuranceAmount.compareTo(BigDecimal.ZERO) > 0 && !checkRefundInsuranceAmount(orderBasicInfo)) { + insuranceAmount = BigDecimal.ZERO; } - // 获取赠送金支付的记录 - List giftPayRecordList = payRecordMap.get(OrderPayRecordEnum.GIFT_BALANCE_PAYMENT.getValue()); - BigDecimal giftPay = null; - if (CollectionUtils.isNotEmpty(giftPayRecordList)) { - giftPay = giftPayRecordList.stream().map(OrderPayRecord::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add); - } + Map refundMap = calculateBalanceRefund(principalPay, giftPay, orderAmount, discountAmount, insuranceAmount); + BigDecimal returnPrincipal = positiveOrZero(refundMap.get("returnPrincipal")) + .add(positiveOrZero(refundMap.get("returnPrincipalForInsurance"))); + BigDecimal returnGift = positiveOrZero(refundMap.get("returnGift")) + .add(positiveOrZero(refundMap.get("returnGiftForInsurance"))); - // 计算需要退回的金额 - Map returnAmountMap = calculateReturnAmount(principalPay, giftPay, orderAmount); - logger.info("结算订单:{}, 剩余金额退回余额, 订单消费金额:{}, 本金支付金额:{}, 赠送支付金额:{}, 退回金额map:{}", - orderCode, orderAmount, principalPay, giftPay, JSON.toJSONString(returnAmountMap)); - - // 需要退回本金的金额 - BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal"); - // 需要退回赠送金的金额 - BigDecimal returnGift = returnAmountMap.get("returnGift"); + logger.info("余额支付订单退款-订单:{}, 订单消费金额:{}, 折扣金额:{}, 保险金额:{}, 本金支付:{}, 赠送支付:{}, 原计算本金:{}, 原计算赠送:{}", + orderCode, orderAmount, discountAmount, insuranceAmount, principalPay, giftPay, returnPrincipal, returnGift); Map allowableRefundMap = calculateAllowableBalanceRefund(orderCode, refundAmount, principalPay, giftPay, returnPrincipal, returnGift); returnPrincipal = allowableRefundMap.get("returnPrincipal"); returnGift = allowableRefundMap.get("returnGift"); if (returnPrincipal.compareTo(BigDecimal.ZERO) <= 0 && returnGift.compareTo(BigDecimal.ZERO) <= 0) { - logger.info("balancePaymentOrderRefundV2-订单:{}本次可退金额为0,不执行退款", orderCode); + logger.info("余额支付订单退款-订单:{}本次可退金额为0,不执行退款", orderCode); return; } - // 更新会员钱包/余额退回到钱包 UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() .memberId(orderBasicInfo.getMemberId()) - .type(MemberWalletEnum.TYPE_IN.getValue()) // 进账 - .subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) // 订单结算退款 + .targetMerchantId(orderBasicInfo.getMerchantId()) + .type(MemberWalletEnum.TYPE_IN.getValue()) + .subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) .updatePrincipalBalance(returnPrincipal) .updateGiftBalance(returnGift) .relatedOrderCode(orderCode) .build(); memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); - // 更新order_pay_record, 解冻部分 - AbstractProgramLogic orderLogic = new DelayMerchantProgramLogic(); - List> list = orderLogic.calculateUnfreezeAmount(orderAmount, payRecordList); + unfreezeBalancePaymentRecords(orderAmount, payRecordList); + } + + private BigDecimal sumPayAmount(List payRecords) { + if (CollectionUtils.isEmpty(payRecords)) { + return BigDecimal.ZERO; + } + return payRecords.stream() + .map(OrderPayRecord::getPayAmount) + .filter(Objects::nonNull) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + private void unfreezeBalancePaymentRecords(BigDecimal orderAmount, List payRecordList) { + List> list = calculateUnfreezeAmount(orderAmount, payRecordList); for (Map map : list) { String paymentId = (String) map.get("paymentId"); BigDecimal unfreezeAmount = (BigDecimal) map.get("unfreezeAmount"); + if (StringUtils.isBlank(paymentId) || unfreezeAmount == null || unfreezeAmount.compareTo(BigDecimal.ZERO) <= 0) { + continue; + } memberAdapayRecordService.unfreezeAmount(paymentId, unfreezeAmount); } } + private List> calculateUnfreezeAmount(BigDecimal orderAmount, List payRecordList) { + List> resultList = Lists.newArrayList(); + if (CollectionUtils.isEmpty(payRecordList)) { + return resultList; + } + + BigDecimal tempAmount = positiveOrZero(orderAmount); + for (OrderPayRecord record : payRecordList) { + if (!StringUtils.equals(record.getPayMode(), OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue())) { + continue; + } + List paymentInfos = orderPayRecordService.parseDeductionRecord(record.getDeductionRecord()); + for (PaymentInfo object : paymentInfos) { + String paymentId = object.getPaymentId(); + BigDecimal payAmount = new BigDecimal(object.getAmount()); + BigDecimal unfreezeAmount; + + if (tempAmount.compareTo(BigDecimal.ZERO) <= 0) { + unfreezeAmount = payAmount; + } else { + BigDecimal min = tempAmount.min(payAmount); + unfreezeAmount = payAmount.subtract(min); + tempAmount = tempAmount.subtract(min); + } + + Map map = Maps.newHashMap(); + map.put("paymentId", paymentId); + map.put("unfreezeAmount", unfreezeAmount); + resultList.add(map); + } + } + return resultList; + } + /** * 订单分账逻辑 * orderSplittingOperations diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index 1e59d4ada..e1a5d3e25 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -833,7 +833,7 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { String payMode = orderBasicInfo.getPayMode(); if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_PRINCIPAL_BALANCE.getValue())) { // 余额支付 - balancePaymentOrderRefund(orderBasicInfo); + orderBasicInfoService.refundBalancePaymentOrder(orderBasicInfo); } else if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue()) || StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_ALIPAY.getValue())) { // 在线支付 @@ -1023,127 +1023,6 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { } - /** - * 余额支付订单退款 - */ - @Transactional(rollbackFor = Exception.class) - public void balancePaymentOrderRefund(OrderBasicInfo orderBasicInfo) { - logger.info("【{}】-余额支付订单退款start orderBasicInfo:{}", this.getClass().getSimpleName(), JSON.toJSONString(orderBasicInfo)); - // 需要退款的金额 - BigDecimal refundAmount = orderBasicInfo.getRefundAmount(); - - // 如果退款金额小于等于0, 不执行退款 - if (refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) { - logger.info("balancePaymentOrderRefund-退款金额小于等于0,orderCode:{}, 退款金额:{}", orderBasicInfo.getOrderCode(), refundAmount); - return; - } - - // 获取订单已退款金额 - BigDecimal orderRefundedAmount = orderBasicInfoService.getOrderRefundedAmount(orderBasicInfo.getOrderCode()); - if (orderRefundedAmount.compareTo(refundAmount) >= 0) { - logger.info("执行订单退款-校验已退款金额,orderCode:{}, 应退款金额:{}, 已经退款金额:{}, 不再执行退款", orderBasicInfo.getOrderCode(), refundAmount, orderRefundedAmount); - return; - } - - // 订单编号 - String orderCode = orderBasicInfo.getOrderCode(); - - // 运营商id - String merchantId = orderBasicInfo.getMerchantId(); - - // 订单消费金额 - BigDecimal orderAmount = orderBasicInfo.getOrderAmount(); - - // 查支付记录 - List payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); - - // 根据payMode分组 - Map> payRecordMap = payRecordList.stream() - .collect(Collectors.groupingBy(OrderPayRecord::getPayMode)); - - // 获取本金支付的记录 - List principalPayRecordList = payRecordMap.get(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()); - BigDecimal principalPay = null; - if (CollectionUtils.isNotEmpty(principalPayRecordList)) { - principalPay = principalPayRecordList.stream().map(OrderPayRecord::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add); - } - - // 获取赠送金支付的记录 - List giftPayRecordList = payRecordMap.get(OrderPayRecordEnum.GIFT_BALANCE_PAYMENT.getValue()); - BigDecimal giftPay = null; - if (CollectionUtils.isNotEmpty(giftPayRecordList)) { - giftPay = giftPayRecordList.stream().map(OrderPayRecord::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add); - } - - BigDecimal discountAmount = orderBasicInfo.getDiscountAmount() == null ? BigDecimal.ZERO : orderBasicInfo.getDiscountAmount(); - BigDecimal insuranceAmount = orderBasicInfo.getInsuranceAmount() == null ? BigDecimal.ZERO : orderBasicInfo.getInsuranceAmount(); - - // 计算需要退回的金额 - Map returnAmountMap = calculateReturnAmount(principalPay, giftPay, orderAmount, discountAmount); - logger.info("结算订单:{}, 剩余金额退回余额, 订单消费金额:{}, 本金支付金额:{}, 赠送支付金额:{}, 退回金额map:{}", - orderCode, orderAmount, principalPay, giftPay, JSON.toJSONString(returnAmountMap)); - - // 需要退回本金的金额 - BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal"); - returnPrincipal = returnPrincipal == null ? BigDecimal.ZERO : returnPrincipal; - - // 需要退回赠送金的金额 - BigDecimal returnGift = returnAmountMap.get("returnGift"); - returnGift = returnGift == null ? BigDecimal.ZERO : returnGift; - - // 更新会员钱包/余额退回到钱包 - UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() - .memberId(orderBasicInfo.getMemberId()) - .targetMerchantId(merchantId) - .type(MemberWalletEnum.TYPE_IN.getValue()) // 进账 - .subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) // 订单结算退款 - .updatePrincipalBalance(returnPrincipal) - .updateGiftBalance(returnGift) - .relatedOrderCode(orderCode) - .build(); - - // 判断消费金额,如果消费金额 - 折扣金额小于 1 元,则将保险费也进行退回 - if (orderAmount.subtract(discountAmount).compareTo(BigDecimal.ONE) < 0) { - // 判断是否需要退保险费用 - boolean checkResult = orderBasicInfoService.checkRefundInsuranceAmount(orderBasicInfo); - if (checkResult) { - // 退保险, 使用 calculateBalanceRefund 重新计算完整的退款金额(电费退款+保险费退款) - // 注意:不能在 calculateReturnAmount 的基础上叠加保险费,因为 calculateReturnAmount 不感知保险费, - // 算出的退款金额中已包含保险费部分,叠加会导致保险费被重复退还 - Map refundMap = calculateBalanceRefund(principalPay, giftPay, orderAmount, discountAmount, insuranceAmount); - BigDecimal refundPrincipal = refundMap.get("returnPrincipal"); - BigDecimal refundGift = refundMap.get("returnGift"); - BigDecimal returnPrincipalForInsurance = refundMap.get("returnPrincipalForInsurance"); - BigDecimal returnGiftForInsurance = refundMap.get("returnGiftForInsurance"); - refundPrincipal = refundPrincipal == null ? BigDecimal.ZERO : refundPrincipal; - refundGift = refundGift == null ? BigDecimal.ZERO : refundGift; - - updateMemberBalanceDTO.setUpdatePrincipalBalance(refundPrincipal.add(returnPrincipalForInsurance)); - updateMemberBalanceDTO.setUpdateGiftBalance(refundGift.add(returnGiftForInsurance)); - } - } - - Map allowableRefundMap = orderBasicInfoService.calculateAllowableBalanceRefund(orderCode, refundAmount, - principalPay, giftPay, updateMemberBalanceDTO.getUpdatePrincipalBalance(), updateMemberBalanceDTO.getUpdateGiftBalance()); - updateMemberBalanceDTO.setUpdatePrincipalBalance(allowableRefundMap.get("returnPrincipal")); - updateMemberBalanceDTO.setUpdateGiftBalance(allowableRefundMap.get("returnGift")); - if (updateMemberBalanceDTO.getUpdatePrincipalBalance().compareTo(BigDecimal.ZERO) <= 0 - && updateMemberBalanceDTO.getUpdateGiftBalance().compareTo(BigDecimal.ZERO) <= 0) { - logger.info("balancePaymentOrderRefund-订单:{}本次可退金额为0,不执行退款", orderCode); - return; - } - // 统一退款 - memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); - - // 更新order_pay_record, 解冻部分 - // List> list = calculateUnfreezeAmount(orderAmount, payRecordList); - // for (Map map : list) { - // String paymentId = (String) map.get("paymentId"); - // BigDecimal unfreezeAmount = (BigDecimal) map.get("unfreezeAmount"); - // memberAdapayRecordService.unfreezeAmount(paymentId, unfreezeAmount); - // } - } - /** * 在线支付订单退款 */ diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java index 36cb8461f..8235ca39d 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java @@ -542,7 +542,7 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic { String payMode = orderBasicInfo.getPayMode(); if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_PRINCIPAL_BALANCE.getValue())) { // 余额支付 - balancePaymentOrderRefund(orderBasicInfo); + orderBasicInfoService.refundBalancePaymentOrder(orderBasicInfo); } else if (StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue()) || StringUtils.equals(payMode, OrderPayModeEnum.PAYMENT_OF_ALIPAY.getValue())) { // 在线支付 @@ -747,86 +747,6 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic { } } - /** - * 余额支付订单退款 - * - * @param orderBasicInfo - */ - @Transactional(rollbackFor = Exception.class) - public void balancePaymentOrderRefund(OrderBasicInfo orderBasicInfo) { - logger.info("【{}】-余额支付订单退款start orderBasicInfo:{}", this.getClass().getSimpleName(), JSON.toJSONString(orderBasicInfo)); - BigDecimal refundAmount = orderBasicInfo.getRefundAmount(); - if (refundAmount == null || refundAmount.compareTo(BigDecimal.ZERO) <= 0) { - logger.info("balancePaymentOrderRefund-退款金额小于等于0,orderCode:{}, 退款金额:{}", orderBasicInfo.getOrderCode(), refundAmount); - return; - } - // 订单编号 - String orderCode = orderBasicInfo.getOrderCode(); - // 订单消费金额 - BigDecimal orderAmount = orderBasicInfo.getOrderAmount(); - // 查支付记录 - List payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); - - // 根据payMode分组 - Map> payRecordMap = payRecordList.stream() - .collect(Collectors.groupingBy(OrderPayRecord::getPayMode)); - - // 获取本金支付的记录 - List principalPayRecordList = payRecordMap.get(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()); - BigDecimal principalPay = null; - if (CollectionUtils.isNotEmpty(principalPayRecordList)) { - principalPay = principalPayRecordList.stream().map(OrderPayRecord::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add); - } - - // 获取赠送金支付的记录 - List giftPayRecordList = payRecordMap.get(OrderPayRecordEnum.GIFT_BALANCE_PAYMENT.getValue()); - BigDecimal giftPay = null; - if (CollectionUtils.isNotEmpty(giftPayRecordList)) { - giftPay = giftPayRecordList.stream().map(OrderPayRecord::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add); - } - - BigDecimal discountAmount = orderBasicInfo.getDiscountAmount() == null ? BigDecimal.ZERO : orderBasicInfo.getDiscountAmount(); - - // 计算需要退回的金额 - Map returnAmountMap = calculateReturnAmount(principalPay, giftPay, orderAmount, discountAmount); - logger.info("结算订单:{}, 剩余金额退回余额, 订单消费金额:{}, 本金支付金额:{}, 赠送支付金额:{}, 退回金额map:{}", - orderCode, orderAmount, principalPay, giftPay, JSON.toJSONString(returnAmountMap)); - - // 需要退回本金的金额 - BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal"); - // 需要退回赠送金的金额 - BigDecimal returnGift = returnAmountMap.get("returnGift"); - - // 更新会员钱包/余额退回到钱包 - UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() - .memberId(orderBasicInfo.getMemberId()) - .type(MemberWalletEnum.TYPE_IN.getValue()) // 进账 - .subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) // 订单结算退款 - .updatePrincipalBalance(returnPrincipal) - .updateGiftBalance(returnGift) - .relatedOrderCode(orderCode) - .build(); - - Map allowableRefundMap = orderBasicInfoService.calculateAllowableBalanceRefund(orderCode, refundAmount, - principalPay, giftPay, updateMemberBalanceDTO.getUpdatePrincipalBalance(), updateMemberBalanceDTO.getUpdateGiftBalance()); - updateMemberBalanceDTO.setUpdatePrincipalBalance(allowableRefundMap.get("returnPrincipal")); - updateMemberBalanceDTO.setUpdateGiftBalance(allowableRefundMap.get("returnGift")); - if (updateMemberBalanceDTO.getUpdatePrincipalBalance().compareTo(BigDecimal.ZERO) <= 0 - && updateMemberBalanceDTO.getUpdateGiftBalance().compareTo(BigDecimal.ZERO) <= 0) { - logger.info("balancePaymentOrderRefund-订单:{}本次可退金额为0,不执行退款", orderCode); - return; - } - memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); - - // 更新order_pay_record, 解冻部分 - List> list = calculateUnfreezeAmount(orderAmount, payRecordList); - for (Map map : list) { - String paymentId = (String) map.get("paymentId"); - BigDecimal unfreezeAmount = (BigDecimal) map.get("unfreezeAmount"); - memberAdapayRecordService.unfreezeAmount(paymentId, unfreezeAmount); - } - } - /** * 在线支付订单退款 *