Переглянути джерело

[Bugfix 0000] 修复AI智能助手新任务关闭再打开时渲染错误问题

wangkeyi 3 тижнів тому
батько
коміт
3a6286d1d5

+ 40 - 10
src/views/ventAI/manageAssistent/components/AiAssistantModal.vue

@@ -195,6 +195,9 @@
 
   const taskList = ref<Task[]>([]);
 
+  // 已从接口拉取过的会话 id,用于识别流式期间后端新建的会话
+  const knownApiSessionIds = new Set<string>();
+
   // 从接口获取会话列表
   const fetchSessionList = async () => {
     try {
@@ -211,18 +214,35 @@
           sortOrder: item.sort_order,
         }));
 
-        const mergedTasks = apiTasks.map((apiTask) => {
+        // 流式中的空白任务:后端已为其创建会话,但前端要等流结束才拿到 session_id。
+        // 该会话在接口里是一条全新记录,归并回空白任务而不是单独插入,避免列表出现重复条目
+        let blankStreamingTask: Task | null = taskList.value.find((t) => !t.sessionId && t.isStreaming) || null;
+
+        const mergedTasks: Task[] = [];
+        for (const apiTask of apiTasks) {
+          if (blankStreamingTask && (blankStreamingTask.pendingSessionId === apiTask.id || !knownApiSessionIds.has(apiTask.id))) {
+            blankStreamingTask.pendingSessionId = apiTask.id;
+            blankStreamingTask.name = apiTask.name;
+            blankStreamingTask.updatedAt = apiTask.updatedAt;
+            blankStreamingTask.sortOrder = apiTask.sortOrder;
+            blankStreamingTask = null;
+            continue;
+          }
+
           const existing = taskList.value.find((t) => t.id === apiTask.id);
           if (existing) {
-            return {
+            mergedTasks.push({
               ...apiTask,
               messages: existing.messages,
               attachedFiles: existing.attachedFiles,
               wordUrl: existing.wordUrl,
-            };
+            });
+          } else {
+            mergedTasks.push(apiTask);
           }
-          return apiTask;
-        });
+        }
+
+        apiTasks.forEach((apiTask) => knownApiSessionIds.add(apiTask.id));
 
         const localOnlyTasks = taskList.value.filter((t) => !t.sessionId && !apiTasks.find((a) => a.id === t.id));
 
@@ -1359,7 +1379,11 @@
         const originTask = taskList.value.find((t) => t.id === originTaskId);
         if (originTask && !originTask.sessionId) {
           originTask.sessionId = result.session_id;
-          originTask.name = userInput.substring(0, 20) + (userInput.length > 20 ? '...' : '');
+          // 流式期间若列表已用后端标题归并过该任务,则保留后端标题;否则用首条消息命名
+          if (originTask.pendingSessionId !== result.session_id) {
+            originTask.name = userInput.substring(0, 20) + (userInput.length > 20 ? '...' : '');
+          }
+          originTask.pendingSessionId = undefined;
           if (originTask.id !== result.session_id) {
             taskList.value = taskList.value.filter((t) => t.id !== result.session_id);
             originTask.id = result.session_id;
@@ -1465,9 +1489,12 @@
       if (result.session_id) {
         const originTask = taskList.value.find((t) => t.id === originTaskId);
         if (originTask && !originTask.sessionId) {
-          const taskName = userInput || `文件:${file.name}`;
           originTask.sessionId = result.session_id;
-          originTask.name = taskName.substring(0, 20) + (taskName.length > 20 ? '...' : '');
+          if (originTask.pendingSessionId !== result.session_id) {
+            const taskName = userInput || `文件:${file.name}`;
+            originTask.name = taskName.substring(0, 20) + (taskName.length > 20 ? '...' : '');
+          }
+          originTask.pendingSessionId = undefined;
           if (originTask.id !== result.session_id) {
             taskList.value = taskList.value.filter((t) => t.id !== result.session_id);
             originTask.id = result.session_id;
@@ -1536,11 +1563,14 @@
           return index === taskList.value.findIndex((t) => !t.sessionId);
         });
 
-        // 默认选中第一条历史记录
+        // 优先回到关闭前所在的任务(如流式中的新任务),否则默认选中第一条历史记录
         const firstHistoryTask = taskList.value.find((t) => t.sessionId);
+        const prevTask = taskList.value.find((t) => t.id === currentTaskId.value);
 
         let targetTask: Task;
-        if (firstHistoryTask) {
+        if (prevTask) {
+          targetTask = prevTask;
+        } else if (firstHistoryTask) {
           targetTask = firstHistoryTask;
         } else {
           // 没有历史记录时才创建空白新任务

+ 2 - 0
src/views/ventAI/manageAssistent/components/chatModal/types.ts

@@ -69,6 +69,8 @@ export interface Task {
   updatedAt?: string;
   sortOrder?: number;
   isStreaming?: boolean;
+  // 流式期间从会话列表归并得到的后端会话 id(流结束前 sessionId 尚未返回)
+  pendingSessionId?: string;
 }
 
 export type SectionType = 'select' | 'params' | 'result';