package model import "time" // LicenseCode 兑换券(激活码)。由平台方批量生成,用户购买/活动获得后在自己门店兑换。 // 每张码代表一段时长(duration_days),兑换时叠加到门店当前到期时间上;一码一次(status 控制)。 type LicenseCode struct { ID uint64 `gorm:"primaryKey;autoIncrement" json:"id"` Code string `gorm:"size:32;uniqueIndex;not null" json:"code"` // 归一化大写无连字符存储 Type string `gorm:"type:enum('trial','monthly','annual','lifetime');default:'annual'" json:"type"` // 计费/时长标签 // Tier 档位钩子(类似 pro/max)。当前只用 'standard' 一种,分档能力/消费模式后续设计。 Tier string `gorm:"size:32;not null;default:'standard'" json:"tier"` DurationDays int `gorm:"not null;default:0" json:"duration_days"` // 授予时长;0 = 永久(lifetime) MaxDevices int `gorm:"not null;default:0" json:"max_devices"` // 授予设备上限;0 = 不改变现值 Status string `gorm:"type:enum('unused','redeemed','void');default:'unused';index" json:"status"` RedeemedShopID *uint64 `gorm:"index" json:"redeemed_shop_id,omitempty"` RedeemedAt *time.Time `json:"redeemed_at,omitempty"` RedeemedDeviceID string `gorm:"size:255" json:"redeemed_device_id,omitempty"` Batch string `gorm:"size:64" json:"batch,omitempty"` // 发放批次/活动名 Note string `gorm:"size:255" json:"note,omitempty"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` }