package com.emotion.controller; import com.emotion.common.Result; 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; /** * AI聊天控制器 * * @author emotion-museum * @date 2025-07-23 */ @Slf4j @RestController @RequestMapping("/api/ai") public class AiChatController { @Autowired 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 sendChatMessage(@Valid @RequestBody AiChatRequest request) { log.info("收到AI聊天请求: conversationId={}, userId={}, message={}", request.getConversationId(), request.getUserId(), request.getMessage()); // 调用AI服务 String aiReply = aiChatService.sendChatMessage(request.getConversationId(), request.getMessage(), request.getUserId()); // 构建响应 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); } /** * 生成对话总结 */ @PostMapping("/summary") public Result generateSummary(@Valid @RequestBody AiSummaryRequest request) { log.info("收到对话总结请求: conversationId={}, userId={}", request.getConversationId(), request.getUserId()); // 调用AI总结服务 String summary = aiChatService.generateConversationSummary(request.getConversationId(), request.getUserId()); // 构建响应 AiSummaryResponse response = new AiSummaryResponse(); response.setConversationId(request.getConversationId()); response.setSummary(summary); response.setUserId(request.getUserId()); response.setTimestamp(System.currentTimeMillis()); return Result.success(response); } /** * 获取AI服务状态 */ @GetMapping("/status") public Result getServiceStatus() { log.info("获取AI服务状态"); boolean available = aiChatService.isServiceAvailable(); String status = aiChatService.getServiceStatus(); // 构建响应 AiStatusResponse response = new AiStatusResponse(); response.setAvailable(available); response.setStatus(status); response.setTimestamp(System.currentTimeMillis()); return Result.success(response); } /** * 获取聊天记录统计 */ @GetMapping("/stats") public Result 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); response.setUserConversationCount(userConversationCount); response.setActiveConversationCount(activeConversationCount); } if (conversationId != null && !conversationId.trim().isEmpty()) { Long conversationMessageCount = messageService.countByConversationId(conversationId); response.setConversationMessageCount(conversationMessageCount); } response.setTimestamp(System.currentTimeMillis()); return Result.success(response); } /** * 访客聊天(不需要登录) */ @PostMapping("/guest/chat") public Result guestChat(@Valid @RequestBody GuestChatRequest request, HttpServletRequest httpRequest) { String clientIp = getClientIp(httpRequest); log.info("访客聊天请求: {}, IP: {}", request.getMessage(), clientIp); // 调用AI服务 Map 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 getGuestUserInfo(HttpServletRequest request) { String clientIp = getClientIp(request); log.info("获取访客用户信息: IP={}", clientIp); // 调用AI服务 Map 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 createConversation(@Valid @RequestBody ConversationCreateRequest request, HttpServletRequest httpRequest) { log.info("创建对话请求: userId={}, title={}", request.getUserId(), request.getTitle()); String clientIp = getClientIp(httpRequest); // 调用AI服务创建对话 Map 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(); } }