聊天页bug修复

This commit is contained in:
2025-10-26 17:43:24 +08:00
parent 2e243c7671
commit accd1ae9da
4 changed files with 131 additions and 65 deletions
@@ -442,21 +442,12 @@ public class AiChatServiceImpl implements AiChatService {
// 调用Coze API(带messageId
String aiReply = sendMessageWithMessageId(conversationId, messageId, message, userId);
// 注意:不保存用户消息,因为WebSocket处理器已经保存了
// 只保存AI回复
Message aiMessage = new Message();
aiMessage.setId(snowflakeIdGenerator.nextIdAsString());
aiMessage.setConversationId(conversationId);
aiMessage.setCreateBy(userId); // 设置创建人为当前用户
aiMessage.setContent(aiReply);
aiMessage.setType("text");
aiMessage.setSender("ai");
aiMessage.setCozeRole("assistant");
aiMessage.setCozeContentType("text");
aiMessage = messageService.createMessage(aiMessage);
// 注意:不在这里保存AI回复消息
// WebSocket处理器会在sendAiReplyInParts中分割并保存每条消息
// 这样可以确保分割后的消息都被正确保存到数据库
log.info("WebSocket聊天消息处理完成(带messageId: userMessageId={}, aiMessageId={}",
messageId, aiMessage.getId());
log.info("WebSocket聊天消息处理完成(带messageId: userMessageId={}, aiReplyLength={}",
messageId, aiReply != null ? aiReply.length() : 0);
return aiReply;
@@ -10,6 +10,7 @@ import com.emotion.service.WebSocketService;
import com.emotion.service.AiChatService;
import com.emotion.service.MessageService;
import com.emotion.service.ConversationService;
import com.emotion.util.SnowflakeIdGenerator;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
@@ -42,7 +43,10 @@ public class WebSocketServiceImpl implements WebSocketService {
@Autowired
private ConversationService conversationService;
@Autowired
private SnowflakeIdGenerator snowflakeIdGenerator;
// 在线用户管理
private final ConcurrentHashMap<String, String> onlineUsers = new ConcurrentHashMap<>();
@@ -464,24 +468,46 @@ public class WebSocketServiceImpl implements WebSocketService {
* @param content 消息内容
*/
private void sendSingleAiMessage(String userId, String conversationId, String content) {
// 构建AI回复消息
WebSocketMessage aiMessage = WebSocketMessage.builder()
.messageId(UUID.randomUUID().toString())
.conversationId(conversationId)
.type("TEXT")
.content(content)
.senderId("ai")
.senderType("AI")
.status("SENT")
.createTime(LocalDateTime.now())
.build();
try {
// 保存AI消息到数据库
Message aiMessage = new Message();
aiMessage.setId(snowflakeIdGenerator.nextIdAsString());
aiMessage.setConversationId(conversationId);
aiMessage.setUserId(userId);
aiMessage.setCreateBy("ai");
aiMessage.setContent(content);
aiMessage.setType("text");
aiMessage.setSender("ai");
aiMessage.setCozeRole("assistant");
aiMessage.setCozeContentType("text");
aiMessage.setTimestamp(LocalDateTime.now());
messageService.createMessage(aiMessage);
// 发送给用户私有队列
messagingTemplate.convertAndSendToUser(userId, "/queue/messages", aiMessage);
log.info("AI消息已保存到数据库: messageId={}, conversationId={}, contentLength={}",
aiMessage.getId(), conversationId, content.length());
// 发送到会话公共频道
if (conversationId != null) {
messagingTemplate.convertAndSend("/topic/conversation/" + conversationId, aiMessage);
// 构建WebSocket消息
WebSocketMessage wsMessage = WebSocketMessage.builder()
.messageId(aiMessage.getId())
.conversationId(conversationId)
.type("TEXT")
.content(content)
.senderId("ai")
.senderType("AI")
.status("SENT")
.createTime(LocalDateTime.now())
.build();
// 发送给用户私有队列
messagingTemplate.convertAndSendToUser(userId, "/queue/messages", wsMessage);
// 发送到会话公共频道
if (conversationId != null) {
messagingTemplate.convertAndSend("/topic/conversation/" + conversationId, wsMessage);
}
} catch (Exception e) {
log.error("发送单条AI消息失败: userId={}, conversationId={}", userId, conversationId, e);
sendErrorMessage(userId, "消息发送失败,请稍后重试");
}
}