feat: 对话历史页面租户分组展示功能

- 新增 ConversationHistoryManager.get_tenant_summary() 按租户聚合会话统计
- get_sessions_paginated() 和 get_conversation_analytics() 增加 tenant_id 过滤
- 新增 GET /api/conversations/tenants 租户汇总端点
- sessions 和 analytics API 端点支持 tenant_id 查询参数
- 前端实现租户卡片列表视图和租户详情会话表格视图
- 实现面包屑导航、搜索范围限定、统计面板上下文切换
- 会话删除后自动检测空租户并返回列表视图
- dashboard.html 添加租户视图 DOM 容器
- 交互模式与知识库租户分组视图保持一致
This commit is contained in:
2026-04-01 16:11:02 +08:00
parent e14e3ee7a5
commit 7013e9db70
27 changed files with 2753 additions and 276 deletions

58
scripts/migrate_tenant.py Normal file
View File

@@ -0,0 +1,58 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
多租户迁移脚本
为现有数据表添加 tenant_id 字段,已有数据填充为 'default'
"""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from src.core.database import db_manager
from sqlalchemy import text, inspect
TABLES_TO_MIGRATE = [
"work_orders",
"chat_sessions",
"conversations",
"knowledge_entries",
"analytics",
"alerts",
"users",
]
def migrate():
print("=" * 50)
print("多租户迁移: 添加 tenant_id 字段")
print("=" * 50)
with db_manager.get_session() as session:
inspector = inspect(session.bind)
for table in TABLES_TO_MIGRATE:
# 检查表是否存在
if table not in inspector.get_table_names():
print(f" [跳过] 表 {table} 不存在")
continue
# 检查字段是否已存在
columns = [col["name"] for col in inspector.get_columns(table)]
if "tenant_id" in columns:
print(f" [已有] 表 {table} 已包含 tenant_id")
continue
# 添加字段
print(f" [迁移] 表 {table} 添加 tenant_id ...")
session.execute(text(
f"ALTER TABLE {table} ADD COLUMN tenant_id VARCHAR(50) DEFAULT 'default' NOT NULL"
))
session.commit()
print(f" [完成] 表 {table} 迁移成功")
print("\n迁移完成!")
if __name__ == "__main__":
migrate()