2026-06-14 16:49:18 +08:00
|
|
|
|
// =============================================================================
|
|
|
|
|
|
// 企微IT智能服务台 — 管理后台 API 调用函数
|
|
|
|
|
|
// =============================================================================
|
|
|
|
|
|
// 说明:封装所有管理后台 API 端点调用,统一返回类型
|
2026-07-07 21:52:11 +08:00
|
|
|
|
// 所有函数返回 axios response,调用方从 response 获取业务数据
|
2026-06-14 16:49:18 +08:00
|
|
|
|
|
|
|
|
|
|
import apiClient from './index'
|
2026-07-09 13:46:20 +08:00
|
|
|
|
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
|
|
|
|
|
|
})
|
2026-06-14 16:49:18 +08:00
|
|
|
|
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,
|
2026-07-09 13:46:20 +08:00
|
|
|
|
EmployeeSearchResponse,
|
2026-06-14 16:49:18 +08:00
|
|
|
|
} 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<string, string> = {}
|
|
|
|
|
|
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}`)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-07 21:52:11 +08:00
|
|
|
|
/** 重置坐席密码 */
|
|
|
|
|
|
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 })
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-14 16:49:18 +08:00
|
|
|
|
// ==========================================================================
|
|
|
|
|
|
// 外部系统集成配置
|
|
|
|
|
|
// ==========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/** 获取集成系统列表及配置状态 */
|
|
|
|
|
|
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<string, string> = {}
|
|
|
|
|
|
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)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-07 21:52:11 +08:00
|
|
|
|
/** 创建快速回复模板 */
|
|
|
|
|
|
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<QuickReplyTemplate>
|
|
|
|
|
|
): 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<string, string> = {}
|
|
|
|
|
|
if (category) params.category = category
|
|
|
|
|
|
if (keyword) params.keyword = keyword
|
|
|
|
|
|
return apiClient.get('/knowledge', { params })
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** 创建知识库条目 */
|
|
|
|
|
|
export function createKnowledgeBase(
|
|
|
|
|
|
data: Omit<KnowledgeBaseItem, 'id' | 'view_count' | 'use_count' | 'created_at' | 'updated_at'>
|
|
|
|
|
|
): Promise<{ data: { code: number; data: KnowledgeBaseItem; message: string } }> {
|
|
|
|
|
|
return apiClient.post('/knowledge', data)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/** 更新知识库条目 */
|
|
|
|
|
|
export function updateKnowledgeBase(
|
|
|
|
|
|
id: string,
|
|
|
|
|
|
data: Partial<KnowledgeBaseItem>
|
|
|
|
|
|
): 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}`)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-14 16:49:18 +08:00
|
|
|
|
// ==========================================================================
|
|
|
|
|
|
// 消息分配模式
|
|
|
|
|
|
// ==========================================================================
|
|
|
|
|
|
|
|
|
|
|
|
/** 获取当前分配模式 */
|
|
|
|
|
|
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<string, string> = {}
|
|
|
|
|
|
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')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-08 21:54:57 +08:00
|
|
|
|
/** 获取用户角色分配列表 */
|
|
|
|
|
|
export function getUserRoleAssignments(): Promise<{ data: { code: number; data: any[]; message: string } }> {
|
|
|
|
|
|
return apiClient.get('/admin/roles/user-roles')
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-14 16:49:18 +08:00
|
|
|
|
/** 手动分配角色给用户 */
|
|
|
|
|
|
export function assignRole(
|
|
|
|
|
|
data: RoleAssignRequest
|
|
|
|
|
|
): Promise<{ data: { code: number; data: null; message: string } }> {
|
|
|
|
|
|
return apiClient.post('/admin/roles/assign', data)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-09 13:46:20 +08:00
|
|
|
|
/** 员工目录搜索(分配角色时按姓名/账号自动补全) */
|
|
|
|
|
|
export function searchEmployees(
|
|
|
|
|
|
q: string
|
|
|
|
|
|
): Promise<{ data: { code: number; data: EmployeeSearchResponse; message: string } }> {
|
|
|
|
|
|
return apiClient.get('/admin/roles/employees/search', { params: { q } })
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-06-14 16:49:18 +08:00
|
|
|
|
/** 撤销用户角色 */
|
|
|
|
|
|
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: 系统日志
|
|
|
|
|
|
// ==========================================================================
|
|
|
|
|
|
|
2026-07-09 13:46:20 +08:00
|
|
|
|
/** 获取系统日志(配置变更历史),支持配置键/操作人/时间范围筛选 */
|
2026-06-14 16:49:18 +08:00
|
|
|
|
export function getSystemLogs(params?: {
|
|
|
|
|
|
page?: number
|
|
|
|
|
|
page_size?: number
|
2026-07-09 13:46:20 +08:00
|
|
|
|
config_key?: string
|
|
|
|
|
|
changed_by?: string
|
|
|
|
|
|
from?: string
|
|
|
|
|
|
to?: string
|
2026-06-14 16:49:18 +08:00
|
|
|
|
}): Promise<{ data: { code: number; data: { items: any[]; total: number; page: number; page_size: number }; message: string } }> {
|
|
|
|
|
|
return apiClient.get('/admin/system-logs', { params })
|
|
|
|
|
|
}
|
2026-07-07 21:52:11 +08:00
|
|
|
|
|
2026-07-09 13:46:20 +08:00
|
|
|
|
// ==========================================================================
|
|
|
|
|
|
// 安全审计日志 (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<Blob> {
|
|
|
|
|
|
return downloadClient
|
|
|
|
|
|
.get('/admin/runtime-logs', {
|
|
|
|
|
|
params: { ...params, download: true },
|
|
|
|
|
|
responseType: 'blob',
|
|
|
|
|
|
})
|
|
|
|
|
|
.then((res) => res.data as Blob)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2026-07-07 21:52:11 +08:00
|
|
|
|
// ==========================================================================
|
|
|
|
|
|
// 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,
|
2026-07-09 13:46:20 +08:00
|
|
|
|
getAuditLogs,
|
|
|
|
|
|
getRuntimeLogs,
|
|
|
|
|
|
getRuntimeLogDownload,
|
2026-07-07 21:52:11 +08:00
|
|
|
|
}
|