141 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			141 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package entities | |||
|  | 
 | |||
|  | import ( | |||
|  | 	"time" | |||
|  | 
 | |||
|  | 	"github.com/google/uuid" | |||
|  | 	"github.com/shopspring/decimal" | |||
|  | 	"gorm.io/gorm" | |||
|  | ) | |||
|  | 
 | |||
|  | // AlipayOrderStatus 支付宝订单状态枚举 | |||
|  | type AlipayOrderStatus string | |||
|  | 
 | |||
|  | const ( | |||
|  | 	AlipayOrderStatusPending   AlipayOrderStatus = "pending"   // 待支付 | |||
|  | 	AlipayOrderStatusSuccess   AlipayOrderStatus = "success"   // 支付成功 | |||
|  | 	AlipayOrderStatusFailed    AlipayOrderStatus = "failed"    // 支付失败 | |||
|  | 	AlipayOrderStatusCancelled AlipayOrderStatus = "cancelled" // 已取消 | |||
|  | 	AlipayOrderStatusClosed    AlipayOrderStatus = "closed"    // 已关闭 | |||
|  | ) | |||
|  | 
 | |||
|  | const ( | |||
|  | 	AlipayOrderPlatformApp  = "app"  // 支付宝APP支付 | |||
|  | 	AlipayOrderPlatformH5  = "h5"   // 支付宝H5支付 | |||
|  | 	AlipayOrderPlatformPC  = "pc"   // 支付宝PC支付 | |||
|  | ) | |||
|  | 
 | |||
|  | // AlipayOrder 支付宝订单详情实体 | |||
|  | type AlipayOrder struct { | |||
|  | 	// 基础标识 | |||
|  | 	ID         string `gorm:"primaryKey;type:varchar(36)" json:"id" comment:"支付宝订单唯一标识"` | |||
|  | 	RechargeID string `gorm:"type:varchar(36);not null;uniqueIndex" json:"recharge_id" comment:"关联充值记录ID"` | |||
|  | 	OutTradeNo string `gorm:"type:varchar(64);not null;uniqueIndex" json:"out_trade_no" comment:"商户订单号"` | |||
|  | 	TradeNo    *string `gorm:"type:varchar(64);uniqueIndex" json:"trade_no,omitempty" comment:"支付宝交易号"` | |||
|  | 
 | |||
|  | 	// 订单信息 | |||
|  | 	Subject  string            `gorm:"type:varchar(200);not null" json:"subject" comment:"订单标题"` | |||
|  | 	Amount   decimal.Decimal   `gorm:"type:decimal(20,8);not null" json:"amount" comment:"订单金额"` | |||
|  | 	Platform string            `gorm:"type:varchar(20);not null" json:"platform" comment:"支付平台:app/h5/pc"` | |||
|  | 	Status   AlipayOrderStatus `gorm:"type:varchar(20);not null;default:'pending';index" json:"status" comment:"订单状态"` | |||
|  | 
 | |||
|  | 	// 支付宝返回信息 | |||
|  | 	BuyerID       string          `gorm:"type:varchar(64)" json:"buyer_id,omitempty" comment:"买家支付宝用户ID"` | |||
|  | 	SellerID      string          `gorm:"type:varchar(64)" json:"seller_id,omitempty" comment:"卖家支付宝用户ID"` | |||
|  | 	PayAmount     decimal.Decimal `gorm:"type:decimal(20,8)" json:"pay_amount,omitempty" comment:"实际支付金额"` | |||
|  | 	ReceiptAmount decimal.Decimal `gorm:"type:decimal(20,8)" json:"receipt_amount,omitempty" comment:"实收金额"` | |||
|  | 
 | |||
|  | 	// 回调信息 | |||
|  | 	NotifyTime *time.Time `gorm:"index" json:"notify_time,omitempty" comment:"异步通知时间"` | |||
|  | 	ReturnTime *time.Time `gorm:"index" json:"return_time,omitempty" comment:"同步返回时间"` | |||
|  | 
 | |||
|  | 	// 错误信息 | |||
|  | 	ErrorCode    string `gorm:"type:varchar(64)" json:"error_code,omitempty" comment:"错误码"` | |||
|  | 	ErrorMessage string `gorm:"type:text" json:"error_message,omitempty" comment:"错误信息"` | |||
|  | 
 | |||
|  | 	// 时间戳字段 | |||
|  | 	CreatedAt time.Time      `gorm:"autoCreateTime" json:"created_at" comment:"创建时间"` | |||
|  | 	UpdatedAt time.Time      `gorm:"autoUpdateTime" json:"updated_at" comment:"更新时间"` | |||
|  | 	DeletedAt gorm.DeletedAt `gorm:"index" json:"-" comment:"软删除时间"` | |||
|  | } | |||
|  | 
 | |||
