-- BossAi 2.0 UIUX 重构 — 数据库迁移脚本 -- TASK-001: 案卡表 + sessions 扩展 -- TASK-002: 专家关系表 -- 幂等:可重复执行,已存在的对象跳过 -- 运行:psql -d mcp -f migrations/001_bossai_v2.sql BEGIN; -- ============================================================ -- TASK-001: 案卡(matters)表 -- ============================================================ CREATE TABLE IF NOT EXISTS matters ( id SERIAL PRIMARY KEY, code TEXT NOT NULL UNIQUE, -- 唯一业务代码 MTR_{YYYYMMDD}_{seq} user_phone TEXT NOT NULL, -- 所属老板(手机号,关联 users.phone) scene TEXT NOT NULL, -- legal / decision / life / emotion title TEXT NOT NULL, -- 案卡标题(AI 生成或用户命名) status TEXT NOT NULL DEFAULT 'new', -- new / asking_facts / pending_confirm / analyzing / pending_expert / closed session_id TEXT, -- 关联会话 sid(可空,旧会话无案卡) risk_level TEXT, -- 可空: green / amber / orange / red summary TEXT, -- 可空: AI 结论摘要 closed_at TIMESTAMPTZ, -- 闭环时间 execution_result TEXT, -- 可空: 顺利 / 受阻 / 未执行 execution_note TEXT, -- 可空: 执行情况备注 created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_matters_user_phone ON matters(user_phone); CREATE INDEX IF NOT EXISTS idx_matters_status ON matters(status); CREATE INDEX IF NOT EXISTS idx_matters_user_status ON matters(user_phone, status); CREATE INDEX IF NOT EXISTS idx_matters_created ON matters(created_at DESC); -- 案卡状态流转合法性约束(通过 CHECK) ALTER TABLE matters DROP CONSTRAINT IF EXISTS chk_matters_status; ALTER TABLE matters ADD CONSTRAINT chk_matters_status CHECK ( status IN ('new', 'asking_facts', 'pending_confirm', 'analyzing', 'pending_expert', 'closed') ); ALTER TABLE matters DROP CONSTRAINT IF EXISTS chk_matters_scene; ALTER TABLE matters ADD CONSTRAINT chk_matters_scene CHECK ( scene IN ('legal', 'decision', 'life', 'emotion') ); ALTER TABLE matters DROP CONSTRAINT IF EXISTS chk_matters_risk; ALTER TABLE matters ADD CONSTRAINT chk_matters_risk CHECK ( risk_level IS NULL OR risk_level IN ('green', 'amber', 'orange', 'red') ); -- sessions 表扩展:关联案卡(若 sessions 表存在) DO $$ BEGIN IF EXISTS ( SELECT 1 FROM information_schema.tables WHERE table_name = 'sessions' ) AND NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'sessions' AND column_name = 'matter_id' ) THEN ALTER TABLE sessions ADD COLUMN matter_id INTEGER REFERENCES matters(id); CREATE INDEX IF NOT EXISTS idx_sessions_matter ON sessions(matter_id); END IF; END $$; -- chat_messages 表扩展:关联案卡(用于无 sessions 表时通过消息关联) DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM information_schema.columns WHERE table_name = 'chat_messages' AND column_name = 'matter_id' ) THEN ALTER TABLE chat_messages ADD COLUMN matter_id INTEGER REFERENCES matters(id); CREATE INDEX IF NOT EXISTS idx_chat_messages_matter ON chat_messages(matter_id); END IF; END $$; -- ============================================================ -- TASK-002: 专家关系(expert_relations)表 -- ============================================================ CREATE TABLE IF NOT EXISTS expert_relations ( id SERIAL PRIMARY KEY, user_phone TEXT NOT NULL, -- 老板手机号 expert_id INTEGER NOT NULL REFERENCES experts(id), consultation_count INTEGER NOT NULL DEFAULT 0, -- 咨询次数 last_consulted_at TIMESTAMPTZ, -- 最近咨询时间 last_topic TEXT, -- 最近咨询话题 tags TEXT, -- 擅长领域标签(逗号分隔) created_at TIMESTAMPTZ NOT NULL DEFAULT now(), updated_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE(user_phone, expert_id) ); CREATE INDEX IF NOT EXISTS idx_expert_relations_user ON expert_relations(user_phone); CREATE INDEX IF NOT EXISTS idx_expert_relations_expert ON expert_relations(expert_id); COMMIT; -- ============================================================ -- 回滚脚本(手动执行,需谨慎) -- 反向执行:psql -d mcp -f migrations/001_bossai_v2_rollback.sql -- ============================================================ -- BEGIN; -- ALTER TABLE chat_messages DROP COLUMN IF EXISTS matter_id; -- ALTER TABLE sessions DROP COLUMN IF EXISTS matter_id; -- DROP TABLE IF EXISTS expert_relations; -- DROP TABLE IF EXISTS matters; -- COMMIT;