Commit 3caa5f14bdd628395634291388695da8a8dc391c
1 parent
b84da302
mall + pay:
1. 优化退款管理的接口实现
Showing
17 changed files
with
190 additions
and
445 deletions
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/order/vo/PayOrderRespVO.java
100755 → 100644
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/PayRefundController.java
| ... | ... | @@ -2,6 +2,11 @@ package cn.iocoder.yudao.module.pay.controller.admin.refund; |
| 2 | 2 | |
| 3 | 3 | import cn.hutool.core.collection.CollectionUtil; |
| 4 | 4 | import cn.hutool.core.util.ObjectUtil; |
| 5 | +import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 6 | +import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 7 | +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; | |
| 8 | +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | |
| 9 | +import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum; | |
| 5 | 10 | import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.*; |
| 6 | 11 | import cn.iocoder.yudao.module.pay.convert.refund.PayRefundConvert; |
| 7 | 12 | import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO; |
| ... | ... | @@ -10,15 +15,9 @@ import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; |
| 10 | 15 | import cn.iocoder.yudao.module.pay.service.app.PayAppService; |
| 11 | 16 | import cn.iocoder.yudao.module.pay.service.order.PayOrderService; |
| 12 | 17 | import cn.iocoder.yudao.module.pay.service.refund.PayRefundService; |
| 13 | -import cn.iocoder.yudao.framework.common.pojo.CommonResult; | |
| 14 | -import cn.iocoder.yudao.framework.common.pojo.PageResult; | |
| 15 | -import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils; | |
| 16 | -import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; | |
| 17 | -import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog; | |
| 18 | -import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum; | |
| 19 | -import io.swagger.v3.oas.annotations.tags.Tag; | |
| 20 | -import io.swagger.v3.oas.annotations.Parameter; | |
| 21 | 18 | import io.swagger.v3.oas.annotations.Operation; |
| 19 | +import io.swagger.v3.oas.annotations.Parameter; | |
| 20 | +import io.swagger.v3.oas.annotations.tags.Tag; | |
| 22 | 21 | import org.springframework.security.access.prepost.PreAuthorize; |
| 23 | 22 | import org.springframework.validation.annotation.Validated; |
| 24 | 23 | import org.springframework.web.bind.annotation.GetMapping; |
| ... | ... | @@ -35,6 +34,7 @@ import java.util.List; |
| 35 | 34 | import java.util.Map; |
| 36 | 35 | |
| 37 | 36 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 37 | +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | |
| 38 | 38 | import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT; |
| 39 | 39 | |
| 40 | 40 | @Tag(name = "管理后台 - 退款订单") |
| ... | ... | @@ -56,20 +56,14 @@ public class PayRefundController { |
| 56 | 56 | @PreAuthorize("@ss.hasPermission('pay:refund:query')") |
| 57 | 57 | public CommonResult<PayRefundDetailsRespVO> getRefund(@RequestParam("id") Long id) { |
| 58 | 58 | PayRefundDO refund = refundService.getRefund(id); |
| 59 | - if (ObjectUtil.isNull(refund)) { | |
| 59 | + if (refund == null) { | |
| 60 | 60 | return success(new PayRefundDetailsRespVO()); |
| 61 | 61 | } |
| 62 | 62 | |
| 63 | - PayAppDO appDO = appService.getApp(refund.getAppId()); | |
| 64 | - PayChannelEnum channelEnum = PayChannelEnum.getByCode(refund.getChannelCode()); | |
| 65 | - PayOrderDO orderDO = orderService.getOrder(refund.getOrderId()); | |
| 66 | - | |
| 67 | - PayRefundDetailsRespVO refundDetail = PayRefundConvert.INSTANCE.refundDetailConvert(refund); | |
| 68 | - refundDetail.setAppName(ObjectUtil.isNotNull(appDO) ? appDO.getName() : "未知应用"); | |
| 69 | - refundDetail.setChannelCodeName(ObjectUtil.isNotNull(channelEnum) ? channelEnum.getName() : "未知渠道"); | |
| 70 | - refundDetail.setSubject(orderDO.getSubject()); | |
| 71 | - | |
| 72 | - return success(refundDetail); | |
| 63 | + // 拼接数据 | |
| 64 | + PayAppDO app = appService.getApp(refund.getAppId()); | |
| 65 | + PayOrderDO order = orderService.getOrder(refund.getOrderId()); | |
| 66 | + return success(PayRefundConvert.INSTANCE.convert(refund, order, app)); | |
| 73 | 67 | } |
| 74 | 68 | |
| 75 | 69 | @GetMapping("/page") |
| ... | ... | @@ -82,21 +76,8 @@ public class PayRefundController { |
| 82 | 76 | } |
| 83 | 77 | |
| 84 | 78 | // 处理应用ID数据 |
| 85 | - Map<Long, PayAppDO> appMap = appService.getAppMap( | |
| 86 | - CollectionUtils.convertList(pageResult.getList(), PayRefundDO::getAppId)); | |
| 87 | - List<PayRefundPageItemRespVO> list = new ArrayList<>(pageResult.getList().size()); | |
| 88 | - pageResult.getList().forEach(c -> { | |
| 89 | - PayAppDO appDO = appMap.get(c.getAppId()); | |
| 90 | - PayChannelEnum channelEnum = PayChannelEnum.getByCode(c.getChannelCode()); | |
| 91 | - | |
| 92 | - PayRefundPageItemRespVO item = PayRefundConvert.INSTANCE.pageItemConvert(c); | |
| 93 | - | |
| 94 | - item.setAppName(ObjectUtil.isNotNull(appDO) ? appDO.getName() : "未知应用"); | |
| 95 | - item.setChannelCodeName(ObjectUtil.isNotNull(channelEnum) ? channelEnum.getName() : "未知渠道"); | |
| 96 | - list.add(item); | |
| 97 | - }); | |
| 98 | - | |
| 99 | - return success(new PageResult<>(list, pageResult.getTotal())); | |
| 79 | + Map<Long, PayAppDO> appMap = appService.getAppMap(convertList(pageResult.getList(), PayRefundDO::getAppId)); | |
| 80 | + return success(PayRefundConvert.INSTANCE.convertPage(pageResult, appMap)); | |
| 100 | 81 | } |
| 101 | 82 | |
| 102 | 83 | @GetMapping("/export-excel") |
| ... | ... | @@ -105,21 +86,21 @@ public class PayRefundController { |
| 105 | 86 | @OperateLog(type = EXPORT) |
| 106 | 87 | public void exportRefundExcel(@Valid PayRefundExportReqVO exportReqVO, |
| 107 | 88 | HttpServletResponse response) throws IOException { |
| 108 | - | |
| 109 | 89 | List<PayRefundDO> list = refundService.getRefundList(exportReqVO); |
| 110 | 90 | if (CollectionUtil.isEmpty(list)) { |
| 111 | 91 | ExcelUtils.write(response, "退款订单.xls", "数据", |
| 112 | 92 | PayRefundExcelVO.class, new ArrayList<>()); |
| 93 | + return; | |
| 113 | 94 | } |
| 114 | 95 | |
| 115 | 96 | // 处理应用ID数据 |
| 116 | 97 | Map<Long, PayAppDO> appMap = appService.getAppMap( |
| 117 | - CollectionUtils.convertList(list, PayRefundDO::getAppId)); | |
| 98 | + convertList(list, PayRefundDO::getAppId)); | |
| 118 | 99 | |
| 119 | 100 | List<PayRefundExcelVO> excelDatum = new ArrayList<>(list.size()); |
| 120 | 101 | // 处理商品名称数据 |
| 121 | 102 | Map<Long, PayOrderDO> orderMap = orderService.getOrderSubjectMap( |
| 122 | - CollectionUtils.convertList(list, PayRefundDO::getOrderId)); | |
| 103 | + convertList(list, PayRefundDO::getOrderId)); | |
| 123 | 104 | |
| 124 | 105 | list.forEach(c -> { |
| 125 | 106 | PayAppDO appDO = appMap.get(c.getAppId()); | ... | ... |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundBaseVO.java
| 1 | 1 | package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; |
| 2 | + | |
| 2 | 3 | import io.swagger.v3.oas.annotations.media.Schema; |
| 3 | 4 | import lombok.Data; |
| 4 | -import org.springframework.format.annotation.DateTimeFormat; | |
| 5 | 5 | |
| 6 | -import javax.validation.constraints.NotNull; | |
| 7 | 6 | import java.time.LocalDateTime; |
| 8 | 7 | |
| 9 | -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | |
| 10 | - | |
| 11 | 8 | /** |
| 12 | 9 | * 退款订单 Base VO,提供给添加、修改、详细的子 VO 使用 |
| 13 | 10 | * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成 |
| ... | ... | @@ -15,83 +12,67 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ |
| 15 | 12 | @Data |
| 16 | 13 | public class PayRefundBaseVO { |
| 17 | 14 | |
| 18 | - @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 19 | - @NotNull(message = "应用编号不能为空") | |
| 15 | + @Schema(description = "外部退款号", requiredMode = Schema.RequiredMode.REQUIRED, example = "110") | |
| 16 | + private String no; | |
| 17 | + | |
| 18 | + @Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 20 | 19 | private Long appId; |
| 21 | 20 | |
| 22 | - @Schema(description = "渠道编号", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 23 | - @NotNull(message = "渠道编号不能为空") | |
| 21 | + @Schema(description = "渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048") | |
| 24 | 22 | private Long channelId; |
| 25 | 23 | |
| 26 | - @Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 27 | - @NotNull(message = "渠道编码不能为空") | |
| 24 | + @Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx_app") | |
| 28 | 25 | private String channelCode; |
| 29 | 26 | |
| 30 | - @Schema(description = "支付订单编号 pay_order 表id", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 31 | - @NotNull(message = "支付订单编号 pay_order 表id不能为空") | |
| 27 | + @Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 32 | 28 | private Long orderId; |
| 33 | 29 | |
| 34 | - @Schema(description = "交易订单号 pay_extension 表no 字段", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 35 | - @NotNull(message = "交易订单号 pay_extension 表no 字段不能为空") | |
| 36 | - private String tradeNo; | |
| 30 | + // ========== 商户相关字段 ========== | |
| 37 | 31 | |
| 38 | - @Schema(description = "商户订单编号(商户系统生成)", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 39 | - @NotNull(message = "商户订单编号(商户系统生成)不能为空") | |
| 32 | + @Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "225") | |
| 40 | 33 | private String merchantOrderId; |
| 41 | 34 | |
| 42 | - @Schema(description = "商户退款订单号(商户系统生成)", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 43 | - @NotNull(message = "商户退款订单号(商户系统生成)不能为空") | |
| 44 | - private String merchantRefundNo; | |
| 35 | + @Schema(description = "商户退款订单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "512") | |
| 36 | + private String merchantRefundId; | |
| 45 | 37 | |
| 46 | - @Schema(description = "异步通知商户地址", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 47 | - @NotNull(message = "异步通知商户地址不能为空") | |
| 38 | + @Schema(description = "异步通知地址", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 48 | 39 | private String notifyUrl; |
| 49 | 40 | |
| 50 | - @Schema(description = "退款状态", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 51 | - @NotNull(message = "退款状态不能为空") | |
| 52 | - private Integer status; | |
| 41 | + // ========== 退款相关字段 ========== | |
| 53 | 42 | |
| 54 | - @Schema(description = "退款类型(部分退款,全部退款)", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 55 | - @NotNull(message = "退款类型(部分退款,全部退款)不能为空") | |
| 56 | - private Integer type; | |
| 43 | + @Schema(description = "退款状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") | |
| 44 | + private Integer status; | |
| 57 | 45 | |
| 58 | - @Schema(description = "支付金额,单位分", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 59 | - @NotNull(message = "支付金额,单位分不能为空") | |
| 60 | - private Long payAmount; | |
| 46 | + @Schema(description = "支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") | |
| 47 | + private Long payPrice; | |
| 61 | 48 | |
| 62 | - @Schema(description = "退款金额,单位分", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 63 | - @NotNull(message = "退款金额,单位分不能为空") | |
| 64 | - private Long refundAmount; | |
| 49 | + @Schema(description = "退款金额,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "200") | |
| 50 | + private Long refundPrice; | |
| 65 | 51 | |
| 66 | - @Schema(description = "退款原因", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 67 | - @NotNull(message = "退款原因不能为空") | |
| 52 | + @Schema(description = "退款原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "我要退了") | |
| 68 | 53 | private String reason; |
| 69 | 54 | |
| 70 | - @Schema(description = "用户 IP") | |
| 55 | + @Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1") | |
| 71 | 56 | private String userIp; |
| 72 | 57 | |
| 73 | - @Schema(description = "渠道订单号,pay_order 中的channel_order_no 对应", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 74 | - @NotNull(message = "渠道订单号,pay_order 中的channel_order_no 对应不能为空") | |
| 58 | + // ========== 渠道相关字段 ========== | |
| 59 | + | |
| 60 | + @Schema(description = "渠道订单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "233") | |
| 75 | 61 | private String channelOrderNo; |
| 76 | 62 | |
| 77 | - @Schema(description = "渠道退款单号,渠道返回") | |
| 63 | + @Schema(description = "渠道退款单号", example = "2022") | |
| 78 | 64 | private String channelRefundNo; |
| 79 | 65 | |
| 80 | - @Schema(description = "渠道调用报错时,错误码") | |
| 66 | + @Schema(description = "退款成功时间") | |
| 67 | + private LocalDateTime successTime; | |
| 68 | + | |
| 69 | + @Schema(description = "调用渠道的错误码") | |
| 81 | 70 | private String channelErrorCode; |
| 82 | 71 | |
| 83 | - @Schema(description = "渠道调用报错时,错误信息") | |
| 72 | + @Schema(description = "调用渠道的错误提示") | |
| 84 | 73 | private String channelErrorMsg; |
| 85 | 74 | |
| 86 | 75 | @Schema(description = "支付渠道的额外参数") |
| 87 | - private String channelExtras; | |
| 88 | - | |
| 89 | - @Schema(description = "退款失效时间") | |
| 90 | - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 91 | - private LocalDateTime expireTime; | |
| 92 | - | |
| 93 | - @Schema(description = "退款成功时间") | |
| 94 | - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 95 | - private LocalDateTime successTime; | |
| 76 | + private String channelNotifyData; | |
| 96 | 77 | |
| 97 | 78 | } | ... | ... |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundCreateReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; | |
| 2 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 3 | -import lombok.*; | |
| 4 | - | |
| 5 | -@Schema(description = "管理后台 - 退款订单创建 Request VO") | |
| 6 | -@Data | |
| 7 | -@EqualsAndHashCode(callSuper = true) | |
| 8 | -@ToString(callSuper = true) | |
| 9 | -public class PayRefundCreateReqVO extends PayRefundBaseVO { | |
| 10 | - | |
| 11 | -} |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundDetailsRespVO.java
| ... | ... | @@ -5,7 +5,6 @@ import lombok.Data; |
| 5 | 5 | import lombok.EqualsAndHashCode; |
| 6 | 6 | import lombok.ToString; |
| 7 | 7 | |
| 8 | -import javax.validation.constraints.NotNull; | |
| 9 | 8 | import java.time.LocalDateTime; |
| 10 | 9 | |
| 11 | 10 | @Schema(description = "管理后台 - 退款订单详情 Response VO") |
| ... | ... | @@ -17,14 +16,11 @@ public class PayRefundDetailsRespVO extends PayRefundBaseVO { |
| 17 | 16 | @Schema(description = "支付退款编号", requiredMode = Schema.RequiredMode.REQUIRED) |
| 18 | 17 | private Long id; |
| 19 | 18 | |
| 20 | - @Schema(description = "应用名称") | |
| 19 | + @Schema(description = "应用名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是芋艿") | |
| 21 | 20 | private String appName; |
| 22 | 21 | |
| 23 | - @Schema(description = "渠道编号名称") | |
| 24 | - private String channelCodeName; | |
| 25 | - | |
| 26 | - @NotNull(message = "商品标题不能为空") | |
| 27 | - private String subject; | |
| 22 | + @Schema(description = "支付订单", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 23 | + private Order order; | |
| 28 | 24 | |
| 29 | 25 | @Schema(description = "创建时间") |
| 30 | 26 | private LocalDateTime createTime; |
| ... | ... | @@ -32,4 +28,13 @@ public class PayRefundDetailsRespVO extends PayRefundBaseVO { |
| 32 | 28 | @Schema(description = "更新时间") |
| 33 | 29 | private LocalDateTime updateTime; |
| 34 | 30 | |
| 31 | + @Schema(description = "管理后台 - 支付订单") | |
| 32 | + @Data | |
| 33 | + public static class Order { | |
| 34 | + | |
| 35 | + @Schema(description = "商品标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆") | |
| 36 | + private String subject; | |
| 37 | + | |
| 38 | + } | |
| 39 | + | |
| 35 | 40 | } | ... | ... |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundExportReqVO.java
| ... | ... | @@ -12,74 +12,26 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ |
| 12 | 12 | @Data |
| 13 | 13 | public class PayRefundExportReqVO { |
| 14 | 14 | |
| 15 | - @Schema(description = "应用编号") | |
| 15 | + @Schema(description = "应用编号", example = "1024") | |
| 16 | 16 | private Long appId; |
| 17 | 17 | |
| 18 | - @Schema(description = "渠道编号") | |
| 19 | - private Long channelId; | |
| 20 | - | |
| 21 | - @Schema(description = "渠道编码") | |
| 18 | + @Schema(description = "渠道编码", example = "wx_app") | |
| 22 | 19 | private String channelCode; |
| 23 | 20 | |
| 24 | - @Schema(description = "支付订单编号 pay_order 表id") | |
| 25 | - private Long orderId; | |
| 26 | - | |
| 27 | - @Schema(description = "交易订单号 pay_extension 表no 字段") | |
| 28 | - private String tradeNo; | |
| 29 | - | |
| 30 | - @Schema(description = "商户订单编号(商户系统生成)") | |
| 21 | + @Schema(description = "商户支付单号", example = "10") | |
| 31 | 22 | private String merchantOrderId; |
| 32 | 23 | |
| 33 | - @Schema(description = "商户退款订单号(商户系统生成)") | |
| 34 | - private String merchantRefundNo; | |
| 35 | - | |
| 36 | - @Schema(description = "异步通知商户地址") | |
| 37 | - private String notifyUrl; | |
| 38 | - | |
| 39 | - @Schema(description = "退款状态") | |
| 40 | - private Integer status; | |
| 41 | - | |
| 42 | - @Schema(description = "退款类型(部分退款,全部退款)") | |
| 43 | - private Integer type; | |
| 44 | - | |
| 45 | - @Schema(description = "支付金额,单位分") | |
| 46 | - private Long payPrice; | |
| 47 | - | |
| 48 | - @Schema(description = "退款金额,单位分") | |
| 49 | - private Long refundPrice; | |
| 50 | - | |
| 51 | - @Schema(description = "退款原因") | |
| 52 | - private String reason; | |
| 24 | + @Schema(description = "商户退款单号", example = "20") | |
| 25 | + private String merchantRefundId; | |
| 53 | 26 | |
| 54 | - @Schema(description = "用户 IP") | |
| 55 | - private String userIp; | |
| 56 | - | |
| 57 | - @Schema(description = "渠道订单号,pay_order 中的channel_order_no 对应") | |
| 27 | + @Schema(description = "渠道支付单号", example = "30") | |
| 58 | 28 | private String channelOrderNo; |
| 59 | 29 | |
| 60 | - @Schema(description = "渠道退款单号,渠道返回") | |
| 30 | + @Schema(description = "渠道退款单号", example = "40") | |
| 61 | 31 | private String channelRefundNo; |
| 62 | 32 | |
| 63 | - @Schema(description = "渠道调用报错时,错误码") | |
| 64 | - private String channelErrorCode; | |
| 65 | - | |
| 66 | - @Schema(description = "渠道调用报错时,错误信息") | |
| 67 | - private String channelErrorMsg; | |
| 68 | - | |
| 69 | - @Schema(description = "支付渠道的额外参数") | |
| 70 | - private String channelExtras; | |
| 71 | - | |
| 72 | - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 73 | - @Schema(description = "退款失效时间") | |
| 74 | - private LocalDateTime[] expireTime; | |
| 75 | - | |
| 76 | - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 77 | - @Schema(description = "退款成功时间") | |
| 78 | - private LocalDateTime[] successTime; | |
| 79 | - | |
| 80 | - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 81 | - @Schema(description = "退款通知时间") | |
| 82 | - private LocalDateTime[] notifyTime; | |
| 33 | + @Schema(description = "退款状态", example = "0") | |
| 34 | + private Integer status; | |
| 83 | 35 | |
| 84 | 36 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 85 | 37 | @Schema(description = "创建时间") | ... | ... |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundPageItemRespVO.java
| ... | ... | @@ -13,15 +13,12 @@ import java.time.LocalDateTime; |
| 13 | 13 | @ToString(callSuper = true) |
| 14 | 14 | public class PayRefundPageItemRespVO extends PayRefundBaseVO { |
| 15 | 15 | |
| 16 | - @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 16 | + @Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") | |
| 17 | 17 | private Long id; |
| 18 | 18 | |
| 19 | - @Schema(description = "应用名称") | |
| 19 | + @Schema(description = "应用名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是芋艿") | |
| 20 | 20 | private String appName; |
| 21 | 21 | |
| 22 | - @Schema(description = "渠道名称") | |
| 23 | - private String channelCodeName; | |
| 24 | - | |
| 25 | 22 | @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) |
| 26 | 23 | private LocalDateTime createTime; |
| 27 | 24 | ... | ... |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundPageReqVO.java
| ... | ... | @@ -17,70 +17,26 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_ |
| 17 | 17 | @ToString(callSuper = true) |
| 18 | 18 | public class PayRefundPageReqVO extends PageParam { |
| 19 | 19 | |
| 20 | - @Schema(description = "应用编号") | |
| 20 | + @Schema(description = "应用编号", example = "1024") | |
| 21 | 21 | private Long appId; |
| 22 | 22 | |
| 23 | - @Schema(description = "渠道编号") | |
| 24 | - private Long channelId; | |
| 25 | - | |
| 26 | - @Schema(description = "渠道编码") | |
| 23 | + @Schema(description = "渠道编码", example = "wx_app") | |
| 27 | 24 | private String channelCode; |
| 28 | 25 | |
| 29 | - @Schema(description = "支付订单编号 pay_order 表id") | |
| 30 | - private Long orderId; | |
| 31 | - | |
| 32 | - @Schema(description = "交易订单号 pay_extension 表no 字段") | |
| 33 | - private String tradeNo; | |
| 34 | - | |
| 35 | - @Schema(description = "商户订单编号(商户系统生成)") | |
| 26 | + @Schema(description = "商户支付单号", example = "10") | |
| 36 | 27 | private String merchantOrderId; |
| 37 | 28 | |
| 38 | - @Schema(description = "商户退款订单号(商户系统生成)") | |
| 39 | - private String merchantRefundNo; | |
| 40 | - | |
| 41 | - @Schema(description = "异步通知商户地址") | |
| 42 | - private String notifyUrl; | |
| 43 | - | |
| 44 | - @Schema(description = "退款状态") | |
| 45 | - private Integer status; | |
| 46 | - | |
| 47 | - @Schema(description = "退款类型(部分退款,全部退款)") | |
| 48 | - private Integer type; | |
| 49 | - | |
| 50 | - @Schema(description = "支付金额,单位分") | |
| 51 | - private Long payPrice; | |
| 52 | - | |
| 53 | - @Schema(description = "退款金额,单位分") | |
| 54 | - private Long refundPrice; | |
| 29 | + @Schema(description = "商户退款单号", example = "20") | |
| 30 | + private String merchantRefundId; | |
| 55 | 31 | |
| 56 | - @Schema(description = "退款原因") | |
| 57 | - private String reason; | |
| 58 | - | |
| 59 | - @Schema(description = "用户 IP") | |
| 60 | - private String userIp; | |
| 61 | - | |
| 62 | - @Schema(description = "渠道订单号,pay_order 中的channel_order_no 对应") | |
| 32 | + @Schema(description = "渠道支付单号", example = "30") | |
| 63 | 33 | private String channelOrderNo; |
| 64 | 34 | |
| 65 | - @Schema(description = "渠道退款单号,渠道返回") | |
| 35 | + @Schema(description = "渠道退款单号", example = "40") | |
| 66 | 36 | private String channelRefundNo; |
| 67 | 37 | |
| 68 | - @Schema(description = "渠道调用报错时,错误码") | |
| 69 | - private String channelErrorCode; | |
| 70 | - | |
| 71 | - @Schema(description = "渠道调用报错时,错误信息") | |
| 72 | - private String channelErrorMsg; | |
| 73 | - | |
| 74 | - @Schema(description = "支付渠道的额外参数") | |
| 75 | - private String channelExtras; | |
| 76 | - | |
| 77 | - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 78 | - @Schema(description = "退款失效时间") | |
| 79 | - private LocalDateTime[] expireTime; | |
| 80 | - | |
| 81 | - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | |
| 82 | - @Schema(description = "退款成功时间") | |
| 83 | - private LocalDateTime[] successTime; | |
| 38 | + @Schema(description = "退款状态", example = "0") | |
| 39 | + private Integer status; | |
| 84 | 40 | |
| 85 | 41 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 86 | 42 | @Schema(description = "创建时间") | ... | ... |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundRespVO.java deleted
| 1 | -package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; | |
| 2 | - | |
| 3 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 4 | -import lombok.Data; | |
| 5 | -import lombok.EqualsAndHashCode; | |
| 6 | -import lombok.ToString; | |
| 7 | - | |
| 8 | -import java.time.LocalDateTime; | |
| 9 | - | |
| 10 | -@Schema(description = "管理后台 - 退款订单 Response VO") | |
| 11 | -@Data | |
| 12 | -@EqualsAndHashCode(callSuper = true) | |
| 13 | -@ToString(callSuper = true) | |
| 14 | -public class PayRefundRespVO extends PayRefundBaseVO { | |
| 15 | - | |
| 16 | - @Schema(description = "支付退款编号", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 17 | - private Long id; | |
| 18 | - | |
| 19 | - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 20 | - private LocalDateTime createTime; | |
| 21 | - | |
| 22 | -} |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/controller/admin/refund/vo/PayRefundUpdateReqVO.java deleted
| 1 | -package cn.iocoder.yudao.module.pay.controller.admin.refund.vo; | |
| 2 | -import io.swagger.v3.oas.annotations.media.Schema; | |
| 3 | -import lombok.*; | |
| 4 | -import javax.validation.constraints.*; | |
| 5 | - | |
| 6 | -@Schema(description = "管理后台 - 退款订单更新 Request VO") | |
| 7 | -@Data | |
| 8 | -@EqualsAndHashCode(callSuper = true) | |
| 9 | -@ToString(callSuper = true) | |
| 10 | -public class PayRefundUpdateReqVO extends PayRefundBaseVO { | |
| 11 | - | |
| 12 | - @Schema(description = "支付退款编号", requiredMode = Schema.RequiredMode.REQUIRED) | |
| 13 | - @NotNull(message = "支付退款编号不能为空") | |
| 14 | - private Long id; | |
| 15 | - | |
| 16 | -} |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/convert/refund/PayRefundConvert.java
| 1 | 1 | package cn.iocoder.yudao.module.pay.convert.refund; |
| 2 | 2 | |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | +import cn.iocoder.yudao.framework.common.util.collection.MapUtils; | |
| 4 | 5 | import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundCreateReqDTO; |
| 5 | 6 | import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundRespDTO; |
| 6 | -import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.*; | |
| 7 | +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundDetailsRespVO; | |
| 8 | +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundExcelVO; | |
| 9 | +import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundPageItemRespVO; | |
| 10 | +import cn.iocoder.yudao.module.pay.dal.dataobject.app.PayAppDO; | |
| 11 | +import cn.iocoder.yudao.module.pay.dal.dataobject.order.PayOrderDO; | |
| 7 | 12 | import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; |
| 8 | 13 | import org.mapstruct.Mapper; |
| 9 | 14 | import org.mapstruct.factory.Mappers; |
| 10 | 15 | |
| 11 | 16 | import java.math.BigDecimal; |
| 12 | 17 | import java.math.RoundingMode; |
| 13 | -import java.util.List; | |
| 18 | +import java.util.Map; | |
| 14 | 19 | |
| 15 | 20 | @Mapper |
| 16 | 21 | public interface PayRefundConvert { |
| 17 | 22 | |
| 18 | 23 | PayRefundConvert INSTANCE = Mappers.getMapper(PayRefundConvert.class); |
| 19 | 24 | |
| 20 | - PayRefundDO convert(PayRefundCreateReqVO bean); | |
| 21 | 25 | |
| 22 | - PayRefundDO convert(PayRefundUpdateReqVO bean); | |
| 23 | - | |
| 24 | - PayRefundRespVO convert(PayRefundDO bean); | |
| 25 | - | |
| 26 | - /** | |
| 27 | - * 退款订单 DO 转 退款详情订单 VO | |
| 28 | - * | |
| 29 | - * @param bean 退款订单 DO | |
| 30 | - * @return 退款详情订单 VO | |
| 31 | - */ | |
| 32 | - PayRefundDetailsRespVO refundDetailConvert(PayRefundDO bean); | |
| 33 | - | |
| 34 | - /** | |
| 35 | - * 退款订单DO 转 分页退款条目VO | |
| 36 | - * | |
| 37 | - * @param bean 退款订单DO | |
| 38 | - * @return 分页退款条目VO | |
| 39 | - */ | |
| 40 | - PayRefundPageItemRespVO pageItemConvert(PayRefundDO bean); | |
| 41 | - | |
| 42 | - List<PayRefundRespVO> convertList(List<PayRefundDO> list); | |
| 26 | + default PayRefundDetailsRespVO convert(PayRefundDO refund, PayOrderDO order, PayAppDO app) { | |
| 27 | + PayRefundDetailsRespVO respVO = convert(refund) | |
| 28 | + .setOrder(convert(order)); | |
| 29 | + if (app != null) { | |
| 30 | + respVO.setAppName(app.getName()); | |
| 31 | + } | |
| 32 | + return respVO; | |
| 33 | + } | |
| 34 | + PayRefundDetailsRespVO convert(PayRefundDO bean); | |
| 35 | + PayRefundDetailsRespVO.Order convert(PayOrderDO bean); | |
| 43 | 36 | |
| 44 | - PageResult<PayRefundRespVO> convertPage(PageResult<PayRefundDO> page); | |
| 37 | + default PageResult<PayRefundPageItemRespVO> convertPage(PageResult<PayRefundDO> page, Map<Long, PayAppDO> appMap) { | |
| 38 | + PageResult<PayRefundPageItemRespVO> result = convertPage(page); | |
| 39 | + result.getList().forEach(order -> MapUtils.findAndThen(appMap, order.getAppId(), app -> order.setAppName(app.getName()))); | |
| 40 | + return result; | |
| 41 | + } | |
| 42 | + PageResult<PayRefundPageItemRespVO> convertPage(PageResult<PayRefundDO> page); | |
| 45 | 43 | |
| 46 | 44 | /** |
| 47 | 45 | * 退款订单DO 转 导出excel VO | ... | ... |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/refund/PayRefundDO.java
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/mysql/refund/PayRefundMapper.java
| ... | ... | @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.pay.dal.mysql.refund; |
| 3 | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | 4 | import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; |
| 5 | 5 | import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; |
| 6 | -import cn.iocoder.yudao.framework.mybatis.core.query.QueryWrapperX; | |
| 7 | 6 | import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundExportReqVO; |
| 8 | 7 | import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.PayRefundPageReqVO; |
| 9 | 8 | import cn.iocoder.yudao.module.pay.dal.dataobject.refund.PayRefundDO; |
| ... | ... | @@ -44,25 +43,29 @@ public interface PayRefundMapper extends BaseMapperX<PayRefundDO> { |
| 44 | 43 | } |
| 45 | 44 | |
| 46 | 45 | default PageResult<PayRefundDO> selectPage(PayRefundPageReqVO reqVO) { |
| 47 | - return selectPage(reqVO, new QueryWrapperX<PayRefundDO>() | |
| 48 | - .eqIfPresent("app_id", reqVO.getAppId()) | |
| 49 | - .eqIfPresent("channel_code", reqVO.getChannelCode()) | |
| 50 | - .likeIfPresent("merchant_refund_no", reqVO.getMerchantRefundNo()) | |
| 51 | - .eqIfPresent("type", reqVO.getType()) | |
| 52 | - .eqIfPresent("status", reqVO.getStatus()) | |
| 53 | - .betweenIfPresent("create_time", reqVO.getCreateTime()) | |
| 54 | - .orderByDesc("id")); | |
| 46 | + return selectPage(reqVO, new LambdaQueryWrapperX<PayRefundDO>() | |
| 47 | + .eqIfPresent(PayRefundDO::getAppId, reqVO.getAppId()) | |
| 48 | + .eqIfPresent(PayRefundDO::getChannelCode, reqVO.getChannelCode()) | |
| 49 | + .likeIfPresent(PayRefundDO::getMerchantOrderId, reqVO.getMerchantOrderId()) | |
| 50 | + .likeIfPresent(PayRefundDO::getMerchantRefundId, reqVO.getMerchantRefundId()) | |
| 51 | + .likeIfPresent(PayRefundDO::getChannelOrderNo, reqVO.getChannelOrderNo()) | |
| 52 | + .likeIfPresent(PayRefundDO::getChannelRefundNo, reqVO.getChannelRefundNo()) | |
| 53 | + .eqIfPresent(PayRefundDO::getStatus, reqVO.getStatus()) | |
| 54 | + .betweenIfPresent(PayRefundDO::getCreateTime, reqVO.getCreateTime()) | |
| 55 | + .orderByDesc(PayRefundDO::getId)); | |
| 55 | 56 | } |
| 56 | 57 | |
| 57 | 58 | default List<PayRefundDO> selectList(PayRefundExportReqVO reqVO) { |
| 58 | - return selectList(new QueryWrapperX<PayRefundDO>() | |
| 59 | - .eqIfPresent("app_id", reqVO.getAppId()) | |
| 60 | - .eqIfPresent("channel_code", reqVO.getChannelCode()) | |
| 61 | - .likeIfPresent("merchant_refund_no", reqVO.getMerchantRefundNo()) | |
| 62 | - .eqIfPresent("type", reqVO.getType()) | |
| 63 | - .eqIfPresent("status", reqVO.getStatus()) | |
| 64 | - .betweenIfPresent("create_time", reqVO.getCreateTime()) | |
| 65 | - .orderByDesc("id")); | |
| 59 | + return selectList(new LambdaQueryWrapperX<PayRefundDO>() | |
| 60 | + .eqIfPresent(PayRefundDO::getAppId, reqVO.getAppId()) | |
| 61 | + .eqIfPresent(PayRefundDO::getChannelCode, reqVO.getChannelCode()) | |
| 62 | + .likeIfPresent(PayRefundDO::getMerchantOrderId, reqVO.getMerchantOrderId()) | |
| 63 | + .likeIfPresent(PayRefundDO::getMerchantRefundId, reqVO.getMerchantRefundId()) | |
| 64 | + .likeIfPresent(PayRefundDO::getChannelOrderNo, reqVO.getChannelOrderNo()) | |
| 65 | + .likeIfPresent(PayRefundDO::getChannelRefundNo, reqVO.getChannelRefundNo()) | |
| 66 | + .eqIfPresent(PayRefundDO::getStatus, reqVO.getStatus()) | |
| 67 | + .betweenIfPresent(PayRefundDO::getCreateTime, reqVO.getCreateTime()) | |
| 68 | + .orderByDesc(PayRefundDO::getId)); | |
| 66 | 69 | } |
| 67 | 70 | |
| 68 | 71 | } | ... | ... |
yudao-module-pay/yudao-module-pay-biz/src/test/java/cn/iocoder/yudao/module/pay/service/refund/PayRefundServiceTest.java
| ... | ... | @@ -91,7 +91,7 @@ public class PayRefundServiceTest extends BaseDbUnitTest { |
| 91 | 91 | PayRefundPageReqVO reqVO = new PayRefundPageReqVO(); |
| 92 | 92 | reqVO.setAppId(1L); |
| 93 | 93 | reqVO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); |
| 94 | - reqVO.setMerchantRefundNo("MRF0000001"); | |
| 94 | + reqVO.setMerchantRefundId("MRF0000001"); | |
| 95 | 95 | reqVO.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); |
| 96 | 96 | reqVO.setCreateTime((new LocalDateTime[]{LocalDateTime.of(2021, 1, 1, 10, 10, 10), LocalDateTime.of(2021, 1, 1, 10, 10, 12)})); |
| 97 | 97 | |
| ... | ... | @@ -145,7 +145,6 @@ public class PayRefundServiceTest extends BaseDbUnitTest { |
| 145 | 145 | PayRefundExportReqVO reqVO = new PayRefundExportReqVO(); |
| 146 | 146 | reqVO.setAppId(1L); |
| 147 | 147 | reqVO.setChannelCode(PayChannelEnum.WX_PUB.getCode()); |
| 148 | - reqVO.setMerchantRefundNo("MRF0000001"); | |
| 149 | 148 | reqVO.setStatus(PayRefundStatusEnum.SUCCESS.getStatus()); |
| 150 | 149 | reqVO.setCreateTime((new LocalDateTime[]{LocalDateTime.of(2021, 1, 1, 10, 10, 10), LocalDateTime.of(2021, 1, 1, 10, 10, 12)})); |
| 151 | 150 | ... | ... |
yudao-ui-admin/src/utils/dict.js
| ... | ... | @@ -58,7 +58,7 @@ export const DICT_TYPE = { |
| 58 | 58 | PAY_CHANNEL_CODE: 'pay_channel_code', // 支付渠道编码类型 |
| 59 | 59 | PAY_NOTIFY_STATUS: 'pay_notify_status', // 商户支付回调状态 |
| 60 | 60 | PAY_ORDER_STATUS: 'pay_order_status', // 商户支付订单状态 |
| 61 | - PAY_REFUND_ORDER_STATUS: 'pay_refund_order_status', // 退款订单状态 | |
| 61 | + PAY_REFUND_STATUS: 'pay_refund_status', // 退款订单状态 | |
| 62 | 62 | |
| 63 | 63 | // ========== MP 模块 ========== |
| 64 | 64 | MP_AUTO_REPLY_REQUEST_MATCH: 'mp_auto_reply_request_match', // 自动回复请求匹配类型 | ... | ... |
yudao-ui-admin/src/views/pay/order/index.vue
| ... | ... | @@ -9,8 +9,7 @@ |
| 9 | 9 | </el-select> |
| 10 | 10 | </el-form-item> |
| 11 | 11 | <el-form-item label="支付渠道" prop="channelCode"> |
| 12 | - <el-select v-model="queryParams.channelCode" placeholder="请选择支付渠道" clearable | |
| 13 | - @clear="()=>{queryParams.channelCode = null}"> | |
| 12 | + <el-select v-model="queryParams.channelCode" placeholder="请选择支付渠道" clearable> | |
| 14 | 13 | <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE)" :key="dict.value" :label="dict.label" :value="dict.value"/> |
| 15 | 14 | </el-select> |
| 16 | 15 | </el-form-item> |
| ... | ... | @@ -77,9 +76,15 @@ |
| 77 | 76 | </el-table-column> |
| 78 | 77 | <el-table-column label="订单号" align="left" width="300"> |
| 79 | 78 | <template v-slot="scope"> |
| 80 | - <p class="order-font"><el-tag size="mini">商户单号</el-tag> {{scope.row.merchantOrderId}}</p> | |
| 81 | - <p class="order-font" v-if="scope.row.no"><el-tag size="mini" type="warning">支付单号</el-tag> {{scope.row.no}}</p> | |
| 82 | - <p class="order-font" v-if="scope.row.channelOrderNo"><el-tag size="mini" type="success">渠道单号</el-tag> {{scope.row.channelOrderNo}}</p> | |
| 79 | + <p class="order-font"><el-tag size="mini"> | |
| 80 | + 商户</el-tag> {{scope.row.merchantOrderId}} | |
| 81 | + </p> | |
| 82 | + <p class="order-font" v-if="scope.row.no"> | |
| 83 | + <el-tag size="mini" type="warning">支付</el-tag> {{scope.row.no}} | |
| 84 | + </p> | |
| 85 | + <p class="order-font" v-if="scope.row.channelOrderNo"> | |
| 86 | + <el-tag size="mini" type="success">渠道</el-tag> {{scope.row.channelOrderNo}} | |
| 87 | + </p> | |
| 83 | 88 | </template> |
| 84 | 89 | </el-table-column> |
| 85 | 90 | <el-table-column label="支付状态" align="center" prop="status"> | ... | ... |
yudao-ui-admin/src/views/pay/refund/index.vue
| ... | ... | @@ -7,25 +7,30 @@ |
| 7 | 7 | <el-option v-for="item in appList" :key="item.id" :label="item.name" :value="item.id" /> |
| 8 | 8 | </el-select> |
| 9 | 9 | </el-form-item> |
| 10 | - <el-form-item label="渠道编码" prop="channelCode"> | |
| 11 | - <el-select v-model="queryParams.channelCode" placeholder="请输入渠道编码" clearable | |
| 12 | - @clear="()=>{queryParams.channelCode = null}"> | |
| 13 | - <el-option v-for="dict in payChannelCodeDictDatum" :key="dict.value" :label="dict.label" :value="dict.value"/> | |
| 10 | + <el-form-item label="退款渠道" prop="channelCode"> | |
| 11 | + <el-select v-model="queryParams.channelCode" placeholder="请选择退款渠道" clearable> | |
| 12 | + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE)" :key="dict.value" :label="dict.label" :value="dict.value"/> | |
| 14 | 13 | </el-select> |
| 15 | 14 | </el-form-item> |
| 16 | - <el-form-item label="退款类型" prop="type"> | |
| 17 | - <el-select v-model="queryParams.type" placeholder="请选择退款类型" clearable> | |
| 18 | - <el-option v-for="dict in payRefundOrderTypeDictDatum" :key="parseInt(dict.value)" | |
| 19 | - :label="dict.label" :value="parseInt(dict.value)"/> | |
| 20 | - </el-select> | |
| 15 | + <el-form-item label="商户支付单号" prop="merchantOrderId"> | |
| 16 | + <el-input v-model="queryParams.merchantOrderId" placeholder="请输入商户支付单号" clearable | |
| 17 | + @keyup.enter.native="handleQuery"/> | |
| 18 | + </el-form-item> | |
| 19 | + <el-form-item label="商户退款单号" prop="merchantRefundId"> | |
| 20 | + <el-input v-model="queryParams.merchantRefundId" placeholder="请输入商户退款单号" clearable | |
| 21 | + @keyup.enter.native="handleQuery"/> | |
| 22 | + </el-form-item> | |
| 23 | + <el-form-item label="渠道支付单号" prop="channelOrderNo"> | |
| 24 | + <el-input v-model="queryParams.channelOrderNo" placeholder="请输入渠道支付单号" clearable | |
| 25 | + @keyup.enter.native="handleQuery"/> | |
| 21 | 26 | </el-form-item> |
| 22 | - <el-form-item label="商户退款订单号" prop="merchantRefundNo"> | |
| 23 | - <el-input v-model="queryParams.merchantRefundNo" placeholder="请输入商户退款订单号" clearable | |
| 27 | + <el-form-item label="渠道退款单号" prop="channelRefundNo"> | |
| 28 | + <el-input v-model="queryParams.channelRefundNo" placeholder="请输入渠道退款单号" clearable | |
| 24 | 29 | @keyup.enter.native="handleQuery"/> |
| 25 | 30 | </el-form-item> |
| 26 | 31 | <el-form-item label="退款状态" prop="status"> |
| 27 | 32 | <el-select v-model="queryParams.status" placeholder="请选择退款状态" clearable> |
| 28 | - <el-option v-for="dict in payRefundOrderDictDatum" :key="parseInt(dict.value)" | |
| 33 | + <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PAY_REFUND_STATUS)" :key="parseInt(dict.value)" | |
| 29 | 34 | :label="dict.label" :value="parseInt(dict.value)"/> |
| 30 | 35 | </el-select> |
| 31 | 36 | </el-form-item> |
| ... | ... | @@ -52,65 +57,55 @@ |
| 52 | 57 | <!-- 列表 --> |
| 53 | 58 | <el-table v-loading="loading" :data="list"> |
| 54 | 59 | <el-table-column label="编号" align="center" prop="id"/> |
| 55 | - <el-table-column label="支付渠道" align="center" width="130"> | |
| 60 | + <el-table-column label="创建时间" align="center" prop="createTime" width="180"> | |
| 61 | + <template v-slot="scope"> | |
| 62 | + <span>{{ parseTime(scope.row.createTime) }}</span> | |
| 63 | + </template> | |
| 64 | + </el-table-column> | |
| 65 | + <el-table-column label="支付金额" align="center" prop="payPrice" width="100"> | |
| 66 | + <template v-slot="scope" class=""> | |
| 67 | + ¥{{ (scope.row.payPrice / 100.0).toFixed(2) }} | |
| 68 | + </template> | |
| 69 | + </el-table-column> | |
| 70 | + <el-table-column label="退款金额" align="center" prop="refundPrice" width="100"> | |
| 56 | 71 | <template v-slot="scope"> |
| 57 | - <el-popover trigger="hover" placement="top"> | |
| 58 | - <p>应用名称: {{ scope.row.appName }}</p> | |
| 59 | - <p>渠道名称: {{ scope.row.channelCodeName }}</p> | |
| 60 | - <div slot="reference" class="name-wrapper"> | |
| 61 | - {{ scope.row.channelCodeName }} | |
| 62 | - </div> | |
| 63 | - </el-popover> | |
| 72 | + ¥{{ (scope.row.refundPrice / 100.0).toFixed(2) }} | |
| 64 | 73 | </template> |
| 65 | 74 | </el-table-column> |
| 66 | - <!-- <el-table-column label="交易订单号" align="center" prop="tradeNo" width="140"/>--> | |
| 67 | - <!-- <el-table-column label="商户订单编号" align="center" prop="merchantOrderId" width="140"/>--> | |
| 68 | - <el-table-column label="商户订单号" align="left" width="230"> | |
| 75 | + <el-table-column label="退款订单号" align="left" width="300"> | |
| 69 | 76 | <template v-slot="scope"> |
| 70 | 77 | <p class="order-font"> |
| 71 | - <el-tag size="mini">退款</el-tag> | |
| 72 | - {{ scope.row.merchantRefundNo }} | |
| 78 | + <el-tag size="mini">商户</el-tag> {{scope.row.merchantRefundId}} | |
| 73 | 79 | </p> |
| 74 | 80 | <p class="order-font"> |
| 75 | - <el-tag type="success">交易</el-tag> | |
| 76 | - {{ scope.row.merchantOrderId }} | |
| 81 | + <el-tag size="mini" type="warning">支付</el-tag> {{scope.row.no}} | |
| 82 | + </p> | |
| 83 | + <p class="order-font" v-if="scope.row.channelRefundNo"> | |
| 84 | + <el-tag size="mini" type="success">渠道</el-tag> {{scope.row.channelRefundNo}} | |
| 77 | 85 | </p> |
| 78 | 86 | </template> |
| 79 | 87 | </el-table-column> |
| 80 | - <el-table-column label="支付订单号" align="center" prop="merchantRefundNo" width="250"> | |
| 88 | + <el-table-column label="支付订单号" align="left" width="300"> | |
| 81 | 89 | <template v-slot="scope"> |
| 82 | 90 | <p class="order-font"> |
| 83 | - <el-tag size="mini">交易</el-tag> | |
| 84 | - {{ scope.row.tradeNo }} | |
| 91 | + <el-tag size="mini">商户</el-tag> {{scope.row.merchantOrderId}} | |
| 85 | 92 | </p> |
| 86 | 93 | <p class="order-font"> |
| 87 | - <el-tag size="mini" type="warning">渠道</el-tag> | |
| 88 | - {{ scope.row.channelOrderNo }} | |
| 94 | + <el-tag size="mini" type="success">渠道</el-tag> {{scope.row.channelOrderNo}} | |
| 89 | 95 | </p> |
| 90 | 96 | </template> |
| 91 | 97 | </el-table-column> |
| 92 | - <el-table-column label="支付金额(元)" align="center" prop="payPrice" width="100"> | |
| 93 | - <template v-slot="scope" class=""> | |
| 94 | - ¥{{ parseFloat(scope.row.payPrice / 100).toFixed(2) }} | |
| 95 | - </template> | |
| 96 | - </el-table-column> | |
| 97 | - <el-table-column label="退款金额(元)" align="center" prop="refundPrice" width="100"> | |
| 98 | - <template v-slot="scope"> | |
| 99 | - ¥{{ parseFloat(scope.row.refundPrice / 100).toFixed(2) }} | |
| 100 | - </template> | |
| 101 | - </el-table-column> | |
| 102 | 98 | <el-table-column label="退款状态" align="center" prop="status"> |
| 103 | 99 | <template v-slot="scope"> |
| 104 | - <dict-tag :type="DICT_TYPE.PAY_REFUND_ORDER_STATUS" :value="scope.row.status" /> | |
| 100 | + <dict-tag :type="DICT_TYPE.PAY_REFUND_STATUS" :value="scope.row.status" /> | |
| 105 | 101 | </template> |
| 106 | 102 | </el-table-column> |
| 107 | - <el-table-column label="退款原因" align="center" prop="reason" width="140" :show-overflow-tooltip="true"/> | |
| 108 | - <el-table-column label="创建时间" align="center" prop="createTime" width="100"> | |
| 103 | + <el-table-column label="退款渠道" align="center" width="140"> | |
| 109 | 104 | <template v-slot="scope"> |
| 110 | - <span>{{ parseTime(scope.row.createTime) }}</span> | |
| 105 | + <dict-tag :type="DICT_TYPE.PAY_CHANNEL_CODE" :value="scope.row.channelCode" /> | |
| 111 | 106 | </template> |
| 112 | 107 | </el-table-column> |
| 113 | - <el-table-column label="退款成功时间" align="center" prop="successTime" width="100"> | |
| 108 | + <el-table-column label="成功时间" align="center" prop="successTime" width="180"> | |
| 114 | 109 | <template v-slot="scope"> |
| 115 | 110 | <span>{{ parseTime(scope.row.successTime) }}</span> |
| 116 | 111 | </template> |
| ... | ... | @@ -150,7 +145,7 @@ |
| 150 | 145 | <el-tag class="tag-purple" size="mini">{{ parseFloat(refundDetail.refundPrice / 100).toFixed(2) }}</el-tag> |
| 151 | 146 | </el-descriptions-item> |
| 152 | 147 | <el-descriptions-item label="退款状态"> |
| 153 | - <dict-tag :type="DICT_TYPE.PAY_REFUND_ORDER_STATUS" :value="refundDetail.status" /> | |
| 148 | + <dict-tag :type="DICT_TYPE.PAY_REFUND_STATUS" :value="refundDetail.status" /> | |
| 154 | 149 | </el-descriptions-item> |
| 155 | 150 | <el-descriptions-item label="创建时间">{{ parseTime(refundDetail.createTime) }}</el-descriptions-item> |
| 156 | 151 | <el-descriptions-item label="退款成功时间">{{ parseTime(refundDetail.successTime) }}</el-descriptions-item> |
| ... | ... | @@ -185,37 +180,7 @@ |
| 185 | 180 | |
| 186 | 181 | <script> |
| 187 | 182 | import {getRefundPage, exportRefundExcel, getRefund} from "@/api/pay/refund"; |
| 188 | -import { DICT_TYPE, getDictDatas } from "@/utils/dict"; | |
| 189 | -import { getNowDateTime } from "@/utils/ruoyi"; | |
| 190 | - | |
| 191 | -const defaultRefundDetail = { | |
| 192 | - id: null, | |
| 193 | - appId: null, | |
| 194 | - appName: '', | |
| 195 | - channelCode: '', | |
| 196 | - channelCodeName: '', | |
| 197 | - channelErrorCode: '', | |
| 198 | - channelErrorMsg: '', | |
| 199 | - channelExtras: '', | |
| 200 | - channelId: null, | |
| 201 | - channelOrderNo: '', | |
| 202 | - channelRefundNo: '', | |
| 203 | - createTime: null, | |
| 204 | - expireTime: null, | |
| 205 | - merchantOrderId: '', | |
| 206 | - merchantRefundNo: '', | |
| 207 | - notifyUrl: '', | |
| 208 | - orderId: null, | |
| 209 | - payPrice: null, | |
| 210 | - reason: '', | |
| 211 | - refundPrice: null, | |
| 212 | - status: null, | |
| 213 | - subject: '', | |
| 214 | - successTime: null, | |
| 215 | - tradeNo: '', | |
| 216 | - type: null, | |
| 217 | - userIp: '' | |
| 218 | -} | |
| 183 | +import { getAppList } from "@/api/pay/app"; | |
| 219 | 184 | |
| 220 | 185 | export default { |
| 221 | 186 | name: "PayRefund", |
| ... | ... | @@ -239,67 +204,30 @@ export default { |
| 239 | 204 | pageNo: 1, |
| 240 | 205 | pageSize: 10, |
| 241 | 206 | appId: null, |
| 242 | - channelId: null, | |
| 243 | 207 | channelCode: null, |
| 244 | - orderId: null, | |
| 245 | - tradeNo: null, | |
| 246 | 208 | merchantOrderId: null, |
| 247 | - merchantRefundNo: null, | |
| 248 | - notifyUrl: null, | |
| 249 | - status: null, | |
| 250 | - type: null, | |
| 251 | - payPrice: null, | |
| 252 | - refundPrice: null, | |
| 253 | - reason: null, | |
| 254 | - userIp: null, | |
| 209 | + merchantRefundId: null, | |
| 255 | 210 | channelOrderNo: null, |
| 256 | 211 | channelRefundNo: null, |
| 257 | - channelErrorCode: null, | |
| 258 | - channelErrorMsg: null, | |
| 259 | - channelExtras: null, | |
| 260 | - expireTime: [], | |
| 261 | - successTime: [], | |
| 212 | + status: null, | |
| 262 | 213 | createTime: [] |
| 263 | 214 | }, |
| 264 | - // 商户加载遮罩层 | |
| 265 | - merchantLoading: false, | |
| 266 | - // 商户列表集合 | |
| 267 | - merchantList: null, | |
| 268 | 215 | // 支付应用列表集合 |
| 269 | 216 | appList: null, |
| 270 | - // 支付渠道编码字典数据集合 | |
| 271 | - payChannelCodeDictDatum: getDictDatas(DICT_TYPE.PAY_CHANNEL_CODE), | |
| 272 | - // 订单退款状态字典数据集合 | |
| 273 | - payRefundOrderDictDatum: getDictDatas(DICT_TYPE.PAY_REFUND_ORDER_STATUS), | |
| 274 | - // 订单回调商户状态字典数据集合 | |
| 275 | - payOrderNotifyDictDatum: getDictDatas(DICT_TYPE.PAY_NOTIFY_STATUS), | |
| 276 | 217 | // 退款订单详情 |
| 277 | - refundDetail: JSON.parse(JSON.stringify(defaultRefundDetail)), | |
| 218 | + refundDetail: {}, | |
| 278 | 219 | }; |
| 279 | 220 | }, |
| 280 | 221 | created() { |
| 281 | - this.initTime(); | |
| 282 | 222 | this.getList(); |
| 283 | - this.handleGetMerchantListByName(null); | |
| 223 | + // 获得筛选项 | |
| 224 | + getAppList().then(response => { | |
| 225 | + this.appList = response.data; | |
| 226 | + }) | |
| 284 | 227 | }, |
| 285 | 228 | methods: { |
| 286 | - initTime(){ | |
| 287 | - this.queryParams.createTime = [getNowDateTime("00:00:00"), getNowDateTime("23:59:59")]; | |
| 288 | - }, | |
| 289 | 229 | /** 查询列表 */ |
| 290 | 230 | getList() { |
| 291 | - // 判断选择的日期是否超过了一个月 | |
| 292 | - let oneMonthTime = 31 * 24 * 3600 * 1000; | |
| 293 | - if (this.queryParams.createTime == null){ | |
| 294 | - this.initTime(); | |
| 295 | - } else { | |
| 296 | - let minDateTime = new Date(this.queryParams.createTime[0]).getTime(); | |
| 297 | - let maxDateTime = new Date(this.queryParams.createTime[1]).getTime() | |
| 298 | - if (maxDateTime - minDateTime > oneMonthTime) { | |
| 299 | - this.$message.error('时间范围最大为 31 天!'); | |
| 300 | - return false; | |
| 301 | - } | |
| 302 | - } | |
| 303 | 231 | this.loading = true; |
| 304 | 232 | // 执行查询 |
| 305 | 233 | getRefundPage(this.queryParams).then(response => { |
| ... | ... | @@ -336,25 +264,14 @@ export default { |
| 336 | 264 | }).catch(() => {}); |
| 337 | 265 | }, |
| 338 | 266 | /** |
| 339 | - * 根据商户名称模糊匹配商户信息 | |
| 340 | - * @param name 商户名称 | |
| 341 | - */ | |
| 342 | - handleGetMerchantListByName(name) { | |
| 343 | - getMerchantListByName(name).then(response => { | |
| 344 | - this.merchantList = response.data; | |
| 345 | - this.merchantLoading = false; | |
| 346 | - }); | |
| 347 | - }, | |
| 348 | - /** | |
| 349 | 267 | * 查看订单详情 |
| 350 | 268 | */ |
| 351 | 269 | handleQueryDetails(row) { |
| 352 | - this.refundDetail = JSON.parse(JSON.stringify(defaultRefundDetail)); | |
| 270 | + this.refundDetail = {}; | |
| 353 | 271 | getRefund(row.id).then(response => { |
| 354 | 272 | this.refundDetail = response.data; |
| 355 | 273 | this.open = true; |
| 356 | 274 | }); |
| 357 | - | |
| 358 | 275 | }, |
| 359 | 276 | } |
| 360 | 277 | }; | ... | ... |