服务层重构与优化:补全所有ServiceImpl实现类,修复RestTemplate注入,完善DTO与配置,保证编译与启动通过
This commit is contained in:
@@ -1,13 +1,30 @@
|
||||
package com.emotion.controller;
|
||||
|
||||
import com.emotion.common.Result;
|
||||
import com.emotion.service.AiService;
|
||||
import com.emotion.dto.request.AiChatRequest;
|
||||
import com.emotion.dto.request.AiSummaryRequest;
|
||||
import com.emotion.dto.request.ChatStatsRequest;
|
||||
import com.emotion.dto.request.GuestChatRequest;
|
||||
import com.emotion.dto.request.ConversationCreateRequest;
|
||||
import com.emotion.dto.response.AiChatResponse;
|
||||
import com.emotion.dto.response.AiSummaryResponse;
|
||||
import com.emotion.dto.response.AiStatusResponse;
|
||||
import com.emotion.dto.response.ChatStatsResponse;
|
||||
import com.emotion.dto.response.GuestChatResponse;
|
||||
import com.emotion.dto.response.GuestUserInfoResponse;
|
||||
import com.emotion.dto.response.ConversationResponse;
|
||||
import com.emotion.entity.Conversation;
|
||||
import com.emotion.service.AIChatService;
|
||||
import com.emotion.service.MessageService;
|
||||
import com.emotion.service.ConversationService;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.BeanUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import javax.validation.Valid;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -23,140 +40,201 @@ import java.util.Map;
|
||||
public class AiChatController {
|
||||
|
||||
@Autowired
|
||||
private AiService aiService;
|
||||
private AIChatService aiChatService;
|
||||
|
||||
@Autowired
|
||||
private MessageService messageService;
|
||||
|
||||
@Autowired
|
||||
private ConversationService conversationService;
|
||||
|
||||
|
||||
private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
||||
|
||||
/**
|
||||
* 发送聊天消息
|
||||
*/
|
||||
@PostMapping("/chat")
|
||||
public Result<Map<String, Object>> sendChatMessage(@RequestBody Map<String, String> request) {
|
||||
try {
|
||||
String conversationId = request.get("conversationId");
|
||||
String message = request.get("message");
|
||||
String userId = request.get("userId");
|
||||
|
||||
if (message == null || message.trim().isEmpty()) {
|
||||
return Result.error("消息内容不能为空");
|
||||
}
|
||||
|
||||
if (userId == null || userId.trim().isEmpty()) {
|
||||
userId = "guest_" + System.currentTimeMillis();
|
||||
}
|
||||
|
||||
public Result<AiChatResponse> sendChatMessage(@Valid @RequestBody AiChatRequest request) {
|
||||
log.info("收到AI聊天请求: conversationId={}, userId={}, message={}",
|
||||
conversationId, userId, message);
|
||||
request.getConversationId(), request.getUserId(), request.getMessage());
|
||||
|
||||
// 调用AI服务
|
||||
String aiReply = aiService.sendChatMessage(conversationId, message, userId);
|
||||
String aiReply = aiChatService.sendChatMessage(request.getConversationId(), request.getMessage(),
|
||||
request.getUserId());
|
||||
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("conversationId", conversationId);
|
||||
response.put("userMessage", message);
|
||||
response.put("aiReply", aiReply);
|
||||
response.put("userId", userId);
|
||||
response.put("timestamp", System.currentTimeMillis());
|
||||
// 构建响应
|
||||
AiChatResponse response = new AiChatResponse();
|
||||
response.setConversationId(request.getConversationId());
|
||||
response.setUserMessage(request.getMessage());
|
||||
response.setAiReply(aiReply);
|
||||
response.setUserId(request.getUserId());
|
||||
response.setTimestamp(System.currentTimeMillis());
|
||||
|
||||
return Result.success(response);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("AI聊天请求处理失败", e);
|
||||
return Result.error("AI聊天服务暂时不可用,请稍后再试");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成对话总结
|
||||
*/
|
||||
@PostMapping("/summary")
|
||||
public Result<Map<String, Object>> generateSummary(@RequestBody Map<String, String> request) {
|
||||
try {
|
||||
String conversationId = request.get("conversationId");
|
||||
String userId = request.get("userId");
|
||||
|
||||
if (conversationId == null || conversationId.trim().isEmpty()) {
|
||||
return Result.error("会话ID不能为空");
|
||||
}
|
||||
|
||||
if (userId == null || userId.trim().isEmpty()) {
|
||||
userId = "guest_" + System.currentTimeMillis();
|
||||
}
|
||||
|
||||
log.info("收到对话总结请求: conversationId={}, userId={}", conversationId, userId);
|
||||
public Result<AiSummaryResponse> generateSummary(@Valid @RequestBody AiSummaryRequest request) {
|
||||
log.info("收到对话总结请求: conversationId={}, userId={}", request.getConversationId(), request.getUserId());
|
||||
|
||||
// 调用AI总结服务
|
||||
String summary = aiService.generateConversationSummary(conversationId, userId);
|
||||
String summary = aiChatService.generateConversationSummary(request.getConversationId(),
|
||||
request.getUserId());
|
||||
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("conversationId", conversationId);
|
||||
response.put("summary", summary);
|
||||
response.put("userId", userId);
|
||||
response.put("timestamp", System.currentTimeMillis());
|
||||
// 构建响应
|
||||
AiSummaryResponse response = new AiSummaryResponse();
|
||||
response.setConversationId(request.getConversationId());
|
||||
response.setSummary(summary);
|
||||
response.setUserId(request.getUserId());
|
||||
response.setTimestamp(System.currentTimeMillis());
|
||||
|
||||
return Result.success(response);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("对话总结请求处理失败", e);
|
||||
return Result.error("对话总结服务暂时不可用,请稍后再试");
|
||||
}
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取AI服务状态
|
||||
*/
|
||||
@GetMapping("/status")
|
||||
public Result<Map<String, Object>> getServiceStatus() {
|
||||
try {
|
||||
boolean available = aiService.isServiceAvailable();
|
||||
String status = aiService.getServiceStatus();
|
||||
public Result<AiStatusResponse> getServiceStatus() {
|
||||
log.info("获取AI服务状态");
|
||||
|
||||
boolean available = aiChatService.isServiceAvailable();
|
||||
String status = aiChatService.getServiceStatus();
|
||||
|
||||
Map<String, Object> response = new HashMap<>();
|
||||
response.put("available", available);
|
||||
response.put("status", status);
|
||||
response.put("timestamp", System.currentTimeMillis());
|
||||
|
||||
return Result.success(response);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("获取AI服务状态失败", e);
|
||||
return Result.error("无法获取AI服务状态");
|
||||
}
|
||||
// 构建响应
|
||||
AiStatusResponse response = new AiStatusResponse();
|
||||
response.setAvailable(available);
|
||||
response.setStatus(status);
|
||||
response.setTimestamp(System.currentTimeMillis());
|
||||
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取聊天记录统计
|
||||
*/
|
||||
@GetMapping("/stats")
|
||||
public Result<Map<String, Object>> getChatStats(@RequestParam(required = false) String userId,
|
||||
@RequestParam(required = false) String conversationId) {
|
||||
try {
|
||||
Map<String, Object> stats = new HashMap<>();
|
||||
public Result<ChatStatsResponse> getChatStats(@RequestParam(required = false) String userId,
|
||||
@RequestParam(required = false) String conversationId) {
|
||||
log.info("获取聊天统计: userId={}, conversationId={}", userId, conversationId);
|
||||
|
||||
// 构建响应
|
||||
ChatStatsResponse response = new ChatStatsResponse();
|
||||
|
||||
if (userId != null && !userId.trim().isEmpty()) {
|
||||
Long userConversationCount = conversationService.countByUserId(userId);
|
||||
Long activeConversationCount = conversationService.countActiveByUserId(userId);
|
||||
|
||||
stats.put("userConversationCount", userConversationCount);
|
||||
stats.put("activeConversationCount", activeConversationCount);
|
||||
response.setUserConversationCount(userConversationCount);
|
||||
response.setActiveConversationCount(activeConversationCount);
|
||||
}
|
||||
|
||||
if (conversationId != null && !conversationId.trim().isEmpty()) {
|
||||
Long conversationMessageCount = messageService.countByConversationId(conversationId);
|
||||
stats.put("conversationMessageCount", conversationMessageCount);
|
||||
response.setConversationMessageCount(conversationMessageCount);
|
||||
}
|
||||
|
||||
stats.put("timestamp", System.currentTimeMillis());
|
||||
|
||||
return Result.success(stats);
|
||||
|
||||
} catch (Exception e) {
|
||||
log.error("获取聊天统计失败", e);
|
||||
return Result.error("无法获取聊天统计信息");
|
||||
|
||||
response.setTimestamp(System.currentTimeMillis());
|
||||
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 访客聊天(不需要登录)
|
||||
*/
|
||||
@PostMapping("/guest/chat")
|
||||
public Result<GuestChatResponse> guestChat(@Valid @RequestBody GuestChatRequest request,
|
||||
HttpServletRequest httpRequest) {
|
||||
String clientIp = getClientIp(httpRequest);
|
||||
log.info("访客聊天请求: {}, IP: {}", request.getMessage(), clientIp);
|
||||
|
||||
// 调用AI服务
|
||||
Map<String, Object> aiResponse = aiChatService.guestChat(request.getMessage(), clientIp);
|
||||
|
||||
// 构建响应
|
||||
GuestChatResponse response = new GuestChatResponse();
|
||||
response.setMessage((String) aiResponse.get("message"));
|
||||
response.setMessageId((String) aiResponse.get("messageId"));
|
||||
response.setTimestamp((Long) aiResponse.get("timestamp"));
|
||||
response.setError((Boolean) aiResponse.get("error"));
|
||||
|
||||
return Result.success("发送成功", response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取访客用户信息
|
||||
*/
|
||||
@GetMapping("/guest/user/info")
|
||||
public Result<GuestUserInfoResponse> getGuestUserInfo(HttpServletRequest request) {
|
||||
String clientIp = getClientIp(request);
|
||||
log.info("获取访客用户信息: IP={}", clientIp);
|
||||
|
||||
// 调用AI服务
|
||||
Map<String, Object> userInfo = aiChatService.getGuestUserInfo(clientIp);
|
||||
|
||||
// 构建响应
|
||||
GuestUserInfoResponse response = new GuestUserInfoResponse();
|
||||
response.setId((String) userInfo.get("id"));
|
||||
response.setUsername((String) userInfo.get("username"));
|
||||
response.setNickname((String) userInfo.get("nickname"));
|
||||
response.setType((String) userInfo.get("type"));
|
||||
response.setClientIp((String) userInfo.get("clientIp"));
|
||||
response.setUserCreateTime((Long) userInfo.get("createTime"));
|
||||
|
||||
return Result.success(response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建对话
|
||||
*/
|
||||
@PostMapping("/conversation/create")
|
||||
public Result<ConversationResponse> createConversation(@Valid @RequestBody ConversationCreateRequest request,
|
||||
HttpServletRequest httpRequest) {
|
||||
log.info("创建对话请求: userId={}, title={}", request.getUserId(), request.getTitle());
|
||||
|
||||
String clientIp = getClientIp(httpRequest);
|
||||
|
||||
// 调用AI服务创建对话
|
||||
Map<String, Object> aiConversation = aiChatService.createConversation(request.getUserId(),
|
||||
request.getTitle());
|
||||
|
||||
// 创建数据库对话记录
|
||||
Conversation conversation = conversationService.createConversation(
|
||||
request.getUserId(),
|
||||
request.getTitle(),
|
||||
request.getType() != null ? request.getType() : "user");
|
||||
|
||||
// 构建响应
|
||||
ConversationResponse response = new ConversationResponse();
|
||||
BeanUtils.copyProperties(conversation, response);
|
||||
response.setId(conversation.getId());
|
||||
if (conversation.getCreateTime() != null) {
|
||||
response.setCreateTime(conversation.getCreateTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
if (conversation.getUpdateTime() != null) {
|
||||
response.setUpdateTime(conversation.getUpdateTime().format(DATE_TIME_FORMATTER));
|
||||
}
|
||||
|
||||
return Result.success("创建成功", response);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取客户端IP
|
||||
*/
|
||||
private String getClientIp(HttpServletRequest request) {
|
||||
String xForwardedFor = request.getHeader("X-Forwarded-For");
|
||||
if (xForwardedFor != null && !xForwardedFor.isEmpty() && !"unknown".equalsIgnoreCase(xForwardedFor)) {
|
||||
return xForwardedFor.split(",")[0].trim();
|
||||
}
|
||||
|
||||
String xRealIp = request.getHeader("X-Real-IP");
|
||||
if (xRealIp != null && !xRealIp.isEmpty() && !"unknown".equalsIgnoreCase(xRealIp)) {
|
||||
return xRealIp;
|
||||
}
|
||||
|
||||
return request.getRemoteAddr();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user