WIP-CHECKPOINT[auth-refactor]: 固化工程师崩溃前部分成果 + 同树其他未提交WIP(仅源码,不含密钥/二进制)-- 待重激活工程师续作

This commit is contained in:
Simon
2026-07-07 21:52:11 +08:00
parent 242c1967ff
commit fab75760e0
203 changed files with 21504 additions and 3345 deletions
+247 -1
View File
@@ -2,7 +2,7 @@
// 企微IT智能服务台 — 管理后台 API 调用函数
// =============================================================================
// 说明:封装所有管理后台 API 端点调用,统一返回类型
// 所有函数返回 axios response,调用方从 response.data.data 获取业务数据
// 所有函数返回 axios response,调用方从 response 获取业务数据
import apiClient from './index'
import type {
@@ -114,6 +114,14 @@ export function deleteAgent(
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 })
}
// ==========================================================================
// 外部系统集成配置
// ==========================================================================
@@ -250,6 +258,71 @@ export function reviewQuickReply(
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<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}`)
}
// ==========================================================================
// 消息分配模式
// ==========================================================================
@@ -383,3 +456,176 @@ export function getSystemLogs(params?: {
}): Promise<{ data: { code: number; data: { items: any[]; total: number; page: number; page_size: number }; message: string } }> {
return apiClient.get('/admin/system-logs', { params })
}
// ==========================================================================
// 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,
}
+8 -6
View File
@@ -71,19 +71,21 @@ apiClient.interceptors.response.use(
})
}
// 返回 rejected Promise,让调用方的 catch 能捕获
return Promise.reject(new Error(res.message || '请求失败'))
// 返回 rejected Promise,让调用方的 catch 能捕获Scheme A: {code, message}
return Promise.reject({ code: res.code, message: res.message || '请求失败' })
}
// 业务成功:返回完整响应(调用方从 response.data.data 获取业务数据
return response
// 业务成功:Scheme A — 直接返回 inner data(三端统一契约
return res.data
},
(error) => {
// 网络错误或服务器错误(HTTP 状态码非 2xx)
// 网络错误或服务器错误(HTTP 状态码非 2xx)— 统一 reject {code, message}CTRT-03
let message = '网络异常,请稍后重试'
let code = -1
if (error.response) {
// 服务器返回了错误状态码
code = error.response.status
switch (error.response.status) {
case 401:
message = '未授权,请重新登录'
@@ -110,7 +112,7 @@ apiClient.interceptors.response.use(
// 显示错误提示
ElMessage.error(message)
return Promise.reject(error)
return Promise.reject({ code, message })
}
)
+2 -2
View File
@@ -92,7 +92,7 @@ export async function listMfaUsers(
params: MfaUserListParams = {}
): Promise<MfaUserListData> {
const response: AxiosResponse = await apiClient.get('/admin/mfa/users', { params })
return response.data.data
return response
}
/**
@@ -107,5 +107,5 @@ export async function resetMfa(employeeId: string): Promise<MfaAdminResetData> {
const response: AxiosResponse = await apiClient.post(
`/admin/mfa/reset/${encodeURIComponent(employeeId)}`
)
return response.data.data
return response
}
+1 -1
View File
@@ -76,7 +76,7 @@ export async function listTemplates(): Promise<TroubleshootingTemplate[]> {
const res = await http.get<ApiResponse<TroubleshootingTemplate[]>>(
'/troubleshooting-templates'
)
return res.data.data?.items || []
return res.data.data || []
}
/** GET /api/troubleshooting-templates/{id} — 获取模板详情 */