创建ChatRoom同步AI数据
This commit is contained in:
@@ -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<TbChatMessage> result = agentChatService.getChatMessageList(filter);
|
||||
if (!Boolean.TRUE.equals(result.getSuccess()) || result.getDataList() == null) {
|
||||
logger.warn("获取AI对话消息失败: aiSessionId={}, message={}",
|
||||
chatRoom.getAiSessionId(), result.getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
List<TbChatMessage> 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();
|
||||
|
||||
Reference in New Issue
Block a user