初始化order和pay模块

This commit is contained in:
2025-08-27 10:02:53 +08:00
parent ea780302e3
commit 1555739fcd
536 changed files with 6640 additions and 17174 deletions

View File

@@ -1,20 +0,0 @@
## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性
## 感谢复旦核博士的建议!灰子哥,牛皮!
FROM eclipse-temurin:21-jre
## 创建目录,并使用它作为工作目录
RUN mkdir -p /yudao-module-pay-biz
WORKDIR /yudao-module-pay-biz
## 将后端项目的 Jar 文件,复制到镜像中
COPY ./target/yudao-module-pay-biz.jar app.jar
## 设置 TZ 时区
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms512m -Xmx512m"
## 暴露后端项目的 48080 端口
EXPOSE 48085
## 启动后端项目
CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar app.jar

View File

@@ -71,6 +71,10 @@
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-data-excel</artifactId>
</dependency>
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-framework-tenant</artifactId>
</dependency>
</dependencies>

View File

@@ -1,17 +1,18 @@
package com.tashow.cloud.pay.api.order;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.pay.convert.order.PayOrderConvert;
import com.tashow.cloud.pay.dal.dataobject.order.PayOrderDO;
import com.tashow.cloud.pay.service.order.PayOrderService;
import com.tashow.cloud.payapi.api.order.PayOrderApi;
import com.tashow.cloud.payapi.api.order.dto.PayOrderCreateReqDTO;
import com.tashow.cloud.sdk.payment.dto.order.PayOrderRespDTO;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
import jakarta.annotation.Resource;
import static com.tashow.cloud.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@RestController // 提供 RESTful API 接口,给 Feign 调用
@Validated

View File

@@ -4,7 +4,8 @@ import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.pay.convert.refund.PayRefundConvert;
import com.tashow.cloud.pay.service.refund.PayRefundService;
import com.tashow.cloud.payapi.api.refund.PayRefundApi;
import com.tashow.cloud.sdk.payment.dto.refund.PayRefundRespDTO;
import com.tashow.cloud.payapi.api.refund.dto.PayRefundCreateReqDTO;
import com.tashow.cloud.payapi.api.refund.dto.PayRefundRespDTO;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;

View File

@@ -1,17 +1,18 @@
package com.tashow.cloud.pay.api.transfer;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferCreateReqDTO;
import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferRespDTO;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.util.object.BeanUtils;
import com.tashow.cloud.pay.dal.dataobject.transfer.PayTransferDO;
import com.tashow.cloud.pay.service.transfer.PayTransferService;
import com.tashow.cloud.payapi.api.transfer.PayTransferApi;
import com.tashow.cloud.payapi.api.transfer.dto.PayTransferCreateReqDTO;
import com.tashow.cloud.sdk.payment.dto.transfer.PayTransferRespDTO;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
import jakarta.annotation.Resource;
import static com.tashow.cloud.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
/**
* 转账单 API 实现类

View File

@@ -1,39 +0,0 @@
package com.tashow.cloud.pay.api.wallet;
import cn.hutool.core.lang.Assert;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.pay.api.wallet.dto.PayWalletAddBalanceReqDTO;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletDO;
import cn.iocoder.yudao.module.pay.enums.wallet.PayWalletBizTypeEnum;
import com.tashow.cloud.pay.service.wallet.PayWalletService;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RestController;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.*;
/**
* 钱包 API 实现类
*
* @author jason
*/
@RestController // 提供 RESTful API 接口,给 Feign 调用
@Validated
public class PayWalletApiImpl implements PayWalletApi {
@Resource
private PayWalletService payWalletService;
@Override
public CommonResult<Boolean> addWalletBalance(PayWalletAddBalanceReqDTO reqDTO) {
// 创建或获取钱包
PayWalletDO wallet = payWalletService.getOrCreateWallet(reqDTO.getUserId(), reqDTO.getUserType());
Assert.notNull(wallet, "钱包({}/{})不存在", reqDTO.getUserId(), reqDTO.getUserType());
// 增加余额
PayWalletBizTypeEnum bizType = PayWalletBizTypeEnum.valueOf(reqDTO.getBizType());
payWalletService.addWalletBalance(wallet.getId(), reqDTO.getBizId(), bizType, reqDTO.getPrice());
return success(true);
}
}

View File

