feat: integrate unified payment and wallet refunds

This commit is contained in:
2026-08-02 23:24:32 +08:00
parent f0b8af0bc8
commit 82a2106a97
64 changed files with 1519 additions and 254 deletions

View File

@@ -6,7 +6,7 @@ import "git.apinb.com/bsm-sdk/core/database"
type GasorderPayment struct {
Entity // 公共实体字段Status 保存支付尝试状态
GasorderBasicID uint64 `gorm:"column:gasorder_basic_id;not null;index;uniqueIndex:idx_gasorder_payment_attempt" json:"gasorder_basic_id"` // 订单自增主键
WalletPaymentID uint64 `gorm:"column:wallet_payment_id;not null;uniqueIndex" json:"wallet_payment_id"` // 钱包支付记录自增主键
PaymentOrderID uint64 `gorm:"column:payment_order_id;not null;uniqueIndex" json:"payment_order_id"` // 钱包支付记录自增主键
AttemptNo int `gorm:"column:attempt_no;not null;uniqueIndex:idx_gasorder_payment_attempt" json:"attempt_no"` // 支付尝试序号
Amount int64 `gorm:"column:amount;not null;check:amount > 0" json:"amount"` // 支付金额,单位分
}

View File

@@ -0,0 +1,34 @@
package models
import (
"time"
"git.apinb.com/bsm-sdk/core/database"
)
// PaymentOrder 对应 payment_order是全项目唯一的支付尝试事实。
type PaymentOrder struct {
Entity // 公共实体字段
PaymentStatus int `gorm:"column:payment_status;not null;default:10;index" json:"payment_status"` // 10待支付、20确认中、23成功、30关闭、40失败、50异常
PaymentNo string `gorm:"column:payment_no;type:varchar(64);not null;uniqueIndex" json:"payment_no"` // 平台支付单号
RequestNo string `gorm:"column:request_no;type:varchar(128);not null;uniqueIndex:idx_payment_request" json:"request_no"` // 客户端幂等请求号
BusinessType string `gorm:"column:business_type;type:varchar(32);not null;index;uniqueIndex:idx_payment_request" json:"business_type"` // 业务类型
BusinessIdentity string `gorm:"column:business_identity;type:varchar(36);not null;index" json:"business_identity"` // 业务对象标识
UserIdentity string `gorm:"column:user_identity;type:varchar(36);not null;index" json:"user_identity"` // 付款用户标识
MerchantIdentity string `gorm:"column:merchant_identity;type:varchar(36);not null;default:'platform';index" json:"merchant_identity"` // 商户配置标识
Channel string `gorm:"column:channel;type:varchar(32);not null;index" json:"channel"` // 支付渠道
PayType string `gorm:"column:pay_type;type:varchar(32);not null" json:"pay_type"` // 渠道支付产品
ChannelTradeNo string `gorm:"column:channel_trade_no;type:varchar(128);not null;default:'';uniqueIndex:idx_payment_channel_trade,where:channel_trade_no <> ''" json:"channel_trade_no"` // 渠道交易号
Amount int64 `gorm:"column:amount;not null;check:amount > 0" json:"amount"` // 实付金额,单位分
Subject string `gorm:"column:subject;type:varchar(256);not null" json:"subject"` // 渠道订单标题
ClientArgs string `gorm:"column:client_args;type:text;not null;default:''" json:"-"` // 客户端调起参数
CallbackDigest string `gorm:"column:callback_digest;type:varchar(64);not null;default:''" json:"-"` // 回调原文摘要
FailureCode string `gorm:"column:failure_code;type:varchar(64);not null;default:''" json:"failure_code"` // 稳定失败码
FailureMessage string `gorm:"column:failure_message;type:varchar(512);not null;default:''" json:"failure_message"` // 脱敏失败说明
ExpiresAt time.Time `gorm:"column:expires_at;type:timestamptz;not null;index" json:"expires_at"` // 支付过期时间
PaidAt *time.Time `gorm:"column:paid_at;type:timestamptz" json:"paid_at"` // 渠道确认支付时间
ClosedAt *time.Time `gorm:"column:closed_at;type:timestamptz" json:"closed_at"` // 渠道关单时间
}
func init() { database.AppendMigrate(&PaymentOrder{}) }
func (*PaymentOrder) TableName() string { return "payment_order" }

