package store import ( "context" "gorm.io/gorm/clause" ) // Setting 是平台级键值配置(全局,非租户作用域)——如 token→积分汇率 等可后台热调的计费规则。 // 表名 sundynix_setting。Key 唯一。 type Setting struct { BaseModel Key string `gorm:"size:64;uniqueIndex"` Value string `gorm:"type:text"` // 曾是 varchar(255):支付配置 JSON(含加密密钥)一条就超,live 撞过 22001 } func (Setting) TableName() string { return "sundynix_setting" } // 平台设置键。 const ( SettingTokensPerCredit = "tokens_per_credit" SettingCreditEnforce = "credit_enforce" // "on"=余额≤0 拒绝新任务;其它/未设=软扣不拦 ) // CreditEnforceEnabled 是否开启积分硬拦截(默认关:软扣,余额可为负)。 func (p *Postgres) CreditEnforceEnabled(ctx context.Context) bool { return p.GetSetting(ctx, SettingCreditEnforce) == "on" } // GetSetting 读一个平台设置;不存在返回空串(调用方回退默认)。 func (p *Postgres) GetSetting(ctx context.Context, key string) string { if p.db == nil { return "" } var s Setting if err := p.db.WithContext(ctx).Select("value").Where("key = ?", key).First(&s).Error; err != nil { return "" } return s.Value } // SetSetting 幂等写一个平台设置(key 唯一,重复即覆盖 value)。 func (p *Postgres) SetSetting(ctx context.Context, key, value string) error { if p.db == nil { return errStoreDisabled } return p.db.WithContext(ctx).Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "key"}}, DoUpdates: clause.AssignmentColumns([]string{"value", "updated_at"}), }).Create(&Setting{Key: key, Value: value}).Error }