From 333a93571452073a9e628c6256044d345099aa50 Mon Sep 17 00:00:00 2001
From: zhou zhou <3272660260@qq.com>
Date: 星期四, 02 四月 2026 08:19:55 +0800
Subject: [PATCH] #

---
 rsf-design/src/views/manager/task/index.vue |  156 +++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 131 insertions(+), 25 deletions(-)

diff --git a/rsf-design/src/views/manager/task/index.vue b/rsf-design/src/views/manager/task/index.vue
index 138697d..08fc6cf 100644
--- a/rsf-design/src/views/manager/task/index.vue
+++ b/rsf-design/src/views/manager/task/index.vue
@@ -9,7 +9,30 @@
     />
 
     <ElCard class="art-table-card">
-      <ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="loadPageData" />
+      <ArtTableHeader v-model:columns="columnChecks" :loading="loading" @refresh="loadPageData">
+        <template #left>
+          <ElSpace wrap>
+            <ElButton
+              v-if="!autoRunEnabled"
+              type="primary"
+              plain
+              :loading="autoRunLoading"
+              @click="handleToggleAutoRun(true)"
+            >
+              鑷姩涓嬪彂浠诲姟
+            </ElButton>
+            <ElButton
+              v-else
+              type="warning"
+              plain
+              :loading="autoRunLoading"
+              @click="handleToggleAutoRun(false)"
+            >
+              鏆傚仠鑷姩涓嬪彂
+            </ElButton>
+          </ElSpace>
+        </template>
+      </ArtTableHeader>
 
       <ArtTable
         :loading="loading"
@@ -21,6 +44,11 @@
       />
     </ElCard>
 
+    <TaskFlowStepDialog
+      v-model:visible="flowStepDialogVisible"
+      :task-row="activeTaskRow"
+    />
+
     <TaskDetailDrawer
       v-model:visible="detailDrawerVisible"
       :loading="detailLoading"
@@ -31,13 +59,14 @@
       @refresh="loadDetailResources"
       @size-change="handleDetailSizeChange"
       @current-change="handleDetailCurrentChange"
+      @flow-step="handleOpenFlowStepFromDetail"
     />
   </div>
 </template>
 
 <script setup>
   import { ElMessage } from 'element-plus'
-  import { computed, onMounted, reactive, ref } from 'vue'
+  import { computed, h, onMounted, onUnmounted, reactive, ref } from 'vue'
   import { useTableColumns } from '@/hooks/core/useTableColumns'
   import { guardRequestWithMessage } from '@/utils/sys/requestGuard'
   import {
@@ -45,12 +74,15 @@
     fetchCompleteTask,
     fetchPickTask,
     fetchRemoveTask,
-    fetchTaskDetail,
+    fetchTaskAutoRunFlag,
     fetchTaskItemPage,
     fetchTaskPage,
-    fetchTopTask
+    fetchTopTask,
+    fetchUpdateTaskAutoRunFlag
   } from '@/api/task'
   import TaskDetailDrawer from './modules/task-detail-drawer.vue'
