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