feat: BossAi v2.0 UI/UX 重构 + 看板断点续接 + 多轮上下文
- 新增 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:
+60
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user