feat(model): 新增金豆消费、CDK配置、炫彩皮肤及双塔模型,优化物品奖励和BOSS配置
This commit is contained in:
115
modules/config/model/cdk.go
Normal file
115
modules/config/model/cdk.go
Normal file
@@ -0,0 +1,115 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"blazing/cool"
|
||||
"errors"
|
||||
"fmt"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 表名常量定义:CDK配置表
|
||||
const (
|
||||
TableNameCDKConfig = "cdk_config" // CDK配置表(记录CDK编号、可兑换次数、奖励配置等核心信息)
|
||||
)
|
||||
|
||||
// CDKConfig CDK核心配置模型(含可兑换次数,满足查询`where 可兑换次数 != 0`需求)
|
||||
type CDKConfig struct {
|
||||
*cool.Model `json:"-" gorm:"embedded"` // 嵌入通用Model(ID/创建时间/更新时间,不参与json序列化)
|
||||
|
||||
// 核心字段
|
||||
CDKCode string `gorm:"not null;size:64;uniqueIndex;comment:'CDK编号(唯一标识,用于玩家兑换)'" json:"cdk_code" description:"CDK编号"`
|
||||
|
||||
//cdk可兑换次数,where不等于0
|
||||
ExchangeRemainCount uint32 `gorm:"not null;default:1;comment:'CDK剩余可兑换次数(不能为0才允许兑换,支持查询where !=0)'" json:"exchange_remain_count" description:"剩余可兑换次数"`
|
||||
ItemRewardIds []uint32 `gorm:"not null;type:json;default:'[]';comment:'绑定奖励物品ID数组,关联item_gift表主键'" json:"item_reward_ids" description:"奖励物品数组"`
|
||||
ElfRewardIds []uint32 `gorm:"not null;type:json;default:'[]';comment:'绑定奖励精灵ID数组,关联config_pet_boss表主键'" json:"elf_reward_ids" description:"奖励精灵数组"`
|
||||
|
||||
// 辅助配置字段
|
||||
ValidStartTime time.Time `gorm:"not null;comment:'CDK有效开始时间'" json:"valid_start_time" description:"有效开始时间"`
|
||||
ValidEndTime time.Time `gorm:"not null;comment:'CDK有效结束时间'" json:"valid_end_time" description:"有效结束时间"`
|
||||
IsEnabled uint32 `gorm:"not null;default:1;comment:'是否启用该CDK(0-禁用 1-启用)'" json:"is_enabled" description:"是否启用"`
|
||||
Remark string `gorm:"size:512;default:'';comment:'CDK备注'" json:"remark" description:"备注信息"`
|
||||
ItemGift []ItemGift `orm:"with:item_id=id"`
|
||||
}
|
||||
|
||||
// -------------------------- 核心配套方法(遵循项目规范)--------------------------
|
||||
func (*CDKConfig) TableName() string {
|
||||
return TableNameCDKConfig
|
||||
}
|
||||
|
||||
func (*CDKConfig) GroupName() string {
|
||||
return "default"
|
||||
}
|
||||
|
||||
func NewCDKConfig() *CDKConfig {
|
||||
return &CDKConfig{
|
||||
Model: cool.NewModel(),
|
||||
CDKCode: "",
|
||||
|
||||
ExchangeRemainCount: 1, // 剩余可兑换次数默认1,确保不为0
|
||||
ItemRewardIds: []uint32{},
|
||||
ElfRewardIds: []uint32{},
|
||||
ValidStartTime: time.Now(),
|
||||
ValidEndTime: time.Now().AddDate(1, 0, 0), // 默认有效期1年
|
||||
IsEnabled: 1,
|
||||
Remark: "",
|
||||
}
|
||||
}
|
||||
|
||||
// -------------------------- 业务操作方法(适配可兑换次数 != 0 需求)--------------------------
|
||||
|
||||
// SetExchangeTotalCount 设置总可兑换次数(确保不为0,满足where !=0 约束)
|
||||
func (c *CDKConfig) SetExchangeTotalCount(total uint32) error {
|
||||
if total == 0 {
|
||||
return errors.New("CDK总可兑换次数不能为0,请设置大于0的数值")
|
||||
}
|
||||
// 若剩余次数大于新的总次数,同步更新剩余次数为总次数
|
||||
if c.ExchangeRemainCount > total {
|
||||
c.ExchangeRemainCount = total
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// DeductRemainCount 扣减剩余可兑换次数(扣减后仍保证非负,且仅当剩余次数>0时可扣减)
|
||||
func (c *CDKConfig) DeductRemainCount(deductNum uint32) error {
|
||||
if deductNum <= 0 {
|
||||
return errors.New("扣减的兑换次数必须大于0")
|
||||
}
|
||||
// 校验剩余次数是否大于0(满足where !=0 前置条件)
|
||||
if c.ExchangeRemainCount == 0 {
|
||||
return errors.New("CDK剩余可兑换次数为0,无法继续扣减")
|
||||
}
|
||||
// 校验扣减后是否为负
|
||||
if c.ExchangeRemainCount < deductNum {
|
||||
return fmt.Errorf("剩余可兑换次数不足(当前剩余%d,需扣减%d)", c.ExchangeRemainCount, deductNum)
|
||||
}
|
||||
c.ExchangeRemainCount -= deductNum
|
||||
return nil
|
||||
}
|
||||
|
||||
// IsAvailable 判断CDK是否可用(剩余次数!=0 + 启用 + 在有效期内)
|
||||
func (c *CDKConfig) IsAvailable() (bool, string) {
|
||||
now := time.Now()
|
||||
// 校验剩余次数是否!=0
|
||||
if c.ExchangeRemainCount == 0 {
|
||||
return false, "CDK剩余可兑换次数为0,已失效"
|
||||
}
|
||||
// 校验是否启用
|
||||
if c.IsEnabled == 0 {
|
||||
return false, "CDK已被禁用,无法使用"
|
||||
}
|
||||
// 校验有效期
|
||||
if now.Before(c.ValidStartTime) {
|
||||
return false, "CDK尚未到有效时间,暂无法使用"
|
||||
}
|
||||
if now.After(c.ValidEndTime) {
|
||||
return false, "CDK已过有效期,已失效"
|
||||
}
|
||||
return true, "CDK可用"
|
||||
}
|
||||
|
||||
// -------------------------- 表结构自动同步 --------------------------
|
||||
func init() {
|
||||
cool.CreateTable(&CDKConfig{})
|
||||
}
|
||||
Reference in New Issue
Block a user