Browse Source

将接口分为大模型调用、会话ID存储、详细内容存储

zhaojinyu 1 month ago
parent
commit
fa64b8a0d1

+ 3 - 3
base-modules/service-ai/service-ai-biz/src/main/java/com/usky/ai/AIQuestionApplication.java → base-modules/service-ai/service-ai-biz/src/main/java/com/usky/ai/AIChatApplication.java

@@ -21,11 +21,11 @@ import java.net.UnknownHostException;
 @MapperScan(value = "com.usky.ai.mapper")
 @ComponentScan(basePackages = {"com.usky"})
 @SpringBootApplication
-public class AIQuestionApplication {
-        private static final Logger LOGGER = LoggerFactory.getLogger(AIQuestionApplication.class);
+public class AIChatApplication {
+        private static final Logger LOGGER = LoggerFactory.getLogger(AIChatApplication.class);
 
         public static void main (String[]args) throws UnknownHostException {
-        ConfigurableApplicationContext application = SpringApplication.run(AIQuestionApplication.class, args);
+        ConfigurableApplicationContext application = SpringApplication.run(AIChatApplication.class, args);
         Environment env = application.getEnvironment();
         String ip = InetAddress.getLocalHost().getHostAddress();
         String port = env.getProperty("server.port");

+ 250 - 0
base-modules/service-ai/service-ai-biz/src/main/java/com/usky/ai/controller/web/AiChatController.java

@@ -0,0 +1,250 @@
+package com.usky.ai.controller.web;
+
+import com.alibaba.dashscope.aigc.generation.Generation;
+import com.alibaba.dashscope.aigc.generation.GenerationParam;
+import com.alibaba.dashscope.aigc.generation.GenerationResult;
+import com.alibaba.dashscope.common.Message;
+import com.alibaba.dashscope.common.Role;
+import com.alibaba.dashscope.exception.InputRequiredException;
+import com.alibaba.dashscope.exception.NoApiKeyException;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.usky.ai.mapper.AiQuestionMapper;
+import com.usky.ai.mapper.AiSessionMapper;
+import com.usky.ai.service.AiQuestion;
+import com.usky.ai.service.AiSession;
+import com.usky.common.security.utils.SecurityUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
+
+import javax.annotation.Resource;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Slf4j
+@RestController
+@RequestMapping("/ai")
+public class AiChatController {
+
+    @Value("${ai.api.key}")
+    private String apiKey;
+
+    @Resource
+    private Generation generation;
+
+    @Autowired
+    private AiQuestionMapper aiQuestionMapper;
+
+    @Autowired
+    private AiSessionMapper aiSessionMapper;
+
+    private final ObjectMapper objectMapper = new ObjectMapper();
+
+    // 阿里百炼通义千问大模型
+    @PostMapping(value = "/aliTyqw", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+    public ResponseEntity<StreamingResponseBody> send1(@RequestBody String content, @RequestParam(required = false) String sessionId) throws NoApiKeyException, InputRequiredException {
+        // 获取当前登录用户的信息
+        Long userId = SecurityUtils.getUserId();
+        String userName = SecurityUtils.getLoginUser().getSysUser().getNickName();
+
+        // 如果没有传入 sessionId,则创建一个新的会话ID
+        if (sessionId == null || sessionId.isEmpty()) {
+            sessionId = java.util.UUID.randomUUID().toString();
+
+
+            // 解析 JSON 并提取 "content" 字段的值
+            String questionText;
+            try {
+                JsonNode jsonNode = objectMapper.readTree(content);
+                questionText = jsonNode.get("content").asText(); // 提取 "content" 字段的值
+            } catch (IOException e) {
+                log.error("Error parsing JSON content", e);
+                return ResponseEntity.badRequest().body(outputStream -> {
+                    outputStream.write("Invalid JSON format".getBytes(StandardCharsets.UTF_8));
+                    outputStream.flush();
+                });
+            }
+
+            // 检查是否已经存在相同的 sessionId
+            boolean exists = aiSessionMapper.existsBySessionId(sessionId);
+
+            if (!exists) {
+                // 创建新的 AiSession 实体并存入数据库
+                AiSession aiSession = new AiSession();
+                aiSession.setSessionId(sessionId);
+                aiSession.setUserId(userId);
+                aiSession.setUserName(userName);
+                aiSession.setQuestion(questionText);
+                aiSession.setAskTime(LocalDateTime.now());
+                aiSessionMapper.save(aiSession);
+            }
+        }
+
+        // 获取当前用户的对话历史
+        List<AiQuestion> conversationHistory = aiQuestionMapper.findByUserIdAndSessionId(sessionId, userId);
+
+        // 构建对话历史消息
+        List<Message> messages = conversationHistory.stream()
+                .map(q -> Message.builder()
+                        .role(q.getUserId().equals(userId) ? Role.USER.getValue() : Role.ASSISTANT.getValue())
+                        .content(q.getUserId().equals(userId) ? q.getQuestion() : q.getAnswer())
+                        .build())
+                .collect(Collectors.toList());
+
+        // 解析 JSON 并提取 "content" 字段的值
+        String questionText;
+        try {
+            JsonNode jsonNode = objectMapper.readTree(content);
+            questionText = jsonNode.get("content").asText(); // 提取 "content" 字段的值
+        } catch (IOException e) {
+            log.error("Error parsing JSON content", e);
+            return ResponseEntity.badRequest().body(outputStream -> {
+                outputStream.write("Invalid JSON format".getBytes(StandardCharsets.UTF_8));
+                outputStream.flush();
+            });
+        }
+
+        // 添加用户的新消息
+        Message userMessage = Message.builder()
+                .role(Role.USER.getValue())
+                .content(questionText) // 使用提取的文本
+                .build();
+        messages.add(userMessage);
+
+        // 构建模型调用参数
+        GenerationParam param = GenerationParam.builder()
+                .model("qwen-turbo")
+                .messages(messages)
+                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
+                .topP(0.8)
+                .apiKey(apiKey)
+                .enableSearch(true)
+                .build();
+
+        String finalSessionId = sessionId;
+        return ResponseEntity.ok()
+                .contentType(MediaType.TEXT_EVENT_STREAM)
+                .body(outputStream -> {
+                    try {
+                        GenerationResult generationResult = generation.call(param);
+
+                        // 获取回答内容
+                        String answer = generationResult.getOutput().getChoices().get(0).getMessage().getContent();
+
+                        // 将回答内容写入输出流
+                        outputStream.write(answer.getBytes(StandardCharsets.UTF_8));
+                        outputStream.flush();
+
+                        // 创建实体并保存到数据库
+                        AiQuestion aiQuestion = new AiQuestion();
+                        aiQuestion.setModel("qwen-turbo");
+                        aiQuestion.setSessionId(finalSessionId);
+                        aiQuestion.setUserId(userId);
+                        aiQuestion.setUserName(userName);
+                        aiQuestion.setQuestion(questionText); // 存入提取的文本
+                        aiQuestion.setAnswer(answer);
+                        aiQuestion.setAskTime(LocalDateTime.now());
+                        aiQuestionMapper.save(aiQuestion);
+                    } catch (IOException | NoApiKeyException | InputRequiredException e) {
+                        log.error("Error processing request", e);
+                        outputStream.write("Error processing request".getBytes(StandardCharsets.UTF_8));
+                        outputStream.flush();
+                    } finally {
+                        outputStream.close();
+                    }
+                });
+    }
+
+    // 阿里百炼DeepSeek大模型
+    @PostMapping(value = "/aliDeepSeek", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
+    public ResponseEntity<StreamingResponseBody> send2(@RequestBody String content, @RequestParam(required = false) String sessionId) throws NoApiKeyException, InputRequiredException {
+        // 获取当前登录用户的信息
+        Long userId = SecurityUtils.getUserId();
+        String userName = SecurityUtils.getLoginUser().getSysUser().getNickName();
+
+        // 如果没有传入 sessionId,则创建一个新的会话ID
+        if (sessionId == null || sessionId.isEmpty()) {
+            sessionId = java.util.UUID.randomUUID().toString();
+        }
+
+        // 获取当前用户的对话历史
+        List<AiQuestion> conversationHistory = aiQuestionMapper.findByUserIdAndSessionId(sessionId, userId);
+
+        // 构建对话历史消息
+        List<Message> messages = conversationHistory.stream()
+                .map(q -> Message.builder()
+                        .role(q.getUserId().equals(userId) ? Role.USER.getValue() : Role.ASSISTANT.getValue())
+                        .content(q.getUserId().equals(userId) ? q.getQuestion() : q.getAnswer())
+                        .build())
+                .collect(Collectors.toList());
+
+        // 解析 JSON 并提取 "content" 字段的值
+        String questionText;
+        try {
+            JsonNode jsonNode = objectMapper.readTree(content);
+            questionText = jsonNode.get("content").asText(); // 提取 "content" 字段的值
+        } catch (IOException e) {
+            log.error("Error parsing JSON content", e);
+            return ResponseEntity.badRequest().body(outputStream -> {
+                outputStream.write("Invalid JSON format".getBytes(StandardCharsets.UTF_8));
+                outputStream.flush();
+            });
+        }
+
+        // 添加用户的新消息
+        Message userMessage = Message.builder()
+                .role(Role.USER.getValue())
+                .content(questionText) // 使用提取的文本
+                .build();
+        messages.add(userMessage);
+
+        // 构建模型调用参数
+        GenerationParam param = GenerationParam.builder()
+                .model("deepseek-v3")
+                .messages(messages)
+                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
+                .apiKey(apiKey)
+                .build();
+
+        String finalSessionId = sessionId;
+        return ResponseEntity.ok()
+                .contentType(MediaType.TEXT_EVENT_STREAM)
+                .body(outputStream -> {
+                    try {
+                        GenerationResult generationResult = generation.call(param);
+
+                        // 获取回答内容
+                        String answer = generationResult.getOutput().getChoices().get(0).getMessage().getContent();
+
+                        // 将回答内容写入输出流
+                        outputStream.write(answer.getBytes(StandardCharsets.UTF_8));
+                        outputStream.flush();
+
+                        // 创建实体并保存到数据库
+                        AiQuestion aiQuestion = new AiQuestion();
+                        aiQuestion.setModel("deepseek-v3");
+                        aiQuestion.setSessionId(finalSessionId);
+                        aiQuestion.setUserId(userId);
+                        aiQuestion.setUserName(userName);
+                        aiQuestion.setQuestion(questionText); // 存入提取的文本
+                        aiQuestion.setAnswer(answer);
+                        aiQuestion.setAskTime(LocalDateTime.now());
+                        aiQuestionMapper.save(aiQuestion);
+                    } catch (IOException | NoApiKeyException | InputRequiredException e) {
+                        log.error("Error processing request", e);
+                        outputStream.write("Error processing request".getBytes(StandardCharsets.UTF_8));
+                        outputStream.flush();
+                    } finally {
+                        outputStream.close();
+                    }
+                });
+    }
+}

+ 5 - 204
base-modules/service-ai/service-ai-biz/src/main/java/com/usky/ai/controller/web/AiQuestionController.java

@@ -1,48 +1,21 @@
 package com.usky.ai.controller.web;
 
-import com.alibaba.dashscope.aigc.generation.Generation;
-import com.alibaba.dashscope.aigc.generation.GenerationParam;
-import com.alibaba.dashscope.aigc.generation.GenerationResult;
-import com.alibaba.dashscope.common.Message;
-import com.alibaba.dashscope.common.Role;
-import com.alibaba.dashscope.exception.InputRequiredException;
-import com.alibaba.dashscope.exception.NoApiKeyException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
 import com.usky.ai.mapper.AiQuestionMapper;
 import com.usky.ai.service.AiQuestion;
-import com.usky.common.security.utils.SecurityUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
-import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
 
-import javax.annotation.Resource;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.time.LocalDateTime;
 import java.util.List;
-import java.util.stream.Collectors;
 
 @Slf4j
 @RestController
-@RequestMapping("/ai")
+@RequestMapping("/questions")
 public class AiQuestionController {
 
-    @Value("${ai.api.key}")
-    private String apiKey;
-
-    @Resource
-    private Generation generation;
-
     @Autowired
     private AiQuestionMapper aiQuestionMapper;
 
-    private final ObjectMapper objectMapper = new ObjectMapper();
-
     // 查询所有数据
     @GetMapping("/all")
     public List<AiQuestion> getAllQuestions() {
@@ -62,181 +35,9 @@ public class AiQuestionController {
         return "Question with id " + id + " deleted successfully.";
     }
 
-    // 根据 userId 和 sessionId 查询数据
-    @GetMapping("/session/{sessionId}/user/{userId}")
-    public List<AiQuestion> getQuestionsByUserIdAndSessionId(@PathVariable String sessionId, @PathVariable Long userId) {
-        return aiQuestionMapper.findByUserIdAndSessionId(sessionId, userId);
-    }
-
-    // 阿里百炼通义千问大模型
-    @PostMapping(value = "/aliTyqw", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
-    public ResponseEntity<StreamingResponseBody> send1(@RequestBody String content, @RequestParam(required = false) String sessionId) throws NoApiKeyException, InputRequiredException {
-        // 获取当前登录用户的信息
-        Long userId = SecurityUtils.getUserId();
-        String userName = SecurityUtils.getLoginUser().getSysUser().getNickName();
-
-        // 如果没有传入 sessionId,则创建一个新的会话ID
-        if (sessionId == null || sessionId.isEmpty()) {
-            sessionId = java.util.UUID.randomUUID().toString();
-        }
-
-        // 获取当前用户的对话历史
-        List<AiQuestion> conversationHistory = aiQuestionMapper.findByUserIdAndSessionId(sessionId, userId);
-
-        // 构建对话历史消息
-        List<Message> messages = conversationHistory.stream()
-                .map(q -> Message.builder()
-                        .role(q.getUserId().equals(userId) ? Role.USER.getValue() : Role.ASSISTANT.getValue())
-                        .content(q.getUserId().equals(userId) ? q.getQuestion() : q.getAnswer())
-                        .build())
-                .collect(Collectors.toList());
-
-        // 解析 JSON 并提取 "content" 字段的值
-        String questionText;
-        try {
-            JsonNode jsonNode = objectMapper.readTree(content);
-            questionText = jsonNode.get("content").asText(); // 提取 "content" 字段的值
-        } catch (IOException e) {
-            log.error("Error parsing JSON content", e);
-            return ResponseEntity.badRequest().body(outputStream -> {
-                outputStream.write("Invalid JSON format".getBytes(StandardCharsets.UTF_8));
-                outputStream.flush();
-            });
-        }
-
-        // 添加用户的新消息
-        Message userMessage = Message.builder()
-                .role(Role.USER.getValue())
-                .content(questionText) // 使用提取的文本
-                .build();
-        messages.add(userMessage);
-
-        // 构建模型调用参数
-        GenerationParam param = GenerationParam.builder()
-                .model("qwen-turbo")
-                .messages(messages)
-                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
-                .topP(0.8)
-                .apiKey(apiKey)
-                .enableSearch(true)
-                .build();
-
-        String finalSessionId = sessionId;
-        return ResponseEntity.ok()
-                .contentType(MediaType.TEXT_EVENT_STREAM)
-                .body(outputStream -> {
-                    try {
-                        GenerationResult generationResult = generation.call(param);
-
-                        // 获取回答内容
-                        String answer = generationResult.getOutput().getChoices().get(0).getMessage().getContent();
-
-                        // 将回答内容写入输出流
-                        outputStream.write(answer.getBytes(StandardCharsets.UTF_8));
-                        outputStream.flush();
-
-                        // 创建实体并保存到数据库
-                        AiQuestion aiQuestion = new AiQuestion();
-                        aiQuestion.setModel("qwen-turbo");
-                        aiQuestion.setSessionId(finalSessionId);
-                        aiQuestion.setUserId(userId);
-                        aiQuestion.setUserName(userName);
-                        aiQuestion.setQuestion(questionText); // 存入提取的文本
-                        aiQuestion.setAnswer(answer);
-                        aiQuestion.setAskTime(LocalDateTime.now());
-                        aiQuestionMapper.save(aiQuestion);
-                    } catch (IOException | NoApiKeyException | InputRequiredException e) {
-                        log.error("Error processing request", e);
-                        outputStream.write("Error processing request".getBytes(StandardCharsets.UTF_8));
-                        outputStream.flush();
-                    } finally {
-                        outputStream.close();
-                    }
-                });
-    }
-
-    // 阿里百炼DeepSeek大模型
-    @PostMapping(value = "/aliDeepSeek", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
-    public ResponseEntity<StreamingResponseBody> send2(@RequestBody String content, @RequestParam(required = false) String sessionId) throws NoApiKeyException, InputRequiredException {
-        // 获取当前登录用户的信息
-        Long userId = SecurityUtils.getUserId();
-        String userName = SecurityUtils.getLoginUser().getSysUser().getNickName();
-
-        // 如果没有传入 sessionId,则创建一个新的会话ID
-        if (sessionId == null || sessionId.isEmpty()) {
-            sessionId = java.util.UUID.randomUUID().toString();
-        }
-
-        // 获取当前用户的对话历史
-        List<AiQuestion> conversationHistory = aiQuestionMapper.findByUserIdAndSessionId(sessionId, userId);
-
-        // 构建对话历史消息
-        List<Message> messages = conversationHistory.stream()
-                .map(q -> Message.builder()
-                        .role(q.getUserId().equals(userId) ? Role.USER.getValue() : Role.ASSISTANT.getValue())
-                        .content(q.getUserId().equals(userId) ? q.getQuestion() : q.getAnswer())
-                        .build())
-                .collect(Collectors.toList());
-
-        // 解析 JSON 并提取 "content" 字段的值
-        String questionText;
-        try {
-            JsonNode jsonNode = objectMapper.readTree(content);
-            questionText = jsonNode.get("content").asText(); // 提取 "content" 字段的值
-        } catch (IOException e) {
-            log.error("Error parsing JSON content", e);
-            return ResponseEntity.badRequest().body(outputStream -> {
-                outputStream.write("Invalid JSON format".getBytes(StandardCharsets.UTF_8));
-                outputStream.flush();
-            });
-        }
-
-        // 添加用户的新消息
-        Message userMessage = Message.builder()
-                .role(Role.USER.getValue())
-                .content(questionText) // 使用提取的文本
-                .build();
-        messages.add(userMessage);
-
-        // 构建模型调用参数
-        GenerationParam param = GenerationParam.builder()
-                .model("deepseek-v3")
-                .messages(messages)
-                .resultFormat(GenerationParam.ResultFormat.MESSAGE)
-                .apiKey(apiKey)
-                .build();
-
-        String finalSessionId = sessionId;
-        return ResponseEntity.ok()
-                .contentType(MediaType.TEXT_EVENT_STREAM)
-                .body(outputStream -> {
-                    try {
-                        GenerationResult generationResult = generation.call(param);
-
-                        // 获取回答内容
-                        String answer = generationResult.getOutput().getChoices().get(0).getMessage().getContent();
-
-                        // 将回答内容写入输出流
-                        outputStream.write(answer.getBytes(StandardCharsets.UTF_8));
-                        outputStream.flush();
-
-                        // 创建实体并保存到数据库
-                        AiQuestion aiQuestion = new AiQuestion();
-                        aiQuestion.setModel("deepseek-v3");
-                        aiQuestion.setSessionId(finalSessionId);
-                        aiQuestion.setUserId(userId);
-                        aiQuestion.setUserName(userName);
-                        aiQuestion.setQuestion(questionText); // 存入提取的文本
-                        aiQuestion.setAnswer(answer);
-                        aiQuestion.setAskTime(LocalDateTime.now());
-                        aiQuestionMapper.save(aiQuestion);
-                    } catch (IOException | NoApiKeyException | InputRequiredException e) {
-                        log.error("Error processing request", e);
-                        outputStream.write("Error processing request".getBytes(StandardCharsets.UTF_8));
-                        outputStream.flush();
-                    } finally {
-                        outputStream.close();
-                    }
-                });
+    // 根据 sessionId 查询数据
+    @GetMapping("/session/{sessionId}")
+    public List<AiQuestion> getQuestionsBySessionId(@PathVariable String sessionId) {
+        return aiQuestionMapper.findBySessionId(sessionId);
     }
 }

+ 28 - 0
base-modules/service-ai/service-ai-biz/src/main/java/com/usky/ai/controller/web/AiSessionController.java

@@ -0,0 +1,28 @@
+package com.usky.ai.controller.web;
+
+import com.usky.ai.mapper.AiSessionMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@RestController
+@RequestMapping("/session")
+public class AiSessionController {
+
+    @Autowired
+    private AiSessionMapper aiSessionMapper;
+
+    @GetMapping("/all")
+    public String getAllSessions() {
+        return aiSessionMapper.findAll().toString();
+    }
+
+    @GetMapping("/session/{sessionId}")
+    public String getSessionsBySessionId(@PathVariable String sessionId) {
+        return aiSessionMapper.findBySessionId(sessionId).toString();
+    }
+}

+ 7 - 3
base-modules/service-ai/service-ai-biz/src/main/java/com/usky/ai/mapper/AiQuestionMapper.java

@@ -12,18 +12,22 @@ public interface AiQuestionMapper {
     void save(AiQuestion aiQuestion);
 
     // 查询所有数据
-    @Select("SELECT * FROM ai_questions")
+    @Select("SELECT * FROM ai_questions ORDER BY ask_time ASC")
     List<AiQuestion> findAll();
 
     // 根据 userId 查询数据
-    @Select("SELECT * FROM ai_questions WHERE user_id = #{userId}")
+    @Select("SELECT * FROM ai_questions WHERE user_id = #{userId} ORDER BY ask_time ASC")
     List<AiQuestion> findByUserId(Long userId);
 
     // 根据 id 删除数据
     @Delete("DELETE FROM ai_questions WHERE id = #{id}")
     void deleteById(Long id);
 
-    // 根据 sessionId  和 userId 查询数据
+    // 根据 sessionId 和 userId 查询数据
     @Select("SELECT * FROM ai_questions WHERE session_id = #{sessionId} AND user_id = #{userId} ORDER BY ask_time ASC")
     List<AiQuestion> findByUserIdAndSessionId(@Param("sessionId") String sessionId, @Param("userId") Long userId);
+
+    //根据 sessionId查询数据
+    @Select("SELECT * FROM ai_questions WHERE session_id = #{sessionId} ORDER BY ask_time ASC")
+    List<AiQuestion> findBySessionId(String sessionId);
 }

+ 27 - 0
base-modules/service-ai/service-ai-biz/src/main/java/com/usky/ai/mapper/AiSessionMapper.java

@@ -0,0 +1,27 @@
+package com.usky.ai.mapper;
+
+import com.usky.ai.service.AiSession;
+import org.apache.ibatis.annotations.Insert;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+
+@Mapper
+public interface AiSessionMapper {
+    @Insert("INSERT INTO ai_sessions (session_id, user_id, user_name, question, ask_time) " +
+            "VALUES (#{sessionId}, #{userId}, #{userName}, #{question}, #{askTime})")
+    void save(AiSession aiSession);
+
+    //查询所有数据
+    @Select("SELECT * FROM ai_sessions ORDER BY ask_time ASC")
+    List<AiSession> findAll();
+
+    // 根据 session_id 查询数据
+    @Select("SELECT * FROM ai_sessions WHERE session_id = #{sessionId} ORDER BY ask_time ASC")
+    List<AiSession> findBySessionId(String sessionId);
+
+    // 检查是否存在指定的 session_id
+    @Select("SELECT COUNT(*) FROM ai_sessions WHERE session_id = #{sessionId}")
+    boolean existsBySessionId(String sessionId);
+}

+ 0 - 1
base-modules/service-ai/service-ai-biz/src/main/java/com/usky/ai/service/AiQuestion.java

@@ -12,7 +12,6 @@ public class AiQuestion {
     private String answer;
     private LocalDateTime askTime;
 
-    // Getters and Setters
     public Long getId() {
         return id;
     }

+ 37 - 0
base-modules/service-ai/service-ai-biz/src/main/java/com/usky/ai/service/AiSession.java

@@ -0,0 +1,37 @@
+package com.usky.ai.service;
+
+import java.time.LocalDateTime;
+
+public class AiSession {
+
+    private Long id;
+    private String sessionId;
+    private Long userId; // 添加用户ID字段
+    private String userName; // 添加用户名字段
+    private String question;
+    private LocalDateTime askTime;
+
+    public Long getId() { return id; }
+
+    public void setId(Long id) { this.id = id; }
+
+    public String getSessionId() { return sessionId; }
+
+    public void setSessionId(String sessionId) { this.sessionId = sessionId; }
+
+    public Long getUserId() { return userId; }
+
+    public void setUserId(Long userId) { this.userId = userId; }
+
+    public String getUserName() { return userName; }
+
+    public void setUserName(String userName) { this.userName = userName; }
+
+    public String getQuestion() { return question; }
+
+    public void setQuestion(String question) { this.question = question; }
+
+    public LocalDateTime getAskTime() { return askTime; }
+
+    public void setAskTime(LocalDateTime askTime) { this.askTime = askTime; }
+}

+ 1 - 1
base-modules/service-ai/service-ai-biz/src/main/java/com/usky/ai/service/config/AiQuestionConfig.java → base-modules/service-ai/service-ai-biz/src/main/java/com/usky/ai/service/config/AiChatConfig.java

@@ -5,7 +5,7 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
 @Configuration
-public class AiQuestionConfig {
+public class AiChatConfig {
 
     @Bean
     public Generation generation() {