feat: chat接口会话结束时, 发送docId给前端

This commit is contained in:
Jiang Yulong
2025-12-10 16:56:02 +08:00
parent 85dbefee3e
commit 6474c29a60
4 changed files with 25 additions and 17 deletions

View File

@@ -230,7 +230,7 @@ public class CaseAiChatApi extends ApiBaseController {
aiChatConversationData.setCaseRefers(caseAiMessageVo.getCaseRefer()); aiChatConversationData.setCaseRefers(caseAiMessageVo.getCaseRefer());
aiChatConversationData.setSuggestions(caseAiMessageVo.getSuggestions()); aiChatConversationData.setSuggestions(caseAiMessageVo.getSuggestions());
aiChatConversationData.setUserId(userId); aiChatConversationData.setUserId(userId);
if (elasticSearchIndexService.createData(aiChatConversationData)) { if (elasticSearchIndexService.createData(aiChatConversationData) != null) {
return success("创建成功"); return success("创建成功");
} }
return error("创建失败"); return error("创建失败");

View File

@@ -41,7 +41,7 @@ public interface IElasticSearchIndexService {
* @param data * @param data
* @return * @return
*/ */
boolean createData(AiChatConversationData data); String createData(AiChatConversationData data);
/** /**
* 查询数据 * 查询数据

View File

@@ -2,6 +2,7 @@ package com.xboe.module.boecase.service.impl;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSON;
import com.xboe.constants.CaseAiConstants; import com.xboe.constants.CaseAiConstants;
import com.xboe.core.CurrentUser; import com.xboe.core.CurrentUser;
import com.xboe.core.orm.FieldFilters; import com.xboe.core.orm.FieldFilters;
@@ -175,22 +176,22 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
if (org.apache.commons.lang3.StringUtils.isBlank(accessToken)) { if (org.apache.commons.lang3.StringUtils.isBlank(accessToken)) {
errMessage(sseEmitter, conversationId, CaseAiConstants.CHAT_SYS_ERR_MSG); errMessage(sseEmitter, conversationId, CaseAiConstants.CHAT_SYS_ERR_MSG);
// 先响应给前端 // 先响应给前端
sseEmitter.complete();
conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode()); conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode());
conversationData.setErrorMsg("获取AccessToken时发生异常"); conversationData.setErrorMsg("获取AccessToken时发生异常");
conversationData.appendAnswer(CaseAiConstants.CHAT_SYS_ERR_MSG); conversationData.appendAnswer(CaseAiConstants.CHAT_SYS_ERR_MSG);
saveConversationData(conversationData); saveConversationData(sseEmitter, conversationData);
sseEmitter.complete();
return sseEmitter; return sseEmitter;
} }
} catch (Exception e) { } catch (Exception e) {
log.error("获取access_token失败", e); log.error("获取access_token失败", e);
errMessage(sseEmitter, conversationId, CaseAiConstants.CHAT_SYS_ERR_MSG); errMessage(sseEmitter, conversationId, CaseAiConstants.CHAT_SYS_ERR_MSG);
// 先响应给前端 // 先响应给前端
sseEmitter.complete();
conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode()); conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode());
conversationData.setErrorMsg("获取AccessToken时发生异常" + e.getMessage()); conversationData.setErrorMsg("获取AccessToken时发生异常" + e.getMessage());
conversationData.appendAnswer(CaseAiConstants.CHAT_SYS_ERR_MSG); conversationData.appendAnswer(CaseAiConstants.CHAT_SYS_ERR_MSG);
saveConversationData(conversationData); saveConversationData(sseEmitter, conversationData);
sseEmitter.complete();
return sseEmitter; return sseEmitter;
} }
String apiCode = caseAiProperties.getChatApiCode(); String apiCode = caseAiProperties.getChatApiCode();
@@ -239,11 +240,11 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
} }
errMessage(sseEmitter, conversationId, sseContent); errMessage(sseEmitter, conversationId, sseContent);
sseEmitter.complete();
conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode()); conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode());
conversationData.setErrorMsg(sseContent); conversationData.setErrorMsg(sseContent);
conversationData.appendAnswer(sseContent); conversationData.appendAnswer(sseContent);
saveConversationData(conversationData); saveConversationData(sseEmitter, conversationData);
sseEmitter.complete();
// 关闭eventSource // 关闭eventSource
eventSource.cancel(); eventSource.cancel();
return; return;
@@ -256,7 +257,7 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
public void onClosed(@NotNull EventSource eventSource) { public void onClosed(@NotNull EventSource eventSource) {
log.info("调用接口 [{}] 接口关闭", request.url()); log.info("调用接口 [{}] 接口关闭", request.url());
// 对话完成保存到ES // 对话完成保存到ES
saveConversationData(conversationData); saveConversationData(sseEmitter, conversationData);
// 从Map中移除已完成的会话 // 从Map中移除已完成的会话
conversationEventSourceMap.remove(conversationId); conversationEventSourceMap.remove(conversationId);
sseEmitter.complete(); sseEmitter.complete();
@@ -352,14 +353,14 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
} }
errMessage(sseEmitter, conversationId, errorMessage); errMessage(sseEmitter, conversationId, errorMessage);
sseEmitter.complete();
// 从Map中移除失败的会话 // 从Map中移除失败的会话
conversationEventSourceMap.remove(conversationId); conversationEventSourceMap.remove(conversationId);
// 即使失败也要将已有的对话数据保存到ES // 即使失败也要将已有的对话数据保存到ES
conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode()); conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode());
conversationData.setErrorMsg(errorMessage); conversationData.setErrorMsg(errorMessage);
conversationData.appendAnswer(errorMessage); conversationData.appendAnswer(errorMessage);
saveConversationData(conversationData); saveConversationData(sseEmitter, conversationData);
sseEmitter.complete();
} }
}; };
@@ -1006,7 +1007,14 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService {
* 异步存储会话数据 * 异步存储会话数据
* @param conversationData * @param conversationData
*/ */
private void saveConversationData(AiChatConversationData conversationData) { private void saveConversationData(SseEmitter sseEmitter, AiChatConversationData conversationData) {
esChatExecutor.execute(() -> elasticSearchIndexService.createData(conversationData)); try {
String docId = elasticSearchIndexService.createData(conversationData);
if (docId != null) {
sseEmitter.send(JSON.toJSONString(Collections.singletonMap("docId", docId)));
}
} catch (Exception e) {
log.error("docId消息发送失败", e);
}
} }
} }

View File

@@ -163,10 +163,10 @@ public class ElasticSearchIndexServiceImpl implements IElasticSearchIndexService
} }
@Override @Override
public boolean createData(AiChatConversationData conversationData) { public String createData(AiChatConversationData conversationData) {
if (elasticsearchClient == null) { if (elasticsearchClient == null) {
log.error("未配置Elasticsearch客户端无法保存对话记录"); log.error("未配置Elasticsearch客户端无法保存对话记录");
return false; return null;
} }
try { try {
@@ -209,10 +209,10 @@ public class ElasticSearchIndexServiceImpl implements IElasticSearchIndexService
IndexResponse indexResponse = elasticsearchClient.index(indexRequest, RequestOptions.DEFAULT); IndexResponse indexResponse = elasticsearchClient.index(indexRequest, RequestOptions.DEFAULT);
log.info("保存对话记录到ES成功文档ID: {}", indexResponse.getId()); log.info("保存对话记录到ES成功文档ID: {}", indexResponse.getId());
return true; return indexResponse.getId();
} catch (Exception e) { } catch (Exception e) {
log.error("保存对话记录到ES异常", e); log.error("保存对话记录到ES异常", e);
return false; return null;
} }
} }