View File

@@ -0,0 +1,45 @@
package models
import (
"time"
"git.apinb.com/bsm-sdk/core/database"
)
// PaymentRefund 对应 payment_refund保存用户发起、财务审核并退入钱包的退款申请。
type PaymentRefund struct {
Entity // 公共实体字段
RefundStatus int `gorm:"column:refund_status;not null;default:10;index" json:"refund_status"` // 10待审核、20已通过、30已驳回
PaymentOrderID uint64 `gorm:"column:payment_order_id;not null;index" json:"payment_order_id"` // 原支付单内部主键
WalletBasicID uint64 `gorm:"column:wallet_basic_id;not null;index" json:"wallet_basic_id"` // 入账钱包内部主键
RefundNo string `gorm:"column:refund_no;type:varchar(64);not null;uniqueIndex" json:"refund_no"` // 平台退款单号
RequestNo string `gorm:"column:request_no;type:varchar(128);not null;uniqueIndex:idx_refund_request" json:"request_no"` // 用户端幂等号
BusinessType string `gorm:"column:business_type;type:varchar(32);not null;index" json:"business_type"` // 原业务类型
BusinessIdentity string `gorm:"column:business_identity;type:varchar(36);not null;index" json:"business_identity"` // 原业务标识
UserIdentity string `gorm:"column:user_identity;type:varchar(36);not null;index;uniqueIndex:idx_refund_request" json:"user_identity"` // 申请用户标识
Amount int64 `gorm:"column:amount;not null;check:amount > 0" json:"amount"` // 核定退款金额,单位分
Reason string `gorm:"column:reason;type:varchar(256);not null" json:"reason"` // 用户退款原因
Description string `gorm:"column:description;type:text;not null;default:''" json:"description"` // 用户补充说明
ReviewRemark string `gorm:"column:review_remark;type:text;not null;default:''" json:"review_remark"` // 财务审核说明
ReviewerIdentity string `gorm:"column:reviewer_identity;type:varchar(36);not null;default:''" json:"reviewer_identity"` // 审核人标识
ReviewedAt *time.Time `gorm:"column:reviewed_at;type:timestamptz" json:"reviewed_at"` // 审核时间
CompletedAt *time.Time `gorm:"column:completed_at;type:timestamptz" json:"completed_at"` // 钱包入账完成时间
}
func init() { database.AppendMigrate(&PaymentRefund{}) }
func (*PaymentRefund) TableName() string { return "payment_refund" }
// PaymentRefundItem 对应 payment_refund_item保存退款订单项、数量和服务端核定金额。
type PaymentRefundItem struct {
ID uint64 `gorm:"column:id;primaryKey;autoIncrement" json:"id"` // 数据库自增主键
Identity string `gorm:"column:identity;type:varchar(36);not null;uniqueIndex" json:"identity"` // 对外退款明细标识
PaymentRefundID uint64 `gorm:"column:payment_refund_id;not null;index" json:"payment_refund_id"` // 退款申请内部主键
OrderItemIdentity string `gorm:"column:order_item_identity;type:varchar(36);not null;index" json:"order_item_identity"` // 原订单项标识
Quantity int `gorm:"column:quantity;not null;check:quantity > 0" json:"quantity"` // 退款数量
Amount int64 `gorm:"column:amount;not null;check:amount >= 0" json:"amount"` // 分摊退款金额,单位分
CreatedAt time.Time `gorm:"column:created_at;type:timestamptz;not null" json:"created_at"` // 创建时间
UpdatedAt time.Time `gorm:"column:updated_at;type:timestamptz;not null" json:"updated_at"` // 更新时间
}
func init() { database.AppendMigrate(&PaymentRefundItem{}) }
func (*PaymentRefundItem) TableName() string { return "payment_refund_item" }

View File

