feat: BossAi v2.0 UI/UX 重构 + 看板断点续接 + 多轮上下文
CI / 后端测试 (push) Has been cancelled
CI / 前端构建 (push) Has been cancelled

- 新增 web2/ 前端:任务卡看板、风险雷达、决策日志、我的团队、快捷指令
- ChatPanel 增强:风险卡置顶、案卡接入、起诉状向导、语音输入
- 事项看板:点击查看详情弹窗、断点续接(恢复历史对话+matterId)
- 保密模式恢复:密码验证后重建内存 session,保留多轮上下文
- 多轮对话:ask/ask-stream/ask-analyze 注入 session 历史,AI 有上下文
- 追问优化:紧扣用户问题,不再偏离主题(社保问社保,工伤问工伤)
- 对话区可滚动,输入区固定可见
- 状态机放宽:允许从任意非终态转到 pending_expert
- session 存活检查端点,后端重启后自动重建 session
- DB migration:风险推送表、案卡表

Generated with [Devin](https://devin.ai)

Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
selfrelease
2026-08-31 08:38:33 +08:00
co-authored by Devin
parent 7a788bf8dc
commit 4de36547cd
88 changed files with 15237 additions and 62 deletions
+60
View File
@@ -193,6 +193,62 @@ CREATE INDEX IF NOT EXISTS idx_chat_messages_session ON chat_messages(session_id
CREATE INDEX IF NOT EXISTS idx_chat_messages_phone ON chat_messages(phone);
CREATE INDEX IF NOT EXISTS idx_chat_messages_phone_mode ON chat_messages(phone, mode);
CREATE INDEX IF NOT EXISTS idx_chat_messages_created ON chat_messages(created_at DESC);
-- ===== BossAi 2.0 新增表 =====
-- 案卡:每次咨询绑定一张案卡,可视化追踪全生命周期
CREATE TABLE IF NOT EXISTS matters (
id SERIAL PRIMARY KEY,
code TEXT NOT NULL UNIQUE,
user_phone TEXT NOT NULL,
scene TEXT NOT NULL,
title TEXT NOT NULL,
status TEXT NOT NULL DEFAULT 'new',
session_id TEXT,
risk_level TEXT,
summary TEXT,
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);
-- 专家关系:用户咨询过的专家自动沉淀为"我的团队"
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);
-- 风险推送:AI 主动提醒用户行业新规、合同风险等
CREATE TABLE IF NOT EXISTS risk_alerts (
id SERIAL PRIMARY KEY,
user_phone TEXT NOT NULL,
level TEXT NOT NULL,
title TEXT NOT NULL,
content TEXT NOT NULL,
source TEXT NOT NULL DEFAULT 'knowledge',
related_matter_id INTEGER,
read_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX IF NOT EXISTS idx_risk_alerts_user ON risk_alerts(user_phone);
CREATE INDEX IF NOT EXISTS idx_risk_alerts_user_read ON risk_alerts(user_phone, read_at);
CREATE INDEX IF NOT EXISTS idx_risk_alerts_created ON risk_alerts(created_at DESC);
"""
# 专家种子数据(密码统一为 expert123,生产环境应让专家自行注册)
@@ -286,6 +342,8 @@ def main():
BEGIN ALTER TABLE review_tickets ADD COLUMN sla_deadline TIMESTAMPTZ; EXCEPTION WHEN duplicate_column THEN NULL; END;
BEGIN ALTER TABLE review_tickets ADD COLUMN sla_status TEXT NOT NULL DEFAULT 'normal'; EXCEPTION WHEN duplicate_column THEN NULL; END;
BEGIN ALTER TABLE users ADD COLUMN status TEXT NOT NULL DEFAULT 'active'; EXCEPTION WHEN duplicate_column THEN NULL; END;
-- 2.0:chat_messages 关联案卡
BEGIN ALTER TABLE chat_messages ADD COLUMN matter_id INTEGER; EXCEPTION WHEN duplicate_column THEN NULL; END;
END $$;
""")
@@ -309,6 +367,8 @@ def main():
# SLA 索引(列已确保存在后创建)
cur.execute("CREATE INDEX IF NOT EXISTS idx_review_tickets_sla ON review_tickets(sla_status)")
# 2.0:案卡关联索引
cur.execute("CREATE INDEX IF NOT EXISTS idx_chat_messages_matter ON chat_messages(matter_id)")
# 清除所有旧知识数据(测试数据已废弃,重新种子)
cur.execute("DELETE FROM knowledge_doc_versions")