接口优化
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package com.emotion.service.impl;
|
||||
|
||||
import com.emotion.dto.request.WebSocketRequest;
|
||||
import com.emotion.dto.websocket.ChatRequest;
|
||||
import com.emotion.dto.websocket.ConnectRequest;
|
||||
import com.emotion.dto.websocket.WebSocketMessage;
|
||||
@@ -13,6 +14,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.messaging.simp.SimpMessagingTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.security.Principal;
|
||||
import java.time.LocalDateTime;
|
||||
@@ -48,64 +50,54 @@ public class WebSocketServiceImpl implements WebSocketService {
|
||||
* 处理聊天消息
|
||||
*/
|
||||
@Override
|
||||
public void handleChatMessage(ChatRequest request, String sessionId, Principal principal) {
|
||||
public void handleChatMessage(WebSocketRequest webSocketRequest, String sessionId, Principal principal) {
|
||||
try {
|
||||
log.info("处理聊天消息: request={}, sessionId={}, principal={}", request, sessionId, principal);
|
||||
log.info("处理聊天消息: request={}, sessionId={}, principal={}", webSocketRequest, sessionId, principal);
|
||||
|
||||
// 验证请求参数
|
||||
if (request.getContent() == null || request.getContent().trim().isEmpty()) {
|
||||
sendErrorMessage(request.getSenderId(), "消息内容不能为空");
|
||||
if (webSocketRequest.getContent() == null || webSocketRequest.getContent().trim().isEmpty()) {
|
||||
sendErrorMessage(getUserId(principal, sessionId), "消息内容不能为空");
|
||||
return;
|
||||
}
|
||||
|
||||
// 确定用户身份和类型
|
||||
String userId = request.getSenderId();
|
||||
WebSocketMessage.SenderType senderType = WebSocketMessage.SenderType.GUEST;
|
||||
// 设置默认值
|
||||
setWebSocketRequestDefaults(webSocketRequest, principal, sessionId);
|
||||
|
||||
if (principal != null) {
|
||||
userId = principal.getName();
|
||||
// 如果用户ID不是以guest_开头,说明是认证用户
|
||||
if (!userId.startsWith("guest_")) {
|
||||
senderType = WebSocketMessage.SenderType.USER;
|
||||
}
|
||||
}
|
||||
log.info("确定用户身份: userId={}, senderType={}", webSocketRequest.getSenderId(),
|
||||
webSocketRequest.getSenderType());
|
||||
|
||||
// 更新请求中的用户信息
|
||||
request.setSenderId(userId);
|
||||
request.setSenderType(senderType == WebSocketMessage.SenderType.USER ? ChatRequest.SenderType.USER
|
||||
: ChatRequest.SenderType.GUEST);
|
||||
|
||||
log.info("确定用户身份: userId={}, senderType={}", userId, senderType);
|
||||
// 转换请求对象
|
||||
ChatRequest chatRequest = convertToChatRequest(webSocketRequest);
|
||||
|
||||
// 构建用户消息
|
||||
WebSocketMessage userMessage = WebSocketMessage.builder()
|
||||
.messageId(UUID.randomUUID().toString())
|
||||
.conversationId(request.getConversationId())
|
||||
.type(WebSocketMessage.MessageType.TEXT)
|
||||
.content(request.getContent())
|
||||
.senderId(userId)
|
||||
.senderType(senderType)
|
||||
.status(WebSocketMessage.MessageStatus.SENT)
|
||||
.conversationId(chatRequest.getConversationId())
|
||||
.type("TEXT")
|
||||
.content(chatRequest.getContent())
|
||||
.senderId(chatRequest.getSenderId())
|
||||
.senderType(getSenderType(chatRequest.getSenderType()))
|
||||
.status("SENT")
|
||||
.createTime(LocalDateTime.now())
|
||||
.build();
|
||||
|
||||
// 发送用户消息到会话
|
||||
if (request.getConversationId() != null) {
|
||||
messagingTemplate.convertAndSend("/topic/conversation/" + request.getConversationId(), userMessage);
|
||||
if (chatRequest.getConversationId() != null) {
|
||||
messagingTemplate.convertAndSend("/topic/conversation/" + chatRequest.getConversationId(), userMessage);
|
||||
}
|
||||
|
||||
// 发送给用户私有队列
|
||||
messagingTemplate.convertAndSendToUser(request.getSenderId(), "/queue/messages", userMessage);
|
||||
messagingTemplate.convertAndSendToUser(chatRequest.getSenderId(), "/queue/messages", userMessage);
|
||||
|
||||
// 发送AI思考状态
|
||||
sendAiThinkingMessage(request.getSenderId(), request.getConversationId());
|
||||
sendAiThinkingMessage(chatRequest.getSenderId(), chatRequest.getConversationId());
|
||||
|
||||
// 异步调用AI服务
|
||||
processAiResponse(request);
|
||||
processAiResponse(chatRequest);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("处理聊天消息失败", e);
|
||||
sendErrorMessage(request.getSenderId(), "消息处理失败,请稍后重试");
|
||||
sendErrorMessage(getUserId(principal, sessionId), "消息处理失败,请稍后重试");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,39 +107,27 @@ public class WebSocketServiceImpl implements WebSocketService {
|
||||
@Override
|
||||
public void handleUserConnect(ConnectRequest request, String sessionId, Principal principal) {
|
||||
try {
|
||||
String userId = request.getUserId();
|
||||
boolean isAuthenticated = false;
|
||||
|
||||
// 优先从Principal获取认证用户信息
|
||||
if (principal != null) {
|
||||
userId = principal.getName();
|
||||
// 检查是否是认证用户(不是访客)
|
||||
isAuthenticated = !userId.startsWith("guest_");
|
||||
}
|
||||
|
||||
// 如果还没有userId,生成访客ID
|
||||
if (userId == null) {
|
||||
userId = "guest_" + sessionId;
|
||||
}
|
||||
// 设置默认值
|
||||
setConnectRequestDefaults(request, principal, sessionId);
|
||||
|
||||
log.info("用户连接WebSocket: userId={}, sessionId={}, authenticated={}",
|
||||
userId, sessionId, isAuthenticated);
|
||||
request.getUserId(), sessionId, isUserAuthenticated(request.getUserId()));
|
||||
|
||||
// 记录在线用户
|
||||
onlineUsers.put(sessionId, userId);
|
||||
onlineUsers.put(sessionId, request.getUserId());
|
||||
|
||||
// 发送连接成功消息
|
||||
WebSocketMessage connectMessage = WebSocketMessage.builder()
|
||||
.messageId(UUID.randomUUID().toString())
|
||||
.type(WebSocketMessage.MessageType.CONNECTION)
|
||||
.type("CONNECTION")
|
||||
.content("连接成功")
|
||||
.senderId("system")
|
||||
.senderType(WebSocketMessage.SenderType.SYSTEM)
|
||||
.status(WebSocketMessage.MessageStatus.SENT)
|
||||
.senderType("SYSTEM")
|
||||
.status("SENT")
|
||||
.createTime(LocalDateTime.now())
|
||||
.build();
|
||||
|
||||
messagingTemplate.convertAndSendToUser(userId, "/queue/messages", connectMessage);
|
||||
messagingTemplate.convertAndSendToUser(request.getUserId(), "/queue/messages", connectMessage);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("处理用户连接失败", e);
|
||||
@@ -182,11 +162,11 @@ public class WebSocketServiceImpl implements WebSocketService {
|
||||
// 发送心跳响应
|
||||
WebSocketMessage heartbeatMessage = WebSocketMessage.builder()
|
||||
.messageId(UUID.randomUUID().toString())
|
||||
.type(WebSocketMessage.MessageType.HEARTBEAT)
|
||||
.type("HEARTBEAT")
|
||||
.content("pong")
|
||||
.senderId("system")
|
||||
.senderType(WebSocketMessage.SenderType.SYSTEM)
|
||||
.status(WebSocketMessage.MessageStatus.SENT)
|
||||
.senderType("SYSTEM")
|
||||
.status("SENT")
|
||||
.createTime(LocalDateTime.now())
|
||||
.build();
|
||||
|
||||
@@ -206,11 +186,11 @@ public class WebSocketServiceImpl implements WebSocketService {
|
||||
WebSocketMessage thinkingMessage = WebSocketMessage.builder()
|
||||
.messageId(UUID.randomUUID().toString())
|
||||
.conversationId(conversationId)
|
||||
.type(WebSocketMessage.MessageType.AI_THINKING)
|
||||
.type("AI_THINKING")
|
||||
.content("AI正在思考中...")
|
||||
.senderId("ai")
|
||||
.senderType(WebSocketMessage.SenderType.AI)
|
||||
.status(WebSocketMessage.MessageStatus.SENT)
|
||||
.senderType("AI")
|
||||
.status("SENT")
|
||||
.createTime(LocalDateTime.now())
|
||||
.build();
|
||||
|
||||
@@ -246,7 +226,7 @@ public class WebSocketServiceImpl implements WebSocketService {
|
||||
userMessage.setUserId(userId);
|
||||
userMessage.setCreateBy(userId); // 设置创建人为当前用户
|
||||
userMessage
|
||||
.setUserType(request.getSenderType() == ChatRequest.SenderType.USER ? "registered" : "guest");
|
||||
.setUserType("USER".equals(request.getSenderType()) ? "registered" : "guest");
|
||||
userMessage.setContent(request.getContent());
|
||||
userMessage.setType("text");
|
||||
userMessage.setSender("user");
|
||||
@@ -281,11 +261,11 @@ public class WebSocketServiceImpl implements WebSocketService {
|
||||
private void sendErrorMessage(String userId, String errorContent) {
|
||||
WebSocketMessage errorMessage = WebSocketMessage.builder()
|
||||
.messageId(UUID.randomUUID().toString())
|
||||
.type(WebSocketMessage.MessageType.ERROR)
|
||||
.type("ERROR")
|
||||
.content(errorContent)
|
||||
.senderId("system")
|
||||
.senderType(WebSocketMessage.SenderType.SYSTEM)
|
||||
.status(WebSocketMessage.MessageStatus.SENT)
|
||||
.senderType("SYSTEM")
|
||||
.status("SENT")
|
||||
.createTime(LocalDateTime.now())
|
||||
.build();
|
||||
|
||||
@@ -309,7 +289,7 @@ public class WebSocketServiceImpl implements WebSocketService {
|
||||
|
||||
Conversation conversation = Conversation.builder()
|
||||
.userId(userId)
|
||||
.userType(request.getSenderType() == ChatRequest.SenderType.USER ? "registered" : "guest")
|
||||
.userType("USER".equals(request.getSenderType()) ? "registered" : "guest")
|
||||
.title("新对话")
|
||||
.type("chat")
|
||||
.conversationStatus("active")
|
||||
@@ -341,7 +321,7 @@ public class WebSocketServiceImpl implements WebSocketService {
|
||||
// 如果会话不存在,创建一个
|
||||
conversation = Conversation.builder()
|
||||
.userId(userId)
|
||||
.userType(request.getSenderType() == ChatRequest.SenderType.USER ? "registered" : "guest")
|
||||
.userType("USER".equals(request.getSenderType()) ? "registered" : "guest")
|
||||
.title("对话")
|
||||
.type("chat")
|
||||
.conversationStatus("active")
|
||||
@@ -453,11 +433,11 @@ public class WebSocketServiceImpl implements WebSocketService {
|
||||
WebSocketMessage fallbackMessage = WebSocketMessage.builder()
|
||||
.messageId(UUID.randomUUID().toString())
|
||||
.conversationId(conversationId)
|
||||
.type(WebSocketMessage.MessageType.TEXT)
|
||||
.type("TEXT")
|
||||
.content(aiReply)
|
||||
.senderId("ai")
|
||||
.senderType(WebSocketMessage.SenderType.AI)
|
||||
.status(WebSocketMessage.MessageStatus.SENT)
|
||||
.senderType("AI")
|
||||
.status("SENT")
|
||||
.createTime(LocalDateTime.now())
|
||||
.build();
|
||||
|
||||
@@ -488,11 +468,11 @@ public class WebSocketServiceImpl implements WebSocketService {
|
||||
WebSocketMessage aiMessage = WebSocketMessage.builder()
|
||||
.messageId(UUID.randomUUID().toString())
|
||||
.conversationId(conversationId)
|
||||
.type(WebSocketMessage.MessageType.TEXT)
|
||||
.type("TEXT")
|
||||
.content(content)
|
||||
.senderId("ai")
|
||||
.senderType(WebSocketMessage.SenderType.AI)
|
||||
.status(WebSocketMessage.MessageStatus.SENT)
|
||||
.senderType("AI")
|
||||
.status("SENT")
|
||||
.createTime(LocalDateTime.now())
|
||||
.build();
|
||||
|
||||
@@ -534,4 +514,95 @@ public class WebSocketServiceImpl implements WebSocketService {
|
||||
log.debug("没有换行符,返回原始内容");
|
||||
return new String[]{aiReply};
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置WebSocket请求的默认值
|
||||
*/
|
||||
private void setWebSocketRequestDefaults(WebSocketRequest request, Principal principal, String sessionId) {
|
||||
// 如果请求中没有发送者ID,尝试从Principal获取
|
||||
if (request.getSenderId() == null && principal != null) {
|
||||
request.setSenderId(principal.getName());
|
||||
}
|
||||
|
||||
// 如果还是没有发送者ID,使用会话ID作为访客ID
|
||||
if (request.getSenderId() == null) {
|
||||
request.setSenderId("guest_" + sessionId);
|
||||
request.setSenderType("GUEST");
|
||||
}
|
||||
|
||||
// 设置时间戳
|
||||
if (request.getTimestamp() == null) {
|
||||
request.setTimestamp(System.currentTimeMillis());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置连接请求的默认值
|
||||
*/
|
||||
private void setConnectRequestDefaults(ConnectRequest request, Principal principal, String sessionId) {
|
||||
// 优先从Principal获取认证用户信息
|
||||
if (principal != null) {
|
||||
request.setUserId(principal.getName());
|
||||
}
|
||||
|
||||
// 如果还没有userId,生成访客ID
|
||||
if (request.getUserId() == null) {
|
||||
request.setUserId("guest_" + sessionId);
|
||||
}
|
||||
|
||||
// 设置连接时间戳
|
||||
if (request.getTimestamp() == null) {
|
||||
request.setTimestamp(System.currentTimeMillis());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户ID
|
||||
*/
|
||||
private String getUserId(Principal principal, String sessionId) {
|
||||
if (principal != null) {
|
||||
return principal.getName();
|
||||
}
|
||||
return "guest_" + sessionId;
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断用户是否已认证
|
||||
*/
|
||||
private boolean isUserAuthenticated(String userId) {
|
||||
return userId != null && !userId.startsWith("guest_");
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取发送者类型
|
||||
*/
|
||||
private String getSenderType(String senderType) {
|
||||
if ("USER".equals(senderType)) {
|
||||
return "USER";
|
||||
} else if ("GUEST".equals(senderType)) {
|
||||
return "GUEST";
|
||||
} else if ("AI".equals(senderType)) {
|
||||
return "AI";
|
||||
} else if ("SYSTEM".equals(senderType)) {
|
||||
return "SYSTEM";
|
||||
}
|
||||
return "USER";
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换WebSocketRequest到ChatRequest
|
||||
*
|
||||
* @param webSocketRequest WebSocket请求对象
|
||||
* @return ChatRequest对象
|
||||
*/
|
||||
private ChatRequest convertToChatRequest(WebSocketRequest webSocketRequest) {
|
||||
return ChatRequest.builder()
|
||||
.content(webSocketRequest.getContent())
|
||||
.senderId(webSocketRequest.getSenderId())
|
||||
.senderType(webSocketRequest.getSenderType())
|
||||
.messageType(webSocketRequest.getMessageType())
|
||||
.conversationId(webSocketRequest.getConversationId())
|
||||
.timestamp(webSocketRequest.getTimestamp())
|
||||
.build();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user