@@ -14,8 +14,8 @@ func TestBusinessModelsUseDedicatedStatusFields(t *testing.T) {
{GasorderBasic{}, "OrderStatus"},
{ProductInfo{}, "ProductStatus"},
{EcOrder{}, "OrderStatus"},
{WalletPayment{}, "PaymentStatus"},
{WalletRefund{}, "RefundStatus"},
{PaymentOrder{}, "PaymentStatus"},
{PaymentRefund{}, "RefundStatus"},
{WalletApplyCash{}, "ApplyStatus"},
{FinPayment{}, "PaymentStatus"},
{FinReconciliation{}, "ReconciliationStatus"},

View File

@@ -1,23 +0,0 @@
package models
import "git.apinb.com/bsm-sdk/core/database"
// WalletPayment 对应 wallet_payment保存第三方或余额支付单。
type WalletPayment struct {
Entity // 公共实体字段
PaymentStatus int `gorm:"column:payment_status;not null;default:10;index" json:"payment_status"` // 支付业务状态
WalletBasicID uint64 `gorm:"column:wallet_basic_id;not null;index" json:"wallet_basic_id"` // 钱包自增主键
PaymentNo string `gorm:"column:payment_no;type:varchar(64);not null;uniqueIndex" json:"payment_no"` // 内部支付单号
OrderNo string `gorm:"column:order_no;type:varchar(128);not null;index" json:"order_no"` // 业务订单号
TradeNo string `gorm:"column:trade_no;type:varchar(128);not null;default:'';uniqueIndex:idx_wallet_payment_trade,where:trade_no <> ''" json:"trade_no"` // 第三方交易流水号
PaymentType string `gorm:"column:payment_type;type:varchar(32);not null" json:"payment_type"` // 支付业务类型
PayChannel string `gorm:"column:pay_channel;type:varchar(32);not null;uniqueIndex:idx_wallet_payment_trade,where:trade_no <> ''" json:"pay_channel"` // 支付渠道
PayType string `gorm:"column:pay_type;type:varchar(64);not null;default:''" json:"pay_type"` // 渠道支付类型
Amount int64 `gorm:"column:amount;not null;check:amount > 0" json:"amount"` // 支付金额,单位分
Args string `gorm:"column:args;type:text;not null;default:''" json:"args"` // 支付参数
Remark string `gorm:"column:remark;type:text;not null;default:''" json:"remark"` // 备注
CallbackMsg string `gorm:"column:callback_msg;type:text;not null;default:''" json:"callback_msg"` // 支付回调信息
}
func init() { database.AppendMigrate(&WalletPayment{}) }
func (table *WalletPayment) TableName() string { return "wallet_payment" }

View File

@@ -1,27 +0,0 @@
package models
import (
"time"
"git.apinb.com/bsm-sdk/core/database"
)
// WalletRefund 对应 wallet_refund保存支付退款结果。
type WalletRefund struct {
Entity // 公共实体字段
RefundStatus int `gorm:"column:refund_status;not null;default:10;index" json:"refund_status"` // 退款业务状态
WalletBasicID uint64 `gorm:"column:wallet_basic_id;not null;index" json:"wallet_basic_id"` // 钱包自增主键
WalletPaymentID uint64 `gorm:"column:wallet_payment_id;not null;index" json:"wallet_payment_id"` // 原支付记录自增主键
RefundNo string `gorm:"column:refund_no;type:varchar(64);not null;uniqueIndex" json:"refund_no"` // 内部退款单号
OrderIdentity string `gorm:"column:order_identity;type:varchar(64);not null;index" json:"order_identity"` // 订单业务标识
Amount int64 `gorm:"column:amount;not null;check:amount > 0" json:"amount"` // 退款金额,单位分
Fee int64 `gorm:"column:fee;not null;default:0;check:fee >= 0" json:"fee"` // 退款手续费,单位分
Reason string `gorm:"column:reason;type:text;not null;default:''" json:"reason"` // 退款原因
OrderInfo string `gorm:"column:order_info;type:text;not null;default:''" json:"order_info"` // 订单信息快照
Result string `gorm:"column:result;type:text;not null;default:''" json:"result"` // 第三方处理结果
TradeNo string `gorm:"column:trade_no;type:varchar(128);not null;default:'';index" json:"trade_no"` // 第三方退款流水号
CompletedAt *time.Time `gorm:"column:completed_at;type:timestamptz" json:"completed_at"` // 完成时间
}
func init() { database.AppendMigrate(&WalletRefund{}) }
func (table *WalletRefund) TableName() string { return "wallet_refund" }