diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/package-info.java new file mode 100644 index 000000000..da3973390 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/package-info.java @@ -0,0 +1,6 @@ +/** + * 提供 POJO 类的实体转换 + * + * 目前使用 MapStruct 框架 + */ +package cn.iocoder.yudao.adminserver.modules.pay.convert; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md new file mode 100644 index 000000000..8153487b7 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/convert/《芋道 Spring Boot 对象转换 MapStruct 入门》.md @@ -0,0 +1 @@ + diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayAppDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayAppDO.java new file mode 100644 index 000000000..eefdca682 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayAppDO.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +/** + * 支付应用 DO + * 一个商户下,可能会有多个支付应用。例如说,京东有京东商城、京东到家等等 + * 不过一般来说,一个商户,只有一个应用哈~ + * + * 即 PayMerchantDO : PayAppDO = 1 : n + * + * @author 芋道源码 + */ +@Data +public class PayAppDO extends BaseDO { + + /** + * 应用编号,数据库自增 + */ + @TableId + private Long id; + /** + * 应用号 + * 例如说,60cc81e0e4b06afc4d3f0cfq + */ + private String no; + /** + * 应用名 + */ + private String name; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + /** + * 应用私钥 + * TODO 芋艿:用途 + */ + private String secret; + + /** + * 商户编号 + * + * 关联 {@link PayMerchantDO#getId()} + */ + private Long merchantId; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayChannelDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayChannelDO.java new file mode 100644 index 000000000..190debdab --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayChannelDO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant; + +import cn.iocoder.yudao.adminserver.modules.pay.enums.PayChannelCodeEnum; +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import lombok.Data; + +/** + * 支付渠道 DO + * 一个应用下,会有多种支付渠道,例如说微信支付、支付宝支付等等 + * + * 即 PayAppDO : PayChannelDO = 1 : n + * + * @author 芋道源码 + */ +@Data +public class PayChannelDO extends BaseDO { + + /** + * 渠道编号,数据库自增 + */ + private Long id; + /** + * 渠道编码 + * + * 枚举 {@link PayChannelCodeEnum} + */ + private String code; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 渠道费率,单位:百分比 + */ + private Double feeRate; + + /** + * 商户编号 + * + * 关联 {@link PayMerchantDO#getId()} + */ + private Long merchantId; + /** + * 应用编号 + * + * 关联 {@link PayAppDO#getId()} + */ + private String appId; + + // TODO 芋艿:不同渠道的配置。暂时考虑硬编码 + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayMerchantDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayMerchantDO.java new file mode 100644 index 000000000..0d64d4c3a --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/merchant/PayMerchantDO.java @@ -0,0 +1,46 @@ +package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant; + +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; + +/** + * 商户信息 DO + * 目前暂时没有特别的用途,主要为未来多商户提供基础。 + * + * @author 芋道源码 + */ +@Data +public class PayMerchantDO extends BaseDO { + + /** + * 商户编号,数据库自增 + */ + @TableId + private Long id; + /** + * 商户号 + * 例如说,M233666999 + */ + private String no; + /** + * 商户全称 + */ + private String name; + /** + * 商户简称 + */ + private String shortName; + /** + * 状态 + * + * 枚举 {@link CommonStatusEnum} + */ + private Integer status; + /** + * 备注 + */ + private String remark; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayNotifyDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayNotifyDO.java new file mode 100644 index 000000000..110e1a082 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayNotifyDO.java @@ -0,0 +1,15 @@ +package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.order; + +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import lombok.Data; + +/** + * 商户支付、退款等的通知 + * 在支付系统收到支付渠道的支付、退款的结果后,需要不断的通知到业务系统,直到成功。 + * TODO 芋艿:待完善 + * + * @author 芋道源码 + */ +@Data +public class PayNotifyDO extends BaseDO { +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayOrderDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayOrderDO.java new file mode 100644 index 000000000..88c0012a9 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayOrderDO.java @@ -0,0 +1,167 @@ +package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.order; + +import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.adminserver.modules.pay.enums.PayChannelCodeEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import lombok.Data; + +import java.util.Date; + +/** + * 支付订单 DO + * + * @author 芋道源码 + */ +@Data +public class PayOrderDO extends BaseDO { + + /** + * 订单编号,数据库自增 + */ + private Long id; + /** + * 订单号,根据规则生成 + * + * 例如说,P202110132239124200055 + */ + private String no; + /** + * 商户编号 + * + * 关联 {@link PayMerchantDO#getId()} + */ + private Long merchantId; + /** + * 应用编号 + * + * 关联 {@link PayAppDO#getId()} + */ + private Long appId; + /** + * 渠道编号 + * + * 关联 {@link PayChannelDO#getMerchantId()} + */ + private Long channelId; + /** + * 商户编码 + * + * 枚举 {@link PayChannelCodeEnum} + */ + private String channelCode; + + // ========== 商户相关字段 ========== + + /** + * 商户订单号 + * 例如说,内部系统 A 的订单号。需要保证每个 PayMerchantDO 唯一 TODO 芋艿:需要在测试下 + */ + private String merchantOrderNo; + /** + * 商品标题 + */ + private String subject; + /** + * 商品描述信息 + */ + private String body; + /** + * 商户拓展参数 + */ + private String merchantExtra; + /** + * 通知商户支付结果的回调状态 + * TODO 芋艿:0 未发送 1 已发送 + */ + private Integer notifyStatus; + + // ========== 订单相关字段 ========== + + /** + * 支付金额,单位:分 + */ + private Long amount; + /** + * 渠道手续费 + * + * 冗余 {@link PayChannelDO#getFeeRate()} + */ + private Double channelFeeRate; + /** + * 渠道手续金额 + */ + private Long channelFeeAmount; + /** + * 支付状态 + * + * TODO 芋艿:状态枚举 + */ + private Integer status; + /** + * 客户端 IP + */ + private String clientIp; + /** + * 订单支付成功时间 + */ + private Date successTime; + /** + * 订单失效时间 + */ + private Date expiredTime; + /** + * 支付渠道的额外参数 + * + * 参见 https://www.pingxx.com/api/支付渠道%20extra%20参数说明.html + */ + private String channelExtra; + /** + * 异步通知地址 + */ + private String notifyUrl; + /** + * 页面跳转地址 + */ + private String returnUrl; + + // TODO 芋艿:可能要优化 + /** + * 渠道支付错误码 + */ + private String errorCode; + /** + * 渠道支付错误消息 + */ + private String errorMessage; + + // ========== 退款相关字段 ========== + /** + * 退款状态 + * + * TODO 芋艿:0 - 未退款;1 - 部分退款; 2 - 全额退款 + */ + private Integer refundStatus; + /** + * 退款次数 + */ + private Integer refundTimes; + /** + * 退款总金额,单位:分 + */ + private Long refundAmount; + + // ========== 渠道相关字段 ========== + /** + * 渠道用户编号 + * + * 例如说,微信 openid、支付宝账号 + */ + private String channelUserId; + /** + * 渠道订单号 + */ + private String channelOrderNo; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayRefundDO.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayRefundDO.java new file mode 100644 index 000000000..375fee5b4 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/order/PayRefundDO.java @@ -0,0 +1,133 @@ +package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.order; + +import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayAppDO; +import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayChannelDO; +import cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject.merchant.PayMerchantDO; +import cn.iocoder.yudao.adminserver.modules.pay.enums.PayChannelCodeEnum; +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import lombok.Data; + +import java.util.Date; + +/** + * 支付退款单 DO + * 一个支付订单,可以拥有多个支付退款单 + * + * 即 PayOrderDO : PayRefundDO = 1 : n + * + * @author 芋道源码 + */ +@Data +public class PayRefundDO extends BaseDO { + + /** + * 退款单编号,数据库自增 + */ + private Long id; + /** + * 退款单号,根据规则生成 + * + * 例如说,R202109181134287570000 + */ + private String no; + /** + * 商户编号 + * + * 关联 {@link PayMerchantDO#getId()} + */ + private Long merchantId; + /** + * 应用编号 + * + * 关联 {@link PayAppDO#getId()} + */ + private Long appId; + /** + * 渠道编号 + * + * 关联 {@link PayChannelDO#getMerchantId()} + */ + private Long channelId; + /** + * 商户编码 + * + * 枚举 {@link PayChannelCodeEnum} + */ + private String channelCode; + /** + * 订单编号 + * + * 关联 {@link PayOrderDO#getId()} + */ + private Long orderId; + + // ========== 商户相关字段 ========== + /** + * 商户退款订单号 + * 例如说,内部系统 A 的退款订单号。需要保证每个 PayMerchantDO 唯一 TODO 芋艿:需要在测试下 + */ + private String merchantRefundNo; + /** + * 商户拓展参数 + */ + private String merchantExtra; + + // ========== 退款相关字段 ========== + /** + * 退款状态 + * + * TODO 芋艿:状态枚举 + */ + private Integer status; + /** + * 客户端 IP + */ + private String clientIp; + /** + * 退款金额,单位:分 + */ + private Long amount; + /** + * 退款原因 + */ + private String reason; + /** + * 订单退款成功时间 + */ + private Date successTime; + /** + * 退款失效时间 + */ + private Date expiredTime; + /** + * 支付渠道的额外参数 + * + * 参见 https://www.pingxx.com/api/Refunds%20退款概述.html + */ + private String channelExtra; + /** + * 异步通知地址 + */ + private String notifyUrl; + + // TODO 芋艿:可能要优化 + /** + * 渠道支付错误码 + */ + private String errorCode; + /** + * 渠道支付错误消息 + */ + private String errorMessage; + + // ========== 渠道相关字段 ========== + /** + * 渠道订单号 + */ + private String channelOrderNo; + /** + * 渠道退款号 + */ + private String channelRefundNo; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/package-info.java new file mode 100644 index 000000000..b89b77f7e --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/dal/dataobject/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.yudao.adminserver.modules.pay.dal.dataobject; diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/enums/PayChannelCodeEnum.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/enums/PayChannelCodeEnum.java new file mode 100644 index 000000000..5a1140eb1 --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/enums/PayChannelCodeEnum.java @@ -0,0 +1,28 @@ +package cn.iocoder.yudao.adminserver.modules.pay.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 支付渠道的编码的枚举 + * + * @author 芋道源码 + */ +@Getter +@AllArgsConstructor +public enum PayChannelCodeEnum { + + wx_pub("wx_pub", "微信 JSAPI 支付"); + + /** + * 编码 + * + * 参考 https://www.pingxx.com/api/支付渠道属性值.html + */ + private String code; + /** + * 名字 + */ + private String name; + +} diff --git a/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/package-info.java b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/package-info.java new file mode 100644 index 000000000..a113b9beb --- /dev/null +++ b/yudao-admin-server/src/main/java/cn/iocoder/yudao/adminserver/modules/pay/package-info.java @@ -0,0 +1,7 @@ +/** + * pay 包下,我们放支付业务,提供业务的支付能力。 + * 例如说:商户、应用、支付、退款等等 + * + * 缩写:pay + */ +package cn.iocoder.yudao.adminserver.modules.pay; diff --git a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java index 114ebf23a..4cd4ebf40 100644 --- a/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java +++ b/yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/infra/dal/dataobject/logger/InfApiErrorLogDO.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.coreservice.modules.infra.dal.dataobject.logger; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.coreservice.modules.infra.enums.logger.InfApiErrorLogProcessStatusEnum; +import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; @@ -25,6 +26,7 @@ public class InfApiErrorLogDO extends BaseDO { /** * 编号 */ + @TableId private Long id; /** * 用户编号