From 21bf0e40a3a7cc63cf421a098f2df78d570195b8 Mon Sep 17 00:00:00 2001 From: xxm1995 Date: Tue, 26 Dec 2023 16:32:56 +0800 Subject: [PATCH] =?UTF-8?q?ref=20=E6=94=AF=E4=BB=98=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E9=87=8D=E6=9E=84,=20=E6=94=AF=E4=BB=98=E4=B8=8A=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../platform/daxpay/code/PayStatusEnum.java | 2 +- .../daxpay/param/pay/RefundChannelParam.java | 4 +- .../daxpay/param/pay/RefundParam.java | 2 +- .../daxpay/param/pay/SimpleRefundParam.java | 16 +- .../common/context/RefundRequestLocal.java | 14 ++ .../daxpay/common/context/RequestLocal.java | 1 + .../order/refund/entity/PayRefundOrder.java | 5 +- .../common/service/PaymentAssistService.java | 61 ++++++++ .../common/service/PaymentSignService.java | 11 +- .../payment/pay/service/PayAssistService.java | 32 ---- .../factory/PayRefundStrategyFactory.java | 8 +- .../service/PayRefundAssistService.java | 102 ++++++++++++ .../refund/service/PayRefundService.java | 147 +++++++++++++++++- .../dto/order/refund/PayRefundOrderDto.java | 5 +- 14 files changed, 353 insertions(+), 57 deletions(-) create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/RefundRequestLocal.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/common/service/PaymentAssistService.java create mode 100644 daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundAssistService.java diff --git a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/PayStatusEnum.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/PayStatusEnum.java index 5e9e6f55..7e2b22cf 100644 --- a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/PayStatusEnum.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/code/PayStatusEnum.java @@ -20,7 +20,7 @@ public enum PayStatusEnum { /** 超时取消 */ TIMEOUT("timeout","超时取消"), PARTIAL_REFUND("partial_refund","部分退款"), - REFUNDED("REFUNDED","已退款"); + REFUNDED("REFUNDED","全部退款"); /** 编码 */ private final String code; diff --git a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/RefundChannelParam.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/RefundChannelParam.java index fe71c4eb..16d86852 100644 --- a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/RefundChannelParam.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/RefundChannelParam.java @@ -9,6 +9,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.experimental.Accessors; +import javax.validation.constraints.Min; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @@ -27,10 +28,11 @@ public class RefundChannelParam { */ @Schema(description = "支付通道编码") @NotBlank(message = "支付通道编码不可为空") - private String payChannel; + private String channel; @Schema(description = "退款金额") @NotNull(message = "退款金额不可为空") + @Min(1) private Integer amount; /** diff --git a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/RefundParam.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/RefundParam.java index 0c67c8ef..d326691f 100644 --- a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/RefundParam.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/RefundParam.java @@ -40,7 +40,7 @@ public class RefundParam extends PayCommonParam { */ @Valid @Schema(description = "退款参数列表") - private List refundModes; + private List refundChannels; @Schema(description = "退款原因") private String reason; diff --git a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/SimpleRefundParam.java b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/SimpleRefundParam.java index 8e8d0377..a1d149af 100644 --- a/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/SimpleRefundParam.java +++ b/daxpay-core/src/main/java/cn/bootx/platform/daxpay/param/pay/SimpleRefundParam.java @@ -22,18 +22,15 @@ import javax.validation.constraints.NotNull; @Schema(title = "简单退款参数") public class SimpleRefundParam extends PayCommonParam { + /** + * 优先级高于业务号 + */ @Schema(description = "支付单ID") private Long paymentId; @Schema(description = "业务号") private String businessNo; - /** - * 部分退款需要传输refundModes参数 - */ - @Schema(description = "是否全部退款") - private boolean refundAll; - /** * 部分退款时此项必填 */ @@ -46,6 +43,13 @@ public class SimpleRefundParam extends PayCommonParam { @NotBlank(message = "支付通道编码不可为空") private String payChannel; + /** + * 部分退款需要传输refundModes参数 + */ + @Schema(description = "是否全部退款") + private boolean refundAll; + + @Schema(description = "退款金额") @NotNull(message = "退款金额不可为空") private Integer amount; diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/RefundRequestLocal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/RefundRequestLocal.java new file mode 100644 index 00000000..a7d4b76c --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/RefundRequestLocal.java @@ -0,0 +1,14 @@ +package cn.bootx.platform.daxpay.common.context; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 退款请求上下文 + * @author xxm + * @since 2023/12/26 + */ +@Data +@Accessors(chain = true) +public class RefundRequestLocal { +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/RequestLocal.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/RequestLocal.java index 60ebd270..fd6ec166 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/RequestLocal.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/common/context/RequestLocal.java @@ -31,4 +31,5 @@ public class RequestLocal { /** 请求链路id */ private String reqId; + } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/entity/PayRefundOrder.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/entity/PayRefundOrder.java index 403d1659..d9bcfd1c 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/entity/PayRefundOrder.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/order/refund/entity/PayRefundOrder.java @@ -3,6 +3,7 @@ package cn.bootx.platform.daxpay.core.order.refund.entity; import cn.bootx.platform.common.core.function.EntityBaseFunction; import cn.bootx.platform.common.mybatisplus.base.MpBaseEntity; import cn.bootx.platform.common.mybatisplus.handler.JacksonRawTypeHandler; +import cn.bootx.platform.daxpay.code.PayRefundStatusEnum; import cn.bootx.platform.daxpay.common.entity.OrderRefundableInfo; import cn.bootx.platform.daxpay.core.order.refund.convert.RefundConvert; import cn.bootx.platform.daxpay.dto.order.refund.PayRefundOrderDto; @@ -59,9 +60,9 @@ public class PayRefundOrder extends MpBaseEntity implements EntityBaseFunction

params = param.toMap(); String signType = platform.getSignType(); - // 生成签名前先去除sign + // 生成签名前先去除sign参数 params.remove(FIELD_SIGN); String data = PayKit.createLinkString(params); if (Objects.equals(PaySignTypeEnum.HMAC_SHA256.getCode(), signType)){ diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayAssistService.java index 95eae84b..3b3dd7d6 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayAssistService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/pay/service/PayAssistService.java @@ -1,20 +1,15 @@ package cn.bootx.platform.daxpay.core.payment.pay.service; -import cn.bootx.platform.common.core.code.CommonCode; import cn.bootx.platform.daxpay.common.context.AsyncPayLocal; import cn.bootx.platform.daxpay.common.context.NoticeLocal; import cn.bootx.platform.daxpay.common.context.PlatformLocal; -import cn.bootx.platform.daxpay.common.context.RequestLocal; import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; -import cn.bootx.platform.daxpay.core.system.entity.PlatformConfig; -import cn.bootx.platform.daxpay.core.system.service.PlatformConfigService; import cn.bootx.platform.daxpay.param.pay.PayParam; import cn.bootx.platform.daxpay.util.PayUtil; import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; import org.springframework.stereotype.Service; import java.time.LocalDateTime; @@ -29,19 +24,6 @@ import java.util.Objects; @Service @RequiredArgsConstructor public class PayAssistService { - private final PlatformConfigService platformConfigService; - /** - * 初始化平台配置上下文 - */ - public void initPlatform(){ - PlatformConfig config = platformConfigService.getConfig(); - PlatformLocal platform = PaymentContextLocal.get().getPlatform(); - platform.setSignType(config.getSignType()); - platform.setSignSecret(config.getSignSecret()); - platform.setNotifyUrl(config.getNotifyUrl()); - platform.setOrderTimeout(config.getOrderTimeout()); - platform.setWebsiteUrl(config.getWebsiteUrl()); - } /** * 初始化支付相关上下文 @@ -51,8 +33,6 @@ public class PayAssistService { this.initExpiredTime(order,payParam); // 初始化通知相关上下文 this.initNotice(payParam); - // 初始化请求相关上下文 - this.initRequest(payParam); } @@ -103,16 +83,4 @@ public class PayAssistService { noticeInfo.setQuitUrl(payParam.getQuitUrl()); } - /** - * 初始化支付请求相关信息 - */ - public void initRequest(PayParam payParam){ - RequestLocal request = PaymentContextLocal.get().getRequest(); - request.setClientIp(payParam.getClientIp()) - .setExtraParam(payParam.getExtraParam()) - .setSign(payParam.getSign()) - .setVersion(payParam.getVersion()) - .setReqTime(payParam.getReqTime()) - .setReqId(MDC.get(CommonCode.TRACE_ID)); - } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/factory/PayRefundStrategyFactory.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/factory/PayRefundStrategyFactory.java index 447b7683..1db63a74 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/factory/PayRefundStrategyFactory.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/factory/PayRefundStrategyFactory.java @@ -30,8 +30,8 @@ public class PayRefundStrategyFactory { */ public static AbsPayRefundStrategy create(RefundChannelParam refundChannelParam) { - AbsPayRefundStrategy strategy = null; - PayChannelEnum channelEnum = PayChannelEnum.findByCode(refundChannelParam.getPayChannel()); + AbsPayRefundStrategy strategy; + PayChannelEnum channelEnum = PayChannelEnum.findByCode(refundChannelParam.getChannel()); switch (channelEnum) { case ALI: strategy = SpringUtil.getBean(AliPayRefundStrategy.class); @@ -86,13 +86,13 @@ public class PayRefundStrategyFactory { // 同步支付 val syncRefundModeParams = refundChannelParams.stream() .filter(Objects::nonNull) - .filter(payModeParam -> !ASYNC_TYPE_CODE.contains(payModeParam.getPayChannel())) + .filter(payModeParam -> !ASYNC_TYPE_CODE.contains(payModeParam.getChannel())) .collect(Collectors.toList()); // 异步支付 val asyncRefundModeParams = refundChannelParams.stream() .filter(Objects::nonNull) - .filter(payModeParam -> ASYNC_TYPE_CODE.contains(payModeParam.getPayChannel())) + .filter(payModeParam -> ASYNC_TYPE_CODE.contains(payModeParam.getChannel())) .collect(Collectors.toList()); List sortList = new ArrayList<>(refundChannelParams.size()); diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundAssistService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundAssistService.java new file mode 100644 index 00000000..92efe11d --- /dev/null +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundAssistService.java @@ -0,0 +1,102 @@ +package cn.bootx.platform.daxpay.core.payment.refund.service; + +import cn.bootx.platform.common.core.exception.ValidationFailedException; +import cn.bootx.platform.common.core.util.CollUtil; +import cn.bootx.platform.daxpay.code.PayStatusEnum; +import cn.bootx.platform.daxpay.common.context.NoticeLocal; +import cn.bootx.platform.daxpay.common.context.PlatformLocal; +import cn.bootx.platform.daxpay.common.local.PaymentContextLocal; +import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; +import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.exception.pay.PayFailureException; +import cn.bootx.platform.daxpay.param.pay.RefundParam; +import cn.hutool.core.util.StrUtil; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +/** + * 支付退款支撑服务 + * @author xxm + * @since 2023/12/26 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PayRefundAssistService { + private final PayOrderManager payOrderManager; + + /** + * 初始化上下文 + */ + public void initRefundContext(RefundParam param, PayOrder payOrder){ + // 初始化通知相关上下文 + this.initNotice(param); + // 初始化请求相关上下文 + this.initRequest(param); + } + + /** + * 初始化通知相关上下文 + */ + private void initNotice(RefundParam param) { + NoticeLocal noticeInfo = PaymentContextLocal.get().getNoticeInfo(); + PlatformLocal platform = PaymentContextLocal.get().getPlatform(); + // 异步回调 + if (!param.isNotNotify()){ + noticeInfo.setNotifyUrl(param.getReturnUrl()); + if (StrUtil.isNotBlank(param.getNotifyUrl())){ + noticeInfo.setNotifyUrl(platform.getNotifyUrl()); + } + } + } + + public void initRequest(RefundParam param){ + + } + + /** + * 根据退款参数获取支付订单, 并进行检查 + */ + public PayOrder getPayOrderAndCheckByRefundParam(RefundParam param, boolean simple){ + + if (!param.isRefundAll()){ + if (CollUtil.isEmpty(param.getRefundChannels())){ + throw new ValidationFailedException("退款通道参数不能为空"); + } + if (Objects.isNull(param.getRefundNo())){ + throw new ValidationFailedException("部分退款时退款单号必传"); + } + } + + PayOrder payOrder = null; + if (Objects.nonNull(param.getPaymentId())){ + payOrder = payOrderManager.findById(param.getPaymentId()) + .orElseThrow(() -> new PayFailureException("未查询到支付订单")); + } + if (Objects.isNull(payOrder)){ + payOrder = payOrderManager.findByBusinessNo(param.getBusinessNo()) + .orElseThrow(() -> new PayFailureException("未查询到支付订单")); + } + + // 简单退款校验 + if (payOrder.isCombinationPayMode() != simple){ + throw new PayFailureException("组合支付不可以使用简单退款方式"); + } + // 状态判断, 支付中/失败/取消等不能进行退款 + List tradesStatus = Arrays.asList( + PayStatusEnum.PROGRESS.getCode(), + PayStatusEnum.CLOSE.getCode(), + PayStatusEnum.CANCEL.getCode(), + PayStatusEnum.TIMEOUT.getCode(), + PayStatusEnum.FAIL.getCode()); + if (tradesStatus.contains(payOrder.getStatus())) { + throw new PayFailureException("状态非法, 无法退款"); + } + return payOrder; + } +} diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundService.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundService.java index 8fdb25b2..51436d3e 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundService.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/core/payment/refund/service/PayRefundService.java @@ -1,10 +1,29 @@ package cn.bootx.platform.daxpay.core.payment.refund.service; +import cn.bootx.platform.common.core.util.ValidationUtil; +import cn.bootx.platform.daxpay.code.PayStatusEnum; +import cn.bootx.platform.daxpay.core.order.pay.dao.PayOrderManager; +import cn.bootx.platform.daxpay.core.order.pay.entity.PayOrder; +import cn.bootx.platform.daxpay.core.payment.refund.factory.PayRefundStrategyFactory; +import cn.bootx.platform.daxpay.core.payment.refund.func.AbsPayRefundStrategy; +import cn.bootx.platform.daxpay.core.payment.refund.func.PayRefundStrategyConsumer; +import cn.bootx.platform.daxpay.exception.pay.PayUnsupportedMethodException; +import cn.bootx.platform.daxpay.param.pay.RefundChannelParam; import cn.bootx.platform.daxpay.param.pay.RefundParam; +import cn.bootx.platform.daxpay.param.pay.SimpleRefundParam; import cn.bootx.platform.daxpay.result.pay.RefundResult; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Collections; +import java.util.List; +import java.util.Optional; +import java.util.function.Consumer; +import java.util.stream.Collectors; /** * 支付退款服务 @@ -16,13 +35,137 @@ import org.springframework.stereotype.Service; @RequiredArgsConstructor public class PayRefundService { + private final PayRefundAssistService payRefundAssistService;; + + private final PayOrderManager payOrderManager; /** * 支付退款 */ + @Transactional(rollbackFor = Exception.class ) public RefundResult refund(RefundParam param){ - - return null; + return this.refund(param,false); } + /** + * 简单退款 + */ + @Transactional(rollbackFor = Exception.class ) + public RefundResult simpleRefund(SimpleRefundParam param){ + ValidationUtil.validateParam(param); + // 构建退款参数 + RefundParam refundParam = new RefundParam(); + BeanUtil.copyProperties(param,refundParam); + RefundChannelParam channelParam = new RefundChannelParam() + .setAmount(param.getAmount()) + .setChannel(param.getPayChannel()) + .setChannelExtra(param.getChannelExtra()); + refundParam.setRefundChannels(Collections.singletonList(channelParam)); + return this.refund(refundParam,true); + } + /** + * 支付退款方法 + * @param param 退款参数 + * @param simple 是否简单退款 + */ + private RefundResult refund(RefundParam param, boolean simple){ + // 参数校验 + ValidationUtil.validateParam(param); + PayOrder payOrder = payRefundAssistService.getPayOrderAndCheckByRefundParam(param, simple); + // 退款上下文初始化 + payRefundAssistService.initRefundContext(param,payOrder); + // 是否全部退款 + if (param.isRefundAll()){ + // 全部退款根据支付订单的退款信息构造退款参数 + List channelParams = payOrder.getRefundableInfos() + .stream() + .map(o -> new RefundChannelParam().setChannel(o.getChannel()) + .setAmount(o.getAmount())) + .collect(Collectors.toList()); + param.setRefundChannels(channelParams); + } + return this.refundByChannel(param,payOrder); + } + + /** + * 分支付通道进行退款 + */ + public RefundResult refundByChannel(RefundParam param,PayOrder order){ + List refundChannels = param.getRefundChannels(); + // 1.获取退款参数方式,通过工厂生成对应的策略组 + List payRefundStrategies = PayRefundStrategyFactory.create(refundChannels); + if (CollectionUtil.isEmpty(payRefundStrategies)) { + throw new PayUnsupportedMethodException(); + } + + // 2.初始化支付的参数 + for (AbsPayRefundStrategy refundStrategy : payRefundStrategies) { + refundStrategy.initPayParam(order, param); + } + + // 3.支付前准备 + this.doHandler(refundChannels, order, payRefundStrategies, AbsPayRefundStrategy::doBeforeRefundHandler, null); + + // 4.执行退款 + this.doHandler(refundChannels,order, payRefundStrategies, AbsPayRefundStrategy::doRefundHandler, (strategyList, payOrder) -> { + this.paymentHandler(payOrder, refundChannels); + }); + return new RefundResult(); + } + + /** + * 处理方法 + * @param channelParams 退款方式参数 + * @param payOrder 支付记录 + * @param strategyList 退款策略 + * @param refundStrategy 执行方法 + * @param successCallback 成功操作 + */ + private void doHandler( List channelParams, + PayOrder payOrder, + List strategyList, + Consumer refundStrategy, + PayRefundStrategyConsumer, PayOrder> successCallback) { + try { + // 执行策略操作,如退款前/退款时 + // 等同strategyList.forEach(payMethod.accept(PaymentStrategy)) + strategyList.forEach(refundStrategy); + + // 执行操作成功的处 + Optional.ofNullable(successCallback).ifPresent(fun -> fun.accept(strategyList, payOrder)); + } + catch (Exception e) { + // 记录退款失败的记录 + Integer i = channelParams.stream() + .map(RefundChannelParam::getAmount) + .reduce(0,Integer::sum); + // TODO 保存 +// SpringUtil.getBean(this.getClass()).saveRefund(payOrder, amount, channelParams); + throw e; + } + + } + + /** + * 支付订单处理 + */ + private void paymentHandler(PayOrder payOrder, List refundModeParams) { + Integer amount = refundModeParams.stream() + .map(RefundChannelParam::getAmount) + .reduce(0, Integer::sum); + // 剩余可退款余额 + int refundableBalance = payOrder.getRefundableBalance() - amount; + + // 退款完成 + if (refundableBalance == 0) { + payOrder.setStatus(PayStatusEnum.REFUNDED.getCode()); + } + else { + payOrder.setStatus(PayStatusEnum.PARTIAL_REFUND.getCode()); + } + payOrder.setRefundableBalance(refundableBalance); + payOrderManager.updateById(payOrder); + // TODO 记录退款成功的记录 +// SpringUtil.getBean(this.getClass()).saveRefund(payOrder, amount, refundModeParams); + } } diff --git a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/dto/order/refund/PayRefundOrderDto.java b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/dto/order/refund/PayRefundOrderDto.java index 4d9dc5b4..959236be 100644 --- a/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/dto/order/refund/PayRefundOrderDto.java +++ b/daxpay-single/daxpay-single-service/src/main/java/cn/bootx/platform/daxpay/dto/order/refund/PayRefundOrderDto.java @@ -1,6 +1,7 @@ package cn.bootx.platform.daxpay.dto.order.refund; import cn.bootx.platform.common.core.rest.dto.BaseDto; +import cn.bootx.platform.daxpay.code.PayRefundStatusEnum; import cn.bootx.platform.daxpay.common.entity.OrderRefundableInfo; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; @@ -51,10 +52,10 @@ public class PayRefundOrderDto extends BaseDto { private List refundableInfo; /** - * @see PayStatusCode#REFUND_PROCESS_FAIL + * @see PayRefundStatusEnum */ @Schema(description = "退款状态") - private String refundStatus; + private String status; @Schema(description = "错误码") private String errorCode;