178 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			178 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package entities | |||
|  | 
 | |||
|  | import ( | |||
|  | 	"errors" | |||
|  | 	"time" | |||
|  | 
 | |||
|  | 	"github.com/google/uuid" | |||
|  | 	"github.com/shopspring/decimal" | |||
|  | 	"gorm.io/gorm" | |||
|  | ) | |||
|  | 
 | |||
|  | // RechargeType 充值类型枚举 | |||
|  | type RechargeType string | |||
|  | 
 | |||
|  | const ( | |||
|  | 	RechargeTypeAlipay   RechargeType = "alipay"   // 支付宝充值 | |||
|  | 	RechargeTypeTransfer RechargeType = "transfer" // 对公转账 | |||
|  | 	RechargeTypeGift     RechargeType = "gift"     // 赠送 | |||
|  | ) | |||
|  | 
 | |||
|  | // RechargeStatus 充值状态枚举 | |||
|  | type RechargeStatus string | |||
|  | 
 | |||
|  | const ( | |||
|  | 	RechargeStatusPending   RechargeStatus = "pending"   // 待处理 | |||
|  | 	RechargeStatusSuccess   RechargeStatus = "success"   // 成功 | |||
|  | 	RechargeStatusFailed    RechargeStatus = "failed"    // 失败 | |||
|  | 	RechargeStatusCancelled RechargeStatus = "cancelled" // 已取消 | |||
|  | ) | |||
|  | 
 | |||
