// ============================================================================= // 企微IT智能服务台 — 管理后台 API 调用函数 // ============================================================================= // 说明:封装所有管理后台 API 端点调用,统一返回类型 // 所有函数返回 axios response,调用方从 response 获取业务数据 import apiClient from './index' import axios from 'axios' // 运行期日志下载使用独立 axios 实例:响应为 blob(文件流), // 不能走 apiClient 的 JSON 信封拦截器(会把 blob 当成 {code,message,data} 解析而报错)。 const downloadClient = axios.create({ baseURL: '/api', timeout: 30000, }) downloadClient.interceptors.request.use((config) => { const token = localStorage.getItem('admin_token') if (token) { config.headers.Authorization = `Bearer ${token}` } return config }) import type { DashboardOverview, ConfigGroup, UpdateConfigRequest, UpdateConfigResponse, PaginatedData, ConfigChangeLogEntry, Agent, CreateAgentRequest, UpdateAgentRequest, Integration, UpdateIntegrationRequest, QuickReplyTemplate, ReviewQuickReplyRequest, ReviewQuickReplyResponse, AssignmentModeConfig, UpdateAssignmentModeRequest, MonitorSessionsData, SearchResults, Role, RoleAssignRequest, RoleRevokeRequest, RoleMappingRule, RoleMappingRuleRequest, EmployeeSearchResponse, } from '@/types' // ========================================================================== // 运营总览 // ========================================================================== /** 获取仪表盘统计数据 */ export function getDashboardOverview(): Promise<{ data: { code: number; data: DashboardOverview; message: string } }> { return apiClient.get('/admin/dashboard/overview') } // ========================================================================== // 功能开关/参数管理 // ========================================================================== /** 获取全部配置项(按功能分组) */ export function getConfigGroups(): Promise<{ data: { code: number; data: { groups: ConfigGroup[] }; message: string } }> { return apiClient.get('/admin/configs') } /** 更新单个配置项 */ export function updateConfig( key: string, value: string ): Promise<{ data: { code: number; data: UpdateConfigResponse; message: string } }> { const body: UpdateConfigRequest = { value } return apiClient.put(`/admin/configs/${key}`, body) } /** 获取指定配置项的变更历史 */ export function getConfigHistory( key: string, limit: number = 20 ): Promise<{ data: { code: number; data: { items: ConfigChangeLogEntry[] }; message: string } }> { return apiClient.get(`/admin/configs/${key}/history`, { params: { limit } }) } // ========================================================================== // 坐席管理 // ========================================================================== /** 获取坐席列表(管理视图) */ export function getAgents( status?: string ): Promise<{ data: { code: number; data: { items: Agent[] }; message: string } }> { const params: Record = {} if (status && status !== 'all') { params.status = status } return apiClient.get('/admin/agents', { params }) } /** 添加坐席 */ export function createAgent( data: CreateAgentRequest ): Promise<{ data: { code: number; data: Agent; message: string } }> { return apiClient.post('/admin/agents', data) } /** 编辑坐席 */ export function updateAgent( id: string, data: UpdateAgentRequest ): Promise<{ data: { code: number; data: Agent; message: string } }> { return apiClient.put(`/admin/agents/${id}`, data) } // ========================================================================== // OTP 管理 // ========================================================================== /** 强制解绑OTP */ export function unbindOtp( id: string ): Promise<{ data: { code: number; data: { message: string }; message: string } }> { return apiClient.post(`/admin/agents/${id}/otp-unbind`) } /** 移除坐席 */ export function deleteAgent( id: string ): Promise<{ data: { code: number; data: null; message: string } }> { return apiClient.delete(`/admin/agents/${id}`) } /** 重置坐席密码 */ export function resetAgentPassword( id: string, newPassword: string ): Promise<{ data: { code: number; data: { message: string }; message: string } }> { return apiClient.post(`/admin/agents/${id}/reset-password`, { new_password: newPassword }) } // ========================================================================== // 外部系统集成配置 // ========================================================================== /** 获取集成系统列表及配置状态 */ export function getIntegrations(): Promise<{ data: { code: number; data: { items: Integration[] }; message: string } }> { return apiClient.get('/admin/integrations') } /** 更新集成配置(支持 url_key 和 access_key 两种模式) */ export function updateIntegration( id: string, data: UpdateIntegrationRequest ): Promise<{ data: { code: number; data: Integration; message: string } }> { return apiClient.put(`/admin/integrations/${id}`, data) } // ========================================================================== // 火绒安全集成 API // ========================================================================== /** 火绒连接测试结果 */ export interface HuorongTestResult { success: boolean message: string total_terminals?: number } /** 测试火绒API连接 */ export function testHuorongConnection(): Promise<{ data: { code: number; data: HuorongTestResult; message: string } }> { return apiClient.post('/admin/integrations/huorong/test') } /** 火绒终端列表 */ export function getHuorongTerminals( params?: { group_id?: string; page?: number; per_page?: number } ): Promise<{ data: { code: number; data: any; message: string } }> { return apiClient.get('/admin/integrations/huorong/terminals', { params }) } /** 火绒终端详情 */ export function getHuorongTerminalDetail( clientId: string ): Promise<{ data: { code: number; data: any; message: string } }> { return apiClient.get(`/admin/integrations/huorong/terminals/${clientId}`) } /** 火绒漏洞信息 */ export function getHuorongLeaks( params?: { group_id?: string; page?: number; per_page?: number } ): Promise<{ data: { code: number; data: any; message: string } }> { return apiClient.get('/admin/integrations/huorong/leaks', { params }) } /** 火绒病毒事件 */ export function getHuorongVirusEvents( params?: { client_id?: string; group_id?: string; query_type?: number; page?: number; per_page?: number } ): Promise<{ data: { code: number; data: any; message: string } }> { return apiClient.get('/admin/integrations/huorong/virus-events', { params }) } // ========================================================================== // 联软LV7000 安全集成 API // ========================================================================== /** 测试联软API连接 */ export function testLianruanConnection(): Promise<{ data: { code: number; data: any; message: string } }> { return apiClient.post('/admin/integrations/lianruan/test') } /** 联软终端查询(核心映射接口) */ export function queryLianruanTerminals( params?: { strusername?: string; strdevname?: string; strdevip?: string; page?: number; per_page?: number } ): Promise<{ data: { code: number; data: any; message: string } }> { return apiClient.get('/admin/integrations/lianruan/terminals', { params }) } // ========================================================================== // RAGFlow 知识检索集成 // ========================================================================== /** 测试 RAGFlow API 连接 */ export function testRagflowConnection(): Promise<{ data: { code: number; data: { success: boolean; message: string }; message: string } }> { return apiClient.post('/admin/integrations/ragflow/test') } /** 列出 RAGFlow 知识库(数据集) */ export function getRagflowDatasets(params?: { page?: number page_size?: number }): Promise<{ data: { code: number; data: { items: any[]; total: number }; message: string } }> { return apiClient.get('/admin/integrations/ragflow/datasets', { params }) } /** RAGFlow 知识检索测试 */ export function ragflowRetrieval(params: { question: string dataset_ids?: string top_k?: number }): Promise<{ data: { code: number; data: { chunks: any[]; doc_aggs: any[]; total: number }; message: string } }> { return apiClient.post('/admin/integrations/ragflow/retrieval', null, { params }) } /** 联软终端详细信息 */ export function getLianruanTerminalDetail( devname: string ): Promise<{ data: { code: number; data: any; message: string } }> { return apiClient.get(`/admin/integrations/lianruan/terminals/${encodeURIComponent(devname)}/detail`) } // ========================================================================== // 快速回复审核 // ========================================================================== /** 获取待审核模板列表 */ export function getPendingQuickReplies( category?: string ): Promise<{ data: { code: number; data: { items: QuickReplyTemplate[] }; message: string } }> { const params: Record = {} if (category && category !== '全部') { params.category = category } return apiClient.get('/admin/quick-replies/pending', { params }) } /** 审核快速回复模板(通过/驳回) */ export function reviewQuickReply( id: string, action: string, reason?: string ): Promise<{ data: { code: number; data: ReviewQuickReplyResponse; message: string } }> { const body: ReviewQuickReplyRequest = { action: action as ReviewQuickReplyRequest['action'], reason } return apiClient.put(`/admin/quick-replies/${id}/review`, body) } /** 创建快速回复模板 */ export function createQuickReplyTemplate( data: QuickReplyTemplate ): Promise<{ data: { code: number; data: QuickReplyTemplate; message: string } }> { return apiClient.post('/quick-replies', data) } /** 更新快速回复模板 */ export function updateQuickReplyTemplate( id: string, data: Partial ): Promise<{ data: { code: number; data: QuickReplyTemplate; message: string } }> { return apiClient.put(`/quick-replies/${id}`, data) } // ========================================================================== // 知识库管理 // ========================================================================== /** 知识库条目类型 */ export interface KnowledgeBaseItem { id: string category: string title: string content: string tags: string[] view_count: number use_count: number created_at: string updated_at: string } /** 获取知识库列表 */ export function getKnowledgeBase( category?: string, keyword?: string ): Promise<{ data: { code: number; data: { items: KnowledgeBaseItem[] }; message: string } }> { const params: Record = {} if (category) params.category = category if (keyword) params.keyword = keyword return apiClient.get('/knowledge', { params }) } /** 创建知识库条目 */ export function createKnowledgeBase( data: Omit ): Promise<{ data: { code: number; data: KnowledgeBaseItem; message: string } }> { return apiClient.post('/knowledge', data) } /** 更新知识库条目 */ export function updateKnowledgeBase( id: string, data: Partial ): Promise<{ data: { code: number; data: KnowledgeBaseItem; message: string } }> { return apiClient.put(`/knowledge/${id}`, data) } /** 删除知识库条目 */ export function deleteKnowledgeBase( id: string ): Promise<{ data: { code: number; data: null; message: string } }> { return apiClient.delete(`/knowledge/${id}`) } // ========================================================================== // 消息分配模式 // ========================================================================== /** 获取当前分配模式 */ export function getAssignmentMode(): Promise<{ data: { code: number; data: AssignmentModeConfig; message: string } }> { return apiClient.get('/admin/assignment-mode') } /** 切换分配模式 */ export function updateAssignmentMode( mode: string ): Promise<{ data: { code: number; data: AssignmentModeConfig; message: string } }> { const body: UpdateAssignmentModeRequest = { mode } return apiClient.put('/admin/assignment-mode', body) } // ========================================================================== // 会话监控 // ========================================================================== /** 获取实时会话列表(Demo预览) */ export function getMonitorSessions( status?: string ): Promise<{ data: { code: number; data: MonitorSessionsData; message: string } }> { const params: Record = {} if (status) { params.status = status } return apiClient.get('/admin/monitor/sessions', { params }) } // ========================================================================== // 全局搜索 // ========================================================================== /** 搜索配置项、坐席、快速回复 */ export function globalSearch( query: string ): Promise<{ data: { code: number; data: SearchResults; message: string } }> { return apiClient.get('/admin/search', { params: { q: query } }) } // ========================================================================== // 角色管理 // ========================================================================== /** 获取所有角色列表(含用户数量统计) */ export function getRoles(): Promise<{ data: { code: number; data: Role[]; message: string } }> { return apiClient.get('/admin/roles') } /** 获取用户角色分配列表 */ export function getUserRoleAssignments(): Promise<{ data: { code: number; data: any[]; message: string } }> { return apiClient.get('/admin/roles/user-roles') } /** 手动分配角色给用户 */ export function assignRole( data: RoleAssignRequest ): Promise<{ data: { code: number; data: null; message: string } }> { return apiClient.post('/admin/roles/assign', data) } /** 员工目录搜索(分配角色时按姓名/账号自动补全) */ export function searchEmployees( q: string ): Promise<{ data: { code: number; data: EmployeeSearchResponse; message: string } }> { return apiClient.get('/admin/roles/employees/search', { params: { q } }) } /** 撤销用户角色 */ export function revokeRole( data: RoleRevokeRequest ): Promise<{ data: { code: number; data: null; message: string } }> { return apiClient.post('/admin/roles/revoke', data) } /** 获取所有角色映射规则 */ export function getRoleMappingRules(): Promise<{ data: { code: number; data: RoleMappingRule[]; message: string } }> { return apiClient.get('/admin/roles/mapping-rules') } /** 创建角色映射规则 */ export function createRoleMappingRule( data: RoleMappingRuleRequest ): Promise<{ data: { code: number; data: { id: string }; message: string } }> { return apiClient.post('/admin/roles/mapping-rules', data) } /** 删除角色映射规则 */ export function deleteRoleMappingRule( ruleId: string ): Promise<{ data: { code: number; data: null; message: string } }> { return apiClient.delete(`/admin/roles/mapping-rules/${ruleId}`) } // ========================================================================== // P2: 会话审计 // ========================================================================== /** 获取会话审计列表 */ export function getAuditConversations(params?: { status?: string agent_id?: string keyword?: string date_from?: string date_to?: string page?: number page_size?: number }): Promise<{ data: { code: number; data: { items: any[]; total: number; page: number; page_size: number }; message: string } }> { return apiClient.get('/admin/audit/conversations', { params }) } /** 获取会话审计详情(含消息列表) */ export function getAuditConversationDetail( conversationId: string ): Promise<{ data: { code: number; data: any; message: string } }> { return apiClient.get(`/admin/audit/conversations/${conversationId}`) } // ========================================================================== // P2: 坐席绩效统计 // ========================================================================== /** 获取坐席绩效统计 */ export function getAgentPerformance(params?: { date_from?: string date_to?: string }): Promise<{ data: { code: number; data: { items: any[] }; message: string } }> { return apiClient.get('/admin/agent-performance', { params }) } // ========================================================================== // P2: 系统日志 // ========================================================================== /** 获取系统日志(配置变更历史),支持配置键/操作人/时间范围筛选 */ export function getSystemLogs(params?: { page?: number page_size?: number config_key?: string changed_by?: string from?: string to?: string }): Promise<{ data: { code: number; data: { items: any[]; total: number; page: number; page_size: number }; message: string } }> { return apiClient.get('/admin/system-logs', { params }) } // ========================================================================== // 安全审计日志 (B) — 复用既有后端 GET /admin/audit-logs // ========================================================================== /** 获取安全审计日志(分页 + 操作人/操作类型/时间范围筛选) */ export function getAuditLogs(params?: { employee_id?: string action?: string from?: string to?: string page?: number page_size?: number }): Promise<{ data: { code: number; data: { items: any[]; total: number; page: number; page_size: number }; message: string } }> { return apiClient.get('/admin/audit-logs', { params }) } // ========================================================================== // 运行期日志 (D) — 新增后端 GET /admin/runtime-logs // ========================================================================== /** 获取运行期日志(分页 + 级别/时间/关键字筛选) */ export function getRuntimeLogs(params?: { level?: string from?: string to?: string keyword?: string page?: number page_size?: number }): Promise<{ data: { code: number; data: { items: any[]; total: number; page: number; page_size: number }; message: string } }> { return apiClient.get('/admin/runtime-logs', { params }) } /** 下载运行期日志(命中行文本,blob 流,responseType: blob) */ export function getRuntimeLogDownload(params?: { level?: string from?: string to?: string keyword?: string }): Promise { return downloadClient .get('/admin/runtime-logs', { params: { ...params, download: true }, responseType: 'blob', }) .then((res) => res.data as Blob) } // ========================================================================== // P2: 满意度评价统计 // ========================================================================== /** 满意度评价统计数据项 */ export interface EvaluationStatsItem { label: string count: number percentage: number } /** 满意度评价记录 */ export interface EvaluationRecord { id: string conversation_id: string employee_id: string employee_name: string star_rating: number emoji: string feedback_text: string | null created_at: string } /** 满意度评价统计响应 */ export interface EvaluationStatsResponse { total_count: number avg_star_rating: number star_distribution: EvaluationStatsItem[] emoji_distribution: EvaluationStatsItem[] recent_evaluations: EvaluationRecord[] } /** 获取满意度评价统计数据 */ export function getEvaluationStats(params?: { page?: number page_size?: number }): Promise<{ data: { code: number; data: EvaluationStatsResponse; message: string } }> { return apiClient.get('/evaluations/stats', { params }) } // ========================================================================== // 知识库自动迭代 (P2-13) // ========================================================================== /** 知识库优化建议项 */ export interface KnowledgeSuggestionItem { id: string suggestion_type: 'new_faq' | 'update' | 'outdated' status: 'pending' | 'approved' | 'rejected' | 'applied' title: string content: string category: string tags: string[] source_type: 'annotation' | 'conversation' | 'ai_uncertain' source_data: string[] | null reason: string | null reject_reason: string | null reviewer_id: string | null reviewed_at: string | null created_at: string updated_at: string } /** 知识库优化建议统计 */ export interface KnowledgeSuggestionStats { total: number pending: number approved: number rejected: number applied: number new_faq_count: number update_count: number outdated_count: number } /** 获取知识库优化建议列表 */ export function getKnowledgeSuggestions(params?: { status?: string suggestion_type?: string page?: number page_size?: number }): Promise<{ data: { code: number; data: { total: number; items: KnowledgeSuggestionItem[] }; message: string } }> { return apiClient.get('/admin/knowledge-iteration/suggestions', { params }) } /** 获取知识库优化建议详情 */ export function getKnowledgeSuggestion( id: string ): Promise<{ data: { code: number; data: KnowledgeSuggestionItem; message: string } }> { return apiClient.get(`/admin/knowledge-iteration/suggestions/${id}`) } /** 触发知识库迭代分析 */ export function triggerKnowledgeIterationAnalysis(params: { days?: number }): Promise<{ data: { code: number; data: any; message: string } }> { return apiClient.post('/admin/knowledge-iteration/analyze', null, { params }) } /** 获取知识库建议统计 */ export function getKnowledgeSuggestionStats(): Promise<{ data: { code: number; data: KnowledgeSuggestionStats; message: string } }> { return apiClient.get('/admin/knowledge-iteration/stats') } /** 审核通过知识库建议 */ export function approveKnowledgeSuggestion( id: string ): Promise<{ data: { code: number; data: KnowledgeSuggestionItem; message: string } }> { return apiClient.post(`/admin/knowledge-iteration/suggestions/${id}/approve`) } /** 拒绝知识库建议 */ export function rejectKnowledgeSuggestion( id: string, body: { reject_reason: string } ): Promise<{ data: { code: number; data: KnowledgeSuggestionItem; message: string } }> { return apiClient.post(`/admin/knowledge-iteration/suggestions/${id}/reject`, body) } /** 管理员 API 对象 (供 KnowledgeSuggestions 等页面使用) */ export const adminApi = { getKnowledgeSuggestions, getKnowledgeSuggestionStats, triggerKnowledgeIterationAnalysis, approveKnowledgeSuggestion, rejectKnowledgeSuggestion, getDashboardOverview, getConfigGroups, updateConfig, getConfigHistory, getAgents, createAgent, updateAgent, unbindOtp, deleteAgent, getIntegrations, updateIntegration, testHuorongConnection, getHuorongTerminals, getHuorongTerminalDetail, getHuorongLeaks, getHuorongVirusEvents, testLianruanConnection, queryLianruanTerminals, getLianruanTerminalDetail, testRagflowConnection, getRagflowDatasets, ragflowRetrieval, getPendingQuickReplies, reviewQuickReply, createQuickReplyTemplate, updateQuickReplyTemplate, getKnowledgeBase, createKnowledgeBase, updateKnowledgeBase, deleteKnowledgeBase, getAssignmentMode, updateAssignmentMode, getMonitorSessions, globalSearch, getRoles, assignRole, revokeRole, getRoleMappingRules, createRoleMappingRule, deleteRoleMappingRule, getAuditConversations, getAuditConversationDetail, getAgentPerformance, getSystemLogs, getEvaluationStats, getAuditLogs, getRuntimeLogs, getRuntimeLogDownload, }