Commit 4d25e810e3d80bc41d43b62a68b096b5167fed12
1 parent
b91a30dd
feat:【MALL 商城】商城分佣提现,初步对接成功微信支付
Showing
22 changed files
with
162 additions
and
225 deletions
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/DictTypeConstants.java
| @@ -7,6 +7,9 @@ package cn.iocoder.yudao.module.trade.enums; | @@ -7,6 +7,9 @@ package cn.iocoder.yudao.module.trade.enums; | ||
| 7 | */ | 7 | */ |
| 8 | public interface DictTypeConstants { | 8 | public interface DictTypeConstants { |
| 9 | 9 | ||
| 10 | + String BROKERAGE_RECORD_STATUS = "brokerage_record_status"; // 佣金记录状态 | ||
| 11 | + | ||
| 12 | + String BROKERAGE_WITHDRAW_TYPE = "brokerage_withdraw_type"; // 佣金提现类型 | ||
| 10 | String BROKERAGE_WITHDRAW_STATUS = "brokerage_withdraw_status"; // 佣金提现状态 | 13 | String BROKERAGE_WITHDRAW_STATUS = "brokerage_withdraw_status"; // 佣金提现状态 |
| 11 | 14 | ||
| 12 | } | 15 | } |
yudao-module-mall/yudao-module-trade-api/src/main/java/cn/iocoder/yudao/module/trade/enums/brokerage/BrokerageWithdrawStatusEnum.java
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageRecordController.java
| @@ -3,11 +3,13 @@ package cn.iocoder.yudao.module.trade.controller.app.brokerage; | @@ -3,11 +3,13 @@ package cn.iocoder.yudao.module.trade.controller.app.brokerage; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 5 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 5 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 6 | +import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils; | ||
| 7 | +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO; | ||
| 6 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageProductPriceRespVO; | 8 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageProductPriceRespVO; |
| 7 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordPageReqVO; | 9 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordPageReqVO; |
| 8 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordRespVO; | 10 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordRespVO; |
| 9 | -import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageRecordConvert; | ||
| 10 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO; | 11 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO; |
| 12 | +import cn.iocoder.yudao.module.trade.enums.DictTypeConstants; | ||
| 11 | import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageRecordService; | 13 | import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageRecordService; |
| 12 | import io.swagger.v3.oas.annotations.Operation; | 14 | import io.swagger.v3.oas.annotations.Operation; |
| 13 | import io.swagger.v3.oas.annotations.tags.Tag; | 15 | import io.swagger.v3.oas.annotations.tags.Tag; |
| @@ -36,8 +38,9 @@ public class AppBrokerageRecordController { | @@ -36,8 +38,9 @@ public class AppBrokerageRecordController { | ||
| 36 | @Operation(summary = "获得分销记录分页") | 38 | @Operation(summary = "获得分销记录分页") |
| 37 | public CommonResult<PageResult<AppBrokerageRecordRespVO>> getBrokerageRecordPage(@Valid AppBrokerageRecordPageReqVO pageReqVO) { | 39 | public CommonResult<PageResult<AppBrokerageRecordRespVO>> getBrokerageRecordPage(@Valid AppBrokerageRecordPageReqVO pageReqVO) { |
| 38 | PageResult<BrokerageRecordDO> pageResult = brokerageRecordService.getBrokerageRecordPage( | 40 | PageResult<BrokerageRecordDO> pageResult = brokerageRecordService.getBrokerageRecordPage( |
| 39 | - BrokerageRecordConvert.INSTANCE.convert(pageReqVO, getLoginUserId())); | ||
| 40 | - return success(BeanUtils.toBean(pageResult, AppBrokerageRecordRespVO.class)); | 41 | + BeanUtils.toBean(pageReqVO, BrokerageRecordPageReqVO.class).setUserId(getLoginUserId())); |
| 42 | + return success(BeanUtils.toBean(pageResult, AppBrokerageRecordRespVO.class, recordVO -> | ||
| 43 | + recordVO.setStatusName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.BROKERAGE_RECORD_STATUS, recordVO.getStatus())))); | ||
| 41 | } | 44 | } |
| 42 | 45 | ||
| 43 | @GetMapping("/get-product-brokerage-price") | 46 | @GetMapping("/get-product-brokerage-price") |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/AppBrokerageWithdrawController.java
| 1 | package cn.iocoder.yudao.module.trade.controller.app.brokerage; | 1 | package cn.iocoder.yudao.module.trade.controller.app.brokerage; |
| 2 | 2 | ||
| 3 | +import cn.hutool.core.util.ObjUtil; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.CommonResult; |
| 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 6 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 7 | +import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils; | ||
| 8 | +import cn.iocoder.yudao.module.pay.api.transfer.PayTransferApi; | ||
| 9 | +import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferRespDTO; | ||
| 10 | +import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawPageReqVO; | ||
| 5 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawCreateReqVO; | 11 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawCreateReqVO; |
| 6 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawPageReqVO; | 12 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawPageReqVO; |
| 7 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawRespVO; | 13 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawRespVO; |
| 8 | -import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageWithdrawConvert; | ||
| 9 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageWithdrawDO; | 14 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageWithdrawDO; |
| 15 | +import cn.iocoder.yudao.module.trade.enums.DictTypeConstants; | ||
| 16 | +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum; | ||
| 17 | +import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawTypeEnum; | ||
| 10 | import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageWithdrawService; | 18 | import cn.iocoder.yudao.module.trade.service.brokerage.BrokerageWithdrawService; |
| 11 | import io.swagger.v3.oas.annotations.Operation; | 19 | import io.swagger.v3.oas.annotations.Operation; |
| 20 | +import io.swagger.v3.oas.annotations.Parameter; | ||
| 12 | import io.swagger.v3.oas.annotations.tags.Tag; | 21 | import io.swagger.v3.oas.annotations.tags.Tag; |
| 13 | import jakarta.annotation.Resource; | 22 | import jakarta.annotation.Resource; |
| 14 | import jakarta.validation.Valid; | 23 | import jakarta.validation.Valid; |
| @@ -16,6 +25,8 @@ import lombok.extern.slf4j.Slf4j; | @@ -16,6 +25,8 @@ import lombok.extern.slf4j.Slf4j; | ||
| 16 | import org.springframework.validation.annotation.Validated; | 25 | import org.springframework.validation.annotation.Validated; |
| 17 | import org.springframework.web.bind.annotation.*; | 26 | import org.springframework.web.bind.annotation.*; |
| 18 | 27 | ||
| 28 | +import java.util.Objects; | ||
| 29 | + | ||
| 19 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; | 30 | import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; |
| 20 | import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId; | 31 | import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId; |
| 21 | 32 | ||
| @@ -29,12 +40,39 @@ public class AppBrokerageWithdrawController { | @@ -29,12 +40,39 @@ public class AppBrokerageWithdrawController { | ||
| 29 | @Resource | 40 | @Resource |
| 30 | private BrokerageWithdrawService brokerageWithdrawService; | 41 | private BrokerageWithdrawService brokerageWithdrawService; |
| 31 | 42 | ||
| 43 | + @Resource | ||
| 44 | + private PayTransferApi payTransferApi; | ||
| 45 | + | ||
| 32 | @GetMapping("/page") | 46 | @GetMapping("/page") |
| 33 | @Operation(summary = "获得分销提现分页") | 47 | @Operation(summary = "获得分销提现分页") |
| 34 | public CommonResult<PageResult<AppBrokerageWithdrawRespVO>> getBrokerageWithdrawPage(AppBrokerageWithdrawPageReqVO pageReqVO) { | 48 | public CommonResult<PageResult<AppBrokerageWithdrawRespVO>> getBrokerageWithdrawPage(AppBrokerageWithdrawPageReqVO pageReqVO) { |
| 35 | PageResult<BrokerageWithdrawDO> pageResult = brokerageWithdrawService.getBrokerageWithdrawPage( | 49 | PageResult<BrokerageWithdrawDO> pageResult = brokerageWithdrawService.getBrokerageWithdrawPage( |
| 36 | - BrokerageWithdrawConvert.INSTANCE.convert(pageReqVO, getLoginUserId())); | ||
| 37 | - return success(BrokerageWithdrawConvert.INSTANCE.convertPage03(pageResult)); | 50 | + BeanUtils.toBean(pageReqVO, BrokerageWithdrawPageReqVO.class).setUserId(getLoginUserId())); |
| 51 | + return success(BeanUtils.toBean(pageResult, AppBrokerageWithdrawRespVO.class, withdrawVO -> | ||
| 52 | + withdrawVO.setTypeName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.BROKERAGE_WITHDRAW_TYPE, withdrawVO.getType())) | ||
| 53 | + .setStatusName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.BROKERAGE_WITHDRAW_STATUS, withdrawVO.getStatus())))); | ||
| 54 | + } | ||
| 55 | + | ||
| 56 | + @GetMapping("/get") | ||
| 57 | + @Operation(summary = "获得佣金提现") | ||
| 58 | + @Parameter(name = "id", description = "编号", required = true, example = "1024") | ||
| 59 | + public CommonResult<AppBrokerageWithdrawRespVO> getBrokerageWithdraw(@RequestParam("id") Long id) { | ||
| 60 | + BrokerageWithdrawDO withdraw = brokerageWithdrawService.getBrokerageWithdraw(id); | ||
| 61 | + if (withdraw == null || ObjUtil.notEqual(withdraw.getUserId(), getLoginUserId())) { | ||
| 62 | + return success(null); | ||
| 63 | + } | ||
| 64 | + // 审核中(转账中),并且是微信转账,需要返回 mchId 用于确认收款 | ||
| 65 | + AppBrokerageWithdrawRespVO withdrawVO = BeanUtils.toBean(withdraw, AppBrokerageWithdrawRespVO.class); | ||
| 66 | + if (Objects.equals(withdraw.getStatus(), BrokerageWithdrawStatusEnum.AUDIT_SUCCESS.getStatus()) | ||
| 67 | + && Objects.equals(withdraw.getType(), BrokerageWithdrawTypeEnum.WECHAT_API.getType()) | ||
| 68 | + && withdraw.getPayTransferId() != null) { | ||
| 69 | + PayTransferRespDTO transfer = payTransferApi.getTransfer(withdraw.getPayTransferId()); | ||
| 70 | + if (transfer != null) { | ||
| 71 | + withdrawVO.setTransferChannelPackageInfo(transfer.getChannelPackageInfo()) | ||
| 72 | + .setTransferChannelMchId(transfer.getChannelMchId()); | ||
| 73 | + } | ||
| 74 | + } | ||
| 75 | + return success(withdrawVO); | ||
| 38 | } | 76 | } |
| 39 | 77 | ||
| 40 | @PostMapping("/create") | 78 | @PostMapping("/create") |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordPageReqVO.java
| @@ -20,11 +20,11 @@ public class AppBrokerageRecordPageReqVO extends PageParam { | @@ -20,11 +20,11 @@ public class AppBrokerageRecordPageReqVO extends PageParam { | ||
| 20 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | 20 | @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) |
| 21 | private LocalDateTime[] createTime; | 21 | private LocalDateTime[] createTime; |
| 22 | 22 | ||
| 23 | - @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 23 | + @Schema(description = "业务类型", example = "1") |
| 24 | @InEnum(value = BrokerageRecordBizTypeEnum.class, message = "业务类型必须是 {value}") | 24 | @InEnum(value = BrokerageRecordBizTypeEnum.class, message = "业务类型必须是 {value}") |
| 25 | private Integer bizType; | 25 | private Integer bizType; |
| 26 | 26 | ||
| 27 | - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 27 | + @Schema(description = "状态", example = "1") |
| 28 | @InEnum(value = BrokerageRecordStatusEnum.class, message = "状态必须是 {value}") | 28 | @InEnum(value = BrokerageRecordStatusEnum.class, message = "状态必须是 {value}") |
| 29 | private Integer status; | 29 | private Integer status; |
| 30 | 30 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/record/AppBrokerageRecordRespVO.java
| @@ -24,6 +24,9 @@ public class AppBrokerageRecordRespVO { | @@ -24,6 +24,9 @@ public class AppBrokerageRecordRespVO { | ||
| 24 | @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | 24 | @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") |
| 25 | private Integer status; | 25 | private Integer status; |
| 26 | 26 | ||
| 27 | + @Schema(description = "状态名", requiredMode = Schema.RequiredMode.REQUIRED, example = "待结算") | ||
| 28 | + private String statusName; | ||
| 29 | + | ||
| 27 | @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) | 30 | @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) |
| 28 | private LocalDateTime createTime; | 31 | private LocalDateTime createTime; |
| 29 | 32 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawCreateReqVO.java
| @@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw; | @@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; | 3 | import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils; |
| 4 | import cn.iocoder.yudao.framework.common.validation.InEnum; | 4 | import cn.iocoder.yudao.framework.common.validation.InEnum; |
| 5 | +import cn.iocoder.yudao.module.pay.enums.PayChannelEnum; | ||
| 5 | import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawTypeEnum; | 6 | import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawTypeEnum; |
| 6 | import io.swagger.v3.oas.annotations.media.Schema; | 7 | import io.swagger.v3.oas.annotations.media.Schema; |
| 8 | +import jakarta.validation.constraints.Min; | ||
| 7 | import lombok.Data; | 9 | import lombok.Data; |
| 8 | import org.hibernate.validator.constraints.URL; | 10 | import org.hibernate.validator.constraints.URL; |
| 9 | 11 | ||
| @@ -22,6 +24,7 @@ public class AppBrokerageWithdrawCreateReqVO { | @@ -22,6 +24,7 @@ public class AppBrokerageWithdrawCreateReqVO { | ||
| 22 | 24 | ||
| 23 | @Schema(description = "提现金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") | 25 | @Schema(description = "提现金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") |
| 24 | @PositiveOrZero(message = "提现金额不能小于 0") | 26 | @PositiveOrZero(message = "提现金额不能小于 0") |
| 27 | + @Min(value = 30, message = "微信提现金额不能小于 0.3", groups = {WechatApi.class}) | ||
| 25 | @NotNull(message = "提现金额不能为空") | 28 | @NotNull(message = "提现金额不能为空") |
| 26 | private Integer price; | 29 | private Integer price; |
| 27 | 30 | ||
| @@ -43,6 +46,11 @@ public class AppBrokerageWithdrawCreateReqVO { | @@ -43,6 +46,11 @@ public class AppBrokerageWithdrawCreateReqVO { | ||
| 43 | @Schema(description = "开户地址", example = "海淀支行") | 46 | @Schema(description = "开户地址", example = "海淀支行") |
| 44 | private String bankAddress; | 47 | private String bankAddress; |
| 45 | 48 | ||
| 49 | + @Schema(description = "转账渠道", example = "wx_lite") | ||
| 50 | + @NotNull(message = "转账渠道不能为空", groups = {WechatApi.class}) | ||
| 51 | + @InEnum(PayChannelEnum.class) | ||
| 52 | + private String transferChannelCode; | ||
| 53 | + | ||
| 46 | public interface Wallet { | 54 | public interface Wallet { |
| 47 | } | 55 | } |
| 48 | 56 |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawPageReqVO.java
| 1 | package cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw; | 1 | package cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageParam; |
| 4 | -import cn.iocoder.yudao.framework.common.validation.InEnum; | ||
| 5 | -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawStatusEnum; | ||
| 6 | -import cn.iocoder.yudao.module.trade.enums.brokerage.BrokerageWithdrawTypeEnum; | ||
| 7 | import io.swagger.v3.oas.annotations.media.Schema; | 4 | import io.swagger.v3.oas.annotations.media.Schema; |
| 8 | import lombok.Data; | 5 | import lombok.Data; |
| 6 | +import org.springframework.format.annotation.DateTimeFormat; | ||
| 7 | + | ||
| 8 | +import java.time.LocalDateTime; | ||
| 9 | + | ||
| 10 | +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; | ||
| 9 | 11 | ||
| 10 | @Schema(description = "应用 App - 分销提现分页 Request VO") | 12 | @Schema(description = "应用 App - 分销提现分页 Request VO") |
| 11 | @Data | 13 | @Data |
| 12 | public class AppBrokerageWithdrawPageReqVO extends PageParam { | 14 | public class AppBrokerageWithdrawPageReqVO extends PageParam { |
| 13 | 15 | ||
| 14 | - @Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 15 | - @InEnum(value = BrokerageWithdrawTypeEnum.class, message = "类型必须是 {value}") | ||
| 16 | - private Integer type; | 16 | + @Schema(description = "创建时间") |
| 17 | + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) | ||
| 18 | + private LocalDateTime[] createTime; | ||
| 19 | + | ||
| 17 | 20 | ||
| 18 | - @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 19 | - @InEnum(value = BrokerageWithdrawStatusEnum.class, message = "状态必须是 {value}") | ||
| 20 | - private Integer status; | ||
| 21 | 21 | ||
| 22 | } | 22 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/controller/app/brokerage/vo/withdraw/AppBrokerageWithdrawRespVO.java
| @@ -12,6 +12,12 @@ public class AppBrokerageWithdrawRespVO { | @@ -12,6 +12,12 @@ public class AppBrokerageWithdrawRespVO { | ||
| 12 | @Schema(description = "提现编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") | 12 | @Schema(description = "提现编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| 13 | private Long id; | 13 | private Long id; |
| 14 | 14 | ||
| 15 | + @Schema(description = "提现类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") | ||
| 16 | + private Integer type; | ||
| 17 | + | ||
| 18 | + @Schema(description = "提现类型名", requiredMode = Schema.RequiredMode.REQUIRED, example = "微信") | ||
| 19 | + private String typeName; | ||
| 20 | + | ||
| 15 | @Schema(description = "提现状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") | 21 | @Schema(description = "提现状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| 16 | private Integer status; | 22 | private Integer status; |
| 17 | 23 | ||
| @@ -24,4 +30,15 @@ public class AppBrokerageWithdrawRespVO { | @@ -24,4 +30,15 @@ public class AppBrokerageWithdrawRespVO { | ||
| 24 | @Schema(description = "提现时间", requiredMode = Schema.RequiredMode.REQUIRED) | 30 | @Schema(description = "提现时间", requiredMode = Schema.RequiredMode.REQUIRED) |
| 25 | private LocalDateTime createTime; | 31 | private LocalDateTime createTime; |
| 26 | 32 | ||
| 33 | + // ========== 微信转账专属 ========== | ||
| 34 | + | ||
| 35 | + @Schema(description = "转账单编号", example = "1024") | ||
| 36 | + private Long payTransferId; | ||
| 37 | + | ||
| 38 | + @Schema(description = "渠道 package 信息") | ||
| 39 | + private String transferChannelPackageInfo; | ||
| 40 | + | ||
| 41 | + @Schema(description = "渠道商户号") | ||
| 42 | + private String transferChannelMchId; | ||
| 43 | + | ||
| 27 | } | 44 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageRecordConvert.java
| 1 | package cn.iocoder.yudao.module.trade.convert.brokerage; | 1 | package cn.iocoder.yudao.module.trade.convert.brokerage; |
| 2 | 2 | ||
| 3 | -import cn.hutool.core.math.Money; | ||
| 4 | import cn.hutool.core.util.ObjectUtil; | 3 | import cn.hutool.core.util.ObjectUtil; |
| 5 | import cn.hutool.core.util.StrUtil; | 4 | import cn.hutool.core.util.StrUtil; |
| 6 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 5 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 7 | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; | 6 | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; |
| 8 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 7 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 9 | -import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordPageReqVO; | ||
| 10 | import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordRespVO; | 8 | import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.record.BrokerageRecordRespVO; |
| 11 | -import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordPageReqVO; | ||
| 12 | -import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.record.AppBrokerageRecordRespVO; | ||
| 13 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByPriceRespVO; | 9 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.user.AppBrokerageUserRankByPriceRespVO; |
| 14 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO; | 10 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageRecordDO; |
| 15 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; | 11 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageUserDO; |
| @@ -68,8 +64,6 @@ public interface BrokerageRecordConvert { | @@ -68,8 +64,6 @@ public interface BrokerageRecordConvert { | ||
| 68 | return result; | 64 | return result; |
| 69 | } | 65 | } |
| 70 | 66 | ||
| 71 | - BrokerageRecordPageReqVO convert(AppBrokerageRecordPageReqVO pageReqVO, Long userId); | ||
| 72 | - | ||
| 73 | default PageResult<AppBrokerageUserRankByPriceRespVO> convertPage03(PageResult<AppBrokerageUserRankByPriceRespVO> pageResult, Map<Long, MemberUserRespDTO> userMap) { | 67 | default PageResult<AppBrokerageUserRankByPriceRespVO> convertPage03(PageResult<AppBrokerageUserRankByPriceRespVO> pageResult, Map<Long, MemberUserRespDTO> userMap) { |
| 74 | for (AppBrokerageUserRankByPriceRespVO vo : pageResult.getList()) { | 68 | for (AppBrokerageUserRankByPriceRespVO vo : pageResult.getList()) { |
| 75 | copyTo(userMap.get(vo.getId()), vo); | 69 | copyTo(userMap.get(vo.getId()), vo); |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/convert/brokerage/BrokerageWithdrawConvert.java
| 1 | package cn.iocoder.yudao.module.trade.convert.brokerage; | 1 | package cn.iocoder.yudao.module.trade.convert.brokerage; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | -import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils; | ||
| 5 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; | 4 | import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO; |
| 6 | -import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawPageReqVO; | ||
| 7 | import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawRespVO; | 5 | import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawRespVO; |
| 8 | -import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawCreateReqVO; | ||
| 9 | -import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawPageReqVO; | ||
| 10 | -import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawRespVO; | ||
| 11 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageWithdrawDO; | 6 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageWithdrawDO; |
| 12 | -import cn.iocoder.yudao.module.trade.enums.DictTypeConstants; | ||
| 13 | import org.mapstruct.Mapper; | 7 | import org.mapstruct.Mapper; |
| 14 | import org.mapstruct.factory.Mappers; | 8 | import org.mapstruct.factory.Mappers; |
| 15 | 9 | ||
| @@ -27,8 +21,6 @@ public interface BrokerageWithdrawConvert { | @@ -27,8 +21,6 @@ public interface BrokerageWithdrawConvert { | ||
| 27 | 21 | ||
| 28 | BrokerageWithdrawConvert INSTANCE = Mappers.getMapper(BrokerageWithdrawConvert.class); | 22 | BrokerageWithdrawConvert INSTANCE = Mappers.getMapper(BrokerageWithdrawConvert.class); |
| 29 | 23 | ||
| 30 | - BrokerageWithdrawDO convert(AppBrokerageWithdrawCreateReqVO createReqVO, Long userId, Integer feePrice); | ||
| 31 | - | ||
| 32 | BrokerageWithdrawRespVO convert(BrokerageWithdrawDO bean); | 24 | BrokerageWithdrawRespVO convert(BrokerageWithdrawDO bean); |
| 33 | 25 | ||
| 34 | List<BrokerageWithdrawRespVO> convertList(List<BrokerageWithdrawDO> list); | 26 | List<BrokerageWithdrawRespVO> convertList(List<BrokerageWithdrawDO> list); |
| @@ -43,15 +35,4 @@ public interface BrokerageWithdrawConvert { | @@ -43,15 +35,4 @@ public interface BrokerageWithdrawConvert { | ||
| 43 | return result; | 35 | return result; |
| 44 | } | 36 | } |
| 45 | 37 | ||
| 46 | - PageResult<AppBrokerageWithdrawRespVO> convertPage02(PageResult<BrokerageWithdrawDO> pageResult); | ||
| 47 | - | ||
| 48 | - default PageResult<AppBrokerageWithdrawRespVO> convertPage03(PageResult<BrokerageWithdrawDO> pageResult) { | ||
| 49 | - PageResult<AppBrokerageWithdrawRespVO> result = convertPage02(pageResult); | ||
| 50 | - for (AppBrokerageWithdrawRespVO vo : result.getList()) { | ||
| 51 | - vo.setStatusName(DictFrameworkUtils.getDictDataLabel(DictTypeConstants.BROKERAGE_WITHDRAW_STATUS, vo.getStatus())); | ||
| 52 | - } | ||
| 53 | - return result; | ||
| 54 | - } | ||
| 55 | - | ||
| 56 | - BrokerageWithdrawPageReqVO convert(AppBrokerageWithdrawPageReqVO pageReqVO, Long userId); | ||
| 57 | } | 38 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/dal/dataobject/brokerage/BrokerageWithdrawDO.java
| @@ -126,12 +126,5 @@ public class BrokerageWithdrawDO extends BaseDO { | @@ -126,12 +126,5 @@ public class BrokerageWithdrawDO extends BaseDO { | ||
| 126 | * 转账错误提示 | 126 | * 转账错误提示 |
| 127 | */ | 127 | */ |
| 128 | private String transferErrorMsg; | 128 | private String transferErrorMsg; |
| 129 | - /** | ||
| 130 | - * 渠道 package 信息 | ||
| 131 | - * | ||
| 132 | - * 特殊:目前只有微信转账有这个东西!!! | ||
| 133 | - * @see <a href="https://pay.weixin.qq.com/doc/v3/merchant/4012716430">JSAPI 调起用户确认收款</a> | ||
| 134 | - */ | ||
| 135 | - private String transferChannelPackageInfo; | ||
| 136 | 129 | ||
| 137 | } | 130 | } |
yudao-module-mall/yudao-module-trade-biz/src/main/java/cn/iocoder/yudao/module/trade/service/brokerage/BrokerageWithdrawServiceImpl.java
| @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; | ||
| 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 7 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 8 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 8 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 9 | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; | 9 | import cn.iocoder.yudao.framework.common.util.number.MoneyUtils; |
| 10 | +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | ||
| 10 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; | 11 | import cn.iocoder.yudao.framework.common.util.object.ObjectUtils; |
| 11 | import cn.iocoder.yudao.module.pay.api.transfer.PayTransferApi; | 12 | import cn.iocoder.yudao.module.pay.api.transfer.PayTransferApi; |
| 12 | import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferCreateReqDTO; | 13 | import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferCreateReqDTO; |
| @@ -18,7 +19,6 @@ import cn.iocoder.yudao.module.pay.enums.PayChannelEnum; | @@ -18,7 +19,6 @@ import cn.iocoder.yudao.module.pay.enums.PayChannelEnum; | ||
| 18 | import cn.iocoder.yudao.module.pay.enums.transfer.PayTransferStatusEnum; | 19 | import cn.iocoder.yudao.module.pay.enums.transfer.PayTransferStatusEnum; |
| 19 | import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawPageReqVO; | 20 | import cn.iocoder.yudao.module.trade.controller.admin.brokerage.vo.withdraw.BrokerageWithdrawPageReqVO; |
| 20 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawCreateReqVO; | 21 | import cn.iocoder.yudao.module.trade.controller.app.brokerage.vo.withdraw.AppBrokerageWithdrawCreateReqVO; |
| 21 | -import cn.iocoder.yudao.module.trade.convert.brokerage.BrokerageWithdrawConvert; | ||
| 22 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageWithdrawDO; | 22 | import cn.iocoder.yudao.module.trade.dal.dataobject.brokerage.BrokerageWithdrawDO; |
| 23 | import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO; | 23 | import cn.iocoder.yudao.module.trade.dal.dataobject.config.TradeConfigDO; |
| 24 | import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageWithdrawMapper; | 24 | import cn.iocoder.yudao.module.trade.dal.mysql.brokerage.BrokerageWithdrawMapper; |
| @@ -157,8 +157,7 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService { | @@ -157,8 +157,7 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService { | ||
| 157 | 157 | ||
| 158 | // 2. 更新提现记录 | 158 | // 2. 更新提现记录 |
| 159 | brokerageWithdrawMapper.updateById(new BrokerageWithdrawDO().setId(withdraw.getId()) | 159 | brokerageWithdrawMapper.updateById(new BrokerageWithdrawDO().setId(withdraw.getId()) |
| 160 | - .setPayTransferId(transferRespDTO.getId()).setTransferChannelCode(channelCode) | ||
| 161 | - .setTransferChannelPackageInfo(transferRespDTO.getChannelPackageInfo())); | 160 | + .setPayTransferId(transferRespDTO.getId()).setTransferChannelCode(channelCode)); |
| 162 | } | 161 | } |
| 163 | 162 | ||
| 164 | private BrokerageWithdrawDO validateBrokerageWithdrawExists(Long id) { | 163 | private BrokerageWithdrawDO validateBrokerageWithdrawExists(Long id) { |
| @@ -190,7 +189,8 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService { | @@ -190,7 +189,8 @@ public class BrokerageWithdrawServiceImpl implements BrokerageWithdrawService { | ||
| 190 | // 2.1 计算手续费 | 189 | // 2.1 计算手续费 |
| 191 | Integer feePrice = calculateFeePrice(createReqVO.getPrice(), tradeConfig.getBrokerageWithdrawFeePercent()); | 190 | Integer feePrice = calculateFeePrice(createReqVO.getPrice(), tradeConfig.getBrokerageWithdrawFeePercent()); |
| 192 | // 2.2 创建佣金提现记录 | 191 | // 2.2 创建佣金提现记录 |
| 193 | - BrokerageWithdrawDO withdraw = BrokerageWithdrawConvert.INSTANCE.convert(createReqVO, userId, feePrice); | 192 | + BrokerageWithdrawDO withdraw = BeanUtils.toBean(createReqVO, BrokerageWithdrawDO.class) |
| 193 | + .setUserId(userId).setFeePrice(feePrice); | ||
| 194 | brokerageWithdrawMapper.insert(withdraw); | 194 | brokerageWithdrawMapper.insert(withdraw); |
| 195 | 195 | ||
| 196 | // 3. 创建用户佣金记录 | 196 | // 3. 创建用户佣金记录 |
yudao-module-pay/yudao-module-pay-api/src/main/java/cn/iocoder/yudao/module/pay/api/transfer/dto/PayTransferRespDTO.java
| @@ -70,5 +70,12 @@ public class PayTransferRespDTO { | @@ -70,5 +70,12 @@ public class PayTransferRespDTO { | ||
| 70 | * @see <a href="https://pay.weixin.qq.com/doc/v3/merchant/4012716430">JSAPI 调起用户确认收款</a> | 70 | * @see <a href="https://pay.weixin.qq.com/doc/v3/merchant/4012716430">JSAPI 调起用户确认收款</a> |
| 71 | */ | 71 | */ |
| 72 | private String channelPackageInfo; | 72 | private String channelPackageInfo; |
| 73 | + /** | ||
| 74 | + * 渠道商户号 | ||
| 75 | + * | ||
| 76 | + * 特殊:目前只有微信转账有这个东西!!! | ||
| 77 | + * @see <a href="https://pay.weixin.qq.com/doc/v3/merchant/4012716430">JSAPI 调起用户确认收款</a> | ||
| 78 | + */ | ||
| 79 | + private String channelMchId; | ||
| 73 | 80 | ||
| 74 | } | 81 | } |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/api/transfer/PayTransferApiImpl.java
| 1 | package cn.iocoder.yudao.module.pay.api.transfer; | 1 | package cn.iocoder.yudao.module.pay.api.transfer; |
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 3 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 4 | +import cn.iocoder.yudao.framework.pay.core.client.impl.weixin.WxPayClientConfig; | ||
| 4 | import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferCreateReqDTO; | 5 | import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferCreateReqDTO; |
| 5 | import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferCreateRespDTO; | 6 | import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferCreateRespDTO; |
| 6 | import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferRespDTO; | 7 | import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferRespDTO; |
| 8 | +import cn.iocoder.yudao.module.pay.dal.dataobject.channel.PayChannelDO; | ||
| 7 | import cn.iocoder.yudao.module.pay.dal.dataobject.transfer.PayTransferDO; | 9 | import cn.iocoder.yudao.module.pay.dal.dataobject.transfer.PayTransferDO; |
| 10 | +import cn.iocoder.yudao.module.pay.service.channel.PayChannelService; | ||
| 8 | import cn.iocoder.yudao.module.pay.service.transfer.PayTransferService; | 11 | import cn.iocoder.yudao.module.pay.service.transfer.PayTransferService; |
| 9 | import jakarta.annotation.Resource; | 12 | import jakarta.annotation.Resource; |
| 10 | import org.springframework.stereotype.Service; | 13 | import org.springframework.stereotype.Service; |
| @@ -21,6 +24,8 @@ public class PayTransferApiImpl implements PayTransferApi { | @@ -21,6 +24,8 @@ public class PayTransferApiImpl implements PayTransferApi { | ||
| 21 | 24 | ||
| 22 | @Resource | 25 | @Resource |
| 23 | private PayTransferService payTransferService; | 26 | private PayTransferService payTransferService; |
| 27 | + @Resource | ||
| 28 | + private PayChannelService payChannelService; | ||
| 24 | 29 | ||
| 25 | @Override | 30 | @Override |
| 26 | public PayTransferCreateRespDTO createTransfer(PayTransferCreateReqDTO reqDTO) { | 31 | public PayTransferCreateRespDTO createTransfer(PayTransferCreateReqDTO reqDTO) { |
| @@ -30,7 +35,15 @@ public class PayTransferApiImpl implements PayTransferApi { | @@ -30,7 +35,15 @@ public class PayTransferApiImpl implements PayTransferApi { | ||
| 30 | @Override | 35 | @Override |
| 31 | public PayTransferRespDTO getTransfer(Long id) { | 36 | public PayTransferRespDTO getTransfer(Long id) { |
| 32 | PayTransferDO transfer = payTransferService.getTransfer(id); | 37 | PayTransferDO transfer = payTransferService.getTransfer(id); |
| 33 | - return BeanUtils.toBean(transfer, PayTransferRespDTO.class); | 38 | + if (transfer == null) { |
| 39 | + return null; | ||
| 40 | + } | ||
| 41 | + PayChannelDO channel = payChannelService.getChannel(transfer.getChannelId()); | ||
| 42 | + String mchId = null; | ||
| 43 | + if (channel != null && channel.getConfig() instanceof WxPayClientConfig) { | ||
| 44 | + mchId = ((WxPayClientConfig) channel.getConfig()).getMchId(); | ||
| 45 | + } | ||
| 46 | + return BeanUtils.toBean(transfer, PayTransferRespDTO.class).setChannelMchId(mchId); | ||
| 34 | } | 47 | } |
| 35 | 48 | ||
| 36 | } | 49 | } |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/dal/dataobject/demo/PayDemoWithdrawDO.java
| @@ -80,12 +80,5 @@ public class PayDemoWithdrawDO extends BaseDO { | @@ -80,12 +80,5 @@ public class PayDemoWithdrawDO extends BaseDO { | ||
| 80 | * 转账错误提示 | 80 | * 转账错误提示 |
| 81 | */ | 81 | */ |
| 82 | private String transferErrorMsg; | 82 | private String transferErrorMsg; |
| 83 | - /** | ||
| 84 | - * 渠道 package 信息 | ||
| 85 | - * | ||
| 86 | - * 特殊:目前只有微信转账有这个东西!!! | ||
| 87 | - * @see <a href="https://pay.weixin.qq.com/doc/v3/merchant/4012716430">JSAPI 调起用户确认收款</a> | ||
| 88 | - */ | ||
| 89 | - private String transferChannelPackageInfo; | ||
| 90 | 83 | ||
| 91 | } | 84 | } |
| 92 | \ No newline at end of file | 85 | \ No newline at end of file |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/demo/PayDemoTransferServiceImpl.java
| @@ -88,8 +88,7 @@ public class PayDemoTransferServiceImpl implements PayDemoWithdrawService { | @@ -88,8 +88,7 @@ public class PayDemoTransferServiceImpl implements PayDemoWithdrawService { | ||
| 88 | 88 | ||
| 89 | // 2.2 更新转账单到 demo 示例提现单,并将状态更新为转账中 | 89 | // 2.2 更新转账单到 demo 示例提现单,并将状态更新为转账中 |
| 90 | demoTransferMapper.updateByIdAndStatus(withdraw.getId(), withdraw.getStatus(), | 90 | demoTransferMapper.updateByIdAndStatus(withdraw.getId(), withdraw.getStatus(), |
| 91 | - new PayDemoWithdrawDO().setPayTransferId(transferRespDTO.getId()) | ||
| 92 | - .setTransferChannelPackageInfo(transferRespDTO.getChannelPackageInfo())); | 91 | + new PayDemoWithdrawDO().setPayTransferId(transferRespDTO.getId())); |
| 93 | return transferRespDTO.getId(); | 92 | return transferRespDTO.getId(); |
| 94 | } | 93 | } |
| 95 | 94 |
yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/transfer/PayTransferServiceImpl.java
| @@ -174,7 +174,7 @@ public class PayTransferServiceImpl implements PayTransferService { | @@ -174,7 +174,7 @@ public class PayTransferServiceImpl implements PayTransferService { | ||
| 174 | int updateCounts = transferMapper.updateByIdAndStatus(transfer.getId(), | 174 | int updateCounts = transferMapper.updateByIdAndStatus(transfer.getId(), |
| 175 | PayTransferStatusEnum.WAITING.getStatus(), | 175 | PayTransferStatusEnum.WAITING.getStatus(), |
| 176 | new PayTransferDO().setStatus(PayTransferStatusEnum.PROCESSING.getStatus()) | 176 | new PayTransferDO().setStatus(PayTransferStatusEnum.PROCESSING.getStatus()) |
| 177 | - .setChannelPackageInfo(transfer.getChannelPackageInfo())); | 177 | + .setChannelPackageInfo(notify.getChannelPackageInfo())); |
| 178 | if (updateCounts == 0) { | 178 | if (updateCounts == 0) { |
| 179 | throw exception(PAY_TRANSFER_NOTIFY_FAIL_STATUS_IS_NOT_WAITING); | 179 | throw exception(PAY_TRANSFER_NOTIFY_FAIL_STATUS_IS_NOT_WAITING); |
| 180 | } | 180 | } |
yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/PayClient.java
| @@ -14,7 +14,7 @@ import java.util.Map; | @@ -14,7 +14,7 @@ import java.util.Map; | ||
| 14 | * | 14 | * |
| 15 | * @author 芋道源码 | 15 | * @author 芋道源码 |
| 16 | */ | 16 | */ |
| 17 | -public interface PayClient { | 17 | +public interface PayClient<Config> { |
| 18 | 18 | ||
| 19 | /** | 19 | /** |
| 20 | * 获得渠道编号 | 20 | * 获得渠道编号 |
| @@ -23,6 +23,13 @@ public interface PayClient { | @@ -23,6 +23,13 @@ public interface PayClient { | ||
| 23 | */ | 23 | */ |
| 24 | Long getId(); | 24 | Long getId(); |
| 25 | 25 | ||
| 26 | + /** | ||
| 27 | + * 获得渠道配置 | ||
| 28 | + * | ||
| 29 | + * @return 渠道配置 | ||
| 30 | + */ | ||
| 31 | + Config getConfig(); | ||
| 32 | + | ||
| 26 | // ============ 支付相关 ========== | 33 | // ============ 支付相关 ========== |
| 27 | 34 | ||
| 28 | /** | 35 | /** |
yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/transfer/WxPayTransferPartnerNotifyV3Result.java deleted
| 1 | -package cn.iocoder.yudao.framework.pay.core.client.dto.transfer; | ||
| 2 | - | ||
| 3 | -import com.github.binarywang.wxpay.bean.notify.OriginNotifyResponse; | ||
| 4 | -import com.github.binarywang.wxpay.bean.notify.WxPayBaseNotifyV3Result; | ||
| 5 | -import com.google.gson.annotations.SerializedName; | ||
| 6 | -import lombok.Data; | ||
| 7 | -import lombok.NoArgsConstructor; | ||
| 8 | - | ||
| 9 | -import java.io.Serializable; | ||
| 10 | - | ||
| 11 | -// TODO @luchi:这个可以复用 wxjava 里的类么? | ||
| 12 | -@NoArgsConstructor | ||
| 13 | -public class WxPayTransferPartnerNotifyV3Result implements Serializable, WxPayBaseNotifyV3Result<WxPayTransferPartnerNotifyV3Result.TransferNotifyResult> { | ||
| 14 | - | ||
| 15 | - private static final long serialVersionUID = -1L; | ||
| 16 | - | ||
| 17 | - /** | ||
| 18 | - * 源数据 | ||
| 19 | - */ | ||
| 20 | - private OriginNotifyResponse rawData; | ||
| 21 | - | ||
| 22 | - /** | ||
| 23 | - * 解密后的数据 | ||
| 24 | - */ | ||
| 25 | - private TransferNotifyResult result; | ||
| 26 | - | ||
| 27 | - @Override | ||
| 28 | - public void setRawData(OriginNotifyResponse rawData) { | ||
| 29 | - this.rawData = rawData; | ||
| 30 | - } | ||
| 31 | - | ||
| 32 | - @Override | ||
| 33 | - public void setResult(TransferNotifyResult data) { | ||
| 34 | - this.result = data; | ||
| 35 | - } | ||
| 36 | - | ||
| 37 | - public TransferNotifyResult getResult() { | ||
| 38 | - return result; | ||
| 39 | - } | ||
| 40 | - | ||
| 41 | - public OriginNotifyResponse getRawData() { | ||
| 42 | - return rawData; | ||
| 43 | - } | ||
| 44 | - | ||
| 45 | - @Data | ||
| 46 | - @NoArgsConstructor | ||
| 47 | - public static class TransferNotifyResult implements Serializable { | ||
| 48 | - private static final long serialVersionUID = 1L; | ||
| 49 | - | ||
| 50 | - /*********************** 公共字段 ******************** | ||
| 51 | - | ||
| 52 | - /** | ||
| 53 | - * 商家批次单号 | ||
| 54 | - */ | ||
| 55 | - @SerializedName(value = "out_batch_no") | ||
| 56 | - protected String outBatchNo; | ||
| 57 | - | ||
| 58 | - /** | ||
| 59 | - * 微信批次单号 | ||
| 60 | - */ | ||
| 61 | - @SerializedName(value = "batch_id") | ||
| 62 | - protected String batchId; | ||
| 63 | - | ||
| 64 | - /** | ||
| 65 | - * 批次状态 | ||
| 66 | - */ | ||
| 67 | - @SerializedName(value = "batch_status") | ||
| 68 | - protected String batchStatus; | ||
| 69 | - | ||
| 70 | - /** | ||
| 71 | - * 批次总笔数 | ||
| 72 | - */ | ||
| 73 | - @SerializedName(value = "total_num") | ||
| 74 | - protected Integer totalNum; | ||
| 75 | - | ||
| 76 | - /** | ||
| 77 | - * 批次总金额 | ||
| 78 | - */ | ||
| 79 | - @SerializedName(value = "total_amount") | ||
| 80 | - protected Integer totalAmount; | ||
| 81 | - | ||
| 82 | - /** | ||
| 83 | - * 批次更新时间 | ||
| 84 | - */ | ||
| 85 | - @SerializedName(value = "update_time") | ||
| 86 | - private String updateTime; | ||
| 87 | - | ||
| 88 | - /*********************** FINISHED ******************** | ||
| 89 | - | ||
| 90 | - /** | ||
| 91 | - * 转账成功金额 | ||
| 92 | - */ | ||
| 93 | - @SerializedName(value = "success_amount") | ||
| 94 | - protected Integer successAmount; | ||
| 95 | - | ||
| 96 | - /** | ||
| 97 | - * 转账成功笔数 | ||
| 98 | - */ | ||
| 99 | - @SerializedName(value = "success_num") | ||
| 100 | - protected Integer successNum; | ||
| 101 | - | ||
| 102 | - /** | ||
| 103 | - * 转账失败金额 | ||
| 104 | - */ | ||
| 105 | - @SerializedName(value = "fail_amount") | ||
| 106 | - protected Integer failAmount; | ||
| 107 | - | ||
| 108 | - /** | ||
| 109 | - * 转账失败笔数 | ||
| 110 | - */ | ||
| 111 | - @SerializedName(value = "fail_num") | ||
| 112 | - protected Integer failNum; | ||
| 113 | - | ||
| 114 | - /*********************** CLOSED ******************** | ||
| 115 | - | ||
| 116 | - /** | ||
| 117 | - * 商户号 | ||
| 118 | - */ | ||
| 119 | - @SerializedName(value = "mchid") | ||
| 120 | - protected String mchId; | ||
| 121 | - | ||
| 122 | - /** | ||
| 123 | - * 批次关闭原因 | ||
| 124 | - */ | ||
| 125 | - @SerializedName(value = "close_reason") | ||
| 126 | - protected String closeReason; | ||
| 127 | - | ||
| 128 | - } | ||
| 129 | -} |
yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/AbstractPayClient.java
| @@ -23,7 +23,7 @@ import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString | @@ -23,7 +23,7 @@ import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString | ||
| 23 | * @author 芋道源码 | 23 | * @author 芋道源码 |
| 24 | */ | 24 | */ |
| 25 | @Slf4j | 25 | @Slf4j |
| 26 | -public abstract class AbstractPayClient<Config extends PayClientConfig> implements PayClient { | 26 | +public abstract class AbstractPayClient<Config extends PayClientConfig> implements PayClient<Config> { |
| 27 | 27 | ||
| 28 | /** | 28 | /** |
| 29 | * 渠道编号 | 29 | * 渠道编号 |
| @@ -74,6 +74,11 @@ public abstract class AbstractPayClient<Config extends PayClientConfig> implemen | @@ -74,6 +74,11 @@ public abstract class AbstractPayClient<Config extends PayClientConfig> implemen | ||
| 74 | return channelId; | 74 | return channelId; |
| 75 | } | 75 | } |
| 76 | 76 | ||
| 77 | + @Override | ||
| 78 | + public Config getConfig() { | ||
| 79 | + return config; | ||
| 80 | + } | ||
| 81 | + | ||
| 77 | // ============ 支付相关 ========== | 82 | // ============ 支付相关 ========== |
| 78 | 83 | ||
| 79 | @Override | 84 | @Override |
yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/weixin/AbstractWxPayClient.java
| @@ -15,13 +15,13 @@ import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundRespDTO; | @@ -15,13 +15,13 @@ import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundRespDTO; | ||
| 15 | import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; | 15 | import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; |
| 16 | import cn.iocoder.yudao.framework.pay.core.client.dto.transfer.PayTransferRespDTO; | 16 | import cn.iocoder.yudao.framework.pay.core.client.dto.transfer.PayTransferRespDTO; |
| 17 | import cn.iocoder.yudao.framework.pay.core.client.dto.transfer.PayTransferUnifiedReqDTO; | 17 | import cn.iocoder.yudao.framework.pay.core.client.dto.transfer.PayTransferUnifiedReqDTO; |
| 18 | -import cn.iocoder.yudao.framework.pay.core.client.dto.transfer.WxPayTransferPartnerNotifyV3Result; | ||
| 19 | import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; | 18 | import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient; |
| 20 | import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderStatusRespEnum; | 19 | import cn.iocoder.yudao.framework.pay.core.enums.order.PayOrderStatusRespEnum; |
| 21 | import com.github.binarywang.wxpay.bean.notify.*; | 20 | import com.github.binarywang.wxpay.bean.notify.*; |
| 22 | import com.github.binarywang.wxpay.bean.request.*; | 21 | import com.github.binarywang.wxpay.bean.request.*; |
| 23 | import com.github.binarywang.wxpay.bean.result.*; | 22 | import com.github.binarywang.wxpay.bean.result.*; |
| 24 | import com.github.binarywang.wxpay.bean.transfer.TransferBillsGetResult; | 23 | import com.github.binarywang.wxpay.bean.transfer.TransferBillsGetResult; |
| 24 | +import com.github.binarywang.wxpay.bean.transfer.TransferBillsNotifyResult; | ||
| 25 | import com.github.binarywang.wxpay.bean.transfer.TransferBillsRequest; | 25 | import com.github.binarywang.wxpay.bean.transfer.TransferBillsRequest; |
| 26 | import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult; | 26 | import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult; |
| 27 | import com.github.binarywang.wxpay.config.WxPayConfig; | 27 | import com.github.binarywang.wxpay.config.WxPayConfig; |
| @@ -355,34 +355,6 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC | @@ -355,34 +355,6 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC | ||
| 355 | } | 355 | } |
| 356 | 356 | ||
| 357 | @Override | 357 | @Override |
| 358 | - public PayTransferRespDTO doParseTransferNotify(Map<String, String> params, String body, Map<String, String> headers) throws WxPayException { | ||
| 359 | - switch (config.getApiVersion()) { | ||
| 360 | - case API_VERSION_V3: | ||
| 361 | - return parseTransferNotifyV3(body, headers); | ||
| 362 | - case API_VERSION_V2: | ||
| 363 | - throw new UnsupportedOperationException("V2 版本暂不支持,建议使用 V3 版本"); | ||
| 364 | - default: | ||
| 365 | - throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); | ||
| 366 | - } | ||
| 367 | - } | ||
| 368 | - | ||
| 369 | - private PayTransferRespDTO parseTransferNotifyV3(String body, Map<String, String> headers) throws WxPayException { | ||
| 370 | - // 1. 解析回调 | ||
| 371 | - SignatureHeader signatureHeader = getRequestHeader(headers); | ||
| 372 | - // TODO @luchi:这个可以复用 wxjava 里的类么? | ||
| 373 | - WxPayTransferPartnerNotifyV3Result response = client.baseParseOrderNotifyV3Result(body, signatureHeader, WxPayTransferPartnerNotifyV3Result.class, WxPayTransferPartnerNotifyV3Result.TransferNotifyResult.class); | ||
| 374 | - WxPayTransferPartnerNotifyV3Result.TransferNotifyResult result = response.getResult(); | ||
| 375 | - // 2. 构建结果 | ||
| 376 | - if (Objects.equals("FINISHED", result.getBatchStatus())) { | ||
| 377 | - if (result.getFailNum() <= 0) { | ||
| 378 | - return PayTransferRespDTO.successOf(result.getBatchId(), parseDateV3(result.getUpdateTime()), | ||
| 379 | - result.getOutBatchNo(), response); | ||
| 380 | - } | ||
| 381 | - } | ||
| 382 | - return PayTransferRespDTO.closedOf(result.getBatchStatus(), result.getCloseReason(), result.getOutBatchNo(), response); | ||
| 383 | - } | ||
| 384 | - | ||
| 385 | - @Override | ||
| 386 | protected PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo) throws WxPayException { | 358 | protected PayRefundRespDTO doGetRefund(String outTradeNo, String outRefundNo) throws WxPayException { |
| 387 | try { | 359 | try { |
| 388 | switch (config.getApiVersion()) { | 360 | switch (config.getApiVersion()) { |
| @@ -522,6 +494,37 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC | @@ -522,6 +494,37 @@ public abstract class AbstractWxPayClient extends AbstractPayClient<WxPayClientC | ||
| 522 | response.getOutBillNo(), response); | 494 | response.getOutBillNo(), response); |
| 523 | } | 495 | } |
| 524 | 496 | ||
| 497 | + @Override | ||
| 498 | + public PayTransferRespDTO doParseTransferNotify(Map<String, String> params, String body, Map<String, String> headers) throws WxPayException { | ||
| 499 | + switch (config.getApiVersion()) { | ||
| 500 | + case API_VERSION_V3: | ||
| 501 | + return parseTransferNotifyV3(body, headers); | ||
| 502 | + case API_VERSION_V2: | ||
| 503 | + throw new UnsupportedOperationException("V2 版本暂不支持,建议使用 V3 版本"); | ||
| 504 | + default: | ||
| 505 | + throw new IllegalArgumentException(String.format("未知的 API 版本(%s)", config.getApiVersion())); | ||
| 506 | + } | ||
| 507 | + } | ||
| 508 | + | ||
| 509 | + private PayTransferRespDTO parseTransferNotifyV3(String body, Map<String, String> headers) throws WxPayException { | ||
| 510 | + // 1. 解析回调 | ||
| 511 | + SignatureHeader signatureHeader = getRequestHeader(headers); | ||
| 512 | + TransferBillsNotifyResult response = client.getTransferService().parseTransferBillsNotifyResult(body, signatureHeader); | ||
| 513 | + TransferBillsNotifyResult.DecryptNotifyResult result = response.getResult(); | ||
| 514 | + | ||
| 515 | + // 2. 创建返回结果 | ||
| 516 | + String state = result.getState(); | ||
| 517 | + if (ObjectUtils.equalsAny(state, "ACCEPTED", "PROCESSING", "WAIT_USER_CONFIRM", "TRANSFERING")) { | ||
| 518 | + return PayTransferRespDTO.processingOf(result.getTransferBillNo(), result.getOutBillNo(), response); | ||
| 519 | + } | ||
| 520 | + if (Objects.equals("SUCCESS", state)) { | ||
| 521 | + return PayTransferRespDTO.successOf(result.getTransferBillNo(), parseDateV3(result.getUpdateTime()), | ||
| 522 | + result.getOutBillNo(), response); | ||
| 523 | + } | ||
| 524 | + return PayTransferRespDTO.closedOf(state, result.getFailReason(), | ||
| 525 | + result.getOutBillNo(), response); | ||
| 526 | + } | ||
| 527 | + | ||
| 525 | // ========== 各种工具方法 ========== | 528 | // ========== 各种工具方法 ========== |
| 526 | 529 | ||
| 527 | /** | 530 | /** |