From 88a82ed77141c91108724d834423673b3d122dbc Mon Sep 17 00:00:00 2001 From: caoxiaozhu Date: Mon, 27 Jul 2026 09:50:26 +0800 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20=E5=AE=8C=E5=96=84=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E4=BB=BB=E5=8A=A1=E6=95=B0=E9=87=8F=E4=B8=8E=E7=8A=B6?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/regression-data-process-list.mjs | 20 +++++++++ .../data-process/DataProcessListView.vue | 43 ++++++++++++++----- 2 files changed, 53 insertions(+), 10 deletions(-) diff --git a/frontend/scripts/regression-data-process-list.mjs b/frontend/scripts/regression-data-process-list.mjs index 9020234..580d31a 100644 --- a/frontend/scripts/regression-data-process-list.mjs +++ b/frontend/scripts/regression-data-process-list.mjs @@ -26,6 +26,26 @@ assert.ok(source.includes('ElMessageBox.confirm('), '删除任务前缺少二次 assert.ok(source.includes('await deleteDataProcessTask(row.id)'), '删除操作没有调用真实 API') assert.ok(!source.includes('TODO: 接入真实接口'), '列表仍包含本地 Mock 任务') assert.ok(source.includes('const dataList = ref([])'), '任务列表必须以空数组初始化并等待真实 API 数据') +assert.match(source, /label="文档数量"[\s\S]*?documentCountLabel\(row as DataProcessTask\)/, '任务列表没有展示真实文档数量') +assert.match(source, /function documentCountLabel\(task: DataProcessTask\)[\s\S]*?`\$\{safeCount\(task\.source_file_count\)\} 个`/, '文档数量没有使用 source_file_count 或缺少单位') +assert.match(source, /label="生成个数"[\s\S]*?generatedCountLabel\(row as DataProcessTask\)/, '任务列表没有展示真实生成数量') +assert.match(source, /function generatedCountLabel\(task: DataProcessTask\)[\s\S]*?`\$\{safeCount\(task\.output_count\)\} 条`/, '生成数量没有使用 output_count 或缺少单位') +assert.doesNotMatch(source, /label="源数据集"|label="输出数据集"/, '任务列表仍使用旧的数据集列标题') +for (const label of ['待生成', '生成中', '已生成', '已发布', '生成失败', '已停止']) { + assert.ok(source.includes(`label: '${label}'`), `任务状态缺少“${label}”`) +} +assert.match(source, /task\.status === 'completed'[\s\S]*?task\.output_dataset_id[\s\S]*?已发布[\s\S]*?已生成/, '完成任务没有按当前轮输出指针区分已生成与已发布') +assert.doesNotMatch(source, /task\.output_datasets\?\.length[\s\S]*?已发布/, '上一轮保留的数据集不应将当前轮标记为已发布') +for (const [label, type] of [ + ['待生成', 'info'], + ['生成中', 'primary'], + ['已生成', 'warning'], + ['已发布', 'success'], + ['生成失败', 'danger'], + ['已停止', 'info'], +]) { + assert.ok(source.includes(`label: '${label}', type: '${type}'`), `任务状态“${label}”颜色应为 ${type}`) +} assert.match(apiSource, /export (?:async )?function getDataProcessTasks/, 'API 模块缺少任务列表方法') assert.match(apiSource, /export const deleteDataProcessTask/, 'API 模块缺少任务删除方法') diff --git a/frontend/src/views/data-process/DataProcessListView.vue b/frontend/src/views/data-process/DataProcessListView.vue index 8778623..265c5d1 100644 --- a/frontend/src/views/data-process/DataProcessListView.vue +++ b/frontend/src/views/data-process/DataProcessListView.vue @@ -3,10 +3,11 @@ import { onMounted, ref } from 'vue' import { useRouter } from 'vue-router' import { ElMessage, ElMessageBox } from 'element-plus' import DataTablePage from '@/components/DataTablePage.vue' -import ModelStatusTag from '@/components/ModelStatusTag.vue' import { deleteDataProcessTask, getDataProcessTasks } from '@/api/modules/dataProcess' import type { DataProcessTask, DataProcessType } from '@/types/dataProcess' +type TaskStatusTagType = 'success' | 'warning' | 'info' | 'danger' | 'primary' + const processTypeMap: Record = { structured: '结构化数据', unstructured: '非结构化数据', @@ -73,12 +74,30 @@ function formatDateTime(value?: string) { return Number.isNaN(date.getTime()) ? value : date.toLocaleString('zh-CN', { hour12: false }) } -function sourceDatasetName(task: DataProcessTask) { - return task.source_dataset_name || task.source_dataset || '-' +function safeCount(value: unknown) { + const count = Number(value) + return Number.isFinite(count) ? Math.max(0, Math.trunc(count)) : 0 } -function outputDatasetName(task: DataProcessTask) { - return task.output_dataset_name || task.output_dataset || '-' +function documentCountLabel(task: DataProcessTask) { + return `${safeCount(task.source_file_count)} 个` +} + +function generatedCountLabel(task: DataProcessTask) { + return `${safeCount(task.output_count)} 条` +} + +/** 将当前轮生成状态与发布指针合并为用户可理解的列表状态。 */ +function taskDisplayStatus(task: DataProcessTask): { label: string; type: TaskStatusTagType } { + if (task.status === 'running') return { label: '生成中', type: 'primary' } + if (task.status === 'completed') { + return task.output_dataset_id + ? { label: '已发布', type: 'success' } + : { label: '已生成', type: 'warning' } + } + if (task.status === 'failed') return { label: '生成失败', type: 'danger' } + if (task.status === 'stopped') return { label: '已停止', type: 'info' } + return { label: '待生成', type: 'info' } } onMounted(loadData) @@ -103,7 +122,11 @@ onMounted(loadData) @@ -114,11 +137,11 @@ onMounted(loadData) - - - + + - - + +