From cc31572b0f2508aba99c1e205dabfe3873a6cfa2 Mon Sep 17 00:00:00 2001 From: "autumn.g@foxmail.com" Date: Wed, 30 Aug 2023 11:34:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=93=E5=8D=B0=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/MemberAdapayRecordServiceImpl.java | 8 +- .../NotDelayMerchantOrderLogic.java | 100 ++++++++++++++++++ 2 files changed, 106 insertions(+), 2 deletions(-) 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 145056e66..701d891cc 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 @@ -86,6 +86,7 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService */ @Override public void updateSpendAmount(String paymentId, BigDecimal spendAmount) { + log.info("更新消费金额, paymentId:{}, 消费金额:{}", paymentId, spendAmount); commonUpdateAmountMethod(paymentId, spendAmount, null, null); } @@ -94,6 +95,7 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService */ @Override public void unfreezeAmount(String paymentId, BigDecimal unfreezeAmount) { + log.info("解冻金额, paymentId:{}, 解冻金额:{}", paymentId, unfreezeAmount); commonUpdateAmountMethod(paymentId, null, null, unfreezeAmount.negate()); } @@ -104,6 +106,7 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService */ @Override public void unfreezeAmountAndUpdateSpendAmount(String paymentId, BigDecimal unfreezeAmount, BigDecimal spendAmount) { + log.info("解冻金额并更新消费金额, paymentId:{}, 解冻金额:{}, 消费金额:{}", paymentId, unfreezeAmount, spendAmount); commonUpdateAmountMethod(paymentId, spendAmount, null, unfreezeAmount.negate()); } @@ -113,6 +116,7 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService */ @Override public void updateRefundAmountFromFreezeAmount(String paymentId, BigDecimal refundAmount) { + log.info("部分解冻,并退款, paymentId:{}, 退款金额:{}", paymentId, refundAmount); commonUpdateAmountMethod(paymentId, null, refundAmount, refundAmount.negate()); } @@ -121,6 +125,7 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService */ @Override public void updateRefundAmount(String paymentId, BigDecimal refundAmount) { + log.info("更新剩余金额, paymentId:{}, 退款金额:{}", paymentId, refundAmount); commonUpdateAmountMethod(paymentId, null, refundAmount, null); } @@ -129,6 +134,7 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService */ @Override public void updateFreezeAmount(String paymentId, BigDecimal freezeAmount) { + log.info("更新冻结金额, paymentId:{}, 冻结金额:{}", paymentId, freezeAmount); commonUpdateAmountMethod(paymentId, null, null, freezeAmount); } @@ -189,7 +195,5 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService balanceAmt = record.getPayAmt().subtract(refundAmt).subtract(spendAmt).subtract(freezeAmt); record.setBalanceAmt(balanceAmt); updateByPrimaryKeySelective(record); - } - } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/NotDelayMerchantOrderLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/NotDelayMerchantOrderLogic.java index a0c3a898b..e5082b62e 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/NotDelayMerchantOrderLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/NotDelayMerchantOrderLogic.java @@ -3,7 +3,9 @@ package com.jsowell.pile.service.orderlogic; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.google.common.collect.Lists; +import com.jsowell.adapay.response.RefundResponse; import com.jsowell.adapay.vo.OrderSettleResult; +import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.ykc.TransactionRecordsData; import com.jsowell.common.enums.AcquirerEnum; import com.jsowell.common.enums.MemberWalletEnum; @@ -11,6 +13,7 @@ import com.jsowell.common.enums.ykc.*; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.util.StringUtils; import com.jsowell.pile.domain.*; +import com.jsowell.pile.dto.ApplyRefundDTO; import com.jsowell.pile.dto.PayOrderDTO; import com.jsowell.pile.dto.PayOrderSuccessCallbackDTO; import com.jsowell.pile.transaction.dto.OrderTransactionDTO; @@ -24,6 +27,9 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.List; import java.util.Map; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 没有设置延时分账的运营商订单逻辑 @@ -293,7 +299,49 @@ public class NotDelayMerchantOrderLogic extends AbstractOrderLogic{ */ @Override public void balancePaymentOrderRefund(OrderBasicInfo orderBasicInfo) { + // 订单编号 + String orderCode = orderBasicInfo.getOrderCode(); + // 订单消费金额 + BigDecimal orderAmount = orderBasicInfo.getOrderAmount(); + // 查支付记录 + List payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); + Map payRecordMap = payRecordList.stream() + .collect(Collectors.toMap(OrderPayRecord::getPayMode, Function.identity(), (k1, k2) -> k1)); + // 取出本金支付金额 + BigDecimal principalPay = null; + + // 获取本金支付的记录 + OrderPayRecord principalPayRecord = payRecordMap.get(Constants.ONE); + if (principalPayRecord != null) { + principalPay = principalPayRecord.getPayAmount(); + } + + // 计算需要退回的金额 + Map returnAmountMap = calculateReturnAmount(principalPay, null, orderAmount); + logger.info("结算订单:{}, 剩余金额退回余额, 订单消费金额:{}, 本金支付金额:{}, 赠送支付金额:{}, 退回金额map:{}", + orderCode, orderAmount, principalPay, null, JSONObject.toJSONString(returnAmountMap)); + + // 需要退回本金的金额 + BigDecimal returnPrincipal = returnAmountMap.get("returnPrincipal"); + + // 更新会员钱包/余额退回到钱包 + UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() + .memberId(orderBasicInfo.getMemberId()) + .type(MemberWalletEnum.TYPE_IN.getValue()) // 进账 + .subType(MemberWalletEnum.SUBTYPE_ORDER_SETTLEMENT_REFUND.getValue()) // 订单结算退款 + .updatePrincipalBalance(returnPrincipal) + .relatedOrderCode(orderCode) + .build(); + memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); + + // 更新order_pay_record, 解冻部分 + List> list = calculateUnfreezeAmount(orderAmount, payRecordList); + for (Map map : list) { + String paymentId = (String) map.get("paymentId"); + String unfreezeAmount = (String) map.get("unfreezeAmount"); + memberAdapayRecordService.unfreezeAmount(paymentId, new BigDecimal(unfreezeAmount)); + } } /** @@ -303,6 +351,58 @@ public class NotDelayMerchantOrderLogic extends AbstractOrderLogic{ */ @Override public void onlinePaymentOrderRefund(OrderBasicInfo orderBasicInfo) { + // 订单编号 + String orderCode = orderBasicInfo.getOrderCode(); + // 需要退款的金额 + BigDecimal refundAmount = orderBasicInfo.getRefundAmount(); + + // 微信退款逻辑 + ApplyRefundDTO applyRefundDTO = new ApplyRefundDTO(); + applyRefundDTO.setOrderCode(orderCode); + applyRefundDTO.setRefundType(Constants.ONE); + applyRefundDTO.setRefundAmount(refundAmount); + + // 汇付退款需要一级运营商的小程序appId, 否则会退款失败 + String wechatAppId = pileMerchantInfoService.queryAppIdByMerchantId(orderBasicInfo.getMerchantId()); + if (StringUtils.isNotBlank(wechatAppId)) { + applyRefundDTO.setWechatAppId(wechatAppId); + } + refundOrderWithAdapay(applyRefundDTO); + } + + /** + * 汇付支付-订单退款处理逻辑 + * 汇付支付订单退款 + * + * @param dto + */ + public void refundOrderWithAdapay(ApplyRefundDTO dto) { + logger.info("汇付支付订单:{}, 执行退款逻辑 param:{}", dto.getOrderCode(), JSON.toJSONString(dto)); + // 查出来原来的支付信息 + AdapayCallbackRecord callbackRecord = adapayCallbackRecordService.selectByOrderCode(dto.getOrderCode()); + if (Objects.isNull(callbackRecord)) { + logger.error("汇付支付orderCode:{}, 订单退款处理逻辑, 查询订单微信支付记录为空!", dto.getOrderCode()); + throw new BusinessException(ReturnCodeEnum.CODE_REFUND_ORDER_CALLBACK_RECORD_ERROR); + } + + String paymentId = callbackRecord.getPaymentId(); + // 判断支付金额和退款金额 + BigDecimal refundAmount = dto.getRefundAmount(); + BigDecimal payAmt = callbackRecord.getPayAmt(); + if (refundAmount.compareTo(payAmt) > 0) { + logger.error("汇付支付订单号:{}, 退款金额:{}(元),大于付款金额{}(元), 抛出异常", dto.getOrderCode(), refundAmount, payAmt); + throw new BusinessException(ReturnCodeEnum.CODE_REFUND_ORDER_AMOUNT_ERROR); + } + + // 实时分账的调退款接口 + RefundResponse refundRequest = adapayService.createRefundRequest(paymentId, refundAmount, + dto.getWechatAppId(), dto.getMemberId(), ScenarioEnum.ORDER.getValue(), dto.getOrderCode()); + if (refundRequest != null && refundRequest.isNotFailed()) { + // 交易退款金额 + BigDecimal refundAmt = new BigDecimal(refundRequest.getRefund_amt()); + // 解冻金额并更新消费金额 + memberAdapayRecordService.unfreezeAmountAndUpdateSpendAmount(paymentId, payAmt, refundAmt); + } } }