116 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package entities
 | ||
| 
 | ||
| import (
 | ||
| 	"time"
 | ||
| 
 | ||
| 	"github.com/google/uuid"
 | ||
| 	"github.com/shopspring/decimal"
 | ||
| 	"gorm.io/gorm"
 | ||
| )
 | ||
| 
 | ||
| // Product 产品实体
 | ||
| type Product struct {
 | ||
| 	ID          string          `gorm:"primaryKey;type:varchar(36)" comment:"产品ID"`
 | ||
| 	OldID       *string         `gorm:"type:varchar(36);index" comment:"旧产品ID,用于兼容"`
 | ||
| 	Name        string          `gorm:"type:varchar(100);not null" comment:"产品名称"`
 | ||
| 	Code        string          `gorm:"type:varchar(50);uniqueIndex;not null" comment:"产品编号"`
 | ||
| 	Description string          `gorm:"type:text" comment:"产品简介"`
 | ||
| 	Content     string          `gorm:"type:text" comment:"产品内容"`
 | ||
| 	CategoryID  string          `gorm:"type:varchar(36);not null" comment:"产品分类ID"`
 | ||
| 	Price       decimal.Decimal `gorm:"type:decimal(10,2);not null;default:0" comment:"产品价格"`
 | ||
| 	IsEnabled   bool            `gorm:"default:true" comment:"是否启用"`
 | ||
| 	IsVisible   bool            `gorm:"default:true" comment:"是否展示"`
 | ||
| 	IsPackage   bool            `gorm:"default:false" comment:"是否组合包"`
 | ||
| 	// 组合包相关关联
 | ||
| 	PackageItems []*ProductPackageItem `gorm:"foreignKey:PackageID" comment:"组合包项目列表"`
 | ||
| 	// SEO信息
 | ||
| 	SEOTitle       string `gorm:"type:varchar(200)" comment:"SEO标题"`
 | ||
| 	SEODescription string `gorm:"type:text" comment:"SEO描述"`
 | ||
| 	SEOKeywords    string `gorm:"type:text" comment:"SEO关键词"`
 | ||
| 
 | ||
| 	// 关联关系
 | ||
| 	Category      *ProductCategory      `gorm:"foreignKey:CategoryID" comment:"产品分类"`
 | ||
| 	Documentation *ProductDocumentation `gorm:"foreignKey:ProductID" comment:"产品文档"`
 | ||
| 
 | ||
| 	CreatedAt time.Time      `gorm:"autoCreateTime" comment:"创建时间"`
 | ||
| 	UpdatedAt time.Time      `gorm:"autoUpdateTime" comment:"更新时间"`
 | ||
| 	DeletedAt gorm.DeletedAt `gorm:"index" comment:"软删除时间"`
 | ||
| }
 | ||
| 
 | ||
| // BeforeCreate GORM钩子:创建前自动生成UUID
 | ||
| func (p *Product) BeforeCreate(tx *gorm.DB) error {
 | ||
| 	if p.ID == "" {
 | ||
| 		p.ID = uuid.New().String()
 | ||
| 	}
 | ||
| 	return nil
 | ||
| }
 | ||
| 
 | ||
| // IsValid 检查产品是否有效
 | ||
| func (p *Product) IsValid() bool {
 | ||
| 	return p.DeletedAt.Time.IsZero() && p.IsEnabled
 | ||
| }
 | ||
| 
 | ||
| // IsVisibleToUser 检查产品是否对用户可见
 | ||
| func (p *Product) IsVisibleToUser() bool {
 | ||
| 	return p.IsValid() && p.IsVisible
 | ||
| }
 | ||
| 
 | ||
| // CanBeSubscribed 检查产品是否可以订阅
 | ||
| func (p *Product) CanBeSubscribed() bool {
 | ||
| 	return p.IsValid()
 | ||
| }
 | ||
| 
 | ||
| 
 | ||
| // UpdateSEO 更新SEO信息
 | ||
| func (p *Product) UpdateSEO(title, description, keywords string) {
 | ||
| 	p.SEOTitle = title
 | ||
| 	p.SEODescription = description
 | ||
| 	p.SEOKeywords = keywords
 | ||
| }
 | ||
| 
 | ||
| // Enable 启用产品
 | ||
| func (p *Product) Enable() {
 | ||
| 	p.IsEnabled = true
 | ||
| }
 | ||
| 
 | ||
| // Disable 禁用产品
 | ||
| func (p *Product) Disable() {
 | ||
| 	p.IsEnabled = false
 | ||
| }
 | ||
| 
 | ||
| // Show 显示产品
 | ||
| func (p *Product) Show() {
 | ||
| 	p.IsVisible = true
 | ||
| }
 | ||
| 
 | ||
| // Hide 隐藏产品
 | ||
| func (p *Product) Hide() {
 | ||
| 	p.IsVisible = false
 | ||
| }
 | ||
| 
 | ||
| // SetAsPackage 设置为组合包
 | ||
| func (p *Product) SetAsPackage() {
 | ||
| 	p.IsPackage = true
 | ||
| }
 | ||
| 
 | ||
| func (p *Product) IsCombo() bool {
 | ||
| 	return p.IsPackage
 | ||
| }
 | ||
| 
 | ||
| // SetOldID 设置旧ID
 | ||
| func (p *Product) SetOldID(oldID string) {
 | ||
| 	p.OldID = &oldID
 | ||
| }
 | ||
| 
 | ||
| // GetOldID 获取旧ID
 | ||
| func (p *Product) GetOldID() string {
 | ||
| 	if p.OldID != nil {
 | ||
| 		return *p.OldID
 | ||
| 	}
 | ||
| 	return ""
 | ||
| }
 | ||
| 
 | ||
| // HasOldID 检查是否有旧ID
 | ||
| func (p *Product) HasOldID() bool {
 | ||
| 	return p.OldID != nil && *p.OldID != ""
 | ||
| } |