Browse Source

[Mod 0000]修复AI助手在多次审批下不能点击的问题

wangkeyi 1 week ago
parent
commit
e88a8c0d3d
1 changed files with 31 additions and 13 deletions
  1. 31 13
      src/views/ventAI/manageAssistent/components/AiAssistantModal.vue

+ 31 - 13
src/views/ventAI/manageAssistent/components/AiAssistantModal.vue

@@ -672,19 +672,27 @@
 
   const handleAskUserSubmit = async (answers: string[]) => {
     const found = await findPendingApprovalTask();
-    if (!found) return;
 
-    const { approval } = found;
-    const sessionId = approval.sessionId;
-    if (!sessionId) return;
+    // 优先从 taskPendingApprovals 获取,若被清除则从消息的 pendingApprovalData 回退
+    let sessionId = found?.approval.sessionId;
+    let threadId = found?.approval.threadId;
+    let taskId = found?.taskId;
 
-    const task = taskList.value.find((t) => t.sessionId === sessionId);
+    // 查找当前任务中处于审批状态的消息
+    const task = taskId ? taskList.value.find((t) => t.id === taskId) : taskList.value.find((t) => t.id === currentTaskId.value);
     if (!task) return;
 
     const taskMessages = task.messages;
     const lastMsg = taskMessages[taskMessages.length - 1];
     if (!lastMsg || !lastMsg.isPendingApproval) return;
 
+    // 若 taskPendingApprovals 已被清除,从消息的 pendingApprovalData 回退取值
+    if (!sessionId && lastMsg.pendingApprovalData) {
+      sessionId = lastMsg.pendingApprovalData.sessionId;
+      threadId = lastMsg.pendingApprovalData.threadId;
+    }
+    if (!sessionId) return;
+
     lastMsg.isPendingApproval = false;
     lastMsg.pendingApprovalData = undefined;
     lastMsg.isLoading = true;
@@ -707,7 +715,7 @@
       const result = await chatResumeStream(
         {
           session_id: sessionId,
-          thread_id: approval.threadId || undefined,
+          thread_id: threadId || undefined,
           status: 'answered',
           answers,
           signal: controller.signal,
@@ -740,7 +748,10 @@
     } finally {
       setTaskAbortController(task.id, null);
       task.isStreaming = false;
-      clearTaskPendingApproval(task.id);
+      // 仅当消息不再处于审批状态时才清除(避免 resume 流返回新 interrupt 被误清)
+      if (!lastMsg.isPendingApproval) {
+        clearTaskPendingApproval(task.id);
+      }
       if (currentTaskId.value === task.id) {
         await scrollToBottom();
       }
@@ -749,19 +760,26 @@
 
   const handleAskUserCancel = async () => {
     const found = await findPendingApprovalTask();
-    if (!found) return;
 
-    const { approval } = found;
-    const sessionId = approval.sessionId;
-    if (!sessionId) return;
+    // 优先从 taskPendingApprovals 获取,若被清除则从消息的 pendingApprovalData 回退
+    let sessionId = found?.approval.sessionId;
+    let threadId = found?.approval.threadId;
 
-    const task = taskList.value.find((t) => t.sessionId === sessionId);
+    // 查找当前任务中处于审批状态的消息
+    const task = found?.taskId ? taskList.value.find((t) => t.id === found.taskId) : taskList.value.find((t) => t.id === currentTaskId.value);
     if (!task) return;
 
     const taskMessages = task.messages;
     const lastMsg = taskMessages[taskMessages.length - 1];
     if (!lastMsg || !lastMsg.isPendingApproval) return;
 
+    // 若 taskPendingApprovals 已被清除,从消息的 pendingApprovalData 回退取值
+    if (!sessionId && lastMsg.pendingApprovalData) {
+      sessionId = lastMsg.pendingApprovalData.sessionId;
+      threadId = lastMsg.pendingApprovalData.threadId;
+    }
+    if (!sessionId) return;
+
     // 冻结累计耗时到 durationMs,避免取消后计时消失
     lastMsg.durationMs = (lastMsg.baseDurationMs || 0) + (lastMsg.generateStartTime ? Date.now() - lastMsg.generateStartTime : 0);
     lastMsg.isPendingApproval = false;
@@ -776,7 +794,7 @@
       await chatResumeStream(
         {
           session_id: sessionId,
-          thread_id: approval.threadId || undefined,
+          thread_id: threadId || undefined,
           status: 'cancelled',
         },
         () => {}