Ver Fonte

[Mod 0000]修复AI助手定时任务立即执行时的逻辑,修复当前的一些bug

wangkeyi há 3 semanas atrás
pai
commit
b6b726e185

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

@@ -128,6 +128,7 @@
             @close="showScheduleDetail = false"
             @deleted="handleScheduleDeleted"
             @updated="fetchScheduleListForDetail"
+            @open-session="handleOpenScheduleSession"
           />
         </div>
       </template>
@@ -371,7 +372,7 @@
     }
   };
 
-  const handleOpenScheduleSession = async (sessionId: string) => {
+  const handleOpenScheduleSession = async (sessionId: string, prompt?: string) => {
     activePanel.value = 'chat';
     previewFile.value = null;
     showScheduleDetail.value = true;
@@ -392,6 +393,13 @@
       historyLoadedTasks.value.delete(sessionId);
       await switchTask(newTask.id);
     }
+
+    // 如果有 prompt,自动发送消息
+    if (prompt) {
+      inputMessage.value = prompt;
+      await nextTick();
+      await handleSendMessage();
+    }
   };
 
   const schedulePanelRef = ref();
@@ -519,6 +527,7 @@
     showFileList.value = false;
 
     if (newTask.sessionId && !historyLoadedTasks.value.has(taskId)) {
+      if (streaming.value) return;
       loading.value = true;
       try {
         const res = await getDetail(newTask.sessionId);
@@ -653,7 +662,6 @@
     approveTask.messages = [...taskMessages];
     if (currentTaskId.value === approveTask.id) {
       messages.value = approveTask.messages;
-      await scrollToBottom();
     }
 
     loading.value = true;
@@ -1369,7 +1377,6 @@
       generateStartTime: Date.now(),
     };
     messages.value.push(aiMsg);
-    await scrollToBottom();
 
     showTodoBar.value = false;
     currentTodos.value = [];
@@ -1475,7 +1482,6 @@
       generateStartTime: Date.now(),
     };
     messages.value.push(aiMsg);
-    await scrollToBottom();
 
     showTodoBar.value = false;
     currentTodos.value = [];

+ 60 - 38
src/views/ventAI/manageAssistent/components/chatModal/ScheduleDetailPanel.vue

@@ -15,11 +15,11 @@
           <span class="detail-task-name-text">{{ task.name }}</span>
           <div class="detail-task-actions">
             <a-switch :checked="task.enabled" size="small" class="schedule-switch" @change="handleToggle" />
-            <a-popover v-model:open="moreVisible" trigger="click" placement="bottomRight" overlayClassName="schedule-more-popover">
-              <div class="detail-more-btn"></div>
-              <template #content>
+            <div class="more-btn-wrapper" ref="morePopupRef">
+              <div class="detail-more-btn" @click="toggleMorePopup"></div>
+              <div v-if="showMorePopup" class="more-popup" @click.stop>
                 <div class="more-menu">
-                  <div class="more-menu-item" @click="handleAction('run')">
+                  <div class="more-menu-item" :class="{ disabled: !task.enabled }" @click="handleAction('run')">
                     <div class="more-menu-icon run-icon"></div>
                     <span>立即执行</span>
                   </div>
@@ -32,8 +32,8 @@
                     <span>删除</span>
                   </div>
                 </div>
-              </template>
-            </a-popover>
+              </div>
+            </div>
           </div>
         </div>
         <div class="detail-task-prompt">{{ task.prompt }}</div>
@@ -87,8 +87,9 @@
 
 <script setup lang="ts">
   import { ref, reactive, watch } from 'vue';
+  import { onClickOutside } from '@vueuse/core';
   import { message, Modal } from 'ant-design-vue';
-  import { getScheduleRuns, pauseSchedule, resumeSchedule, deleteSchedule, runScheduleNow } from '../../api';
+  import { getScheduleRuns, pauseSchedule, resumeSchedule, deleteSchedule } from '../../api';
   import CreateScheduleModal from './CreateScheduleModal.vue';
 
   interface ScheduleTask {
@@ -108,12 +109,21 @@
     (e: 'close'): void;
     (e: 'deleted'): void;
     (e: 'updated'): void;
+    (e: 'open-session', sessionId: string, prompt: string): void;
   }>();
 
-  const moreVisible = ref(false);
+  const morePopupRef = ref<HTMLElement>();
+  const showMorePopup = ref(false);
   const showEditModal = ref(false);
   const editData = ref<ScheduleTask | null>(null);
-  const runningIds = reactive(new Set<number>());
+
+  const toggleMorePopup = () => {
+    showMorePopup.value = !showMorePopup.value;
+  };
+
+  onClickOutside(morePopupRef, () => {
+    showMorePopup.value = false;
+  });
 
   watch(showEditModal, (val) => {
     if (!val) editData.value = null;
@@ -136,15 +146,11 @@
   };
 
   const handleRunNow = async () => {
-    if (!props.task) return;
-    runningIds.add(props.task.id);
-    try {
-      await runScheduleNow(props.task.id);
-      message.success(`任务「${props.task.name}」已开始执行`);
-    } catch {
-      message.error('执行失败');
-    } finally {
-      runningIds.delete(props.task.id);
+    if (!props.task || !props.task.enabled) return;
+    if (props.task.feedback_session_id) {
+      emit('open-session', props.task.feedback_session_id, props.task.prompt);
+    } else {
+      message.warning('该任务暂无关联会话');
     }
   };
 
@@ -177,7 +183,7 @@
   };
 
   const handleAction = (action: 'run' | 'edit' | 'delete') => {
-    moreVisible.value = false;
+    showMorePopup.value = false;
     if (action === 'run') handleRunNow();
     else if (action === 'edit') handleEdit();
     else if (action === 'delete') handleDelete();
@@ -385,8 +391,8 @@
 
   .detail-task-meta {
     display: flex;
-    align-items: center;
-    gap: 20px;
+    flex-direction: column;
+    gap: 6px;
     font-size: 13px;
   }
 
@@ -405,6 +411,18 @@
     font-size: 13px;
     color: #8b949e;
     line-height: 1.6;
+    max-height: 120px;
+    overflow-y: auto;
+    word-break: break-all;
+
+    &::-webkit-scrollbar {
+      width: 4px;
+    }
+
+    &::-webkit-scrollbar-thumb {
+      background: rgba(63, 80, 106, 0.4);
+      border-radius: 2px;
+    }
   }
 
   /* 执行历史 */
@@ -529,26 +547,24 @@
   }
 </style>
 
