97 lines
2.8 KiB
Go
97 lines
2.8 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"`
|
||
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
|
||
} |