feat: 租户管理体系建设 CRUD + 各业务模块接入 tenant_id

1. 新增 Tenant 模型(tenants 表),支持租户创建、重命名、删除
2. 新增 /api/tenants CRUD 蓝图,default 租户不可删除
3. 数据库初始化时自动创建默认租户记录
4. Dashboard 新增租户管理标签页(创建/编辑/删除租户)
5. 各业务模块写入数据时正确传递 tenant_id:
   - realtime_chat: create_session 和 _save_conversation 支持 tenant_id
   - dialogue_manager: _save_conversation 和 create_work_order 支持 tenant_id
   - conversation_history: save_conversation 支持 tenant_id
   - workorder_sync: sync_from_feishu 支持 tenant_id
   - websocket_server: create_session 传递 tenant_id
   - HTTP chat API: create_session 传递 tenant_id
   - feishu_sync API: 同步时传递 tenant_id
   - workorders API: 创建工单时传递 tenant_id
6. 网页对话入口添加租户选择器
7. 知识库搜索按租户隔离(realtime_chat 中 _search_knowledge 传递 tenant_id)
8. 初始化时自动加载租户列表填充选择器
This commit is contained in:
2026-04-02 09:33:16 +08:00
parent 7013e9db70
commit edb0616f7f
14 changed files with 465 additions and 15 deletions

View File

@@ -439,6 +439,10 @@
<i class="fas fa-sliders-h"></i>
系统设置
</a>
<a class="nav-link" href="#tenant-management" data-tab="tenant-management">
<i class="fas fa-building"></i>
租户管理
</a>
</nav>
</div>
</div>
@@ -568,6 +572,13 @@
<h5><i class="fas fa-cog me-2"></i>对话控制</h5>
</div>
<div class="card-body">
<div class="mb-3">
<label class="form-label">租户</label>
<select class="form-select" id="chat-tenant-id">
<option value="default">默认租户</option>
</select>
</div>
<div class="mb-3">
<label class="form-label">用户ID</label>
<input type="text" class="form-control" id="user-id" value="user_001">
@@ -2187,6 +2198,76 @@
</div>
<!-- 模态框 -->
<!-- 租户管理标签页 -->
<div id="tenant-management-tab" class="tab-content" style="display: none;">
<div class="row mb-4">
<div class="col-md-8">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5><i class="fas fa-building me-2"></i>租户管理</h5>
<button class="btn btn-primary btn-sm" onclick="dashboard.showCreateTenantModal()">
<i class="fas fa-plus me-1"></i>新建租户
</button>
</div>
<div class="card-body">
<div id="tenant-list">
<div class="loading-spinner">
<i class="fas fa-spinner fa-spin"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-header">
<h5><i class="fas fa-info-circle me-2"></i>说明</h5>
</div>
<div class="card-body">
<p class="text-muted">租户代表不同的市场或业务单元。每个租户拥有独立的知识库、对话历史和工单数据。</p>
<ul class="text-muted small">
<li>创建租户后,可在各业务模块中选择租户</li>
<li>默认租户不可删除</li>
<li>可为每个租户配置独立的飞书应用和机器人</li>
</ul>
</div>
</div>
</div>
</div>
</div>
<!-- 创建/编辑租户模态框 -->
<div class="modal fade" id="tenantModal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="tenantModalTitle">新建租户</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<input type="hidden" id="tenant-edit-id">
<div class="mb-3" id="tenant-id-group">
<label class="form-label">租户标识 (tenant_id)</label>
<input type="text" class="form-control" id="tenant-id-input" placeholder="如 market_a创建后不可修改">
<div class="form-text">唯一标识,建议使用英文和下划线</div>
</div>
<div class="mb-3">
<label class="form-label">租户名称</label>
<input type="text" class="form-control" id="tenant-name-input" placeholder="如 市场A">
</div>
<div class="mb-3">
<label class="form-label">描述</label>
<textarea class="form-control" id="tenant-desc-input" rows="2" placeholder="可选"></textarea>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
<button type="button" class="btn btn-primary" onclick="dashboard.saveTenant()">保存</button>
</div>
</div>
</div>
</div>
<!-- 创建工单模态框 -->
<div class="modal fade" id="createWorkOrderModal" tabindex="-1">
<div class="modal-dialog">