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, } }