feat(gateway): 多租户增量2 —— 租户切换 + 每租户共享计费开关
用户可切活跃租户,消耗按"计费租户"扣(数据仍落活跃租户/工作区): - User.active_tenant_id(切换持久化)+ Tenant.shared_billing(每租户开关,默认关)。 - 中间件 ActiveTenantForUser:active_tenant_id 若有效(仍是成员)则用之,否则默认租户。 - 计费目标解析 ResolveBillingTenantID:本人是活跃租户 owner 或该租户 shared_billing 开 → 记活跃租户;否则记本人个人租户(各付各的)。SubmitTask 的硬拦截 + 用量都按它走。 - 接口:GET /me/tenants、POST /me/tenant(切换)、PUT /admin/tenants/:id/shared-billing; /tenants/current 改显"可花余额"(计费租户) + billing_shared 标记。 live 验证(demoB 是公司A 成员、个人租户=公司B):切到公司A 后—— shared OFF:任务落公司A 工作区、用量扣公司B(个人),公司A 不变; shared ON:用量扣公司A(共享),公司B 不变;/tenants/current 余额随之在 6.48↔15.92 切换。全过。 前端切换器 + admin 开关见后续。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -8,9 +8,10 @@ package store
|
||||
// User 是平台用户(Users)。
|
||||
type User struct {
|
||||
BaseModel
|
||||
Email string `gorm:"uniqueIndex;size:255"`
|
||||
Name string `gorm:"size:64"`
|
||||
PasswordHash string `gorm:"size:255" json:"-"` // bcrypt;绝不出 JSON
|
||||
Email string `gorm:"uniqueIndex;size:255"`
|
||||
Name string `gorm:"size:64"`
|
||||
PasswordHash string `gorm:"size:255" json:"-"` // bcrypt;绝不出 JSON
|
||||
ActiveTenantID string `gorm:"size:64" json:"-"` // 当前活跃租户(多租户切换;空=用默认)
|
||||
}
|
||||
|
||||
// Task 是一次提交的 Agent 编排任务(DSL)。
|
||||
@@ -88,6 +89,7 @@ type Tenant struct {
|
||||
Plan string `gorm:"size:32;default:free"` // free / pro / enterprise
|
||||
Status string `gorm:"size:16;default:active"` // active / suspended
|
||||
CreditBalanceMicro int64 `gorm:"column:credit_balance_micro"` // 物化积分余额 ×10⁻⁶(= credit_ledger 之和;用量扣、充值增)
|
||||
SharedBilling bool `gorm:"column:shared_billing"` // 共享计费:开=成员消耗计本租户池;关=成员计各自个人池(owner 恒计本租户)
|
||||
}
|
||||
|
||||
func (Tenant) TableName() string { return "sundynix_tenant" }
|
||||
|
||||
Reference in New Issue
Block a user