From 917afb338ada0f74aa6b65d09d80a8b84c50b83c Mon Sep 17 00:00:00 2001 From: chengqian Date: Thu, 28 May 2026 20:22:39 +0800 Subject: [PATCH] =?UTF-8?q?chore:=E5=90=88=E5=B9=B6=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=8F=98=E6=9B=B4=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- migrations/000005_tenant_level_system.sql | 47 -------- migrations/000005_v0_1_5_version.sql | 140 ++++++++++++++++++++++ migrations/000006_model_groups.sql | 66 ---------- 3 files changed, 140 insertions(+), 113 deletions(-) delete mode 100644 migrations/000005_tenant_level_system.sql create mode 100644 migrations/000005_v0_1_5_version.sql delete mode 100644 migrations/000006_model_groups.sql diff --git a/migrations/000005_tenant_level_system.sql b/migrations/000005_tenant_level_system.sql deleted file mode 100644 index 6bccb83..0000000 --- a/migrations/000005_tenant_level_system.sql +++ /dev/null @@ -1,47 +0,0 @@ --- +goose Up --- 租户等级系统:基于累计充值的自动等级体系 - --- 1. 新建等级配置表 -CREATE TABLE tnt_tenant_level_configs ( - id BIGSERIAL PRIMARY KEY, - level INT NOT NULL, - name VARCHAR(32) NOT NULL, - cumulative_recharge_threshold NUMERIC(20,10) NOT NULL, - max_members INT NOT NULL DEFAULT 5, - max_concurrency INT NOT NULL DEFAULT 10, - price_multiplier NUMERIC(5,4) NOT NULL DEFAULT 1.0000, - sort_order INT NOT NULL DEFAULT 0, - created_at TIMESTAMPTZ DEFAULT now() NOT NULL, - updated_at TIMESTAMPTZ DEFAULT now() NOT NULL, - CONSTRAINT uk_tnt_tenant_level_configs_level UNIQUE (level) -); - -COMMENT ON TABLE tnt_tenant_level_configs IS '租户等级配置表'; -COMMENT ON COLUMN tnt_tenant_level_configs.level IS '等级号(1, 2, 3...)'; -COMMENT ON COLUMN tnt_tenant_level_configs.name IS '等级名称'; -COMMENT ON COLUMN tnt_tenant_level_configs.cumulative_recharge_threshold IS '累计充值阈值(USD),达到此值自动升级'; -COMMENT ON COLUMN tnt_tenant_level_configs.max_members IS '该等级最大成员数'; -COMMENT ON COLUMN tnt_tenant_level_configs.max_concurrency IS '该等级最大并发数,0=无限'; -COMMENT ON COLUMN tnt_tenant_level_configs.price_multiplier IS '价格乘数(折扣,如 0.9=九折)'; -COMMENT ON COLUMN tnt_tenant_level_configs.sort_order IS '排序权重'; - --- 2. 插入默认等级数据 -INSERT INTO tnt_tenant_level_configs (level, name, cumulative_recharge_threshold, max_members, max_concurrency, price_multiplier, sort_order) VALUES -(1, 'LV1', 0, 5, 10, 1.0000, 1), -(2, 'LV2', 100, 10, 20, 0.9500, 2), -(3, 'LV3', 500, 20, 50, 0.9000, 3), -(4, 'LV4', 2000, 50, 100, 0.8500, 4), -(5, 'LV5', 10000, 0, 0, 0.8000, 5); - --- 3. bil_wallets 添加累计充值字段 -ALTER TABLE bil_wallets ADD COLUMN cumulative_recharge NUMERIC(20,10) DEFAULT 0 NOT NULL; -COMMENT ON COLUMN bil_wallets.cumulative_recharge IS '累计充值总额(USD)'; - --- 4. tnt_tenants 添加等级字段 -ALTER TABLE tnt_tenants ADD COLUMN level INT DEFAULT 1 NOT NULL; -COMMENT ON COLUMN tnt_tenants.level IS '当前等级(对应 tnt_tenant_level_configs.level)'; - --- +goose Down -ALTER TABLE tnt_tenants DROP COLUMN IF EXISTS level; -ALTER TABLE bil_wallets DROP COLUMN IF EXISTS cumulative_recharge; -DROP TABLE IF EXISTS tnt_tenant_level_configs; diff --git a/migrations/000005_v0_1_5_version.sql b/migrations/000005_v0_1_5_version.sql new file mode 100644 index 0000000..51b5c5d --- /dev/null +++ b/migrations/000005_v0_1_5_version.sql @@ -0,0 +1,140 @@ +-- +goose Up +-- 租户等级系统 + 模型分组功能 + 补充缺失索引 + +-- ============================================================ +-- 一、租户等级系统:基于累计充值的自动等级体系 +-- ============================================================ + +-- 1. 新建等级配置表 +CREATE TABLE tnt_tenant_level_configs ( + id BIGSERIAL PRIMARY KEY, + level INT NOT NULL, + name VARCHAR(32) NOT NULL, + cumulative_recharge_threshold NUMERIC(20,10) NOT NULL, + max_members INT NOT NULL DEFAULT 5, + max_concurrency INT NOT NULL DEFAULT 10, + price_multiplier NUMERIC(5,4) NOT NULL DEFAULT 1.0000, + sort_order INT NOT NULL DEFAULT 0, + created_at TIMESTAMPTZ DEFAULT now() NOT NULL, + updated_at TIMESTAMPTZ DEFAULT now() NOT NULL, + CONSTRAINT uk_tnt_tenant_level_configs_level UNIQUE (level) +); + +COMMENT ON TABLE tnt_tenant_level_configs IS '租户等级配置表'; +COMMENT ON COLUMN tnt_tenant_level_configs.level IS '等级号(1, 2, 3...)'; +COMMENT ON COLUMN tnt_tenant_level_configs.name IS '等级名称'; +COMMENT ON COLUMN tnt_tenant_level_configs.cumulative_recharge_threshold IS '累计充值阈值(USD),达到此值自动升级'; +COMMENT ON COLUMN tnt_tenant_level_configs.max_members IS '该等级最大成员数'; +COMMENT ON COLUMN tnt_tenant_level_configs.max_concurrency IS '该等级最大并发数,0=无限'; +COMMENT ON COLUMN tnt_tenant_level_configs.price_multiplier IS '价格乘数(折扣,如 0.9=九折)'; +COMMENT ON COLUMN tnt_tenant_level_configs.sort_order IS '排序权重'; + +-- 2. 插入默认等级数据 +INSERT INTO tnt_tenant_level_configs (level, name, cumulative_recharge_threshold, max_members, max_concurrency, price_multiplier, sort_order) VALUES +(1, 'LV1', 0, 5, 10, 1.0000, 1), +(2, 'LV2', 100, 10, 20, 0.9500, 2), +(3, 'LV3', 500, 20, 50, 0.9000, 3), +(4, 'LV4', 2000, 50, 100, 0.8500, 4), +(5, 'LV5', 10000, 0, 0, 0.8000, 5); + +-- 3. bil_wallets 添加累计充值字段 +ALTER TABLE bil_wallets ADD COLUMN cumulative_recharge NUMERIC(20,10) DEFAULT 0 NOT NULL; +COMMENT ON COLUMN bil_wallets.cumulative_recharge IS '累计充值总额(USD)'; + +-- 4. tnt_tenants 添加等级字段 +ALTER TABLE tnt_tenants ADD COLUMN level INT DEFAULT 1 NOT NULL; +COMMENT ON COLUMN tnt_tenants.level IS '当前等级(对应 tnt_tenant_level_configs.level)'; + +-- ============================================================ +-- 二、模型分组功能:通过分组批量管理租户可用的模型 +-- ============================================================ + +-- 模型分组定义 +CREATE TABLE mdl_model_groups ( + id BIGSERIAL PRIMARY KEY, + name VARCHAR(100) NOT NULL, + code VARCHAR(50) NOT NULL, + description TEXT, + status VARCHAR(20) DEFAULT 'active' NOT NULL, + created_at TIMESTAMPTZ DEFAULT now() NOT NULL, + updated_at TIMESTAMPTZ DEFAULT now() NOT NULL, + CONSTRAINT uk_mdl_model_groups_code UNIQUE (code) +); + +COMMENT ON TABLE mdl_model_groups IS '模型分组定义'; +COMMENT ON COLUMN mdl_model_groups.id IS '主键ID'; +COMMENT ON COLUMN mdl_model_groups.name IS '分组名称(如"全量模型"、"基础对话")'; +COMMENT ON COLUMN mdl_model_groups.code IS '分组唯一标识(如 full_access、basic_chat)'; +COMMENT ON COLUMN mdl_model_groups.description IS '分组描述'; +COMMENT ON COLUMN mdl_model_groups.status IS '状态:active(启用)/ disabled(禁用)'; +COMMENT ON COLUMN mdl_model_groups.created_at IS '创建时间'; +COMMENT ON COLUMN mdl_model_groups.updated_at IS '更新时间'; + +-- 分组-模型关联(多对多) +CREATE TABLE mdl_group_models ( + id BIGSERIAL PRIMARY KEY, + group_id BIGINT NOT NULL, + model_id BIGINT NOT NULL, + created_at TIMESTAMPTZ DEFAULT now() NOT NULL, + updated_at TIMESTAMPTZ DEFAULT now() NOT NULL, + CONSTRAINT uk_mdl_group_models UNIQUE (group_id, model_id) +); + +CREATE INDEX idx_mdl_group_models_model_id ON mdl_group_models (model_id); + +COMMENT ON TABLE mdl_group_models IS '分组-模型关联'; +COMMENT ON COLUMN mdl_group_models.id IS '主键ID'; +COMMENT ON COLUMN mdl_group_models.group_id IS '分组ID(关联 mdl_model_groups.id)'; +COMMENT ON COLUMN mdl_group_models.model_id IS '模型ID(关联 mdl_models.id)'; +COMMENT ON COLUMN mdl_group_models.created_at IS '创建时间'; +COMMENT ON COLUMN mdl_group_models.updated_at IS '更新时间'; + +-- 租户-分组关联(多对多) +CREATE TABLE mdl_tenant_groups ( + id BIGSERIAL PRIMARY KEY, + tenant_id BIGINT NOT NULL, + group_id BIGINT NOT NULL, + created_at TIMESTAMPTZ DEFAULT now() NOT NULL, + updated_at TIMESTAMPTZ DEFAULT now() NOT NULL, + CONSTRAINT uk_mdl_tenant_groups UNIQUE (tenant_id, group_id) +); + +CREATE INDEX idx_mdl_tenant_groups_tenant_id ON mdl_tenant_groups (tenant_id); + +COMMENT ON TABLE mdl_tenant_groups IS '租户-分组关联'; +COMMENT ON COLUMN mdl_tenant_groups.id IS '主键ID'; +COMMENT ON COLUMN mdl_tenant_groups.tenant_id IS '租户ID(关联 tnt_tenants.id)'; +COMMENT ON COLUMN mdl_tenant_groups.group_id IS '分组ID(关联 mdl_model_groups.id)'; +COMMENT ON COLUMN mdl_tenant_groups.created_at IS '创建时间'; +COMMENT ON COLUMN mdl_tenant_groups.updated_at IS '更新时间'; + +-- ============================================================ +-- 三、补充缺失的外键列索引 +-- ============================================================ + +CREATE INDEX idx_api_keys_user ON api_keys (user_id); +CREATE INDEX idx_bil_records_channel ON bil_records (channel_id) WHERE channel_id IS NOT NULL; +CREATE INDEX idx_fil_files_user ON fil_files (user_id); +CREATE INDEX idx_ord_promo_code_usages_user ON ord_promo_code_usages (user_id); +CREATE INDEX idx_ord_promo_code_usages_order ON ord_promo_code_usages (order_id); +CREATE INDEX idx_pln_tenant_plans_plan ON pln_tenant_plans (plan_id); +CREATE INDEX idx_spt_feedbacks_user ON spt_feedbacks (tenant_id, user_id); +CREATE INDEX idx_spt_replies_user ON spt_replies (user_id); + +-- +goose Down +DROP INDEX IF EXISTS idx_spt_replies_user; +DROP INDEX IF EXISTS idx_spt_feedbacks_user; +DROP INDEX IF EXISTS idx_pln_tenant_plans_plan; +DROP INDEX IF EXISTS idx_ord_promo_code_usages_order; +DROP INDEX IF EXISTS idx_ord_promo_code_usages_user; +DROP INDEX IF EXISTS idx_fil_files_user; +DROP INDEX IF EXISTS idx_bil_records_channel; +DROP INDEX IF EXISTS idx_api_keys_user; + +DROP TABLE IF EXISTS mdl_tenant_groups; +DROP TABLE IF EXISTS mdl_group_models; +DROP TABLE IF EXISTS mdl_model_groups; + +ALTER TABLE tnt_tenants DROP COLUMN IF EXISTS level; +ALTER TABLE bil_wallets DROP COLUMN IF EXISTS cumulative_recharge; +DROP TABLE IF EXISTS tnt_tenant_level_configs; diff --git a/migrations/000006_model_groups.sql b/migrations/000006_model_groups.sql deleted file mode 100644 index 50f39c0..0000000 --- a/migrations/000006_model_groups.sql +++ /dev/null @@ -1,66 +0,0 @@ --- +goose Up --- 模型分组功能:通过分组批量管理租户可用的模型 - --- 模型分组定义 -CREATE TABLE mdl_model_groups ( - id BIGSERIAL PRIMARY KEY, - name VARCHAR(100) NOT NULL, - code VARCHAR(50) NOT NULL, - description TEXT, - status VARCHAR(20) DEFAULT 'active' NOT NULL, - created_at TIMESTAMPTZ DEFAULT now() NOT NULL, - updated_at TIMESTAMPTZ DEFAULT now() NOT NULL, - CONSTRAINT uk_mdl_model_groups_code UNIQUE (code) -); - -COMMENT ON TABLE mdl_model_groups IS '模型分组定义'; -COMMENT ON COLUMN mdl_model_groups.id IS '主键ID'; -COMMENT ON COLUMN mdl_model_groups.name IS '分组名称(如"全量模型"、"基础对话")'; -COMMENT ON COLUMN mdl_model_groups.code IS '分组唯一标识(如 full_access、basic_chat)'; -COMMENT ON COLUMN mdl_model_groups.description IS '分组描述'; -COMMENT ON COLUMN mdl_model_groups.status IS '状态:active(启用)/ disabled(禁用)'; -COMMENT ON COLUMN mdl_model_groups.created_at IS '创建时间'; -COMMENT ON COLUMN mdl_model_groups.updated_at IS '更新时间'; - --- 分组-模型关联(多对多) -CREATE TABLE mdl_group_models ( - id BIGSERIAL PRIMARY KEY, - group_id BIGINT NOT NULL, - model_id BIGINT NOT NULL, - created_at TIMESTAMPTZ DEFAULT now() NOT NULL, - updated_at TIMESTAMPTZ DEFAULT now() NOT NULL, - CONSTRAINT uk_mdl_group_models UNIQUE (group_id, model_id) -); - -CREATE INDEX idx_mdl_group_models_model_id ON mdl_group_models (model_id); - -COMMENT ON TABLE mdl_group_models IS '分组-模型关联'; -COMMENT ON COLUMN mdl_group_models.id IS '主键ID'; -COMMENT ON COLUMN mdl_group_models.group_id IS '分组ID(关联 mdl_model_groups.id)'; -COMMENT ON COLUMN mdl_group_models.model_id IS '模型ID(关联 mdl_models.id)'; -COMMENT ON COLUMN mdl_group_models.created_at IS '创建时间'; -COMMENT ON COLUMN mdl_group_models.updated_at IS '更新时间'; - --- 租户-分组关联(多对多) -CREATE TABLE mdl_tenant_groups ( - id BIGSERIAL PRIMARY KEY, - tenant_id BIGINT NOT NULL, - group_id BIGINT NOT NULL, - created_at TIMESTAMPTZ DEFAULT now() NOT NULL, - updated_at TIMESTAMPTZ DEFAULT now() NOT NULL, - CONSTRAINT uk_mdl_tenant_groups UNIQUE (tenant_id, group_id) -); - -CREATE INDEX idx_mdl_tenant_groups_tenant_id ON mdl_tenant_groups (tenant_id); - -COMMENT ON TABLE mdl_tenant_groups IS '租户-分组关联'; -COMMENT ON COLUMN mdl_tenant_groups.id IS '主键ID'; -COMMENT ON COLUMN mdl_tenant_groups.tenant_id IS '租户ID(关联 tnt_tenants.id)'; -COMMENT ON COLUMN mdl_tenant_groups.group_id IS '分组ID(关联 mdl_model_groups.id)'; -COMMENT ON COLUMN mdl_tenant_groups.created_at IS '创建时间'; -COMMENT ON COLUMN mdl_tenant_groups.updated_at IS '更新时间'; - --- +goose Down -DROP TABLE IF EXISTS mdl_tenant_groups; -DROP TABLE IF EXISTS mdl_group_models; -DROP TABLE IF EXISTS mdl_model_groups;