import type { TableColumnType } from 'antdv-next'; import type { QqbotPluginTaskApi } from '#/api/qqbot/plugin-task'; import type { KtTableApi, KtTableRowAction } from '#/components/ktTable'; import { defineComponent, ref } from 'vue'; import { Page } from '@vben/common-ui'; import { message, Tag } from 'antdv-next'; import { disableQqbotPluginTask, enableQqbotPluginTask, getQqbotPluginTaskPage, runQqbotPluginTaskOnce, } from '#/api/qqbot/plugin-task'; import { KtTable, useKtTable } from '#/components/ktTable'; import TaskCronModal from './components/TaskCronModal'; import TaskRunDrawer from './components/TaskRunDrawer'; const AKtTable = KtTable as any; const runtimeStatusColor: Record = { disabled: 'default', failed: 'error', idle: 'default', running: 'processing', scheduled: 'success', }; const runStatusColor: Record = { failed: 'error', running: 'processing', skipped: 'default', success: 'success', }; export default defineComponent({ name: 'QqBotPluginTaskList', setup() { const cronModalOpen = ref(false); const cronTask = ref(); const runDrawerOpen = ref(false); const runTask = ref(); const columns: Array> = [ { dataIndex: 'pluginName', key: 'pluginName', title: '插件', width: 160 }, { dataIndex: 'taskKey', key: 'taskKey', title: '任务 Key', width: 260 }, { dataIndex: 'taskName', key: 'taskName', title: '任务名称', width: 180 }, { dataIndex: 'cronExpression', key: 'cronExpression', title: 'Cron', width: 150, }, { dataIndex: 'enabled', key: 'enabled', title: '启用', width: 90 }, { dataIndex: 'runtimeStatus', key: 'runtimeStatus', title: '运行状态', width: 120, }, { dataIndex: 'lastStatus', key: 'lastStatus', title: '最近结果', width: 120, }, { dataIndex: 'nextRunAt', key: 'nextRunAt', title: '下次运行', width: 180, }, ]; const api: KtTableApi = { list: async (params) => await getQqbotPluginTaskPage(params), }; const rowActions: Array> = [ { key: 'run', label: '运行一次', onClick: async (row, context) => { await runQqbotPluginTaskOnce(row.id, {}); message.success('任务已提交'); await context.reload(); }, permissionCodes: ['QqBot:PluginTask:Run'], }, { key: 'cron', label: '修改 Cron', onClick: (row) => { cronTask.value = row; cronModalOpen.value = true; }, permissionCodes: ['QqBot:PluginTask:UpdateCron'], }, { key: 'runs', label: '运行记录', onClick: (row) => { runTask.value = row; runDrawerOpen.value = true; }, permissionCodes: ['QqBot:PluginTask:RunLog'], }, { key: 'toggle', label: '启停', onClick: async (row, context) => { if (row.enabled) { await disableQqbotPluginTask(row.id); message.success('任务已停用'); } else { await enableQqbotPluginTask(row.id); message.success('任务已启用'); } await context.reload(); }, permissionCodes: [ 'QqBot:PluginTask:Enable', 'QqBot:PluginTask:Disable', ], }, ]; const [registerTable, tableApi] = useKtTable({ api, columns, formOptions: { schema: [ { component: 'Input', componentProps: { allowClear: true, placeholder: '插件 Key', }, fieldName: 'pluginKey', label: '插件', }, { component: 'Input', componentProps: { allowClear: true, placeholder: '任务 Key', }, fieldName: 'taskKey', label: '任务', }, { component: 'Select', componentProps: { allowClear: true, options: [ { label: '已调度', value: 'scheduled' }, { label: '运行中', value: 'running' }, { label: '失败', value: 'failed' }, { label: '停用', value: 'disabled' }, { label: '空闲', value: 'idle' }, ], }, fieldName: 'status', label: '状态', }, { component: 'Select', componentProps: { allowClear: true, options: [ { label: '启用', value: true }, { label: '停用', value: false }, ], }, fieldName: 'enabled', label: '启用', }, ], }, rowActions, tableTitle: '插件定时任务', }); function closeCronModal() { cronModalOpen.value = false; cronTask.value = undefined; } async function handleCronSaved() { closeCronModal(); await tableApi.reload(); } return () => ( { const row = record as QqbotPluginTaskApi.Task; if (column.key === 'pluginName') { return row.pluginName || row.pluginKey || row.pluginId || '-'; } if (column.key === 'enabled') { return ( {row.enabled ? '启用' : '停用'} ); } if (column.key === 'runtimeStatus') { return ( {row.runtimeStatus} ); } if (column.key === 'lastStatus') { return row.lastStatus ? ( {row.lastStatus} ) : ( '-' ); } return undefined; }, }} /> void handleCronSaved()} open={cronModalOpen.value} task={cronTask.value} /> { runDrawerOpen.value = false; }} open={runDrawerOpen.value} task={runTask.value} /> ); }, });