iconsulting/scripts/migrations/20260125_add_user_profile.sql

143 lines
6.0 KiB
SQL
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.

-- ===========================================
-- 用户档案迁移脚本
-- 添加用户移民档案和联系方式表
-- ===========================================
-- ===========================================
-- 用户档案表 (user_profiles)
-- 存储用户移民相关的详细信息
-- ===========================================
CREATE TABLE IF NOT EXISTS user_profiles (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
tenant_id UUID NOT NULL,
user_id UUID NOT NULL UNIQUE,
-- 基本信息
full_name VARCHAR(100),
birth_date DATE,
nationality VARCHAR(2), -- ISO 3166-1 alpha-2
current_country VARCHAR(2),
current_city VARCHAR(100),
marital_status VARCHAR(20), -- SINGLE, MARRIED, DIVORCED, WIDOWED
-- 移民意向
target_countries TEXT[] DEFAULT '{}',
immigration_types TEXT[] DEFAULT '{}', -- SKILLED, INVESTMENT, BUSINESS, STUDY, FAMILY, etc.
planned_timeline VARCHAR(20), -- WITHIN_6M, WITHIN_1Y, 1_2Y, 2_3Y, NO_PLAN
primary_purpose TEXT,
-- 教育背景
highest_education VARCHAR(20), -- HIGH_SCHOOL, ASSOCIATE, BACHELOR, MASTER, DOCTORATE
education_records JSONB DEFAULT '[]',
-- 工作经历
current_occupation VARCHAR(100),
total_work_years INT,
work_records JSONB DEFAULT '[]',
-- 语言能力
language_scores JSONB DEFAULT '[]',
-- 家庭信息
family_members JSONB DEFAULT '[]',
-- 资产信息
net_worth_range VARCHAR(20), -- UNDER_500K, 500K_1M, 1M_5M, 5M_10M, OVER_10M
has_business_experience BOOLEAN DEFAULT FALSE,
business_years INT,
-- 其他
has_overseas_experience BOOLEAN DEFAULT FALSE,
has_criminal_record BOOLEAN,
has_health_issues BOOLEAN,
additional_notes TEXT,
-- 完成度
completion_percentage INT DEFAULT 0 CHECK (completion_percentage >= 0 AND completion_percentage <= 100),
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
COMMENT ON TABLE user_profiles IS '用户档案表 - 存储用户移民相关的详细信息';
COMMENT ON COLUMN user_profiles.nationality IS '国籍ISO 3166-1 alpha-2 代码';
COMMENT ON COLUMN user_profiles.target_countries IS '目标移民国家列表ISO 3166-1 alpha-2 代码';
COMMENT ON COLUMN user_profiles.immigration_types IS '感兴趣的移民类型列表';
COMMENT ON COLUMN user_profiles.education_records IS '教育经历JSON数组包含学历、专业、院校、毕业年份等';
COMMENT ON COLUMN user_profiles.work_records IS '工作经历JSON数组包含职位、公司、行业、时间等';
COMMENT ON COLUMN user_profiles.language_scores IS '语言成绩JSON数组包含雅思、托福、TEF等';
COMMENT ON COLUMN user_profiles.family_members IS '家庭成员JSON数组包含配偶、子女等信息';
COMMENT ON COLUMN user_profiles.completion_percentage IS '档案完成度百分比';
-- 索引
CREATE INDEX idx_user_profiles_tenant ON user_profiles(tenant_id);
CREATE INDEX idx_user_profiles_user ON user_profiles(user_id);
CREATE INDEX idx_user_profiles_nationality ON user_profiles(tenant_id, nationality);
CREATE INDEX idx_user_profiles_target_countries ON user_profiles USING GIN(target_countries);
CREATE INDEX idx_user_profiles_immigration_types ON user_profiles USING GIN(immigration_types);
CREATE INDEX idx_user_profiles_completion ON user_profiles(tenant_id, completion_percentage DESC);
-- 更新时间触发器
CREATE TRIGGER update_user_profiles_updated_at
BEFORE UPDATE ON user_profiles
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- ===========================================
-- 用户联系方式表 (user_contacts)
-- 存储用户绑定的联系方式,支持通知推送
-- ===========================================
CREATE TABLE IF NOT EXISTS user_contacts (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
tenant_id UUID NOT NULL,
user_id UUID NOT NULL,
-- 联系方式类型: EMAIL, WECHAT, WHATSAPP, TELEGRAM, LINE
type VARCHAR(20) NOT NULL,
-- 联系方式值邮箱地址、openid、手机号等
value VARCHAR(255) NOT NULL,
-- 显示名称(如微信昵称)
display_name VARCHAR(100),
-- 验证状态
is_verified BOOLEAN DEFAULT FALSE,
verified_at TIMESTAMP WITH TIME ZONE,
-- 通知设置 (付费功能)
notification_enabled BOOLEAN DEFAULT FALSE,
enabled_notification_types TEXT[] DEFAULT '{}', -- POLICY_UPDATE, DEADLINE_REMINDER, APPOINTMENT, CASE_UPDATE, PROMOTION
-- 验证相关
verification_code VARCHAR(10),
verification_expires_at TIMESTAMP WITH TIME ZONE,
-- 时间戳
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
-- 同一用户同一类型只能有一个联系方式
UNIQUE(tenant_id, user_id, type)
);
COMMENT ON TABLE user_contacts IS '用户联系方式表 - 存储用户绑定的联系方式,支持通知推送';
COMMENT ON COLUMN user_contacts.type IS '联系方式类型: EMAIL邮箱, WECHAT微信, WHATSAPP, TELEGRAM, LINE';
COMMENT ON COLUMN user_contacts.notification_enabled IS '是否启用通知推送(付费功能)';
COMMENT ON COLUMN user_contacts.enabled_notification_types IS '启用的通知类型列表';
-- 索引
CREATE INDEX idx_user_contacts_tenant ON user_contacts(tenant_id);
CREATE INDEX idx_user_contacts_user ON user_contacts(tenant_id, user_id);
CREATE INDEX idx_user_contacts_type ON user_contacts(tenant_id, user_id, type);
CREATE INDEX idx_user_contacts_verified ON user_contacts(tenant_id, is_verified);
CREATE INDEX idx_user_contacts_notification ON user_contacts(tenant_id, notification_enabled) WHERE notification_enabled = TRUE;
-- 更新时间触发器
CREATE TRIGGER update_user_contacts_updated_at
BEFORE UPDATE ON user_contacts
FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- ===========================================
-- 更新 init-db.sql 需要的默认数据(如果需要)
-- ===========================================
-- 暂无默认数据需要插入