From d3ef2f0d60d311b2e5ec36db055b9291289e3b6f Mon Sep 17 00:00:00 2001 From: wangys <3401275564@qq.com> Date: Tue, 23 Dec 2025 17:31:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BAChatRoom=E5=90=8C=E6=AD=A5AI?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xyzh/ai/controller/ChatController.java | 2 +- .../workcase/service/ChatRoomServiceImpl.java | 93 +++++++++++++++++++ .../chatRoom/chatRoomList/chatRoomList.uvue | 80 ++++++++-------- 3 files changed, 135 insertions(+), 40 deletions(-) diff --git a/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/controller/ChatController.java b/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/controller/ChatController.java index bc009ef0..39d97476 100644 --- a/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/controller/ChatController.java +++ b/urbanLifelineServ/ai/src/main/java/org/xyzh/ai/controller/ChatController.java @@ -73,7 +73,7 @@ public class ChatController { } } - log.info("创建会话: agentId={}, title={}, userId={}, userType={}", chat.getAgentId(), chat.getTitle(), chat.getUserId()); + log.info("创建会话: agentId={}, title={}, userId={}, userType={}", chat.getAgentId(), chat.getTitle(), chat.getUserId(), chat.getUserType()); return chatService.createChat(chat); } diff --git a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/ChatRoomServiceImpl.java b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/ChatRoomServiceImpl.java index 5c3656d9..e387278e 100644 --- a/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/ChatRoomServiceImpl.java +++ b/urbanLifelineServ/workcase/src/main/java/org/xyzh/workcase/service/ChatRoomServiceImpl.java @@ -3,6 +3,7 @@ package org.xyzh.workcase.service; import java.util.Date; import java.util.List; +import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -18,11 +19,15 @@ import org.xyzh.api.workcase.vo.ChatMemberVO; import org.xyzh.api.workcase.vo.ChatRoomMessageVO; import org.xyzh.api.workcase.vo.ChatRoomVO; import org.xyzh.api.workcase.vo.CustomerServiceVO; +import org.xyzh.api.ai.dto.TbChat; +import org.xyzh.api.ai.dto.TbChatMessage; +import org.xyzh.api.ai.service.AgentChatService; import org.xyzh.api.workcase.constant.WorkcaseConstant; import org.xyzh.common.core.domain.ResultDomain; import org.xyzh.common.core.page.PageDomain; import org.xyzh.common.core.page.PageParam; import org.xyzh.common.core.page.PageRequest; +import org.xyzh.common.utils.NonUtils; import org.xyzh.common.utils.id.IdUtil; import org.xyzh.workcase.mapper.TbChatMessageMapper; import org.xyzh.workcase.mapper.TbChatRoomMapper; @@ -56,6 +61,9 @@ public class ChatRoomServiceImpl implements ChatRoomService { @Autowired private RedisService redisService; + @DubboReference(version = "1.0.0", group = "ai", timeout = 30000, retries = 0) + private AgentChatService agentChatService; + // ========================= 聊天室管理 ========================== @Override @@ -112,6 +120,10 @@ public class ChatRoomServiceImpl implements ChatRoomService { updateRoom.setCurrentAgentId(assignResult.getData().getUserId()); chatRoomMapper.updateChatRoom(updateRoom); } + // 从AI同步对话历史 + if(NonUtils.isNotEmpty(chatRoom.getAiSessionId())){ + syncAiChatMessages(chatRoom); + } return ResultDomain.success("创建成功", chatRoom); } @@ -607,6 +619,87 @@ public class ChatRoomServiceImpl implements ChatRoomService { // ========================= 私有方法 ========================== + /** + * 从AI同步对话历史到聊天室 + * @param chatRoom 聊天室信息(包含aiSessionId和guestId) + */ + private void syncAiChatMessages(TbChatRoomDTO chatRoom) { + try { + // 1. 构建查询条件获取AI对话消息列表 + TbChat filter = new TbChat(); + filter.setChatId(chatRoom.getAiSessionId()); + filter.setUserId(chatRoom.getGuestId()); + filter.setUserType(false); // 来客 + + ResultDomain result = agentChatService.getChatMessageList(filter); + if (!Boolean.TRUE.equals(result.getSuccess()) || result.getDataList() == null) { + logger.warn("获取AI对话消息失败: aiSessionId={}, message={}", + chatRoom.getAiSessionId(), result.getMessage()); + return; + } + + List aiMessages = result.getDataList(); + if (aiMessages.isEmpty()) { + logger.info("AI对话消息为空: aiSessionId={}", chatRoom.getAiSessionId()); + return; + } + + // 2. 转换并存入聊天室消息表 + int syncCount = 0; + long baseTime = System.currentTimeMillis() - aiMessages.size() * 1000L; // 保持消息顺序 + + for (int i = 0; i < aiMessages.size(); i++) { + TbChatMessage aiMsg = aiMessages.get(i); + TbChatRoomMessageDTO roomMsg = new TbChatRoomMessageDTO(); + + roomMsg.setMessageId(IdUtil.generateUUID()); + roomMsg.setOptsn(IdUtil.getOptsn()); + roomMsg.setRoomId(chatRoom.getRoomId()); + roomMsg.setContent(aiMsg.getContent()); + roomMsg.setMessageType("text"); + roomMsg.setStatus("sent"); + roomMsg.setFiles(aiMsg.getFiles()); + roomMsg.setSendTime(new Date(baseTime + i * 1000L)); + roomMsg.setIsAiMessage(true); + roomMsg.setAiMessageId(aiMsg.getMessageId()); + roomMsg.setCreator(chatRoom.getGuestId()); + + // 根据角色设置发送者信息 + if ("user".equals(aiMsg.getRole())) { + roomMsg.setSenderId(chatRoom.getGuestId()); + roomMsg.setSenderName(chatRoom.getGuestName()); + roomMsg.setSenderType("guest"); + roomMsg.setIsAiMessage(false); + } else { + // AI回复 + roomMsg.setSenderId("AI"); + roomMsg.setSenderName("智能助手"); + roomMsg.setSenderType("ai"); + } + + chatMessageMapper.insertChatMessage(roomMsg); + syncCount++; + } + + // 3. 更新聊天室消息数和最后消息 + if (syncCount > 0) { + TbChatMessage lastAiMsg = aiMessages.get(aiMessages.size() - 1); + TbChatRoomDTO updateRoom = new TbChatRoomDTO(); + updateRoom.setRoomId(chatRoom.getRoomId()); + updateRoom.setLastMessage(lastAiMsg.getContent()); + updateRoom.setLastMessageTime(new Date()); + updateRoom.setMessageCount(syncCount); + chatRoomMapper.updateChatRoom(updateRoom); + } + + logger.info("AI对话同步完成: roomId={}, aiSessionId={}, syncCount={}", + chatRoom.getRoomId(), chatRoom.getAiSessionId(), syncCount); + + } catch (Exception e) { + logger.error("同步AI对话失败: aiSessionId={}", chatRoom.getAiSessionId(), e); + } + } + private void publishMessageToRedis(TbChatRoomMessageDTO message) { try { String channel = WorkcaseConstant.REDIS_CHAT_PREFIX + message.getRoomId(); diff --git a/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoomList/chatRoomList.uvue b/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoomList/chatRoomList.uvue index 223ce3f0..1d19385a 100644 --- a/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoomList/chatRoomList.uvue +++ b/urbanLifelineWeb/packages/workcase_wechat/pages/chatRoom/chatRoomList/chatRoomList.uvue @@ -51,47 +51,19 @@