ソースを参照

Merge branch 'modules-zjy' of uskycloud/usky-modules into master

gez 1 ヶ月 前
コミット
d60f9f86fc

+ 8 - 22
service-ai/service-ai-biz/src/main/java/com/usky/ai/controller/web/AiChatController.java

@@ -28,6 +28,7 @@ import javax.annotation.Resource;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -62,9 +63,9 @@ public class AiChatController {
 
     private final ObjectMapper objectMapper = new ObjectMapper();
 
-    // 阿里百炼通义千问大模型
+    // 阿里百炼通义千问大模型(修改后)
     @PostMapping(value = "/aliTyqw", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
-    public ResponseEntity<StreamingResponseBody> send1(@RequestBody JSONObject object )throws NoApiKeyException, InputRequiredException {
+    public ResponseEntity<StreamingResponseBody> send1(@RequestBody JSONObject object) throws NoApiKeyException, InputRequiredException {
         // 获取当前登录用户的信息
         Long userId = SecurityUtils.getUserId();
         String userName = SecurityUtils.getLoginUser().getSysUser().getNickName();
@@ -79,8 +80,7 @@ public class AiChatController {
         }
 
         // 解析 JSON 并提取 "content" 字段的值
-        String questionText;
-        questionText = content; // 提取 "content" 字段的值
+        String questionText = content;
 
         // 检查是否已经存在相同的 sessionId
         boolean exists = aiSessionMapper.existsBySessionId(sessionId);
@@ -96,29 +96,15 @@ public class AiChatController {
             aiSessionMapper.save(aiSession);
         }
 
-        // 获取当前用户的对话历史
-        List<AiQuestion> conversationHistory = aiQuestionMapper.findByUserIdAndSessionId(sessionId, userId);
-
-//        // 只保留最近的几轮对话
-//        int historyLimit = Limit;
-//        if (conversationHistory.size() > historyLimit) {
-//            conversationHistory = conversationHistory.subList(conversationHistory.size() - historyLimit, conversationHistory.size());
-//        }
-
-        // 构建对话历史消息
-        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());
+        // 构建消息列表,仅包含角色定义和用户新消息
+        List<Message> messages = new ArrayList<>();
 
         // 插入角色定义(在对话历史的开头)
         Message roleDefinition = Message.builder()
                 .role(Role.SYSTEM.getValue()) // 使用系统角色
                 .content(aiRole) // 定义角色的行为和风格
                 .build();
-        messages.add(0, roleDefinition); // 将角色定义插入到对话历史的开头
+        messages.add(roleDefinition); // 将角色定义插入到对话历史的开头
 
         // 添加用户的新消息
         Message userMessage = Message.builder()
@@ -135,6 +121,7 @@ public class AiChatController {
                 .topP(0.8)
                 .apiKey(apiKey)
                 .incrementalOutput(true) // 开启增量输出
+                .enableSearch(true)  // 联网搜索
                 .build();
 
         String finalSessionId = sessionId;
@@ -164,7 +151,6 @@ public class AiChatController {
 
                                 // 写入输出流
                                 outputStream.write(("data: " + newString + "\n\n").getBytes(StandardCharsets.UTF_8));
-//                                outputStream.write(ApiResult.success(newString).toString().getBytes(StandardCharsets.UTF_8));
                                 outputStream.flush(); // 确保立即发送到前端
 
                                 // 累加到完整回答内容中

+ 27 - 3
service-ai/service-ai-biz/src/main/java/com/usky/ai/controller/web/AiSessionController.java

@@ -36,7 +36,8 @@ public class AiSessionController {
         Long userId = SecurityUtils.getUserId();
         return getSessionsByUserId(userId);
     }
-    public List<AiSession> getSessionsByUserId(@PathVariable Long userId) {
+
+    public List<AiSession> getSessionsByUserId(Long userId) {
         List<AiSession> sessions = aiSessionMapper.findByUserId(userId);
 
         for (AiSession session : sessions) {
@@ -50,15 +51,19 @@ public class AiSessionController {
                 userItem.setUserId(question.getUserId());
                 userItem.setUserName(question.getUserName());
                 userItem.setAskTime(question.getAskTime());
+                // 不设置 reasoningContent,因为 role 是 user
+
+                itemList.add(userItem);
 
-                AiQuestionItem assistantItem = new AiQuestionItem("assistant", question.getAnswer());
+                AiQuestionItem assistantItem = new AiQuestionItem("assistant", null); // 初始化 content 为 null
                 assistantItem.setId(question.getId());
                 assistantItem.setSessionId(question.getSessionId());
                 assistantItem.setUserId(question.getUserId());
                 assistantItem.setUserName(question.getUserName());
                 assistantItem.setAskTime(question.getAskTime());
+                assistantItem.setReasoningContent(question.getAnswer()); // 设置 reasoningContent
+                // 不设置 content,因为 role 是 assistant
 
-                itemList.add(userItem);
                 itemList.add(assistantItem);
             }
 
@@ -67,4 +72,23 @@ public class AiSessionController {
 
         return ApiResult.success(sessions).getData();
     }
+
+    @PostMapping("/update")
+    public ApiResult updateSession(@RequestBody AiSession aiSession) {
+        aiSessionMapper.updateQuestion(aiSession.getSessionId(), aiSession.getQuestion());
+        return ApiResult.success("更新会话成功");
+    }
+
+    @DeleteMapping("/delete")
+    public ApiResult deleteSession(@RequestParam String sessionId) {
+        try {
+            aiSessionMapper.delete(sessionId);
+            aiQuestionMapper.delete(sessionId);
+            return ApiResult.success("删除会话成功");
+        } catch (Exception e) {
+            // 如果出现异常,可以记录日志或者返回错误信息
+            log.error("删除会话失败", e);
+            return ApiResult.error("删除会话失败");
+        }
+    }
 }

+ 4 - 0
service-ai/service-ai-biz/src/main/java/com/usky/ai/mapper/AiQuestionMapper.java

@@ -34,4 +34,8 @@ public interface AiQuestionMapper {
     // 根据 sessionId 查询 ai_questions 表中的数据
     @Select("SELECT * FROM ai_questions WHERE session_id = #{sessionId} ORDER BY ask_time ASC")
     List<AiQuestion> findQuestionsBySessionId(String sessionId);
+
+    //标记会话为删除
+    @Update("UPDATE ai_questions SET deleted = true WHERE session_id = #{sessionId}")
+    void delete(String sessionId);
 }

+ 15 - 9
service-ai/service-ai-biz/src/main/java/com/usky/ai/mapper/AiSessionMapper.java

@@ -2,9 +2,7 @@ package com.usky.ai.mapper;
 
 import com.usky.ai.service.AiQuestion;
 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 org.apache.ibatis.annotations.*;
 
 import java.util.List;
 
@@ -15,17 +13,25 @@ public interface AiSessionMapper {
     void save(AiSession aiSession);
 
     //查询所有数据
-    @Select("SELECT * FROM ai_sessions ORDER BY ask_time ASC")
+    @Select("SELECT * FROM ai_sessions ORDER BY ask_time DESC")
     List<AiSession> findAll();
 
-    //根据user_id 查询数据
-    @Select("SELECT * FROM ai_sessions WHERE user_id = #{userId} ORDER BY ask_time ASC")
+    // 根据 user_id 查询未删除的数据
+    @Select("SELECT * FROM ai_sessions WHERE user_id = #{userId} AND deleted = false ORDER BY ask_time DESC")
     List<AiSession> findByUserId(Long userId);
 
-    // 检查是否存在指定的 session_id
-    @Select("SELECT COUNT(*) FROM ai_sessions WHERE session_id = #{sessionId}")
+    // 检查是否存在指定的 session_id 且未删除
+    @Select("SELECT COUNT(*) FROM ai_sessions WHERE session_id = #{sessionId} ORDER BY ask_time DESC")
     boolean existsBySessionId(String sessionId);
 
-    @Select("SELECT * FROM ai_questions WHERE session_id = #{sessionId} ORDER BY ask_time ASC")
+    @Select("SELECT * FROM ai_questions WHERE session_id = #{sessionId} ORDER BY ask_time DESC")
     List<AiQuestion> findQuestionsBySessionId(String sessionId);
+
+    // 更新会话主题
+    @Update("UPDATE ai_sessions SET question = #{question} WHERE session_id = #{sessionId}")
+    void updateQuestion(@Param("sessionId") String sessionId, @Param("question") String question);
+
+    //标记会话为删除
+    @Update("UPDATE ai_sessions SET deleted = true WHERE session_id = #{sessionId}")
+    void delete(String sessionId);
 }

+ 5 - 0
service-ai/service-ai-biz/src/main/java/com/usky/ai/service/AiQuestionItem.java

@@ -9,6 +9,7 @@ public class AiQuestionItem {
     private String userName;
     private String role;
     private String content;
+    private String reasoningContent;
     private LocalDateTime askTime;
 
     public AiQuestionItem(String role, String content) {
@@ -40,6 +41,10 @@ public class AiQuestionItem {
 
     public void setContent(String content) { this.content = content; }
 
+    public String getReasoningContent() { return reasoningContent; }
+
+    public void setReasoningContent(String reasoningContent) { this.reasoningContent = reasoningContent; }
+
     public LocalDateTime getAskTime() { return askTime; }
 
     public void setAskTime(LocalDateTime askTime) { this.askTime = askTime; }

+ 5 - 0
service-ai/service-ai-biz/src/main/java/com/usky/ai/service/AiSession.java

@@ -12,6 +12,7 @@ public class AiSession {
     private String question;
     private LocalDateTime askTime;
     private List<AiQuestionItem> itemList;
+    private boolean deleted; // 添加删除标识字段
 
     public Long getId() { return id; }
 
@@ -40,4 +41,8 @@ public class AiSession {
     public List<AiQuestionItem> getItemList() { return itemList; }
 
     public void setItemList(List<AiQuestionItem> itemList) { this.itemList = itemList; }
+
+    public boolean isDeleted() { return deleted; }
+
+    public void setDeleted(boolean deleted) { this.deleted = deleted; }
 }