@@ -1,20 +1,15 @@
package com.tashow.cloud.pay.controller.admin.app;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.pay.controller.admin.app.vo.*;
import com.tashow.cloud.common.enums.CommonStatusEnum;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.app.vo.*;
import com.tashow.cloud.payapi.controller.admin.app.vo.*;
import com.tashow.cloud.pay.convert.app.PayAppConvert;
import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;
import com.tashow.cloud.pay.dal.dataobject.channel.PayChannelDO;
import com.tashow.cloud.pay.service.app.PayAppService;
import com.tashow.cloud.pay.service.channel.PayChannelService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
@@ -24,11 +19,12 @@ import org.springframework.web.bind.annotation.*;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static com.tashow.cloud.common.pojo.CommonResult.success;
import static com.tashow.cloud.common.util.collection.CollectionUtils.convertList;
@Slf4j
@Tag(name = "管理后台 - 支付应用信息")
// 管理后台 - 支付应用信息
@RestController
@RequestMapping("/pay/app")
@Validated
@@ -40,14 +36,14 @@ public class PayAppController {
private PayChannelService channelService;
@PostMapping("/create")
@Operation(summary = "创建支付应用信息")
// 创建支付应用信息
@PreAuthorize("@ss.hasPermission('pay:app:create')")
public CommonResult<Long> createApp(@Valid @RequestBody PayAppCreateReqVO createReqVO) {
return success(appService.createApp(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新支付应用信息")
// 更新支付应用信息
@PreAuthorize("@ss.hasPermission('pay:app:update')")
public CommonResult<Boolean> updateApp(@Valid @RequestBody PayAppUpdateReqVO updateReqVO) {
appService.updateApp(updateReqVO);
@@ -55,7 +51,7 @@ public class PayAppController {
}
@PutMapping("/update-status")
@Operation(summary = "更新支付应用状态")
// 更新支付应用状态
@PreAuthorize("@ss.hasPermission('pay:app:update')")
public CommonResult<Boolean> updateAppStatus(@Valid @RequestBody PayAppUpdateStatusReqVO updateReqVO) {
appService.updateAppStatus(updateReqVO.getId(), updateReqVO.getStatus());
@@ -63,8 +59,8 @@ public class PayAppController {
}
@DeleteMapping("/delete")
@Operation(summary = "删除支付应用信息")
@Parameter(name = "id", description = "编号", required = true)
// 删除支付应用信息
// id: 编号,必填
@PreAuthorize("@ss.hasPermission('pay:app:delete')")
public CommonResult<Boolean> deleteApp(@RequestParam("id") Long id) {
appService.deleteApp(id);
@@ -72,8 +68,8 @@ public class PayAppController {
}
@GetMapping("/get")
@Operation(summary = "获得支付应用信息")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
// 获得支付应用信息
// id: 编号必填示例1024
@PreAuthorize("@ss.hasPermission('pay:app:query')")
public CommonResult<PayAppRespVO> getApp(@RequestParam("id") Long id) {
PayAppDO app = appService.getApp(id);
@@ -81,7 +77,7 @@ public class PayAppController {
}
@GetMapping("/page")
@Operation(summary = "获得支付应用信息分页")
// 获得支付应用信息分页
@PreAuthorize("@ss.hasPermission('pay:app:query')")
public CommonResult<PageResult<PayAppPageItemRespVO>> getAppPage(@Valid PayAppPageReqVO pageVO) {
// 得到应用分页列表
@@ -100,7 +96,7 @@ public class PayAppController {
}
@GetMapping("/list")
@Operation(summary = "获得应用列表")
// 获得应用列表
@PreAuthorize("@ss.hasPermission('pay:merchant:query')")
public CommonResult<List<PayAppRespVO>> getAppList() {
List<PayAppDO> appListDO = appService.getAppList();

View File

@@ -1,11 +1,11 @@
package com.tashow.cloud.pay.controller.admin.app.vo;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import org.hibernate.validator.constraints.URL;
import jakarta.validation.constraints.*;
import com.tashow.cloud.common.enums.CommonStatusEnum;
import com.tashow.cloud.common.validation.InEnum;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.hibernate.validator.constraints.URL;
/**
* 支付应用信息 Base VO提供给添加、修改、详细的子 VO 使用
@@ -14,33 +14,33 @@ import jakarta.validation.constraints.*;
@Data
public class PayAppBaseVO {
@Schema(description = "应用标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
// 应用标识必填示例yudao
@NotEmpty(message = "应用标识不能为空")
private String appKey;
@Schema(description = "应用名", requiredMode = Schema.RequiredMode.REQUIRED, example = "小豆")
// 应用名,必填,示例:小豆
@NotNull(message = "应用名不能为空")
private String name;
@Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
// 开启状态必填示例0
@NotNull(message = "开启状态不能为空")
@InEnum(CommonStatusEnum.class)
private Integer status;
@Schema(description = "备注", example = "我是一个测试应用")
// 备注,示例:我是一个测试应用
private String remark;
@Schema(description = "支付结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://127.0.0.1:48080/pay-callback")
// 支付结果的回调地址,必填,示例:http://127.0.0.1:48080/pay-callback
@NotNull(message = "支付结果的回调地址不能为空")
@URL(message = "支付结果的回调地址必须为 URL 格式")
private String orderNotifyUrl;
@Schema(description = "退款结果的回调地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://127.0.0.1:48080/refund-callback")
// 退款结果的回调地址,必填,示例:http://127.0.0.1:48080/refund-callback
@NotNull(message = "退款结果的回调地址不能为空")
@URL(message = "退款结果的回调地址必须为 URL 格式")
private String refundNotifyUrl;
@Schema(description = "转账结果的回调地址", example = "http://127.0.0.1:48080/transfer-callback")
// 转账结果的回调地址,示例:http://127.0.0.1:48080/transfer-callback
@URL(message = "转账结果的回调地址必须为 URL 格式")
private String transferNotifyUrl;

View File

@@ -1,11 +1,11 @@
package com.tashow.cloud.pay.controller.admin.app.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 支付应用信息创建 Request VO")
// 管理后台 - 支付应用信息创建 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)

View File

@@ -1,6 +1,6 @@
package com.tashow.cloud.pay.controller.admin.app.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@@ -8,19 +8,19 @@ import lombok.ToString;
import java.time.LocalDateTime;
import java.util.Set;
@Schema(description = "管理后台 - 支付应用信息分页查询 Response VO,相比于支付信息,还会多出应用渠道的开关信息")
// 管理后台 - 支付应用信息分页查询 Response VO,相比于支付信息,还会多出应用渠道的开关信息
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayAppPageItemRespVO extends PayAppBaseVO {
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 应用编号必填示例1024
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 创建时间,必填
private LocalDateTime createTime;
@Schema(description = "已配置的支付渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "[alipay_pc, alipay_wap]")
// 已配置的支付渠道编码,必填,示例:[alipay_pc, alipay_wap]
private Set<String> channelCodes;
}

View File

@@ -1,7 +1,8 @@
package com.tashow.cloud.pay.controller.admin.app.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import com.tashow.cloud.common.pojo.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@@ -9,25 +10,26 @@ import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 支付应用信息分页 Request VO")
// 管理后台 - 支付应用信息分页 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayAppPageReqVO extends PageParam {
@Schema(description = "应用名", example = "小豆")
// 应用名,示例:小豆
private String name;
@Schema(description = "应用标识", example = "yudao")
// 应用标识示例yudao
private String appKey;
@Schema(description = "开启状态", example = "0")
// 开启状态示例0
private Integer status;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@Schema(description = "创建时间")
// 创建时间
private LocalDateTime[] createTime;
}

View File

@@ -1,25 +1,25 @@
package com.tashow.cloud.pay.controller.admin.app.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 支付应用信息 Response VO")
// 管理后台 - 支付应用信息 Response VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayAppRespVO extends PayAppBaseVO {
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 应用编号必填示例1024
private Long id;
@Schema(description = "应用标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "yudao")
// 应用标识必填示例yudao
private String appKey;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 创建时间,必填
private LocalDateTime createTime;
}

View File

@@ -1,18 +1,18 @@
package com.tashow.cloud.pay.controller.admin.app.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 支付应用信息更新 Request VO")
// 管理后台 - 支付应用信息更新 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayAppUpdateReqVO extends PayAppBaseVO {
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 应用编号必填示例1024
@NotNull(message = "应用编号不能为空")
private Long id;

View File

@@ -1,18 +1,18 @@
package com.tashow.cloud.pay.controller.admin.app.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Schema(description = "管理后台 - 应用更新状态 Request VO")
// 管理后台 - 应用更新状态 Request VO
@Data
public class PayAppUpdateStatusReqVO {
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 应用编号必填示例1024
@NotNull(message = "应用编号不能为空")
private Long id;
@Schema(description = "状态,见 SysCommonStatusEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
// 状态,见 SysCommonStatusEnum 枚举必填示例1
@NotNull(message = "状态不能为空")
private Integer status;

View File

@@ -1,15 +1,12 @@
package com.tashow.cloud.pay.controller.admin.channel;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
import com.tashow.cloud.pay.controller.admin.channel.vo.PayChannelRespVO;
import com.tashow.cloud.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
import com.tashow.cloud.pay.convert.channel.PayChannelConvert;
import com.tashow.cloud.pay.dal.dataobject.channel.PayChannelDO;
import com.tashow.cloud.pay.service.channel.PayChannelService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -19,10 +16,11 @@ import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Set;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
import static com.tashow.cloud.common.pojo.CommonResult.success;
import static com.tashow.cloud.common.util.collection.CollectionUtils.convertSet;
@Tag(name = "管理后台 - 支付渠道")
// 管理后台 - 支付渠道
@RestController
@RequestMapping("/pay/channel")
@Validated
@@ -32,14 +30,14 @@ public class PayChannelController {
private PayChannelService channelService;
@PostMapping("/create")
@Operation(summary = "创建支付渠道 ")
// 创建支付渠道
@PreAuthorize("@ss.hasPermission('pay:channel:create')")
public CommonResult<Long> createChannel(@Valid @RequestBody PayChannelCreateReqVO createReqVO) {
return success(channelService.createChannel(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新支付渠道 ")
// 更新支付渠道
@PreAuthorize("@ss.hasPermission('pay:channel:update')")
public CommonResult<Boolean> updateChannel(@Valid @RequestBody PayChannelUpdateReqVO updateReqVO) {
channelService.updateChannel(updateReqVO);
@@ -47,8 +45,8 @@ public class PayChannelController {
}
@DeleteMapping("/delete")
@Operation(summary = "删除支付渠道 ")
@Parameter(name = "id", description = "编号", required = true)
// 删除支付渠道
// id: 编号,必填
@PreAuthorize("@ss.hasPermission('pay:channel:delete')")
public CommonResult<Boolean> deleteChannel(@RequestParam("id") Long id) {
channelService.deleteChannel(id);
@@ -56,8 +54,8 @@ public class PayChannelController {
}
@GetMapping("/get")
@Operation(summary = "获得支付渠道")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
// 获得支付渠道
// id: 编号必填示例1024
@PreAuthorize("@ss.hasPermission('pay:channel:query')")
public CommonResult<PayChannelRespVO> getChannel(@RequestParam(value = "id", required = false) Long id,
@RequestParam(value = "appId", required = false) Long appId,
@@ -72,8 +70,8 @@ public class PayChannelController {
}
@GetMapping("/get-enable-code-list")
@Operation(summary = "获得指定应用的开启的支付渠道编码列表")
@Parameter(name = "appId", description = "应用编号", required = true, example = "1")
// 获得指定应用的开启的支付渠道编码列表
// appId: 应用编号必填示例1
public CommonResult<Set<String>> getEnableChannelCodeList(@RequestParam("appId") Long appId) {
List<PayChannelDO> channels = channelService.getEnableChannelList(appId);
return success(convertSet(channels, PayChannelDO::getCode));

View File

@@ -1,8 +1,9 @@
package com.tashow.cloud.pay.controller.admin.channel.vo;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import com.tashow.cloud.common.enums.CommonStatusEnum;
import com.tashow.cloud.common.validation.InEnum;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@@ -13,19 +14,19 @@ import lombok.Data;
@Data
public class PayChannelBaseVO {
@Schema(description = "开启状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
// 开启状态必填示例1
@NotNull(message = "开启状态不能为空")
@InEnum(CommonStatusEnum.class)
private Integer status;
@Schema(description = "备注", example = "我是小备注")
// 备注,示例:我是小备注
private String remark;
@Schema(description = "渠道费率,单位:百分比", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
// 渠道费率单位百分比必填示例10
@NotNull(message = "渠道费率,单位:百分比不能为空")
private Double feeRate;
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 应用编号必填示例1024
@NotNull(message = "应用编号不能为空")
private Long appId;

View File

@@ -1,23 +1,23 @@
package com.tashow.cloud.pay.controller.admin.channel.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 支付渠道 创建 Request VO")
// 管理后台 - 支付渠道 创建 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayChannelCreateReqVO extends PayChannelBaseVO {
@Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "alipay_pc")
// 渠道编码,必填,示例:alipay_pc
@NotNull(message = "渠道编码不能为空")
private String code;
@Schema(description = "渠道配置的 json 字符串")
// 渠道配置的 json 字符串
@NotBlank(message = "渠道配置不能为空")
private String config;

View File

@@ -1,28 +1,28 @@
package com.tashow.cloud.pay.controller.admin.channel.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 支付渠道 Response VO")
// 管理后台 - 支付渠道 Response VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayChannelRespVO extends PayChannelBaseVO {
@Schema(description = "商户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 商户编号必填示例1024
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 创建时间必填示例1024
private LocalDateTime createTime;
@Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "alipay_pc")
// 渠道编码,必填,示例:alipay_pc
private String code;
@Schema(description = "配置", requiredMode = Schema.RequiredMode.REQUIRED)
// 配置,必填
private String config;
}

View File

@@ -1,23 +1,23 @@
package com.tashow.cloud.pay.controller.admin.channel.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 支付渠道 更新 Request VO")
// 管理后台 - 支付渠道 更新 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayChannelUpdateReqVO extends PayChannelBaseVO {
@Schema(description = "商户编号", requiredMode = Schema.RequiredMode.REQUIRED)
// 商户编号,必填
@NotNull(message = "商户编号不能为空")
private Long id;
@Schema(description = "渠道配置的json字符串")
// 渠道配置的json字符串
@NotBlank(message = "渠道配置不能为空")
private String config;

View File

@@ -1,74 +0,0 @@
package com.tashow.cloud.pay.controller.admin.demo;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
import cn.iocoder.yudao.module.pay.api.notify.dto.PayRefundNotifyReqDTO;
import com.tashow.cloud.pay.controller.admin.demo.vo.order.PayDemoOrderCreateReqVO;
import com.tashow.cloud.pay.controller.admin.demo.vo.order.PayDemoOrderRespVO;
import com.tashow.cloud.pay.convert.demo.PayDemoOrderConvert;
import com.tashow.cloud.pay.dal.dataobject.demo.PayDemoOrderDO;
import com.tashow.cloud.pay.service.demo.PayDemoOrderService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Tag(name = "管理后台 - 示例订单")
@RestController
@RequestMapping("/pay/demo-order")
@Validated
public class PayDemoOrderController {
@Resource
private PayDemoOrderService payDemoOrderService;
@PostMapping("/create")
@Operation(summary = "创建示例订单")
public CommonResult<Long> createDemoOrder(@Valid @RequestBody PayDemoOrderCreateReqVO createReqVO) {
return success(payDemoOrderService.createDemoOrder(getLoginUserId(), createReqVO));
}
@GetMapping("/page")
@Operation(summary = "获得示例订单分页")
public CommonResult<PageResult<PayDemoOrderRespVO>> getDemoOrderPage(@Valid PageParam pageVO) {
PageResult<PayDemoOrderDO> pageResult = payDemoOrderService.getDemoOrderPage(pageVO);
return success(PayDemoOrderConvert.INSTANCE.convertPage(pageResult));
}
@PostMapping("/update-paid")
@Operation(summary = "更新示例订单为已支付") // 由 pay-module 支付服务,进行回调,可见 PayNotifyJob
@PermitAll // 无需登录,安全由 PayDemoOrderService 内部校验实现
public CommonResult<Boolean> updateDemoOrderPaid(@RequestBody PayOrderNotifyReqDTO notifyReqDTO) {
payDemoOrderService.updateDemoOrderPaid(Long.valueOf(notifyReqDTO.getMerchantOrderId()),
notifyReqDTO.getPayOrderId());
return success(true);
}
@PutMapping("/refund")
@Operation(summary = "发起示例订单的退款")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<Boolean> refundDemoOrder(@RequestParam("id") Long id) {
payDemoOrderService.refundDemoOrder(id, getClientIP());
return success(true);
}
@PostMapping("/update-refunded")
@Operation(summary = "更新示例订单为已退款") // 由 pay-module 支付服务,进行回调,可见 PayNotifyJob
@PermitAll // 无需登录,安全由 PayDemoOrderService 内部校验实现
public CommonResult<Boolean> updateDemoOrderRefunded(@RequestBody PayRefundNotifyReqDTO notifyReqDTO) {
payDemoOrderService.updateDemoOrderRefunded(Long.valueOf(notifyReqDTO.getMerchantOrderId()),
notifyReqDTO.getPayRefundId());
return success(true);
}
}

View File

@@ -1,51 +0,0 @@
package com.tashow.cloud.pay.controller.admin.demo;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.pay.api.notify.dto.PayTransferNotifyReqDTO;
import com.tashow.cloud.pay.controller.admin.demo.vo.transfer.PayDemoTransferCreateReqVO;
import com.tashow.cloud.pay.controller.admin.demo.vo.transfer.PayDemoTransferRespVO;
import com.tashow.cloud.pay.convert.demo.PayDemoTransferConvert;
import com.tashow.cloud.pay.dal.dataobject.demo.PayDemoTransferDO;
import com.tashow.cloud.pay.service.demo.PayDemoTransferService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 示例转账单")
@RestController
@RequestMapping("/pay/demo-transfer")
@Validated
public class PayDemoTransferController {
@Resource
private PayDemoTransferService demoTransferService;
@PostMapping("/create")
@Operation(summary = "创建示例转账订单")
public CommonResult<Long> createDemoTransfer(@Valid @RequestBody PayDemoTransferCreateReqVO createReqVO) {
return success(demoTransferService.createDemoTransfer(createReqVO));
}
@GetMapping("/page")
@Operation(summary = "获得示例转账订单分页")
public CommonResult<PageResult<PayDemoTransferRespVO>> getDemoTransferPage(@Valid PageParam pageVO) {
PageResult<PayDemoTransferDO> pageResult = demoTransferService.getDemoTransferPage(pageVO);
return success(PayDemoTransferConvert.INSTANCE.convertPage(pageResult));
}
@PostMapping("/update-status")
@Operation(summary = "更新示例转账订单的转账状态") // 由 pay-module 转账服务,进行回调
@PermitAll // 无需登录,安全由 PayDemoTransferService 内部校验实现
public CommonResult<Boolean> updateDemoTransferStatus(@RequestBody PayTransferNotifyReqDTO notifyReqDTO) {
demoTransferService.updateDemoTransferStatus(Long.valueOf(notifyReqDTO.getMerchantTransferId()),
notifyReqDTO.getPayTransferId());
return success(true);
}
}

View File

@@ -1,15 +0,0 @@
package com.tashow.cloud.pay.controller.admin.demo.vo.order;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Schema(description = "管理后台 - 示例订单创建 Request VO")
@Data
public class PayDemoOrderCreateReqVO {
@Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17682")
@NotNull(message = "商品编号不能为空")
private Long spuId;
}

View File

@@ -1,54 +0,0 @@
package com.tashow.cloud.pay.controller.admin.demo.vo.order;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 示例订单 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class PayDemoOrderRespVO {
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23199")
private Long userId;
@Schema(description = "商品编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17682")
private Long spuId;
@Schema(description = "商家备注", example = "李四")
private String spuName;
@Schema(description = "价格,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "30381")
private Integer price;
@Schema(description = "是否已支付", requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean payStatus;
@Schema(description = "支付订单编号", example = "16863")
private Long payOrderId;
@Schema(description = "订单支付时间")
private LocalDateTime payTime;
@Schema(description = "支付渠道", example = "alipay_qr")
private String payChannelCode;
@Schema(description = "支付退款编号", example = "23366")
private Long payRefundId;
@Schema(description = "退款金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "14039")
private Integer refundPrice;
@Schema(description = "退款时间")
private LocalDateTime refundTime;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -1,67 +0,0 @@
package com.tashow.cloud.pay.controller.admin.demo.vo.transfer;
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.framework.pay.core.enums.transfer.PayTransferTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Validator;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import static cn.iocoder.yudao.module.pay.enums.transfer.PayTransferTypeEnum.Alipay;
import static cn.iocoder.yudao.module.pay.enums.transfer.PayTransferTypeEnum.WxPay;
/**
* @author jason
*/
@Schema(description = "管理后台 - 示例转账单创建 Request VO")
@Data
public class PayDemoTransferCreateReqVO {
@Schema(description = "转账类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "转账类型不能为空")
@InEnum(PayTransferTypeEnum.class)
private Integer type;
@Schema(description = "转账金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
@NotNull(message = "转账金额不能为空")
@Min(value = 1, message = "转账金额必须大于零")
private Integer price;
@Schema(description = "收款人姓名", example = "test1")
@NotBlank(message = "收款人姓名不能为空", groups = {Alipay.class})
private String userName;
// ========== 支付宝转账相关字段 ==========
@Schema(description = "支付宝登录号,支持邮箱和手机号格式", example = "test1@@sandbox.com")
@NotBlank(message = "支付宝登录号不能为空", groups = {Alipay.class})
private String alipayLogonId;
// ========== 微信转账相关字段 ==========
@Schema(description = "微信 openId", example = "oLefc4g5Gxx")
@NotBlank(message = "微信 openId 不能为空", groups = {WxPay.class})
private String openid;
// ========== 转账到银行卡和钱包相关字段 待补充 ==========
public void validate(Validator validator) {
PayTransferTypeEnum transferType = PayTransferTypeEnum.typeOf(type);
switch (transferType) {
case ALIPAY_BALANCE: {
ValidationUtils.validate(validator, this, Alipay.class);
break;
}
case WX_BALANCE: {
ValidationUtils.validate(validator, this, WxPay.class);
break;
}
default: {
throw new UnsupportedOperationException("待实现");
}
}
}
}

View File

@@ -1,47 +0,0 @@
package com.tashow.cloud.pay.controller.admin.demo.vo.transfer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
/**
* 示例业务转账订单 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class PayDemoTransferRespVO {
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long appId;
@Schema(description = "转账金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "22338")
private Integer price;
@Schema(description = "转账类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer type;
@Schema(description = "收款人姓名", example = "test")
private String userName;
@Schema(description = "支付宝登录号", example = "32167")
private String alipayLogonId;
@Schema(description = "微信 openId", example = "31139")
private String openid;
@Schema(description = "转账状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
private Integer transferStatus;
@Schema(description = "转账订单编号", example = "23695")
private Long payTransferId;
@Schema(description = "转账支付成功渠道")
private String payChannelCode;
@Schema(description = "转账支付时间")
private LocalDateTime transferTime;
}

View File

@@ -1,12 +1,8 @@
package com.tashow.cloud.pay.controller.admin.notify;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.pay.core.client.PayClient;
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderRespDTO;
import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundRespDTO;
import cn.iocoder.yudao.framework.pay.core.client.dto.transfer.PayTransferRespDTO;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.notify.vo.PayNotifyTaskDetailRespVO;
import com.tashow.cloud.pay.controller.admin.notify.vo.PayNotifyTaskPageReqVO;
import com.tashow.cloud.pay.controller.admin.notify.vo.PayNotifyTaskRespVO;
@@ -20,26 +16,28 @@ import com.tashow.cloud.pay.service.notify.PayNotifyService;
import com.tashow.cloud.pay.service.order.PayOrderService;
import com.tashow.cloud.pay.service.refund.PayRefundService;
import com.tashow.cloud.pay.service.transfer.PayTransferService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import com.tashow.cloud.sdk.payment.client.PayClient;
import com.tashow.cloud.sdk.payment.dto.order.PayOrderRespDTO;
import com.tashow.cloud.sdk.payment.dto.refund.PayRefundRespDTO;
import com.tashow.cloud.sdk.payment.dto.transfer.PayTransferRespDTO;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.CHANNEL_NOT_FOUND;
import static com.tashow.cloud.common.exception.util.ServiceExceptionUtil.exception;
import static com.tashow.cloud.common.pojo.CommonResult.success;
import static com.tashow.cloud.common.util.collection.CollectionUtils.convertList;
import static com.tashow.cloud.payapi.enums.ErrorCodeConstants.CHANNEL_NOT_FOUND;
@Tag(name = "管理后台 - 回调通知")
// 管理后台 - 回调通知
@RestController
@RequestMapping("/pay/notify")
@Validated
@@ -60,7 +58,7 @@ public class PayNotifyController {
private PayChannelService channelService;
@PostMapping(value = "/order/{channelId}")
@Operation(summary = "支付渠道的统一【支付】回调")
// 支付渠道的统一【支付】回调
@PermitAll
public String notifyOrder(@PathVariable("channelId") Long channelId,
@RequestParam(required = false) Map<String, String> params,
@@ -80,7 +78,7 @@ public class PayNotifyController {
}
@PostMapping(value = "/refund/{channelId}")
@Operation(summary = "支付渠道的统一【退款】回调")
// 支付渠道的统一【退款】回调
@PermitAll
public String notifyRefund(@PathVariable("channelId") Long channelId,
@RequestParam(required = false) Map<String, String> params,
@@ -99,8 +97,14 @@ public class PayNotifyController {
return "success";
}
/**
* 支付渠道的统一【转账】回调
* @param channelId
* @param params
* @param body
* @return
*/
@PostMapping(value = "/transfer/{channelId}")
@Operation(summary = "支付渠道的统一【转账】回调")
@PermitAll
public String notifyTransfer(@PathVariable("channelId") Long channelId,
@RequestParam(required = false) Map<String, String> params,
@@ -119,9 +123,12 @@ public class PayNotifyController {
return "success";
}
/**
* 获得回调通知的明细
* @param id 编号
* @return
*/
@GetMapping("/get-detail")
@Operation(summary = "获得回调通知的明细")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('pay:notify:query')")
public CommonResult<PayNotifyTaskDetailRespVO> getNotifyTaskDetail(@RequestParam("id") Long id) {
PayNotifyTaskDO task = notifyService.getNotifyTask(id);
@@ -134,8 +141,12 @@ public class PayNotifyController {
return success(PayNotifyTaskConvert.INSTANCE.convert(task, app, logs));
}
/**
* 获得回调通知分页
* @param pageVO
* @return
*/
@GetMapping("/page")
@Operation(summary = "获得回调通知分页")
@PreAuthorize("@ss.hasPermission('pay:notify:query')")
public CommonResult<PageResult<PayNotifyTaskRespVO>> getNotifyTaskPage(@Valid PayNotifyTaskPageReqVO pageVO) {
PageResult<PayNotifyTaskDO> pageResult = notifyService.getNotifyTaskPage(pageVO);

View File

@@ -1,6 +1,6 @@
package com.tashow.cloud.pay.controller.admin.notify.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import java.time.LocalDateTime;
@@ -12,34 +12,34 @@ import java.time.LocalDateTime;
@Data
public class PayNotifyTaskBaseVO {
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10636")
// 应用编号必填示例10636
private Long appId;
@Schema(description = "通知类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
// 通知类型必填示例2
private Byte type;
@Schema(description = "数据编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6722")
// 数据编号必填示例6722
private Long dataId;
@Schema(description = "通知状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
// 通知状态必填示例1
private Byte status;
@Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "26697")
// 商户订单编号必填示例26697
private String merchantOrderId;
@Schema(description = "下一次通知时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 下一次通知时间,必填
private LocalDateTime nextNotifyTime;
@Schema(description = "最后一次执行时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 最后一次执行时间,必填
private LocalDateTime lastExecuteTime;
@Schema(description = "当前通知次数", requiredMode = Schema.RequiredMode.REQUIRED)
// 当前通知次数,必填
private Byte notifyTimes;
@Schema(description = "最大可通知次数", requiredMode = Schema.RequiredMode.REQUIRED)
// 最大可通知次数,必填
private Byte maxNotifyTimes;
@Schema(description = "异步通知地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
// 异步通知地址,必填,示例:https://www.iocoder.cn
private String notifyUrl;
}

View File

@@ -1,7 +1,7 @@
package com.tashow.cloud.pay.controller.admin.notify.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@@ -9,44 +9,44 @@ import lombok.ToString;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - 回调通知的明细 Response VO")
// 管理后台 - 回调通知的明细 Response VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayNotifyTaskDetailRespVO extends PayNotifyTaskBaseVO {
@Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3380")
// 任务编号必填示例3380
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 创建时间,必填
private LocalDateTime createTime;
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 更新时间,必填
private LocalDateTime updateTime;
@Schema(description = "应用名称", example = "wx_pay")
// 应用名称示例wx_pay
private String appName;
@Schema(description = "回调日志列表")
// 回调日志列表
private List<Log> logs;
@Schema(description = "管理后台 - 回调日志")
// 管理后台 - 回调日志
@Data
public static class Log {
@Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8848")
// 日志编号必填示例8848
private Long id;
@Schema(description = "通知状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
// 通知状态必填示例1
private Byte status;
@Schema(description = "当前通知次数", requiredMode = Schema.RequiredMode.REQUIRED)
// 当前通知次数,必填
private Byte notifyTimes;
@Schema(description = "HTTP 响应结果", requiredMode = Schema.RequiredMode.REQUIRED)
// HTTP 响应结果,必填
private String response;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 创建时间,必填
private LocalDateTime createTime;
}

View File

@@ -1,7 +1,8 @@
package com.tashow.cloud.pay.controller.admin.notify.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import com.tashow.cloud.common.pojo.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@@ -9,30 +10,31 @@ import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 回调通知分页 Request VO")
// 管理后台 - 回调通知分页 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayNotifyTaskPageReqVO extends PageParam {
@Schema(description = "应用编号", example = "10636")
// 应用编号示例10636
private Long appId;
@Schema(description = "通知类型", example = "2")
// 通知类型示例2
private Integer type;
@Schema(description = "数据编号", example = "6722")
// 数据编号示例6722
private Long dataId;
@Schema(description = "通知状态", example = "1")
// 通知状态示例1
private Integer status;
@Schema(description = "商户订单编号", example = "26697")
// 商户订单编号示例26697
private String merchantOrderId;
@Schema(description = "创建时间")
// 创建时间
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;

View File

@@ -1,25 +1,25 @@
package com.tashow.cloud.pay.controller.admin.notify.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 回调通知 Response VO")
// 管理后台 - 回调通知 Response VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayNotifyTaskRespVO extends PayNotifyTaskBaseVO {
@Schema(description = "任务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3380")
// 任务编号必填示例3380
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 创建时间,必填
private LocalDateTime createTime;
@Schema(description = "应用名称", example = "wx_pay")
// 应用名称示例wx_pay
private String appName;
}

View File

@@ -1,28 +1,19 @@
package com.tashow.cloud.pay.controller.admin.order;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
import cn.iocoder.yudao.module.pay.controller.admin.order.vo.*;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.object.BeanUtils;
import com.tashow.cloud.excel.excel.core.util.ExcelUtils;
import com.tashow.cloud.pay.controller.admin.order.vo.*;
import com.tashow.cloud.payapi.controller.admin.order.vo.*;
import com.tashow.cloud.pay.convert.order.PayOrderConvert;
import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;
import com.tashow.cloud.pay.dal.dataobject.order.PayOrderDO;
import com.tashow.cloud.pay.dal.dataobject.order.PayOrderExtensionDO;
import cn.iocoder.yudao.module.pay.enums.order.PayOrderStatusEnum;
import com.tashow.cloud.pay.framework.pay.core.WalletPayClient;
import com.tashow.cloud.pay.service.app.PayAppService;
import com.tashow.cloud.pay.service.order.PayOrderService;
import com.google.common.collect.Maps;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import com.tashow.cloud.payapi.enums.order.PayOrderStatusEnum;
import com.tashow.cloud.web.apilog.core.annotation.ApiAccessLog;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
@@ -34,16 +25,14 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserType;
import static com.tashow.cloud.common.pojo.CommonResult.success;
import static com.tashow.cloud.common.util.collection.CollectionUtils.convertList;
import static com.tashow.cloud.common.util.servlet.ServletUtils.getClientIP;
import static com.tashow.cloud.web.apilog.core.enums.OperateTypeEnum.EXPORT;
@Tag(name = "管理后台 - 支付订单")
// 管理后台 - 支付订单
@RestController
@RequestMapping("/pay/order")
@Validated
@@ -55,11 +44,9 @@ public class PayOrderController {
private PayAppService appService;
@GetMapping("/get")
@Operation(summary = "获得支付订单")
@Parameters({
@Parameter(name = "id", description = "编号", required = true, example = "1024"),
@Parameter(name = "sync", description = "是否同步", example = "true")
})
// 获得支付订单
// id: 编号必填示例1024
// sync: 是否同步示例true
@PreAuthorize("@ss.hasPermission('pay:order:query')")
public CommonResult<PayOrderRespVO> getOrder(@RequestParam("id") Long id,
@RequestParam(value = "sync", required = false) Boolean sync) {
@@ -74,8 +61,8 @@ public class PayOrderController {
}
@GetMapping("/get-detail")
@Operation(summary = "获得支付订单详情")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
// 获得支付订单详情
// id: 编号必填示例1024
@PreAuthorize("@ss.hasPermission('pay:order:query')")
public CommonResult<PayOrderDetailsRespVO> getOrderDetail(@RequestParam("id") Long id) {
PayOrderDO order = orderService.getOrder(id);
@@ -90,16 +77,16 @@ public class PayOrderController {
}
@PostMapping("/submit")
@Operation(summary = "提交支付订单")
// 提交支付订单
public CommonResult<PayOrderSubmitRespVO> submitPayOrder(@RequestBody PayOrderSubmitReqVO reqVO) {
// 1. 钱包支付事,需要额外传 user_id 和 user_type
if (Objects.equals(reqVO.getChannelCode(), PayChannelEnum.WALLET.getCode())) {
Map<String, String> channelExtras = reqVO.getChannelExtras() == null ?
Maps.newHashMapWithExpectedSize(2) : reqVO.getChannelExtras();
channelExtras.put(WalletPayClient.USER_ID_KEY, String.valueOf(getLoginUserId()));
channelExtras.put(WalletPayClient.USER_TYPE_KEY, String.valueOf(getLoginUserType()));
reqVO.setChannelExtras(channelExtras);
}
// // 1. 钱包支付事,需要额外传 user_id 和 user_type
// if (Objects.equals(reqVO.getChannelCode(), PayChannelEnum.WALLET.getCode())) {
// Map<String, String> channelExtras = reqVO.getChannelExtras() == null ?
// Maps.newHashMapWithExpectedSize(2) : reqVO.getChannelExtras();
// channelExtras.put(WalletPayClient.USER_ID_KEY, String.valueOf(getLoginUserId()));
// channelExtras.put(WalletPayClient.USER_TYPE_KEY, String.valueOf(getLoginUserType()));
// reqVO.setChannelExtras(channelExtras);
// }
// 2. 提交支付
PayOrderSubmitRespVO respVO = orderService.submitOrder(reqVO, getClientIP());
@@ -107,7 +94,7 @@ public class PayOrderController {
}
@GetMapping("/page")
@Operation(summary = "获得支付订单分页")
// 获得支付订单分页
@PreAuthorize("@ss.hasPermission('pay:order:query')")
public CommonResult<PageResult<PayOrderPageItemRespVO>> getOrderPage(@Valid PayOrderPageReqVO pageVO) {
PageResult<PayOrderDO> pageResult = orderService.getOrderPage(pageVO);
@@ -121,7 +108,7 @@ public class PayOrderController {
}
@GetMapping("/export-excel")
@Operation(summary = "导出支付订单 Excel")
// 导出支付订单 Excel
@PreAuthorize("@ss.hasPermission('pay:order:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportOrderExcel(@Valid PayOrderExportReqVO exportReqVO,

View File

@@ -1,13 +1,12 @@
package com.tashow.cloud.pay.controller.admin.order.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* 支付订单 Base VO提供给添加、修改、详细的子 VO 使用
@@ -18,73 +17,73 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@Data
public class PayOrderBaseVO {
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 应用编号必填示例1024
@NotNull(message = "应用编号不能为空")
private Long appId;
@Schema(description = "渠道编号", example = "2048")
// 渠道编号示例2048
private Long channelId;
@Schema(description = "渠道编码", example = "wx_app")
// 渠道编码示例wx_app
private String channelCode;
@Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "888")
// 商户订单编号必填示例888
@NotNull(message = "商户订单编号不能为空")
private String merchantOrderId;
@Schema(description = "商品标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆")
// 商品标题,必填,示例:土豆
@NotNull(message = "商品标题不能为空")
private String subject;
@Schema(description = "商品描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是土豆")
// 商品描述,必填,示例:我是土豆
@NotNull(message = "商品描述不能为空")
private String body;
@Schema(description = "异步通知地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "http://127.0.0.1:48080/pay/notify")
// 异步通知地址,必填,示例:http://127.0.0.1:48080/pay/notify
@NotNull(message = "异步通知地址不能为空")
private String notifyUrl;
@Schema(description = "支付金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
// 支付金额单位必填示例10
@NotNull(message = "支付金额,单位:分不能为空")
private Long price;
@Schema(description = "渠道手续费,单位:百分比", example = "10")
// 渠道手续费单位百分比示例10
private Double channelFeeRate;
@Schema(description = "渠道手续金额,单位:分", example = "100")
// 渠道手续金额单位示例100
private Integer channelFeePrice;
@Schema(description = "支付状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
// 支付状态必填示例1
@NotNull(message = "支付状态不能为空")
private Integer status;
@Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1")
// 用户 IP必填示例127.0.0.1
@NotNull(message = "用户 IP不能为空")
private String userIp;
@Schema(description = "订单失效时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 订单失效时间,必填
@NotNull(message = "订单失效时间不能为空")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime expireTime;
@Schema(description = "订单支付成功时间")
// 订单支付成功时间
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime successTime;
@Schema(description = "支付成功的订单拓展单编号", example = "50")
// 支付成功的订单拓展单编号示例50
private Long extensionId;
@Schema(description = "支付订单号", example = "2048888")
// 支付订单号,示例:2048888
private String no;
@Schema(description = "退款总金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
// 退款总金额单位必填示例10
@NotNull(message = "退款总金额,单位:分不能为空")
private Long refundPrice;
@Schema(description = "渠道用户编号", example = "2048")
// 渠道用户编号示例2048
private String channelUserId;
@Schema(description = "渠道订单号", example = "4096")
// 渠道订单号示例4096
private String channelOrderNo;
}

View File

@@ -1,28 +1,27 @@
package com.tashow.cloud.pay.controller.admin.order.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 支付订单详细信息 Response VO")
// 管理后台 - 支付订单详细信息 Response VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayOrderDetailsRespVO extends PayOrderBaseVO {
@Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 支付订单编号必填示例1024
private Long id;
@Schema(description = "应用名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋道源码")
// 应用名称,必填,示例:芋道源码
private String appName;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 创建时间,必填
private LocalDateTime createTime;
@Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 更新时间,必填
private LocalDateTime updateTime;
/**
@@ -31,13 +30,13 @@ public class PayOrderDetailsRespVO extends PayOrderBaseVO {
private PayOrderExtension extension;
@Data
@Schema(description = "支付订单扩展")
// 支付订单扩展
public static class PayOrderExtension {
@Schema(description = "支付订单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 支付订单号必填示例1024
private String no;
@Schema(description = "支付异步通知的内容")
// 支付异步通知的内容
private String channelNotifyData;
}

View File

@@ -1,10 +1,10 @@
package com.tashow.cloud.pay.controller.admin.order.vo;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.framework.excel.core.convert.MoneyConvert;
import cn.iocoder.yudao.module.pay.enums.DictTypeConstants;
import com.alibaba.excel.annotation.ExcelProperty;
import com.tashow.cloud.excel.excel.core.annotations.DictFormat;
import com.tashow.cloud.excel.excel.core.convert.DictConvert;
import com.tashow.cloud.excel.excel.core.convert.MoneyConvert;
import com.tashow.cloud.payapi.enums.DictTypeConstants;
import lombok.Data;
import java.time.LocalDateTime;

View File

@@ -1,37 +1,39 @@
package com.tashow.cloud.pay.controller.admin.order.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 支付订单 Excel 导出 Request VO参数和 PayOrderPageReqVO 是一致的")
// 移除Swagger相关导入
// 管理后台 - 支付订单 Excel 导出 Request VO参数和 PayOrderPageReqVO 是一致的
@Data
public class PayOrderExportReqVO {
@Schema(description = "应用编号", example = "1024")
// 应用编号示例1024
private Long appId;
@Schema(description = "渠道编码", example = "wx_app")
// 渠道编码示例wx_app
private String channelCode;
@Schema(description = "商户订单编号", example = "4096")
// 商户订单编号示例4096
private String merchantOrderId;
@Schema(description = "渠道编号", example = "1888")
// 渠道编号示例1888
private String channelOrderNo;
@Schema(description = "支付单号", example = "2014888")
// 支付单号,示例:2014888
private String no;
@Schema(description = "支付状态", example = "0")
// 支付状态示例0
private Integer status;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@Schema(description = "创建时间")
// 创建时间
private LocalDateTime[] createTime;
}

View File

@@ -1,25 +1,26 @@
package com.tashow.cloud.pay.controller.admin.order.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 支付订单分页 Request VO")
// 移除Swagger相关导入
// 管理后台 - 支付订单分页 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayOrderPageItemRespVO extends PayOrderBaseVO {
@Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 支付订单编号必填示例1024
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 创建时间,必填
private LocalDateTime createTime;
@Schema(description = "应用名称", example = "wx_pay")
// 应用名称示例wx_pay
private String appName;
}

View File

@@ -1,7 +1,6 @@
package com.tashow.cloud.pay.controller.admin.order.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import com.tashow.cloud.common.pojo.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@@ -9,34 +8,37 @@ import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 支付订单分页 Request VO")
// 移除Swagger相关导入
// 管理后台 - 支付订单分页 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayOrderPageReqVO extends PageParam {
@Schema(description = "应用编号", example = "1024")
// 应用编号示例1024
private Long appId;
@Schema(description = "渠道编码", example = "wx_app")
// 渠道编码示例wx_app
private String channelCode;
@Schema(description = "商户订单编号", example = "4096")
// 商户订单编号示例4096
private String merchantOrderId;
@Schema(description = "渠道编号", example = "1888")
// 渠道编号示例1888
private String channelOrderNo;
@Schema(description = "支付单号", example = "2014888")
// 支付单号,示例:2014888
private String no;
@Schema(description = "支付状态", example = "0")
// 支付状态示例0
private Integer status;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@Schema(description = "创建时间")
// 创建时间
private LocalDateTime[] createTime;
}

View File

@@ -1,22 +1,23 @@
package com.tashow.cloud.pay.controller.admin.order.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 支付订单 Response VO")
// 移除Swagger相关导入
// 管理后台 - 支付订单 Response VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayOrderRespVO extends PayOrderBaseVO {
@Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
// 支付订单编号,必填
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 创建时间,必填
private LocalDateTime createTime;
}

View File

@@ -1,6 +1,5 @@
package com.tashow.cloud.pay.controller.admin.order.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@@ -8,25 +7,25 @@ import org.hibernate.validator.constraints.URL;
import java.util.Map;
@Schema(description = "管理后台 - 支付订单提交 Request VO")
// 管理后台 - 支付订单提交 Request VO
@Data
public class PayOrderSubmitReqVO {
@Schema(description = "支付单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 支付单编号必填示例1024
@NotNull(message = "支付单编号不能为空")
private Long id;
@Schema(description = "支付渠道", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx_pub")
// 支付渠道必填示例wx_pub
@NotEmpty(message = "支付渠道不能为空")
private String channelCode;
@Schema(description = "支付渠道的额外参数,例如说,微信公众号需要传递 openid 参数")
// 支付渠道的额外参数,例如说,微信公众号需要传递 openid 参数
private Map<String, String> channelExtras;
@Schema(description = "展示模式", example = "url") // 参见 {@link PayDisplayModeEnum} 枚举。如果不传递,则每个支付渠道使用默认的方式
// 展示模式示例url // 参见 {@link PayDisplayModeEnum} 枚举。如果不传递,则每个支付渠道使用默认的方式
private String displayMode;
@Schema(description = "回跳地址")
// 回跳地址
@URL(message = "回跳地址的格式必须是 URL")
private String returnUrl;

View File

@@ -1,18 +1,17 @@
package com.tashow.cloud.pay.controller.admin.order.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 支付订单提交 Response VO")
// 管理后台 - 支付订单提交 Response VO
@Data
public class PayOrderSubmitRespVO {
@Schema(description = "支付状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") // 参见 PayOrderStatusEnum 枚举
// 支付状态必填示例10 // 参见 PayOrderStatusEnum 枚举
private Integer status;
@Schema(description = "展示模式", requiredMode = Schema.RequiredMode.REQUIRED, example = "url") // 参见 PayDisplayModeEnum 枚举
// 展示模式必填示例url // 参见 PayDisplayModeEnum 枚举
private String displayMode;
@Schema(description = "展示内容", requiredMode = Schema.RequiredMode.REQUIRED)
// 展示内容,必填
private String displayContent;
}

View File

@@ -1,21 +1,16 @@
package com.tashow.cloud.pay.controller.admin.refund;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.pay.controller.admin.refund.vo.*;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.excel.excel.core.util.ExcelUtils;
import com.tashow.cloud.pay.controller.admin.refund.vo.*;
import com.tashow.cloud.payapi.controller.admin.refund.vo.*;
import com.tashow.cloud.pay.convert.refund.PayRefundConvert;
import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;
import com.tashow.cloud.pay.dal.dataobject.refund.PayRefundDO;
import com.tashow.cloud.pay.service.app.PayAppService;
import com.tashow.cloud.pay.service.refund.PayRefundService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import com.tashow.cloud.web.apilog.core.annotation.ApiAccessLog;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.Valid;
@@ -31,11 +26,12 @@ import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static com.tashow.cloud.common.pojo.CommonResult.success;
import static com.tashow.cloud.common.util.collection.CollectionUtils.convertList;
import static com.tashow.cloud.web.apilog.core.enums.OperateTypeEnum.EXPORT;
@Tag(name = "管理后台 - 退款订单")
// 管理后台 - 退款订单
@RestController
@RequestMapping("/pay/refund")
@Validated
@@ -47,8 +43,8 @@ public class PayRefundController {
private PayAppService appService;
@GetMapping("/get")
@Operation(summary = "获得退款订单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
// 获得退款订单
// id: 编号必填示例1024
@PreAuthorize("@ss.hasPermission('pay:refund:query')")
public CommonResult<PayRefundDetailsRespVO> getRefund(@RequestParam("id") Long id) {
PayRefundDO refund = refundService.getRefund(id);
@@ -62,7 +58,7 @@ public class PayRefundController {
}
@GetMapping("/page")
@Operation(summary = "获得退款订单分页")
// 获得退款订单分页
@PreAuthorize("@ss.hasPermission('pay:refund:query')")
public CommonResult<PageResult<PayRefundPageItemRespVO>> getRefundPage(@Valid PayRefundPageReqVO pageVO) {
PageResult<PayRefundDO> pageResult = refundService.getRefundPage(pageVO);
@@ -76,7 +72,7 @@ public class PayRefundController {
}
@GetMapping("/export-excel")
@Operation(summary = "导出退款订单 Excel")
// 导出退款订单 Excel
@PreAuthorize("@ss.hasPermission('pay:refund:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportRefundExcel(@Valid PayRefundExportReqVO exportReqVO,

View File

@@ -1,6 +1,6 @@
package com.tashow.cloud.pay.controller.admin.refund.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import java.time.LocalDateTime;
@@ -12,67 +12,67 @@ import java.time.LocalDateTime;
@Data
public class PayRefundBaseVO {
@Schema(description = "外部退款号", requiredMode = Schema.RequiredMode.REQUIRED, example = "110")
// 外部退款号 - 必填 - 示例: 110
private String no;
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 应用编号 - 必填 - 示例: 1024
private Long appId;
@Schema(description = "渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
// 渠道编号 - 必填 - 示例: 2048
private Long channelId;
@Schema(description = "渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "wx_app")
// 渠道编码 - 必填 - 示例: wx_app
private String channelCode;
@Schema(description = "订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 订单编号 - 必填 - 示例: 1024
private Long orderId;
// ========== 商户相关字段 ==========
@Schema(description = "商户订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "225")
// 商户订单编号 - 必填 - 示例: 225
private String merchantOrderId;
@Schema(description = "商户退款订单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "512")
// 商户退款订单号 - 必填 - 示例: 512
private String merchantRefundId;
@Schema(description = "异步通知地址", requiredMode = Schema.RequiredMode.REQUIRED)
// 异步通知地址 - 必填
private String notifyUrl;
// ========== 退款相关字段 ==========
@Schema(description = "退款状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
// 退款状态 - 必填 - 示例: 0
private Integer status;
@Schema(description = "支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
// 支付金额 - 必填 - 示例: 100
private Long payPrice;
@Schema(description = "退款金额,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
// 退款金额,单位分 - 必填 - 示例: 200
private Long refundPrice;
@Schema(description = "退款原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "我要退了")
// 退款原因 - 必填 - 示例: 我要退了
private String reason;
@Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED, example = "127.0.0.1")
// 用户 IP - 必填 - 示例: 127.0.0.1
private String userIp;
// ========== 渠道相关字段 ==========
@Schema(description = "渠道订单号", requiredMode = Schema.RequiredMode.REQUIRED, example = "233")
// 渠道订单号 - 必填 - 示例: 233
private String channelOrderNo;
@Schema(description = "渠道退款单号", example = "2022")
// 渠道退款单号 - 示例: 2022
private String channelRefundNo;
@Schema(description = "退款成功时间")
// 退款成功时间
private LocalDateTime successTime;
@Schema(description = "调用渠道的错误码")
// 调用渠道的错误码
private String channelErrorCode;
@Schema(description = "调用渠道的错误提示")
// 调用渠道的错误提示
private String channelErrorMsg;
@Schema(description = "支付渠道的额外参数")
// 支付渠道的额外参数
private String channelNotifyData;
}

View File

@@ -1,38 +1,38 @@
package com.tashow.cloud.pay.controller.admin.refund.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 退款订单详情 Response VO")
// 管理后台 - 退款订单详情 Response VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayRefundDetailsRespVO extends PayRefundBaseVO {
@Schema(description = "支付退款编号", requiredMode = Schema.RequiredMode.REQUIRED)
// 支付退款编号 - 必填
private Long id;
@Schema(description = "应用名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是芋艿")
// 应用名称 - 必填 - 示例: 我是芋艿
private String appName;
@Schema(description = "支付订单", requiredMode = Schema.RequiredMode.REQUIRED)
// 支付订单 - 必填
private Order order;
@Schema(description = "创建时间")
// 创建时间
private LocalDateTime createTime;
@Schema(description = "更新时间")
// 更新时间
private LocalDateTime updateTime;
@Schema(description = "管理后台 - 支付订单")
// 管理后台 - 支付订单
@Data
public static class Order {
@Schema(description = "商品标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆")
// 商品标题 - 必填 - 示例: 土豆
private String subject;
}

View File

@@ -1,10 +1,10 @@
package com.tashow.cloud.pay.controller.admin.refund.vo;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import cn.iocoder.yudao.framework.excel.core.convert.MoneyConvert;
import cn.iocoder.yudao.module.pay.enums.DictTypeConstants;
import com.alibaba.excel.annotation.ExcelProperty;
import com.tashow.cloud.excel.excel.core.annotations.DictFormat;
import com.tashow.cloud.excel.excel.core.convert.DictConvert;
import com.tashow.cloud.excel.excel.core.convert.MoneyConvert;
import com.tashow.cloud.payapi.enums.DictTypeConstants;
import lombok.Data;
import java.time.LocalDateTime;

View File

@@ -1,40 +1,41 @@
package com.tashow.cloud.pay.controller.admin.refund.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 退款订单 Excel 导出 Request VO参数和 PayRefundPageReqVO 是一致的")
// 管理后台 - 退款订单 Excel 导出 Request VO参数和 PayRefundPageReqVO 是一致的
@Data
public class PayRefundExportReqVO {
@Schema(description = "应用编号", example = "1024")
// 应用编号 - 示例: 1024
private Long appId;
@Schema(description = "渠道编码", example = "wx_app")
// 渠道编码 - 示例: wx_app
private String channelCode;
@Schema(description = "商户支付单号", example = "10")
// 商户支付单号 - 示例: 10
private String merchantOrderId;
@Schema(description = "商户退款单号", example = "20")
// 商户退款单号 - 示例: 20
private String merchantRefundId;
@Schema(description = "渠道支付单号", example = "30")
// 渠道支付单号 - 示例: 30
private String channelOrderNo;
@Schema(description = "渠道退款单号", example = "40")
// 渠道退款单号 - 示例: 40
private String channelRefundNo;
@Schema(description = "退款状态", example = "0")
// 退款状态 - 示例: 0
private Integer status;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@Schema(description = "创建时间")
// 创建时间
private LocalDateTime[] createTime;
}

View File

@@ -1,25 +1,25 @@
package com.tashow.cloud.pay.controller.admin.refund.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 退款订单分页查询 Response VO")
// 管理后台 - 退款订单分页查询 Response VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayRefundPageItemRespVO extends PayRefundBaseVO {
@Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
// 支付订单编号 - 必填 - 示例: 1024
private Long id;
@Schema(description = "应用名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是芋艿")
// 应用名称 - 必填 - 示例: 我是芋艿
private String appName;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 创建时间 - 必填
private LocalDateTime createTime;
}

View File

@@ -1,7 +1,8 @@
package com.tashow.cloud.pay.controller.admin.refund.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import com.tashow.cloud.common.pojo.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@@ -9,37 +10,38 @@ import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 退款订单分页 Request VO")
// 管理后台 - 退款订单分页 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayRefundPageReqVO extends PageParam {
@Schema(description = "应用编号", example = "1024")
// 应用编号 - 示例: 1024
private Long appId;
@Schema(description = "渠道编码", example = "wx_app")
// 渠道编码 - 示例: wx_app
private String channelCode;
@Schema(description = "商户支付单号", example = "10")
// 商户支付单号 - 示例: 10
private String merchantOrderId;
@Schema(description = "商户退款单号", example = "20")
// 商户退款单号 - 示例: 20
private String merchantRefundId;
@Schema(description = "渠道支付单号", example = "30")
// 渠道支付单号 - 示例: 30
private String channelOrderNo;
@Schema(description = "渠道退款单号", example = "40")
// 渠道退款单号 - 示例: 40
private String channelRefundNo;
@Schema(description = "退款状态", example = "0")
// 退款状态 - 示例: 0
private Integer status;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@Schema(description = "创建时间")
// 创建时间
private LocalDateTime[] createTime;
}

View File

@@ -1,25 +1,22 @@
package com.tashow.cloud.pay.controller.admin.transfer;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.pay.controller.admin.transfer.vo.*;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.transfer.vo.*;
import com.tashow.cloud.payapi.controller.admin.transfer.vo.*;
import com.tashow.cloud.pay.convert.transfer.PayTransferConvert;
import com.tashow.cloud.pay.dal.dataobject.transfer.PayTransferDO;
import com.tashow.cloud.pay.service.transfer.PayTransferService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import static com.tashow.cloud.common.pojo.CommonResult.success;
import static com.tashow.cloud.common.util.servlet.ServletUtils.getClientIP;
@Tag(name = "管理后台 - 转账单")
// 管理后台 - 转账单
@RestController
@RequestMapping("/pay/transfer")
@Validated
@@ -29,7 +26,7 @@ public class PayTransferController {
private PayTransferService payTransferService;
@PostMapping("/create")
@Operation(summary = "创建转账单,发起转账")
// 创建转账单,发起转账
@PreAuthorize("@ss.hasPermission('pay:transfer:create')")
public CommonResult<PayTransferCreateRespVO> createPayTransfer(@Valid @RequestBody PayTransferCreateReqVO reqVO) {
PayTransferDO payTransfer = payTransferService.createTransfer(reqVO, getClientIP());
@@ -37,14 +34,14 @@ public class PayTransferController {
}
@GetMapping("/get")
@Operation(summary = "获得转账订单")
// 获得转账订单
@PreAuthorize("@ss.hasPermission('pay:transfer:query')")
public CommonResult<PayTransferRespVO> getTransfer(@RequestParam("id") Long id) {
return success(PayTransferConvert.INSTANCE.convert(payTransferService.getTransfer(id)));
}
@GetMapping("/page")
@Operation(summary = "获得转账订单分页")
// 获得转账订单分页
@PreAuthorize("@ss.hasPermission('pay:transfer:query')")
public CommonResult<PageResult<PayTransferPageItemRespVO>> getTransferPage(@Valid PayTransferPageReqVO pageVO) {
PageResult<PayTransferDO> pageResult = payTransferService.getTransferPage(pageVO);

View File

@@ -1,38 +1,40 @@
package com.tashow.cloud.pay.controller.admin.transfer.vo;
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
import cn.iocoder.yudao.module.pay.enums.transfer.PayTransferTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import com.tashow.cloud.common.util.validation.ValidationUtils;
import com.tashow.cloud.common.validation.InEnum;
import com.tashow.cloud.sdk.payment.enums.channel.PayChannelEnum;
import com.tashow.cloud.sdk.payment.enums.transfer.PayTransferTypeEnum;
import jakarta.validation.Validator;
import jakarta.validation.constraints.*;
import lombok.Data;
import java.util.Map;
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_IMPLEMENTED;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.pay.enums.transfer.PayTransferTypeEnum.*;
import static com.tashow.cloud.common.exception.enums.GlobalErrorCodeConstants.NOT_IMPLEMENTED;
import static com.tashow.cloud.common.exception.util.ServiceExceptionUtil.exception;
import static com.tashow.cloud.sdk.payment.enums.transfer.PayTransferTypeEnum.typeOf;
@Schema(description = "管理后台 - 发起转账 Request VO")
// 管理后台 - 发起转账 Request VO
@Data
public class PayTransferCreateReqVO {
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
// 应用编号 - 必填 - 示例: 1
@NotNull(message = "应用编号不能为空")
private Long appId;
@Schema(description = "商户转账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
// 商户转账单编号 - 必填 - 示例: 1
@NotNull(message = "商户转账单编号不能为空")
private String merchantTransferId;
@Schema(description = "转账类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
// 转账类型 - 必填 - 示例: 1
@NotNull(message = "转账类型不能为空")
@InEnum(PayTransferTypeEnum.class)
private Integer type;
@Schema(description = "转账渠道", requiredMode = Schema.RequiredMode.REQUIRED, example = "alipay_pc")
// 转账渠道 - 必填 - 示例: alipay_pc
@NotEmpty(message = "转账渠道不能为空")
private String channelCode;
@@ -40,34 +42,34 @@ public class PayTransferCreateReqVO {
@NotNull(message = "转账金额不能为空")
private Integer price;
@Schema(description = "转账标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "示例转账")
// 转账标题 - 必填 - 示例: 示例转账
@NotEmpty(message = "转账标题不能为空")
private String subject;
@Schema(description = "收款人姓名", example = "test1")
@NotBlank(message = "收款人姓名不能为空", groups = {Alipay.class})
// 收款人姓名 - 示例: test1
@NotBlank(message = "收款人姓名不能为空", groups = {PayTransferTypeEnum.Alipay.class})
private String userName;
@Schema(description = "支付宝登录号", example = "test1@sandbox.com")
@NotBlank(message = "支付宝登录号不能为空", groups = {Alipay.class})
// 支付宝登录号 - 示例: test1@sandbox.com
@NotBlank(message = "支付宝登录号不能为空", groups = {PayTransferTypeEnum.Alipay.class})
private String alipayLogonId;
@Schema(description = "微信 openId", example = "oLefc4g5Gxx")
@NotBlank(message = "微信 openId 不能为空", groups = {WxPay.class})
// 微信 openId - 示例: oLefc4g5Gxx
@NotBlank(message = "微信 openId 不能为空", groups = {PayTransferTypeEnum.WxPay.class})
private String openid;
@Schema(description = "转账渠道的额外参数")
// 转账渠道的额外参数
private Map<String, String> channelExtras;
public void validate(Validator validator) {
PayTransferTypeEnum transferType = typeOf(type);
switch (transferType) {
case ALIPAY_BALANCE: {
ValidationUtils.validate(validator, this, Alipay.class);
ValidationUtils.validate(validator, this, PayTransferTypeEnum.Alipay.class);
break;
}
case WX_BALANCE: {
ValidationUtils.validate(validator, this, WxPay.class);
ValidationUtils.validate(validator, this, PayTransferTypeEnum.WxPay.class);
break;
}
default: {

View File

@@ -1,16 +1,16 @@
package com.tashow.cloud.pay.controller.admin.transfer.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
@Schema(description = "管理后台 - 发起转账 Response VO")
// 管理后台 - 发起转账 Response VO
@Data
public class PayTransferCreateRespVO {
@Schema(description = "转账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
// 转账单编号 - 必填 - 示例: 1
private Long id;
@Schema(description = "转账状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") // 参见 PayTransferStatusEnum 枚举
// 转账状态 - 必填 - 示例: 1 (参见 PayTransferStatusEnum 枚举)
private Integer status;
}

View File

@@ -1,6 +1,6 @@
package com.tashow.cloud.pay.controller.admin.transfer.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import java.time.LocalDateTime;
@@ -8,55 +8,55 @@ import java.time.LocalDateTime;
/**
* @author jason
*/
@Schema(description = "管理后台 - 转账单分页项 Response VO")
// 管理后台 - 转账单分页项 Response VO
@Data
public class PayTransferPageItemRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2931")
// 编号 - 必填 - 示例: 2931
private Long id;
@Schema(description = "转账单号", requiredMode = Schema.RequiredMode.REQUIRED)
// 转账单号 - 必填
private String no;
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12831")
// 应用编号 - 必填 - 示例: 12831
private Long appId;
@Schema(description = "转账渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24833")
// 转账渠道编号 - 必填 - 示例: 24833
private Long channelId;
@Schema(description = "转账渠道编码", requiredMode = Schema.RequiredMode.REQUIRED)
// 转账渠道编码 - 必填
private String channelCode;
@Schema(description = "商户转账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17481")
// 商户转账单编号 - 必填 - 示例: 17481
private String merchantTransferId;
@Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
// 类型 - 必填 - 示例: 2
private Integer type;
@Schema(description = "转账状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
// 转账状态 - 必填 - 示例: 2
private Integer status;
@Schema(description = "转账成功时间")
// 转账成功时间
private LocalDateTime successTime;
@Schema(description = "转账金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "964")
// 转账金额 - 必填 - 示例: 964
private Integer price;
@Schema(description = "转账标题", requiredMode = Schema.RequiredMode.REQUIRED)
// 转账标题 - 必填
private String subject;
@Schema(description = "收款人姓名", example = "王五")
// 收款人姓名 - 示例: 王五
private String userName;
@Schema(description = "支付宝登录号", example = "29245")
// 支付宝登录号 - 示例: 29245
private String alipayLogonId;
@Schema(description = "微信 openId", example = "26589")
// 微信 openId - 示例: 26589
private String openid;
@Schema(description = "渠道转账单号")
// 渠道转账单号
private String channelTransferNo;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 创建时间 - 必填
private LocalDateTime createTime;
}

View File

@@ -1,7 +1,8 @@
package com.tashow.cloud.pay.controller.admin.transfer.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import com.tashow.cloud.common.pojo.PageParam;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@@ -9,39 +10,40 @@ import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 转账单分页 Request VO")
// 管理后台 - 转账单分页 Request VO
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayTransferPageReqVO extends PageParam {
@Schema(description = "转账单号")
// 转账单号
private String no;
@Schema(description = "应用编号", example = "12831")
// 应用编号 - 示例: 12831
private Long appId;
@Schema(description = "渠道编码", example = "wx_app")
// 渠道编码 - 示例: wx_app
private String channelCode;
@Schema(description = "商户转账单编号", example = "17481")
// 商户转账单编号 - 示例: 17481
private String merchantTransferId;
@Schema(description = "类型", example = "2")
// 类型 - 示例: 2
private Integer type;
@Schema(description = "转账状态", example = "2")
// 转账状态 - 示例: 2
private Integer status;
@Schema(description = "收款人姓名", example = "王五")
// 收款人姓名 - 示例: 王五
private String userName;
@Schema(description = "渠道转账单号")
// 渠道转账单号
private String channelTransferNo;
@Schema(description = "创建时间")
// 创建时间
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;

View File

@@ -1,79 +1,79 @@
package com.tashow.cloud.pay.controller.admin.transfer.vo;
import io.swagger.v3.oas.annotations.media.Schema;
// 移除Swagger相关导入
import lombok.Data;
import java.time.LocalDateTime;
import java.util.Map;
@Schema(description = "管理后台 - 转账单 Response VO")
// 管理后台 - 转账单 Response VO
@Data
public class PayTransferRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2931")
// 编号 - 必填 - 示例: 2931
private Long id;
@Schema(description = "转账单号", requiredMode = Schema.RequiredMode.REQUIRED)
// 转账单号 - 必填
private String no;
@Schema(description = "应用编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12831")
// 应用编号 - 必填 - 示例: 12831
private Long appId;
@Schema(description = "转账渠道编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24833")
// 转账渠道编号 - 必填 - 示例: 24833
private Long channelId;
@Schema(description = "转账渠道编码", requiredMode = Schema.RequiredMode.REQUIRED)
// 转账渠道编码 - 必填
private String channelCode;
@Schema(description = "商户转账单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17481")
// 商户转账单编号 - 必填 - 示例: 17481
private String merchantTransferId;
@Schema(description = "类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
// 类型 - 必填 - 示例: 2
private Integer type;
@Schema(description = "转账状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
// 转账状态 - 必填 - 示例: 2
private Integer status;
@Schema(description = "转账成功时间")
// 转账成功时间
private LocalDateTime successTime;
@Schema(description = "转账金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "964")
// 转账金额 - 必填 - 示例: 964
private Integer price;
@Schema(description = "转账标题", requiredMode = Schema.RequiredMode.REQUIRED)
// 转账标题 - 必填
private String subject;
@Schema(description = "收款人姓名", example = "王五")
// 收款人姓名 - 示例: 王五
private String userName;
@Schema(description = "支付宝登录号", example = "29245")
// 支付宝登录号 - 示例: 29245
private String alipayLogonId;
@Schema(description = "微信 openId", example = "26589")
// 微信 openId - 示例: 26589
private String openid;
@Schema(description = "异步通知商户地址", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.iocoder.cn")
// 异步通知商户地址 - 必填 - 示例: https://www.iocoder.cn
private String notifyUrl;
@Schema(description = "用户 IP", requiredMode = Schema.RequiredMode.REQUIRED)
// 用户 IP - 必填
private String userIp;
@Schema(description = "渠道的额外参数")
// 渠道的额外参数
private Map<String, String> channelExtras;
@Schema(description = "渠道转账单号")
// 渠道转账单号
private String channelTransferNo;
@Schema(description = "调用渠道的错误码")
// 调用渠道的错误码
private String channelErrorCode;
@Schema(description = "调用渠道的错误提示")
// 调用渠道的错误提示
private String channelErrorMsg;
@Schema(description = "渠道的同步/异步通知的内容")
// 渠道的同步/异步通知的内容
private String channelNotifyData;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
// 创建时间 - 必填
private LocalDateTime createTime;
}

View File

@@ -1,70 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.wallet.vo.wallet.PayWalletPageReqVO;
import com.tashow.cloud.pay.controller.admin.wallet.vo.wallet.PayWalletRespVO;
import com.tashow.cloud.pay.controller.admin.wallet.vo.wallet.PayWalletUpdateBalanceReqVO;
import com.tashow.cloud.pay.controller.admin.wallet.vo.wallet.PayWalletUserReqVO;
import com.tashow.cloud.pay.convert.wallet.PayWalletConvert;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletDO;
import cn.iocoder.yudao.module.pay.enums.wallet.PayWalletBizTypeEnum;
import com.tashow.cloud.pay.service.wallet.PayWalletService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static cn.iocoder.yudao.framework.common.enums.UserTypeEnum.MEMBER;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.module.pay.enums.ErrorCodeConstants.WALLET_NOT_FOUND;
@Tag(name = "管理后台 - 用户钱包")
@RestController
@RequestMapping("/pay/wallet")
@Validated
@Slf4j
public class PayWalletController {
@Resource
private PayWalletService payWalletService;
@GetMapping("/get")
@PreAuthorize("@ss.hasPermission('pay:wallet:query')")
@Operation(summary = "获得用户钱包明细")
public CommonResult<PayWalletRespVO> getWallet(PayWalletUserReqVO reqVO) {
PayWalletDO wallet = payWalletService.getOrCreateWallet(reqVO.getUserId(), MEMBER.getValue());
return success(PayWalletConvert.INSTANCE.convert02(wallet));
}
@GetMapping("/page")
@Operation(summary = "获得会员钱包分页")
@PreAuthorize("@ss.hasPermission('pay:wallet:query')")
public CommonResult<PageResult<PayWalletRespVO>> getWalletPage(@Valid PayWalletPageReqVO pageVO) {
PageResult<PayWalletDO> pageResult = payWalletService.getWalletPage(pageVO);
return success(PayWalletConvert.INSTANCE.convertPage(pageResult));
}
@PutMapping("/update-balance")
@Operation(summary = "更新会员用户余额")
@PreAuthorize("@ss.hasPermission('pay:wallet:update-balance')")
public CommonResult<Boolean> updateWalletBalance(@Valid @RequestBody PayWalletUpdateBalanceReqVO updateReqVO) {
// 获得用户钱包
PayWalletDO wallet = payWalletService.getOrCreateWallet(updateReqVO.getUserId(), MEMBER.getValue());
if (wallet == null) {
log.error("[updateWalletBalance]updateReqVO({}) 用户钱包不存在.", updateReqVO);
throw exception(WALLET_NOT_FOUND);
}
// 更新钱包余额
payWalletService.addWalletBalance(wallet.getId(), String.valueOf(updateReqVO.getUserId()),
PayWalletBizTypeEnum.UPDATE_BALANCE, updateReqVO.getBalance());
return success(true);
}
}

View File

@@ -1,57 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.pay.api.notify.dto.PayOrderNotifyReqDTO;
import cn.iocoder.yudao.module.pay.api.notify.dto.PayRefundNotifyReqDTO;
import com.tashow.cloud.pay.service.wallet.PayWalletRechargeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
@Tag(name = "管理后台 - 钱包充值")
@RestController
@RequestMapping("/pay/wallet-recharge")
@Validated
@Slf4j
public class PayWalletRechargeController {
@Resource
private PayWalletRechargeService walletRechargeService;
@PostMapping("/update-paid")
@Operation(summary = "更新钱包充值为已充值") // 由 pay-module 支付服务,进行回调,可见 PayNotifyJob
@PermitAll // 无需登录, 内部校验实现
public CommonResult<Boolean> updateWalletRechargerPaid(@Valid @RequestBody PayOrderNotifyReqDTO notifyReqDTO) {
walletRechargeService.updateWalletRechargerPaid(Long.valueOf(notifyReqDTO.getMerchantOrderId()),
notifyReqDTO.getPayOrderId());
return success(true);
}
// TODO @jason发起退款要 post 操作哈;
@GetMapping("/refund")
@Operation(summary = "发起钱包充值退款")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<Boolean> refundWalletRecharge(@RequestParam("id") Long id) {
walletRechargeService.refundWalletRecharge(id, getClientIP());
return success(true);
}
@PostMapping("/update-refunded")
@Operation(summary = "更新钱包充值为已退款") // 由 pay-module 支付服务,进行回调,可见 PayNotifyJob
@PermitAll // 无需登录, 内部校验实现
public CommonResult<Boolean> updateWalletRechargeRefunded(@RequestBody PayRefundNotifyReqDTO notifyReqDTO) {
walletRechargeService.updateWalletRechargeRefunded(
Long.valueOf(notifyReqDTO.getMerchantOrderId()), notifyReqDTO.getPayRefundId());
return success(true);
}
}

View File

@@ -1,74 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage.WalletRechargePackageCreateReqVO;
import com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage.WalletRechargePackagePageReqVO;
import com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage.WalletRechargePackageRespVO;
import com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage.WalletRechargePackageUpdateReqVO;
import com.tashow.cloud.pay.convert.wallet.PayWalletRechargePackageConvert;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletRechargePackageDO;
import com.tashow.cloud.pay.service.wallet.PayWalletRechargePackageService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 钱包充值套餐")
@RestController
@RequestMapping("/pay/wallet-recharge-package")
@Validated
public class PayWalletRechargePackageController {
@Resource
private PayWalletRechargePackageService walletRechargePackageService;
@PostMapping("/create")
@Operation(summary = "创建钱包充值套餐")
@PreAuthorize("@ss.hasPermission('pay:wallet-recharge-package:create')")
public CommonResult<Long> createWalletRechargePackage(@Valid @RequestBody WalletRechargePackageCreateReqVO createReqVO) {
return success(walletRechargePackageService.createWalletRechargePackage(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新钱包充值套餐")
@PreAuthorize("@ss.hasPermission('pay:wallet-recharge-package:update')")
public CommonResult<Boolean> updateWalletRechargePackage(@Valid @RequestBody WalletRechargePackageUpdateReqVO updateReqVO) {
walletRechargePackageService.updateWalletRechargePackage(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除钱包充值套餐")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('pay:wallet-recharge-package:delete')")
public CommonResult<Boolean> deleteWalletRechargePackage(@RequestParam("id") Long id) {
walletRechargePackageService.deleteWalletRechargePackage(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得钱包充值套餐")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('pay:wallet-recharge-package:query')")
public CommonResult<WalletRechargePackageRespVO> getWalletRechargePackage(@RequestParam("id") Long id) {
PayWalletRechargePackageDO walletRechargePackage = walletRechargePackageService.getWalletRechargePackage(id);
return success(PayWalletRechargePackageConvert.INSTANCE.convert(walletRechargePackage));
}
@GetMapping("/page")
@Operation(summary = "获得钱包充值套餐分页")
@PreAuthorize("@ss.hasPermission('pay:wallet-recharge-package:query')")
public CommonResult<PageResult<WalletRechargePackageRespVO>> getWalletRechargePackagePage(@Valid WalletRechargePackagePageReqVO pageVO) {
PageResult<PayWalletRechargePackageDO> pageResult = walletRechargePackageService.getWalletRechargePackagePage(pageVO);
return success(PayWalletRechargePackageConvert.INSTANCE.convertPage(pageResult));
}
}

View File

@@ -1,42 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.wallet.vo.transaction.PayWalletTransactionPageReqVO;
import com.tashow.cloud.pay.controller.admin.wallet.vo.transaction.PayWalletTransactionRespVO;
import com.tashow.cloud.pay.convert.wallet.PayWalletTransactionConvert;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletTransactionDO;
import com.tashow.cloud.pay.service.wallet.PayWalletTransactionService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 钱包余额明细")
@RestController
@RequestMapping("/pay/wallet-transaction")
@Validated
@Slf4j
public class PayWalletTransactionController {
@Resource
private PayWalletTransactionService payWalletTransactionService;
@GetMapping("/page")
@Operation(summary = "获得钱包流水分页")
@PreAuthorize("@ss.hasPermission('pay:wallet:query')")
public CommonResult<PageResult<PayWalletTransactionRespVO>> getWalletTransactionPage(
@Valid PayWalletTransactionPageReqVO pageReqVO) {
PageResult<PayWalletTransactionDO> result = payWalletTransactionService.getWalletTransactionPage(pageReqVO);
return success(PayWalletTransactionConvert.INSTANCE.convertPage2(result));
}
}

View File

@@ -1,30 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 充值套餐 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class WalletRechargePackageBaseVO {
@Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
@NotNull(message = "套餐名不能为空")
private String name;
@Schema(description = "支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "16454")
@NotNull(message = "支付金额不能为空")
private Integer payPrice;
@Schema(description = "赠送金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "20887")
@NotNull(message = "赠送金额不能为空")
private Integer bonusPrice;
@Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
@NotNull(message = "状态不能为空")
private Byte status;
}

View File

@@ -1,14 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 充值套餐创建 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WalletRechargePackageCreateReqVO extends WalletRechargePackageBaseVO {
}

View File

@@ -1,30 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 充值套餐分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WalletRechargePackagePageReqVO extends PageParam {
@Schema(description = "套餐名", example = "李四")
private String name;
@Schema(description = "状态", example = "2")
private Integer status;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@@ -1,22 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 充值套餐 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WalletRechargePackageRespVO extends WalletRechargePackageBaseVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "9032")
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -1,19 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 充值套餐更新 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class WalletRechargePackageUpdateReqVO extends WalletRechargePackageBaseVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "9032")
@NotNull(message = "编号不能为空")
private Long id;
}

View File

@@ -1,23 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.transaction;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 钱包流水分页 Request VO")
@Data
public class PayWalletTransactionPageReqVO extends PageParam {
@Schema(description = "钱包编号", example = "888")
private Long walletId;
@Schema(description = "用户编号", example = "1024")
private Long userId;
@Schema(description = "用户类型", example = "1")
@InEnum(UserTypeEnum.class)
private Integer userType;
}

View File

@@ -1,35 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.transaction;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "用户 APP - 钱包流水分页 Response VO")
@Data
public class PayWalletTransactionRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "钱包编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
private Long walletId;
@Schema(description = "业务分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer bizType;
@Schema(description = "交易金额,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Long price;
@Schema(description = "流水标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆土豆")
private String title;
@Schema(description = "交易后的余额,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Long balance;
@Schema(description = "交易时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
// TODO @jasonmerchantOrderId 字段,需要在 PayWalletTransaction 存储下;然后,前端也返回下这个字段,界面也展示下商户名
}

View File

@@ -1,38 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.wallet;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
/**
* 用户钱包 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class PayWalletBaseVO {
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20020")
@NotNull(message = "用户编号不能为空")
private Long userId;
@Schema(description = "用户类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "用户类型不能为空")
private Integer userType;
@Schema(description = "余额,单位分", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "余额,单位分不能为空")
private Integer balance;
@Schema(description = "累计支出,单位分", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "累计支出,单位分不能为空")
private Integer totalExpense;
@Schema(description = "累计充值,单位分", requiredMode = Schema.RequiredMode.REQUIRED)
@NotNull(message = "累计充值,单位分不能为空")
private Integer totalRecharge;
@Schema(description = "冻结金额,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "20737")
@NotNull(message = "冻结金额,单位分不能为空")
private Integer freezePrice;
}

View File

@@ -1,33 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.wallet;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 会员钱包分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayWalletPageReqVO extends PageParam {
@Schema(description = "用户编号", example = "1024")
private Long userId;
@Schema(description = "用户类型", example = "1")
@InEnum(value = UserTypeEnum.class)
private Integer userType;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@@ -1,22 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.wallet;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 用户钱包 Response VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class PayWalletRespVO extends PayWalletBaseVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "29528")
private Long id;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -1,19 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.wallet;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Schema(description = "管理后台 - 修改钱包余额 Request VO")
@Data
public class PayWalletUpdateBalanceReqVO {
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23788")
@NotNull(message = "用户编号不能为空")
private Long userId;
@Schema(description = "变动余额,正数为增加,负数为减少", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
@NotNull(message = "变动余额不能为空")
private Integer balance;
}

View File

@@ -1,15 +0,0 @@
package com.tashow.cloud.pay.controller.admin.wallet.vo.wallet;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Schema(description = "管理后台 - 用户钱包明细 Request VO")
@Data
public class PayWalletUserReqVO {
@Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
@NotNull(message = "用户编号不能为空")
private Long userId;
}

View File

@@ -1,63 +0,0 @@
### /pay/create 提交支付订单【alipay_pc】
POST {{appApi}}/pay/order/submit
Content-Type: application/json
Authorization: Bearer {{appToken}}
tenant-id: {{appTenantId}}
{
"id": 174,
"channelCode": "alipay_pc"
}
### /pay/create 提交支付订单【wx_bar】
POST {{appApi}}/pay/order/submit
Content-Type: application/json
Authorization: Bearer {{appToken}}
tenant-id: {{appTenantId}}
{
"id": 202,
"channelCode": "wx_bar",
"channelExtras": {
"authCode": "134042110834344848"
}
}
### /pay/create 提交支付订单【wx_pub】
POST {{appApi}}/pay/order/submit
Content-Type: application/json
Authorization: Bearer {{appToken}}
tenant-id: {{appTenantId}}
{
"id": 202,
"channelCode": "wx_pub",
"channelExtras": {
"openid": "ockUAwIZ-0OeMZl9ogcZ4ILrGba0"
}
}
### /pay/create 提交支付订单【wx_lite】
POST {{appApi}}/pay/order/submit
Content-Type: application/json
Authorization: Bearer {{appToken}}
tenant-id: {{appTenantId}}
{
"id": 202,
"channelCode": "wx_lite",
"channelExtras": {
"openid": "oLefc4g5GjKWHJjLjMSXB3wX0fD0"
}
}
### /pay/create 提交支付订单【wx_native】
POST {{appApi}}/pay/order/submit
Content-Type: application/json
Authorization: Bearer {{appToken}}
tenant-id: {{appTenantId}}
{
"id": 202,
"channelCode": "wx_native"
}

View File

@@ -1,10 +1,9 @@
package com.tashow.cloud.pay.controller.app.order.vo;
import com.tashow.cloud.pay.controller.admin.order.vo.PayOrderSubmitReqVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "用户 APP - 支付订单提交 Request VO")
//用户 APP - 支付订单提交 Request VO
@Data
public class AppPayOrderSubmitReqVO extends PayOrderSubmitReqVO {
}

View File

@@ -1,10 +1,9 @@
package com.tashow.cloud.pay.controller.app.order.vo;
import com.tashow.cloud.pay.controller.admin.order.vo.PayOrderSubmitRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "用户 APP - 支付订单提交 Response VO")
//用户 APP - 支付订单提交 Response VO
@Data
public class AppPayOrderSubmitRespVO extends PayOrderSubmitRespVO {

View File

@@ -1,41 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import com.tashow.cloud.pay.controller.app.wallet.vo.wallet.AppPayWalletRespVO;
import com.tashow.cloud.pay.convert.wallet.PayWalletConvert;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletDO;
import com.tashow.cloud.pay.service.wallet.PayWalletService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
/**
* @author jason
*/
@Tag(name = "用户 APP - 钱包")
@RestController
@RequestMapping("/pay/wallet")
@Validated
@Slf4j
public class AppPayWalletController {
@Resource
private PayWalletService payWalletService;
@GetMapping("/get")
@Operation(summary = "获取钱包")
public CommonResult<AppPayWalletRespVO> getPayWallet() {
PayWalletDO wallet = payWalletService.getOrCreateWallet(getLoginUserId(), UserTypeEnum.MEMBER.getValue());
return success(PayWalletConvert.INSTANCE.convert(wallet));
}
}

View File

@@ -1,67 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.app.wallet.vo.recharge.AppPayWalletRechargeCreateReqVO;
import com.tashow.cloud.pay.controller.app.wallet.vo.recharge.AppPayWalletRechargeCreateRespVO;
import com.tashow.cloud.pay.controller.app.wallet.vo.recharge.AppPayWalletRechargeRespVO;
import com.tashow.cloud.pay.convert.wallet.PayWalletRechargeConvert;
import com.tashow.cloud.pay.dal.dataobject.order.PayOrderDO;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletRechargeDO;
import com.tashow.cloud.pay.service.order.PayOrderService;
import com.tashow.cloud.pay.service.wallet.PayWalletRechargeService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserId;
import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.getLoginUserType;
@Tag(name = "用户 APP - 钱包充值")
@RestController
@RequestMapping("/pay/wallet-recharge")
@Validated
@Slf4j
public class AppPayWalletRechargeController {
@Resource
private PayWalletRechargeService walletRechargeService;
@Resource
private PayOrderService payOrderService;
@PostMapping("/create")
@Operation(summary = "创建钱包充值记录(发起充值)")
public CommonResult<AppPayWalletRechargeCreateRespVO> createWalletRecharge(
@Valid @RequestBody AppPayWalletRechargeCreateReqVO reqVO) {
PayWalletRechargeDO walletRecharge = walletRechargeService.createWalletRecharge(
getLoginUserId(), getLoginUserType(), getClientIP(), reqVO);
return success(PayWalletRechargeConvert.INSTANCE.convert(walletRecharge));
}
@GetMapping("/page")
@Operation(summary = "获得钱包充值记录分页")
public CommonResult<PageResult<AppPayWalletRechargeRespVO>> getWalletRechargePage(@Valid PageParam pageReqVO) {
PageResult<PayWalletRechargeDO> pageResult = walletRechargeService.getWalletRechargePackagePage(
getLoginUserId(), UserTypeEnum.MEMBER.getValue(), pageReqVO, true);
if (CollUtil.isEmpty(pageResult.getList())) {
return success(PageResult.empty(pageResult.getTotal()));
}
// 拼接数据
List<PayOrderDO> payOrderList = payOrderService.getOrderList(
convertList(pageResult.getList(), PayWalletRechargeDO::getPayOrderId));
return success(PayWalletRechargeConvert.INSTANCE.convertPage(pageResult, payOrderList));
}
}

View File

@@ -1,42 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import com.tashow.cloud.pay.controller.app.wallet.vo.recharge.AppPayWalletPackageRespVO;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletRechargePackageDO;
import com.tashow.cloud.pay.service.wallet.PayWalletRechargePackageService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Comparator;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "用户 APP - 钱包充值套餐")
@RestController
@RequestMapping("/pay/wallet-recharge-package")
@Validated
@Slf4j
public class AppPayWalletRechargePackageController {
@Resource
private PayWalletRechargePackageService walletRechargePackageService;
@GetMapping("/list")
@Operation(summary = "获得钱包充值套餐列表")
public CommonResult<List<AppPayWalletPackageRespVO>> getWalletRechargePackageList() {
List<PayWalletRechargePackageDO> list = walletRechargePackageService.getWalletRechargePackageList(
CommonStatusEnum.ENABLE.getStatus());
list.sort(Comparator.comparingInt(PayWalletRechargePackageDO::getPayPrice));
return success(BeanUtils.toBean(list, AppPayWalletPackageRespVO.class));
}
}

View File

@@ -1,60 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import com.tashow.cloud.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionPageReqVO;
import com.tashow.cloud.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionRespVO;
import com.tashow.cloud.pay.controller.app.wallet.vo.transaction.AppPayWalletTransactionSummaryRespVO;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletTransactionDO;
import com.tashow.cloud.pay.service.wallet.PayWalletTransactionService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
@Tag(name = "用户 APP - 钱包余额明细")
@RestController
@RequestMapping("/pay/wallet-transaction")
@Validated
@Slf4j
public class AppPayWalletTransactionController {
@Resource
private PayWalletTransactionService payWalletTransactionService;
@GetMapping("/page")
@Operation(summary = "获得钱包流水分页")
public CommonResult<PageResult<AppPayWalletTransactionRespVO>> getWalletTransactionPage(
@Valid AppPayWalletTransactionPageReqVO pageReqVO) {
PageResult<PayWalletTransactionDO> pageResult = payWalletTransactionService.getWalletTransactionPage(
getLoginUserId(), UserTypeEnum.MEMBER.getValue(), pageReqVO);
return success(BeanUtils.toBean(pageResult, AppPayWalletTransactionRespVO.class));
}
@GetMapping("/get-summary")
@Operation(summary = "获得钱包流水统计")
@Parameter(name = "times", description = "时间段", required = true)
public CommonResult<AppPayWalletTransactionSummaryRespVO> getWalletTransactionSummary(
@RequestParam("createTime") @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) LocalDateTime[] createTime) {
AppPayWalletTransactionSummaryRespVO summary = payWalletTransactionService.getWalletTransactionSummary(
getLoginUserId(), UserTypeEnum.MEMBER.getValue(), createTime);
return success(summary);
}
}

View File

@@ -1,20 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet.vo.recharge;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "用户 APP - 用户充值套餐 Response VO")
@Data
public class AppPayWalletPackageRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
private Long id;
@Schema(description = "套餐名", requiredMode = Schema.RequiredMode.REQUIRED, example = "小套餐")
private String name;
@Schema(description = "支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
private Integer payPrice;
@Schema(description = "赠送金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "20")
private Integer bonusPrice;
}

View File

@@ -1,26 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet.vo.recharge;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.AssertTrue;
import jakarta.validation.constraints.Min;
import lombok.Data;
import java.util.Objects;
@Schema(description = "用户 APP - 创建钱包充值 Request VO")
@Data
public class AppPayWalletRechargeCreateReqVO {
@Schema(description = "支付金额", example = "1000")
@Min(value = 1, message = "支付金额必须大于零")
private Integer payPrice;
@Schema(description = "充值套餐编号", example = "1024")
private Long packageId;
@AssertTrue(message = "充值金额和充钱套餐不能同时为空")
public boolean isValidPayPriceAndPackageId() {
return Objects.nonNull(payPrice) || Objects.nonNull(packageId);
}
}

View File

@@ -1,16 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet.vo.recharge;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "用户 APP - 创建钱包充值 Resp VO")
@Data
public class AppPayWalletRechargeCreateRespVO {
@Schema(description = "钱包充值编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Long payOrderId;
}

View File

@@ -1,42 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet.vo.recharge;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "用户 APP - 钱包充值记录 Resp VO")
@Data
public class AppPayWalletRechargeRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Long id;
@Schema(description = "用户实际到账余额", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer totalPrice;
@Schema(description = "实际支付金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "20")
private Integer payPrice;
@Schema(description = "钱包赠送金额", requiredMode = Schema.RequiredMode.REQUIRED, example = "80")
private Integer bonusPrice;
@Schema(description = "支付成功的支付渠道", requiredMode = Schema.RequiredMode.REQUIRED)
private String payChannelCode;
@Schema(description = "支付渠道名", example = "微信小程序支付")
private String payChannelName;
@Schema(description = "支付订单编号", requiredMode = Schema.RequiredMode.REQUIRED)
private Long payOrderId;
@Schema(description = "支付成功的外部订单号", requiredMode = Schema.RequiredMode.REQUIRED)
private String payOrderChannelOrderNo; // 从 PayOrderDO 的 channelOrderNo 字段
@Schema(description = "订单支付时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime payTime;
@Schema(description = "退款状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
private Integer refundStatus;
}

View File

@@ -1,31 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet.vo.transaction;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
@Schema(description = "用户 APP - 钱包流水分页 Request VO")
@Data
public class AppPayWalletTransactionPageReqVO extends PageParam {
/**
* 类型 - 收入
*/
public static final Integer TYPE_INCOME = 1;
/**
* 类型 - 支出
*/
public static final Integer TYPE_EXPENSE = 2;
@Schema(description = "类型", example = "1")
private Integer type;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@@ -1,24 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet.vo.transaction;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
@Schema(description = "用户 APP - 钱包流水分页 Response VO")
@Data
public class AppPayWalletTransactionRespVO {
@Schema(description = "业务分类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
private Integer bizType;
@Schema(description = "交易金额,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Long price;
@Schema(description = "流水标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "土豆土豆")
private String title;
@Schema(description = "交易时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
}

View File

@@ -1,16 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet.vo.transaction;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "用户 APP - 钱包流水统计 Request VO")
@Data
public class AppPayWalletTransactionSummaryRespVO {
@Schema(description = "累计支出,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000")
private Integer totalExpense;
@Schema(description = "累计收入,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000")
private Integer totalIncome;
}

View File

@@ -1,19 +0,0 @@
package com.tashow.cloud.pay.controller.app.wallet.vo.wallet;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "用户 APP - 用户钱包 Response VO")
@Data
public class AppPayWalletRespVO {
@Schema(description = "钱包余额,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
private Integer balance;
@Schema(description = "累计支出,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000")
private Integer totalExpense;
@Schema(description = "累计充值,单位分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000")
private Integer totalRecharge;
}

View File

@@ -1,7 +1,7 @@
package com.tashow.cloud.pay.convert.app;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.collection.CollectionUtils;
import com.tashow.cloud.pay.controller.admin.app.vo.PayAppCreateReqVO;
import com.tashow.cloud.pay.controller.admin.app.vo.PayAppPageItemRespVO;
import com.tashow.cloud.pay.controller.admin.app.vo.PayAppRespVO;

View File

@@ -1,6 +1,6 @@
package com.tashow.cloud.pay.convert.channel;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.channel.vo.PayChannelCreateReqVO;
import com.tashow.cloud.pay.controller.admin.channel.vo.PayChannelRespVO;
import com.tashow.cloud.pay.controller.admin.channel.vo.PayChannelUpdateReqVO;
@@ -20,7 +20,7 @@ public interface PayChannelConvert {
@Mapping(target = "config",ignore = true)
PayChannelDO convert(PayChannelUpdateReqVO bean);
@Mapping(target = "config",expression = "java(cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString(bean.getConfig()))")
@Mapping(target = "config",expression = "java(com.tashow.cloud.common.util.json.JsonUtils.toJsonString(bean.getConfig()))")
PayChannelRespVO convert(PayChannelDO bean);
PageResult<PayChannelRespVO> convertPage(PageResult<PayChannelDO> page);

View File

@@ -1,26 +0,0 @@
package com.tashow.cloud.pay.convert.demo;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.demo.vo.order.PayDemoOrderCreateReqVO;
import com.tashow.cloud.pay.controller.admin.demo.vo.order.PayDemoOrderRespVO;
import com.tashow.cloud.pay.dal.dataobject.demo.PayDemoOrderDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* 示例订单 Convert
*
* @author 芋道源码
*/
@Mapper
public interface PayDemoOrderConvert {
PayDemoOrderConvert INSTANCE = Mappers.getMapper(PayDemoOrderConvert.class);
PayDemoOrderDO convert(PayDemoOrderCreateReqVO bean);
PayDemoOrderRespVO convert(PayDemoOrderDO bean);
PageResult<PayDemoOrderRespVO> convertPage(PageResult<PayDemoOrderDO> page);
}

View File

@@ -1,21 +0,0 @@
package com.tashow.cloud.pay.convert.demo;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.demo.vo.transfer.PayDemoTransferCreateReqVO;
import com.tashow.cloud.pay.controller.admin.demo.vo.transfer.PayDemoTransferRespVO;
import com.tashow.cloud.pay.dal.dataobject.demo.PayDemoTransferDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
/**
* @author jason
*/
@Mapper
public interface PayDemoTransferConvert {
PayDemoTransferConvert INSTANCE = Mappers.getMapper(PayDemoTransferConvert.class);
PayDemoTransferDO convert(PayDemoTransferCreateReqVO bean);
PageResult<PayDemoTransferRespVO> convertPage(PageResult<PayDemoTransferDO> pageResult);
}

View File

@@ -1,7 +1,7 @@
package com.tashow.cloud.pay.convert.notify;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.collection.MapUtils;
import com.tashow.cloud.pay.controller.admin.notify.vo.PayNotifyTaskDetailRespVO;
import com.tashow.cloud.pay.controller.admin.notify.vo.PayNotifyTaskRespVO;
import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;

View File

@@ -1,18 +1,16 @@
package com.tashow.cloud.pay.convert.order;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderUnifiedReqDTO;
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderCreateReqDTO;
import cn.iocoder.yudao.module.pay.api.order.dto.PayOrderRespDTO;
import cn.iocoder.yudao.module.pay.controller.admin.order.vo.*;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.collection.CollectionUtils;
import com.tashow.cloud.common.util.collection.MapUtils;
import com.tashow.cloud.pay.controller.admin.order.vo.*;
import com.tashow.cloud.payapi.controller.admin.order.vo.*;
import com.tashow.cloud.pay.controller.app.order.vo.AppPayOrderSubmitRespVO;
import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;
import com.tashow.cloud.pay.dal.dataobject.order.PayOrderDO;
import com.tashow.cloud.pay.dal.dataobject.order.PayOrderExtensionDO;
import com.tashow.cloud.payapi.api.order.dto.PayOrderCreateReqDTO;
import com.tashow.cloud.sdk.payment.dto.order.PayOrderRespDTO;
import com.tashow.cloud.sdk.payment.dto.order.PayOrderUnifiedReqDTO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@@ -69,7 +67,7 @@ public interface PayOrderConvert {
PayOrderUnifiedReqDTO convert2(PayOrderSubmitReqVO reqVO, String userIp);
@Mapping(source = "order.status", target = "status")
PayOrderSubmitRespVO convert(PayOrderDO order, cn.iocoder.yudao.framework.pay.core.client.dto.order.PayOrderRespDTO respDTO);
PayOrderSubmitRespVO convert(PayOrderDO order, PayOrderRespDTO respDTO);
AppPayOrderSubmitRespVO convert3(PayOrderSubmitRespVO bean);

View File

@@ -1,16 +1,16 @@
package com.tashow.cloud.pay.convert.refund;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundCreateReqDTO;
import cn.iocoder.yudao.module.pay.api.refund.dto.PayRefundRespDTO;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.collection.CollectionUtils;
import com.tashow.cloud.common.util.collection.MapUtils;
import com.tashow.cloud.pay.controller.admin.refund.vo.PayRefundDetailsRespVO;
import com.tashow.cloud.pay.controller.admin.refund.vo.PayRefundExcelVO;
import com.tashow.cloud.pay.controller.admin.refund.vo.PayRefundPageItemRespVO;
import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;
import com.tashow.cloud.pay.dal.dataobject.order.PayOrderDO;
import com.tashow.cloud.pay.dal.dataobject.refund.PayRefundDO;
import com.tashow.cloud.payapi.api.refund.dto.PayRefundCreateReqDTO;
import com.tashow.cloud.payapi.api.refund.dto.PayRefundRespDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

View File

@@ -1,13 +1,12 @@
package com.tashow.cloud.pay.convert.transfer;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.pay.core.client.dto.transfer.PayTransferUnifiedReqDTO;
import cn.iocoder.yudao.module.pay.api.transfer.dto.PayTransferCreateReqDTO;
import com.tashow.cloud.pay.controller.admin.demo.vo.transfer.PayDemoTransferCreateReqVO;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.transfer.vo.PayTransferCreateReqVO;
import com.tashow.cloud.pay.controller.admin.transfer.vo.PayTransferPageItemRespVO;
import com.tashow.cloud.pay.controller.admin.transfer.vo.PayTransferRespVO;
import com.tashow.cloud.pay.dal.dataobject.transfer.PayTransferDO;
import com.tashow.cloud.payapi.api.transfer.dto.PayTransferCreateReqDTO;
import com.tashow.cloud.sdk.payment.dto.transfer.PayTransferUnifiedReqDTO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@@ -22,8 +21,6 @@ public interface PayTransferConvert {
PayTransferCreateReqDTO convert(PayTransferCreateReqVO vo);
PayTransferCreateReqDTO convert(PayDemoTransferCreateReqVO vo);
PayTransferRespVO convert(PayTransferDO bean);
PageResult<PayTransferPageItemRespVO> convertPage(PageResult<PayTransferDO> pageResult);

View File

@@ -1,21 +0,0 @@
package com.tashow.cloud.pay.convert.wallet;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.wallet.vo.wallet.PayWalletRespVO;
import com.tashow.cloud.pay.controller.app.wallet.vo.wallet.AppPayWalletRespVO;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface PayWalletConvert {
PayWalletConvert INSTANCE = Mappers.getMapper(PayWalletConvert.class);
AppPayWalletRespVO convert(PayWalletDO bean);
PayWalletRespVO convert02(PayWalletDO bean);
PageResult<PayWalletRespVO> convertPage(PageResult<PayWalletDO> page);
}

View File

@@ -1,43 +0,0 @@
package com.tashow.cloud.pay.convert.wallet;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
import com.tashow.cloud.pay.controller.app.wallet.vo.recharge.AppPayWalletRechargeCreateRespVO;
import com.tashow.cloud.pay.controller.app.wallet.vo.recharge.AppPayWalletRechargeRespVO;
import com.tashow.cloud.pay.dal.dataobject.order.PayOrderDO;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletRechargeDO;
import cn.iocoder.yudao.module.pay.enums.DictTypeConstants;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
import java.util.Map;
@Mapper
public interface PayWalletRechargeConvert {
PayWalletRechargeConvert INSTANCE = Mappers.getMapper(PayWalletRechargeConvert.class);
@Mapping(target = "totalPrice", expression = "java( payPrice + bonusPrice)")
PayWalletRechargeDO convert(Long walletId, Integer payPrice, Integer bonusPrice, Long packageId);
AppPayWalletRechargeCreateRespVO convert(PayWalletRechargeDO bean);
default PageResult<AppPayWalletRechargeRespVO> convertPage(PageResult<PayWalletRechargeDO> pageResult,
List<PayOrderDO> payOrderList) {
PageResult<AppPayWalletRechargeRespVO> voPageResult = BeanUtils.toBean(pageResult, AppPayWalletRechargeRespVO.class);
Map<Long, PayOrderDO> payOrderMap = CollectionUtils.convertMap(payOrderList, PayOrderDO::getId);
voPageResult.getList().forEach(recharge -> {
recharge.setPayChannelName(DictFrameworkUtils.getDictDataLabel(
DictTypeConstants.CHANNEL_CODE, recharge.getPayChannelCode()));
MapUtils.findAndThen(payOrderMap, recharge.getPayOrderId(),
order -> recharge.setPayOrderChannelOrderNo(order.getChannelOrderNo()));
});
return voPageResult;
}
}

View File

@@ -1,28 +0,0 @@
package com.tashow.cloud.pay.convert.wallet;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage.WalletRechargePackageCreateReqVO;
import com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage.WalletRechargePackageRespVO;
import com.tashow.cloud.pay.controller.admin.wallet.vo.rechargepackage.WalletRechargePackageUpdateReqVO;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletRechargePackageDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface PayWalletRechargePackageConvert {
PayWalletRechargePackageConvert INSTANCE = Mappers.getMapper(PayWalletRechargePackageConvert.class);
PayWalletRechargePackageDO convert(WalletRechargePackageCreateReqVO bean);
PayWalletRechargePackageDO convert(WalletRechargePackageUpdateReqVO bean);
WalletRechargePackageRespVO convert(PayWalletRechargePackageDO bean);
List<WalletRechargePackageRespVO> convertList(List<PayWalletRechargePackageDO> list);
PageResult<WalletRechargePackageRespVO> convertPage(PageResult<PayWalletRechargePackageDO> page);
}

View File

@@ -1,19 +0,0 @@
package com.tashow.cloud.pay.convert.wallet;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import com.tashow.cloud.pay.controller.admin.wallet.vo.transaction.PayWalletTransactionRespVO;
import com.tashow.cloud.pay.dal.dataobject.wallet.PayWalletTransactionDO;
import com.tashow.cloud.pay.service.wallet.bo.WalletTransactionCreateReqBO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface PayWalletTransactionConvert {
PayWalletTransactionConvert INSTANCE = Mappers.getMapper(PayWalletTransactionConvert.class);
PageResult<PayWalletTransactionRespVO> convertPage2(PageResult<PayWalletTransactionDO> page);
PayWalletTransactionDO convert(WalletTransactionCreateReqBO bean);
}

View File

@@ -1,10 +1,9 @@
package com.tashow.cloud.pay.dal.dataobject.app;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tashow.cloud.common.enums.CommonStatusEnum;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
import lombok.*;
/**
@@ -14,10 +13,8 @@ import lombok.*;
*
* 即 PayMerchantDO : PayAppDO = 1 : n
*
* @author 芋道源码
*/
@TableName("pay_app")
@KeySequence("pay_app_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)

View File

@@ -1,14 +1,13 @@
package com.tashow.cloud.pay.dal.dataobject.channel;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.pay.core.client.PayClientConfig;
import cn.iocoder.yudao.framework.pay.core.enums.channel.PayChannelEnum;
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.tashow.cloud.common.enums.CommonStatusEnum;
import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;
import com.tashow.cloud.sdk.payment.client.PayClientConfig;
import com.tashow.cloud.sdk.payment.enums.channel.PayChannelEnum;
import com.tashow.cloud.tenant.core.db.TenantBaseDO;
import lombok.*;
/**
@@ -17,10 +16,8 @@ import lombok.*;
*
* 即 PayAppDO : PayChannelDO = 1 : n
*
* @author 芋道源码
*/
@TableName(value = "pay_channel", autoResultMap = true)
@KeySequence("pay_channel_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)

View File

@@ -1,87 +0,0 @@
package com.tashow.cloud.pay.dal.dataobject.demo;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.time.LocalDateTime;
/**
* 示例订单
*
* 演示业务系统的订单,如何接入 pay 系统的支付与退款
*
* @author 芋道源码
*/
@TableName("pay_demo_order")
@KeySequence("pay_demo_order_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PayDemoOrderDO extends BaseDO {
/**
* 订单编号,自增
*/
@TableId
private Long id;
/**
* 用户编号
*/
private Long userId;
/**
* 商品编号
*/
private Long spuId;
/**
* 商品名称
*/
private String spuName;
/**
* 价格,单位:分
*/
private Integer price;
// ========== 支付相关字段 ==========
/**
* 是否支付
*/
private Boolean payStatus;
/**
* 支付订单编号
*
* 对接 pay-module-biz 支付服务的支付订单编号,即 PayOrderDO 的 id 编号
*/
private Long payOrderId;
/**
* 付款时间
*/
private LocalDateTime payTime;
/**
* 支付渠道
*
* 对应 PayChannelEnum 枚举
*/
private String payChannelCode;
// ========== 退款相关字段 ==========
/**
* 支付退款单号
*/
private Long payRefundId;
/**
* 退款金额,单位:分
*/
private Integer refundPrice;
/**
* 退款完成时间
*/
private LocalDateTime refundTime;
}

Some files were not shown because too many files have changed in this diff Show More