|  | // TableName 指定数据库表名 | |||
|  | func (AlipayOrder) TableName() string { | |||
|  | 	return "alipay_orders" | |||
|  | } | |||
|  | 
 | |||
|  | // BeforeCreate GORM钩子:创建前自动生成UUID | |||
|  | func (a *AlipayOrder) BeforeCreate(tx *gorm.DB) error { | |||
|  | 	if a.ID == "" { | |||
|  | 		a.ID = uuid.New().String() | |||
|  | 	} | |||
|  | 	return nil | |||
|  | } | |||
|  | 
 | |||
|  | // IsPending 检查是否为待支付状态 | |||
|  | func (a *AlipayOrder) IsPending() bool { | |||
|  | 	return a.Status == AlipayOrderStatusPending | |||
|  | } | |||
|  | 
 | |||
|  | // IsSuccess 检查是否为支付成功状态 | |||
|  | func (a *AlipayOrder) IsSuccess() bool { | |||
|  | 	return a.Status == AlipayOrderStatusSuccess | |||
|  | } | |||
|  | 
 | |||
|  | // IsFailed 检查是否为支付失败状态 | |||
|  | func (a *AlipayOrder) IsFailed() bool { | |||
|  | 	return a.Status == AlipayOrderStatusFailed | |||
|  | } | |||
|  | 
 | |||
|  | // IsCancelled 检查是否为已取消状态 | |||
|  | func (a *AlipayOrder) IsCancelled() bool { | |||
|  | 	return a.Status == AlipayOrderStatusCancelled | |||
|  | } | |||
|  | 
 | |||
|  | // IsClosed 检查是否为已关闭状态 | |||
|  | func (a *AlipayOrder) IsClosed() bool { | |||
|  | 	return a.Status == AlipayOrderStatusClosed | |||
|  | } | |||
|  | 
 | |||
|  | // MarkSuccess 标记为支付成功 | |||
|  | func (a *AlipayOrder) MarkSuccess(tradeNo, buyerID, sellerID string, payAmount, receiptAmount decimal.Decimal) { | |||
|  | 	a.Status = AlipayOrderStatusSuccess | |||
|  | 	a.TradeNo = &tradeNo | |||
|  | 	a.BuyerID = buyerID | |||
|  | 	a.SellerID = sellerID | |||
|  | 	a.PayAmount = payAmount | |||
|  | 	a.ReceiptAmount = receiptAmount | |||
|  | 	now := time.Now() | |||
|  | 	a.NotifyTime = &now | |||
|  | } | |||
|  | 
 | |||
|  | // MarkFailed 标记为支付失败 | |||
|  | func (a *AlipayOrder) MarkFailed(errorCode, errorMessage string) { | |||
|  | 	a.Status = AlipayOrderStatusFailed | |||
|  | 	a.ErrorCode = errorCode | |||
|  | 	a.ErrorMessage = errorMessage | |||
|  | } | |||
|  | 
 | |||
|  | // MarkCancelled 标记为已取消 | |||
|  | func (a *AlipayOrder) MarkCancelled() { | |||
|  | 	a.Status = AlipayOrderStatusCancelled | |||
|  | } | |||
|  | 
 | |||
|  | // MarkClosed 标记为已关闭 | |||
|  | func (a *AlipayOrder) MarkClosed() { | |||
|  | 	a.Status = AlipayOrderStatusClosed | |||
|  | } | |||
|  | 
 | |||
|  | // NewAlipayOrder 工厂方法 - 创建支付宝订单 | |||
|  | func NewAlipayOrder(rechargeID, outTradeNo, subject string, amount decimal.Decimal, platform string) *AlipayOrder { | |||
|  | 	return &AlipayOrder{ | |||
|  | 		ID:         uuid.New().String(), | |||
|  | 		RechargeID: rechargeID, | |||
|  | 		OutTradeNo: outTradeNo, | |||
|  | 		Subject:    subject, | |||
|  | 		Amount:     amount, | |||
|  | 		Platform:   platform, | |||
|  | 		Status:     AlipayOrderStatusPending, | |||
|  | 	} | |||
|  | } |