小程序聊天查询

This commit is contained in:
2025-12-23 18:57:41 +08:00
parent d3ef2f0d60
commit a7897c67e5
11 changed files with 470 additions and 287 deletions

View File

@@ -45,170 +45,6 @@ const BASE_URL = 'http://localhost:8180'
export const workcaseChatAPI = {
baseUrl: '/urban-lifeline/workcase/chat',
// ====================== AI对话管理 ======================
/**
* 创建对话
* @param param agentId和userId必传
*/
createChat(param: CreateChatParam): Promise<ResultDomain<TbChat>> {
return request<TbChat>({ url: this.baseUrl, method: 'POST', data: param })
},
/**
* 更新对话
*/
updateChat(chat: TbChat): Promise<ResultDomain<TbChat>> {
return request<TbChat>({ url: this.baseUrl, method: 'PUT', data: chat })
},
/**
* 查询对话列表
* @param param userId必传
*/
getChatList(param: ChatListParam): Promise<ResultDomain<TbChat[]>> {
return request<TbChat[]>({ url: `${this.baseUrl}/list`, method: 'POST', data: param })
},
/**
* 获取对话消息列表
* @param param chatId必传
*/
getChatMessageList(param: ChatMessageListParam): Promise<ResultDomain<TbChatMessage[]>> {
return request<TbChatMessage[]>({ url: `${this.baseUrl}/message/list`, method: 'POST', data: param })
},
/**
* 准备流式对话会话
* @param param chatId和message必传
*/
prepareChatMessageSession(param: PrepareChatParam): Promise<ResultDomain<string>> {
return request<string>({ url: `${this.baseUrl}/prepare`, method: 'POST', data: param })
},
/**
* 流式对话SSE- 返回EventSource URL
*/
getStreamUrl(sessionId: string): string {
return `${this.baseUrl}/stream/${sessionId}`
},
/**
* 建立SSE流式对话连接
* @param sessionId 会话ID必传
* @param callbacks 回调函数
* @returns SSETask 可用于中止请求
*/
streamChat(sessionId: string, callbacks: SSECallbacks): SSETask {
const url = `${BASE_URL}${this.baseUrl}/stream/${sessionId}`
const token = uni.getStorageSync('token') || ''
const requestTask = uni.request({
url: url,
method: 'GET',
header: {
'Accept': 'text/event-stream',
'Authorization': token ? `Bearer ${token}` : ''
},
enableChunked: true,
success: (res: any) => {
console.log('SSE请求完成:', res)
// 处理非200状态码
if (res.statusCode !== 200) {
console.error('SSE请求状态码异常:', res.statusCode)
let errorMsg = '抱歉,服务暂时不可用,请稍后重试。'
if (res.statusCode === 401) {
errorMsg = '登录已过期,请重新登录。'
} else if (res.statusCode === 403) {
errorMsg = '无权限访问,请联系管理员。'
} else if (res.statusCode === 404) {
errorMsg = '会话不存在或已过期,请重新发起对话。'
} else if (res.statusCode >= 500) {
errorMsg = '服务器异常,请稍后重试。'
}
callbacks.onError?.(errorMsg)
}
callbacks.onComplete?.()
},
fail: (err: any) => {
console.error('SSE请求失败:', err)
callbacks.onError?.('网络连接失败,请稍后重试。')
callbacks.onComplete?.()
}
})
// 监听分块数据
requestTask.onChunkReceived((res: any) => {
try {
const decoder = new TextDecoder('utf-8')
const text = decoder.decode(new Uint8Array(res.data))
const lines = text.split('\n')
for (const line of lines) {
if (line.startsWith('data:')) {
const dataStr = line.substring(5).trim()
if (dataStr && dataStr !== '[DONE]') {
try {
const data: SSEMessageData = JSON.parse(dataStr)
const event = data.event
if (event === 'message' || event === 'agent_message') {
callbacks.onMessage?.(data)
} else if (event === 'message_end') {
callbacks.onEnd?.(data.task_id || '')
} else if (event === 'error') {
callbacks.onError?.(data.message || '发生错误,请稍后重试。')
}
} catch (e) {
console.log('解析SSE数据失败:', dataStr)
}
}
}
}
} catch (e) {
console.error('处理分块数据失败:', e)
}
})
return {
abort: () => {
requestTask.abort()
}
}
},
/**
* 停止对话
* @param param taskId, agentId, userId必传
*/
stopChat(param: StopChatParam): Promise<ResultDomain<boolean>> {
return request<boolean>({ url: `${this.baseUrl}/stop/${param.taskId}`, method: 'POST', data: param })
},
/**
* 评价对话消息
* @param param agentId, chatId, messageId, comment, userId必传
*/
commentChatMessage(param: CommentMessageParam): Promise<ResultDomain<boolean>> {
return request<boolean>({ url: `${this.baseUrl}/comment?messageId=${param.messageId}&comment=${param.comment}`, method: 'POST', data: param })
},
// ====================== 对话分析 ======================
/**
* 分析对话AI预填工单信息
*/
analyzeChat(chatId: string): Promise<ResultDomain<TbWorkcaseDTO>> {
return request<TbWorkcaseDTO>({ url: `${this.baseUrl}/analyze/${chatId}`, method: 'GET' })
},
/**
* 总结对话
*/
summaryChat(chatId: string): Promise<ResultDomain<TbWorkcaseDTO>> {
return request<TbWorkcaseDTO>({ url: `${this.baseUrl}/summary/${chatId}`, method: 'POST' })
},
// ====================== ChatRoom聊天室管理 ======================
/**
@@ -326,7 +162,7 @@ export const workcaseChatAPI = {
* 更新客服在线状态
*/
updateCustomerServiceStatus(userId: string, status: string): Promise<ResultDomain<boolean>> {
return request<boolean>({ url: `${this.baseUrl}/customer-service/${userId}/status?status=${status}`, method: 'POST' })
return request<boolean>({ url: `${this.baseUrl}/customer-service/${userId}/status/${status}`, method: 'POST' })
},
/**