Files
bl/modules/config/model/cdk.go
昔念 cf7736a3e7 feat(user-talk): 优化聊天功能中的物品奖励逻辑
重构 Talk 方法中物品奖励的获取方式,使用新的配置服务以支持多物品 ID 奖励机制。
移除了对 github.com/gogf/gf/v2/util/grand 包的依赖,改为通过服务获取实际物品数量。

同时更新了相关模型定义:
- 修改 MineralCollectionConfig 中 ItemID 为数组形式以支持多个物品配置
- 调整 ItemGift 模型字段
2025-12-22 19:04:16 +08:00

116 lines
4.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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"` // 嵌入通用ModelID/创建时间/更新时间不参与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:'是否启用该CDK0-禁用 1-启用)'" json:"is_enabled" description:"是否启用"`
Remark string `gorm:"size:512;default:'';comment:'CDK备注'" json:"remark" description:"备注信息"`
//ItemGift []*ItemGift `gorm:"-" 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{})
}