|  | // RechargeRecord 充值记录实体 | |||
|  | // 记录用户的各种充值操作,包括支付宝充值、对公转账、赠送等 | |||
|  | type RechargeRecord struct { | |||
|  | 	// 基础标识 | |||
|  | 	ID     string `gorm:"primaryKey;type:varchar(36)" json:"id" comment:"充值记录唯一标识"` | |||
|  | 	UserID string `gorm:"type:varchar(36);not null;index" json:"user_id" comment:"充值用户ID"` | |||
|  | 
 | |||
|  | 	// 充值信息 | |||
|  | 	Amount       decimal.Decimal `gorm:"type:decimal(20,8);not null" json:"amount" comment:"充值金额"` | |||
|  | 	RechargeType RechargeType    `gorm:"type:varchar(20);not null;index" json:"recharge_type" comment:"充值类型"` | |||
|  | 	Status       RechargeStatus  `gorm:"type:varchar(20);not null;default:'pending';index" json:"status" comment:"充值状态"` | |||
|  | 
 | |||
|  | 	// 订单号字段(根据充值类型使用不同字段) | |||
|  | 	AlipayOrderID   *string `gorm:"type:varchar(64);uniqueIndex" json:"alipay_order_id,omitempty" comment:"支付宝订单号"` | |||
|  | 	TransferOrderID *string `gorm:"type:varchar(64);uniqueIndex" json:"transfer_order_id,omitempty" comment:"转账订单号"` | |||
|  | 
 | |||
|  | 	// 通用字段 | |||
|  | 	Notes string `gorm:"type:varchar(500)" json:"notes,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 (RechargeRecord) TableName() string { | |||
|  | 	return "recharge_records" | |||
|  | } | |||
|  | 
 | |||
|  | // BeforeCreate GORM钩子:创建前自动生成UUID | |||
|  | func (r *RechargeRecord) BeforeCreate(tx *gorm.DB) error { | |||
|  | 	if r.ID == "" { | |||
|  | 		r.ID = uuid.New().String() | |||
|  | 	} | |||
|  | 	return nil | |||
|  | } | |||
|  | 
 | |||
|  | // IsPending 检查是否为待处理状态 | |||
|  | func (r *RechargeRecord) IsPending() bool { | |||
|  | 	return r.Status == RechargeStatusPending | |||
|  | } | |||
|  | 
 | |||
|  | // IsSuccess 检查是否为成功状态 | |||
|  | func (r *RechargeRecord) IsSuccess() bool { | |||
|  | 	return r.Status == RechargeStatusSuccess | |||
|  | } | |||
|  | 
 | |||
|  | // IsFailed 检查是否为失败状态 | |||
|  | func (r *RechargeRecord) IsFailed() bool { | |||
|  | 	return r.Status == RechargeStatusFailed | |||
|  | } | |||
|  | 
 | |||
|  | // IsCancelled 检查是否为已取消状态 | |||
|  | func (r *RechargeRecord) IsCancelled() bool { | |||
|  | 	return r.Status == RechargeStatusCancelled | |||
|  | } | |||
|  | 
 | |||
|  | // MarkSuccess 标记为成功 | |||
|  | func (r *RechargeRecord) MarkSuccess() { | |||
|  | 	r.Status = RechargeStatusSuccess | |||
|  | } | |||
|  | 
 | |||
|  | // MarkFailed 标记为失败 | |||
|  | func (r *RechargeRecord) MarkFailed() { | |||
|  | 	r.Status = RechargeStatusFailed | |||
|  | } | |||
|  | 
 | |||
|  | // MarkCancelled 标记为已取消 | |||
|  | func (r *RechargeRecord) MarkCancelled() { | |||
|  | 	r.Status = RechargeStatusCancelled | |||
|  | } | |||
|  | 
 | |||
|  | // ValidatePaymentMethod 验证支付方式:支付宝订单号和转账订单号只能有一个存在 | |||
|  | func (r *RechargeRecord) ValidatePaymentMethod() error { | |||
|  | 	hasAlipay := r.AlipayOrderID != nil && *r.AlipayOrderID != "" | |||
|  | 	hasTransfer := r.TransferOrderID != nil && *r.TransferOrderID != "" | |||
|  | 
 | |||
|  | 	if hasAlipay && hasTransfer { | |||
|  | 		return errors.New("支付宝订单号和转账订单号不能同时存在") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	if !hasAlipay && !hasTransfer { | |||
|  | 		return errors.New("必须提供支付宝订单号或转账订单号") | |||
|  | 	} | |||
|  | 
 | |||
|  | 	return nil | |||
|  | } | |||
|  | 
 | |||
|  | // GetOrderID 获取订单号(根据充值类型返回对应的订单号) | |||
|  | func (r *RechargeRecord) GetOrderID() string { | |||
|  | 	switch r.RechargeType { | |||
|  | 	case RechargeTypeAlipay: | |||
|  | 		if r.AlipayOrderID != nil { | |||
|  | 			return *r.AlipayOrderID | |||
|  | 		} | |||
|  | 	case RechargeTypeTransfer: | |||
|  | 		if r.TransferOrderID != nil { | |||
|  | 			return *r.TransferOrderID | |||
|  | 		} | |||
|  | 	} | |||
|  | 	return "" | |||
|  | } | |||
|  | 
 | |||
|  | // SetAlipayOrderID 设置支付宝订单号 | |||
|  | func (r *RechargeRecord) SetAlipayOrderID(orderID string) { | |||
|  | 	r.AlipayOrderID = &orderID | |||
|  | } | |||
|  | 
 | |||
|  | // SetTransferOrderID 设置转账订单号 | |||
|  | func (r *RechargeRecord) SetTransferOrderID(orderID string) { | |||
|  | 	r.TransferOrderID = &orderID | |||
|  | } | |||
|  | 
 | |||
|  | // NewAlipayRechargeRecord 工厂方法 - 创建支付宝充值记录 | |||
|  | func NewAlipayRechargeRecord(userID string, amount decimal.Decimal, alipayOrderID string) *RechargeRecord { | |||
|  | 	return &RechargeRecord{ | |||
|  | 		UserID:        userID, | |||
|  | 		Amount:        amount, | |||
|  | 		RechargeType:  RechargeTypeAlipay, | |||
|  | 		Status:        RechargeStatusPending, | |||
|  | 		AlipayOrderID: &alipayOrderID, | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | // NewTransferRechargeRecord 工厂方法 - 创建对公转账充值记录 | |||
|  | func NewTransferRechargeRecord(userID string, amount decimal.Decimal, transferOrderID, notes string) *RechargeRecord { | |||
|  | 	return &RechargeRecord{ | |||
|  | 		UserID:          userID, | |||
|  | 		Amount:          amount, | |||
|  | 		RechargeType:    RechargeTypeTransfer, | |||
|  | 		Status:          RechargeStatusPending, | |||
|  | 		TransferOrderID: &transferOrderID, | |||
|  | 		Notes:           notes, | |||
|  | 	} | |||
|  | } | |||
|  | 
 | |||
|  | // NewGiftRechargeRecord 工厂方法 - 创建赠送充值记录 | |||
|  | func NewGiftRechargeRecord(userID string, amount decimal.Decimal, notes string) *RechargeRecord { | |||
|  | 	return &RechargeRecord{ | |||
|  | 		UserID:       userID, | |||
|  | 		Amount:       amount, | |||
|  | 		RechargeType: RechargeTypeGift, | |||
|  | 		Status:       RechargeStatusSuccess, // 赠送直接标记为成功 | |||
|  | 		Notes:        notes, | |||
|  | 	} | |||
|  | } |