From 6474c29a6099ed8820e650b42844cfb22e4ee04a Mon Sep 17 00:00:00 2001 From: Jiang Yulong Date: Wed, 10 Dec 2025 16:56:02 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20chat=E6=8E=A5=E5=8F=A3=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E7=BB=93=E6=9D=9F=E6=97=B6,=20=E5=8F=91=E9=80=81docId?= =?UTF-8?q?=E7=BB=99=E5=89=8D=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../module/boecase/api/CaseAiChatApi.java | 2 +- .../service/IElasticSearchIndexService.java | 2 +- .../service/impl/CaseAiChatServiceImpl.java | 30 ++++++++++++------- .../impl/ElasticSearchIndexServiceImpl.java | 8 ++--- 4 files changed, 25 insertions(+), 17 deletions(-) diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseAiChatApi.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseAiChatApi.java index 8c9216e7..75431183 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseAiChatApi.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/api/CaseAiChatApi.java @@ -230,7 +230,7 @@ public class CaseAiChatApi extends ApiBaseController { aiChatConversationData.setCaseRefers(caseAiMessageVo.getCaseRefer()); aiChatConversationData.setSuggestions(caseAiMessageVo.getSuggestions()); aiChatConversationData.setUserId(userId); - if (elasticSearchIndexService.createData(aiChatConversationData)) { + if (elasticSearchIndexService.createData(aiChatConversationData) != null) { return success("创建成功"); } return error("创建失败"); diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/IElasticSearchIndexService.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/IElasticSearchIndexService.java index f33a3ddb..a60b9f7b 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/IElasticSearchIndexService.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/IElasticSearchIndexService.java @@ -41,7 +41,7 @@ public interface IElasticSearchIndexService { * @param data * @return */ - boolean createData(AiChatConversationData data); + String createData(AiChatConversationData data); /** * 查询数据 diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseAiChatServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseAiChatServiceImpl.java index 3ae5b06d..bf25b857 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseAiChatServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/CaseAiChatServiceImpl.java @@ -2,6 +2,7 @@ package com.xboe.module.boecase.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.JSON; import com.xboe.constants.CaseAiConstants; import com.xboe.core.CurrentUser; import com.xboe.core.orm.FieldFilters; @@ -175,22 +176,22 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService { if (org.apache.commons.lang3.StringUtils.isBlank(accessToken)) { errMessage(sseEmitter, conversationId, CaseAiConstants.CHAT_SYS_ERR_MSG); // 先响应给前端 - sseEmitter.complete(); conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode()); conversationData.setErrorMsg("获取AccessToken时发生异常"); conversationData.appendAnswer(CaseAiConstants.CHAT_SYS_ERR_MSG); - saveConversationData(conversationData); + saveConversationData(sseEmitter, conversationData); + sseEmitter.complete(); return sseEmitter; } } catch (Exception e) { log.error("获取access_token失败", e); errMessage(sseEmitter, conversationId, CaseAiConstants.CHAT_SYS_ERR_MSG); // 先响应给前端 - sseEmitter.complete(); conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode()); conversationData.setErrorMsg("获取AccessToken时发生异常" + e.getMessage()); conversationData.appendAnswer(CaseAiConstants.CHAT_SYS_ERR_MSG); - saveConversationData(conversationData); + saveConversationData(sseEmitter, conversationData); + sseEmitter.complete(); return sseEmitter; } String apiCode = caseAiProperties.getChatApiCode(); @@ -239,11 +240,11 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService { } errMessage(sseEmitter, conversationId, sseContent); - sseEmitter.complete(); conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode()); conversationData.setErrorMsg(sseContent); conversationData.appendAnswer(sseContent); - saveConversationData(conversationData); + saveConversationData(sseEmitter, conversationData); + sseEmitter.complete(); // 关闭eventSource eventSource.cancel(); return; @@ -256,7 +257,7 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService { public void onClosed(@NotNull EventSource eventSource) { log.info("调用接口 [{}] 接口关闭", request.url()); // 对话完成,保存到ES - saveConversationData(conversationData); + saveConversationData(sseEmitter, conversationData); // 从Map中移除已完成的会话 conversationEventSourceMap.remove(conversationId); sseEmitter.complete(); @@ -352,14 +353,14 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService { } errMessage(sseEmitter, conversationId, errorMessage); - sseEmitter.complete(); // 从Map中移除失败的会话 conversationEventSourceMap.remove(conversationId); // 即使失败,也要将已有的对话数据保存到ES conversationData.setStatus(CaseAiChatErrCodeEnum.AIOT_ERROR.getCode()); conversationData.setErrorMsg(errorMessage); conversationData.appendAnswer(errorMessage); - saveConversationData(conversationData); + saveConversationData(sseEmitter, conversationData); + sseEmitter.complete(); } }; @@ -1006,7 +1007,14 @@ public class CaseAiChatServiceImpl implements ICaseAiChatService { * 异步存储会话数据 * @param conversationData */ - private void saveConversationData(AiChatConversationData conversationData) { - esChatExecutor.execute(() -> elasticSearchIndexService.createData(conversationData)); + private void saveConversationData(SseEmitter sseEmitter, AiChatConversationData 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); + } } } diff --git a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/ElasticSearchIndexServiceImpl.java b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/ElasticSearchIndexServiceImpl.java index 8541983f..076b4172 100644 --- a/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/ElasticSearchIndexServiceImpl.java +++ b/servers/boe-server-all/src/main/java/com/xboe/module/boecase/service/impl/ElasticSearchIndexServiceImpl.java @@ -163,10 +163,10 @@ public class ElasticSearchIndexServiceImpl implements IElasticSearchIndexService } @Override - public boolean createData(AiChatConversationData conversationData) { + public String createData(AiChatConversationData conversationData) { if (elasticsearchClient == null) { log.error("未配置Elasticsearch客户端,无法保存对话记录"); - return false; + return null; } try { @@ -209,10 +209,10 @@ public class ElasticSearchIndexServiceImpl implements IElasticSearchIndexService IndexResponse indexResponse = elasticsearchClient.index(indexRequest, RequestOptions.DEFAULT); log.info("保存对话记录到ES成功,文档ID: {}", indexResponse.getId()); - return true; + return indexResponse.getId(); } catch (Exception e) { log.error("保存对话记录到ES异常", e); - return false; + return null; } }