003_subscription.sql 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. -- Sub2API 订阅功能迁移脚本
  2. -- 添加订阅分组和用户订阅功能
  3. -- 1. 扩展 groups 表添加订阅相关字段
  4. ALTER TABLE groups ADD COLUMN IF NOT EXISTS platform VARCHAR(50) NOT NULL DEFAULT 'anthropic';
  5. ALTER TABLE groups ADD COLUMN IF NOT EXISTS subscription_type VARCHAR(20) NOT NULL DEFAULT 'standard';
  6. ALTER TABLE groups ADD COLUMN IF NOT EXISTS daily_limit_usd DECIMAL(20, 8) DEFAULT NULL;
  7. ALTER TABLE groups ADD COLUMN IF NOT EXISTS weekly_limit_usd DECIMAL(20, 8) DEFAULT NULL;
  8. ALTER TABLE groups ADD COLUMN IF NOT EXISTS monthly_limit_usd DECIMAL(20, 8) DEFAULT NULL;
  9. ALTER TABLE groups ADD COLUMN IF NOT EXISTS default_validity_days INT NOT NULL DEFAULT 30;
  10. -- 添加索引
  11. CREATE INDEX IF NOT EXISTS idx_groups_platform ON groups(platform);
  12. CREATE INDEX IF NOT EXISTS idx_groups_subscription_type ON groups(subscription_type);
  13. -- 2. 创建 user_subscriptions 用户订阅表
  14. CREATE TABLE IF NOT EXISTS user_subscriptions (
  15. id BIGSERIAL PRIMARY KEY,
  16. user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
  17. group_id BIGINT NOT NULL REFERENCES groups(id) ON DELETE CASCADE,
  18. -- 订阅有效期
  19. starts_at TIMESTAMPTZ NOT NULL,
  20. expires_at TIMESTAMPTZ NOT NULL,
  21. status VARCHAR(20) NOT NULL DEFAULT 'active', -- active/expired/suspended
  22. -- 滑动窗口起始时间(NULL=未激活)
  23. daily_window_start TIMESTAMPTZ,
  24. weekly_window_start TIMESTAMPTZ,
  25. monthly_window_start TIMESTAMPTZ,
  26. -- 当前窗口已用额度(USD,基于 total_cost 计算)
  27. daily_usage_usd DECIMAL(20, 10) NOT NULL DEFAULT 0,
  28. weekly_usage_usd DECIMAL(20, 10) NOT NULL DEFAULT 0,
  29. monthly_usage_usd DECIMAL(20, 10) NOT NULL DEFAULT 0,
  30. -- 管理员分配信息
  31. assigned_by BIGINT REFERENCES users(id) ON DELETE SET NULL,
  32. assigned_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  33. notes TEXT,
  34. created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  35. updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  36. -- 唯一约束:每个用户对每个分组只能有一个订阅
  37. UNIQUE(user_id, group_id)
  38. );
  39. -- user_subscriptions 索引
  40. CREATE INDEX IF NOT EXISTS idx_user_subscriptions_user_id ON user_subscriptions(user_id);
  41. CREATE INDEX IF NOT EXISTS idx_user_subscriptions_group_id ON user_subscriptions(group_id);
  42. CREATE INDEX IF NOT EXISTS idx_user_subscriptions_status ON user_subscriptions(status);
  43. CREATE INDEX IF NOT EXISTS idx_user_subscriptions_expires_at ON user_subscriptions(expires_at);
  44. CREATE INDEX IF NOT EXISTS idx_user_subscriptions_assigned_by ON user_subscriptions(assigned_by);
  45. -- 3. 扩展 usage_logs 表添加分组和订阅关联
  46. ALTER TABLE usage_logs ADD COLUMN IF NOT EXISTS group_id BIGINT REFERENCES groups(id) ON DELETE SET NULL;
  47. ALTER TABLE usage_logs ADD COLUMN IF NOT EXISTS subscription_id BIGINT REFERENCES user_subscriptions(id) ON DELETE SET NULL;
  48. ALTER TABLE usage_logs ADD COLUMN IF NOT EXISTS rate_multiplier DECIMAL(10, 4) NOT NULL DEFAULT 1;
  49. ALTER TABLE usage_logs ADD COLUMN IF NOT EXISTS first_token_ms INT;
  50. -- usage_logs 新索引
  51. CREATE INDEX IF NOT EXISTS idx_usage_logs_group_id ON usage_logs(group_id);
  52. CREATE INDEX IF NOT EXISTS idx_usage_logs_subscription_id ON usage_logs(subscription_id);
  53. CREATE INDEX IF NOT EXISTS idx_usage_logs_sub_created ON usage_logs(subscription_id, created_at);