-<style lang="less">
-  .schedule-more-popover {
-    .zxm-popover-inner {
-      background: linear-gradient(135deg, #0a1628 0%, #0d2137 50%, #0a1e35 100%);
-      border: 1px solid rgba(63, 80, 106, 0.4);
-      border-radius: 8px;
-      padding: 4px;
-    }
+<style scoped lang="less">
+  .more-btn-wrapper {
+    position: relative;
+  }
 
-    .zxm-popover-arrow::before {
-      background: #0d2137;
-      border-color: rgba(63, 80, 106, 0.4);
-    }
-    .zxm-popover-inner-content {
-      padding: 0;
-    }
+  .more-popup {
+    position: absolute;
+    top: 100%;
+    right: 0;
+    margin-top: 4px;
+    background: linear-gradient(135deg, #0a1628 0%, #0d2137 50%, #0a1e35 100%);
+    border: 1px solid rgba(63, 80, 106, 0.4);
+    border-radius: 8px;
+    padding: 4px;
+    z-index: 100;
+    min-width: 120px;
   }
-</style>
 
-<style scoped lang="less">
   .more-menu {
     display: flex;
     flex-direction: column;
@@ -577,6 +593,12 @@
         }
       }
 
+      &.disabled {
+        opacity: 0.4;
+        cursor: not-allowed;
+        pointer-events: none;
+      }
+
       .more-menu-icon {
         width: 16px;
         height: 16px;

+ 16 - 17
src/views/ventAI/manageAssistent/components/chatModal/SchedulePanel.vue

@@ -36,7 +36,12 @@
           </div>
           <div class="schedule-item-actions">
             <a-switch :checked="item.enabled" size="small" class="schedule-switch" @change="handleToggle(item)" />
-            <div class="schedule-run-btn" @click.stop="handleRunNow(item)" :class="{ running: runningIds.has(item.id) }" title="立即执行"></div>
+            <div
+              class="schedule-run-btn"
+              @click.stop="handleRunNow(item)"
+              :class="{ disabled: !item.enabled }"
+              :title="item.enabled ? '立即执行' : '请先启用任务'"
+            ></div>
             <div class="schedule-item-edit" @click.stop="handleEdit(item)" title="编辑"></div>
             <div class="schedule-item-delete" @click.stop="handleDelete(item)" title="删除"></div>
           </div>
@@ -106,11 +111,11 @@
 <script setup lang="ts">
   import { ref, reactive, computed, onMounted } from 'vue';
   import { PlusOutlined } from '@ant-design/icons-vue';
-  import { getScheduleList, deleteSchedule, pauseSchedule, resumeSchedule, getScheduleRuns, runScheduleNow } from '../../api';
+  import { getScheduleList, deleteSchedule, pauseSchedule, resumeSchedule, getScheduleRuns } from '../../api';
   import { message, Modal } from 'ant-design-vue';
   import CreateScheduleModal from './CreateScheduleModal.vue';
 
-  const emit = defineEmits<{ (e: 'close'): void; (e: 'open-session', sessionId: string): void; (e: 'data-changed'): void }>();
+  const emit = defineEmits<{ (e: 'close'): void; (e: 'open-session', sessionId: string, prompt: string): void; (e: 'data-changed'): void }>();
 
   interface ScheduleItem {
     id: number;
@@ -139,7 +144,6 @@
   });
   const showCreateModal = ref(false);
   const editData = ref<ScheduleItem | null>(null);
-  const runningIds = ref(new Set<number>());
   const expandedIds = ref(new Set<number>());
   const historyMap = reactive<Record<number, any[]>>({});
   const historyLoadingMap = reactive<Record<number, boolean>>({});
@@ -207,17 +211,11 @@
   };
 
   const handleRunNow = async (item: ScheduleItem) => {
-    runningIds.value.add(item.id);
-    try {
-      await runScheduleNow(item.id);
-      message.success(`任务「${item.name}」已开始执行`);
-      if (item.feedback_session_id) {
-        emit('open-session', item.feedback_session_id);
-      }
-    } catch {
-      message.error('执行失败');
-    } finally {
-      runningIds.value.delete(item.id);
+    if (!item.enabled) return;
+    if (item.feedback_session_id) {
+      emit('open-session', item.feedback_session_id, item.prompt);
+    } else {
+      message.warning('该任务暂无关联会话');
     }
   };
 
@@ -601,8 +599,9 @@
       background-color: rgba(10, 132, 255, 0.15);
     }
 
-    &.running {
-      opacity: 0.5;
+    &.disabled {
+      opacity: 0.4;
+      cursor: not-allowed;
       pointer-events: none;
     }
   }