+  import TaskExpandPanel from './modules/task-expand-panel.vue'
+  import TaskFlowStepDialog from './modules/task-flow-step-dialog.vue'
   import { createTaskTableColumns } from './taskTable.columns'
   import {
     buildTaskPageQueryParams,
@@ -70,6 +102,10 @@
   const detailData = ref({})
   const detailTableData = ref([])
   const activeTaskRow = ref(null)
+  const flowStepDialogVisible = ref(false)
+  const autoRunEnabled = ref(false)
+  const autoRunLoading = ref(false)
+  let refreshTimer = null
 
   const pagination = reactive({
     current: 1,
@@ -192,15 +228,29 @@
 
   async function openDetailDrawer(row) {
     activeTaskRow.value = row
+    detailData.value = normalizeTaskRow(row)
     detailPagination.current = 1
     detailDrawerVisible.value = true
     await loadDetailResources()
+  }
+
+  function handleOpenFlowStepFromDetail() {
+    if (!activeTaskRow.value) {
+      return
+    }
+    flowStepDialogVisible.value = true
   }
 
   async function handleActionClick(action, row) {
     try {
       if (action.key === 'view') {
         await openDetailDrawer(row)
+        return
+      }
+
+      if (action.key === 'flowStep') {
+        activeTaskRow.value = row
+        flowStepDialogVisible.value = true
         return
       }
 
@@ -237,7 +287,17 @@
     }
   }
 
-  const { columns, columnChecks } = useTableColumns(() => createTaskTableColumns(handleActionClick))
+  const { columns, columnChecks } = useTableColumns(() =>
+    createTaskTableColumns({
+      handleActionClick,
+      createExpandContent: (row) => ({
+        name: 'TaskExpandPanelHost',
+        render() {
+          return h(TaskExpandPanel, { row })
+        }
+      })
+    })
+  )
 
   function updatePaginationState(target, response, fallbackCurrent, fallbackSize) {
     target.total = Number(response?.total || 0)
@@ -273,6 +333,33 @@
     }
   }
 
+  async function loadAutoRunConfig() {
+    autoRunLoading.value = true
+    try {
+      const response = await guardRequestWithMessage(fetchTaskAutoRunFlag(), { val: false }, {
+        timeoutMessage: '鑷姩涓嬪彂閰嶇疆鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+      })
+      const rawValue = response?.val
+      autoRunEnabled.value =
+        rawValue === true || rawValue === 'true' || rawValue === 1 || rawValue === '1'
+    } finally {
+      autoRunLoading.value = false
+    }
+  }
+
+  async function handleToggleAutoRun(enabled) {
+    autoRunLoading.value = true
+    try {
+      await fetchUpdateTaskAutoRunFlag(enabled)
+      autoRunEnabled.value = enabled
+      ElMessage.success(enabled ? '宸插紑鍚嚜鍔ㄤ笅鍙戜换鍔�' : '宸叉殏鍋滆嚜鍔ㄤ笅鍙戜换鍔�')
+    } catch (error) {
+      ElMessage.error(error?.message || '鑷姩涓嬪彂閰嶇疆鏇存柊澶辫触')
+    } finally {
+      autoRunLoading.value = false
+    }
+  }
+
   async function loadDetailResources() {
     if (!activeTaskRow.value?.id) {
       return
@@ -280,31 +367,29 @@
 
     detailLoading.value = true
     try {
-      const [detailResponse, taskItemResponse] = await Promise.all([
-        guardRequestWithMessage(fetchTaskDetail(activeTaskRow.value.id), {}, {
-          timeoutMessage: '浠诲姟璇︽儏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟'
+      const taskItemResponse = await guardRequestWithMessage(
+        fetchTaskItemPage({
+          taskId: activeTaskRow.value.id,
+          current: detailPagination.current,
+          pageSize: detailPagination.size
         }),
-        guardRequestWithMessage(
-          fetchTaskItemPage({
-            taskId: activeTaskRow.value.id,
-            current: detailPagination.current,
-            pageSize: detailPagination.size
-          }),
-          {
-            records: [],
-            total: 0,
-            current: detailPagination.current,
-            size: detailPagination.size
-          },
-          { timeoutMessage: '浠诲姟鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
-        )
-      ])
+        {
+          records: [],
+          total: 0,
+          current: detailPagination.current,
+          size: detailPagination.size
+        },
+        { timeoutMessage: '浠诲姟鏄庣粏鍔犺浇瓒呮椂锛屽凡鍋滄绛夊緟' }
+      )
 
-      detailData.value = normalizeTaskRow(detailResponse)
+      detailData.value = normalizeTaskRow(activeTaskRow.value)
       detailTableData.value = Array.isArray(taskItemResponse?.records)
         ? taskItemResponse.records.map((record) => normalizeTaskItemRow(record))
         : []
       updatePaginationState(detailPagination, taskItemResponse, detailPagination.current, detailPagination.size)
+    } catch (error) {
+      detailTableData.value = []
+      ElMessage.error(error?.message || '浠诲姟鏄庣粏鍔犺浇澶辫触')
     } finally {
       detailLoading.value = false
     }
@@ -348,5 +433,26 @@
     loadDetailResources()
   }
 
-  onMounted(loadPageData)
+  function startAutoRefresh() {
+    clearAutoRefresh()
+    refreshTimer = window.setInterval(() => {
+      void loadPageData()
+    }, 5000)
+  }
+
+  function clearAutoRefresh() {
+    if (refreshTimer) {
+      window.clearInterval(refreshTimer)
+      refreshTimer = null
+    }
+  }
+
+  onMounted(async () => {
+    await Promise.all([loadPageData(), loadAutoRunConfig()])
+    startAutoRefresh()
+  })
+
+  onUnmounted(() => {
+    clearAutoRefresh()
+  })
 </script>

--
Gitblit v1.9.1