From 759cd431858d5613dee3f53792dceb62ce53a961 Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Tue, 10 Mar 2026 17:24:09 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=84=E7=90=86?=
=?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=8B=E8=BD=BD?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
frontend/src/i18n/locales/en/common.json | 3 +
frontend/src/i18n/locales/zh/common.json | 3 +
.../Detail/components/FileTable.tsx | 59 ++++++++++++-------
.../src/pages/DataCleansing/cleansing.api.ts | 10 ++++
.../interface/cleaning_task_routes.py | 53 +++++++++++++++++
5 files changed, 108 insertions(+), 20 deletions(-)
diff --git a/frontend/src/i18n/locales/en/common.json b/frontend/src/i18n/locales/en/common.json
index 2c56b472..7ffc5551 100644
--- a/frontend/src/i18n/locales/en/common.json
+++ b/frontend/src/i18n/locales/en/common.json
@@ -1331,6 +1331,7 @@
"pause": "Pause",
"compare": "Compare",
"download": "Download",
+ "batchDownload": "Batch Download",
"delete": "Delete",
"batchDownload": "Batch Download",
"edit": "Edit",
@@ -1439,8 +1440,10 @@
"searchFileName": "Search file name",
"searchFileType": "Search file type",
"selectFiles": "{{count}} files selected",
+ "selectedFilesCount": "Selected {{count}} files",
"notCompleted": "Not Completed",
"downloadNotAvailable": "Not Available Yet",
+ "downloadFilesFailed": "Failed to download files",
"compareDialogTitle": "File Comparison - {{fileName}}",
"beforeProcessing": "Before Processing",
"afterProcessing": "After Processing",
diff --git a/frontend/src/i18n/locales/zh/common.json b/frontend/src/i18n/locales/zh/common.json
index 1a020a04..4ab35c8f 100644
--- a/frontend/src/i18n/locales/zh/common.json
+++ b/frontend/src/i18n/locales/zh/common.json
@@ -1331,6 +1331,7 @@
"pause": "暂停",
"compare": "对比",
"download": "下载",
+ "batchDownload": "批量下载",
"delete": "删除",
"batchDownload": "批量下载",
"edit": "编辑",
@@ -1439,8 +1440,10 @@
"searchFileName": "搜索文件名",
"searchFileType": "搜索文件类型",
"selectFiles": "已选择 {{count}} 个文件",
+ "selectedFilesCount": "已选择 {{count}} 个文件",
"notCompleted": "未完成",
"downloadNotAvailable": "暂未开放",
+ "downloadFilesFailed": "下载文件失败",
"compareDialogTitle": "文件对比 - {{fileName}}",
"beforeProcessing": "处理前",
"afterProcessing": "处理后",
diff --git a/frontend/src/pages/DataCleansing/Detail/components/FileTable.tsx b/frontend/src/pages/DataCleansing/Detail/components/FileTable.tsx
index 0b025645..cb48c094 100644
--- a/frontend/src/pages/DataCleansing/Detail/components/FileTable.tsx
+++ b/frontend/src/pages/DataCleansing/Detail/components/FileTable.tsx
@@ -37,8 +37,25 @@ export default function FileTable({result, fetchTaskResult}) {
setSelectedFile(file);
setShowFileCompareDialog(true);
};
- const handleBatchDownload = () => {
- // 实际下载逻辑
+ const handleDownload = async () => {
+ try {
+ const response = await fetch(`/api/cleaning/tasks/${id}/result/download`);
+ if (!response.ok) {
+ throw new Error('Download failed');
+ }
+ const blob = await response.blob();
+ const url = window.URL.createObjectURL(blob);
+ const a = document.createElement('a');
+ a.href = url;
+ a.download = `task_${id}_files.zip`;
+ document.body.appendChild(a);
+ a.click();
+ window.URL.revokeObjectURL(url);
+ document.body.removeChild(a);
+ } catch (error) {
+ console.error('Download failed:', error);
+ message.error(t("dataCleansing.detail.fileTable.downloadFilesFailed"));
+ }
};
function formatFileSize(bytes: number, decimals: number = 2): string {
@@ -332,7 +349,7 @@ export default function FileTable({result, fetchTaskResult}) {
{
title: t("dataCleansing.detail.fileTable.actions"),
key: "action",
- width: 200,
+ width: 150,
render: (_text: string, record: any) => (
{record.status === "COMPLETED" ? (
@@ -352,9 +369,13 @@ export default function FileTable({result, fetchTaskResult}) {
{t("dataCleansing.actions.compare")}
)}
-
-
-
+
),
},
@@ -363,20 +384,18 @@ export default function FileTable({result, fetchTaskResult}) {
return (
<>
{selectedFileIds.length > 0 && (
-
-
-
- {t("dataCleansing.detail.fileTable.downloadNotAvailable", {count: selectedFileIds.length})}
-
- }
- >
- {t("dataCleansing.actions.batchDownload")}
-
-
+
+
+ {t("dataCleansing.detail.fileTable.selectedFilesCount", { count: selectedFileIds.length })}
+
+ }
+ >
+ {t("dataCleansing.actions.download")}
+
)}
Date: Wed, 11 Mar 2026 14:10:51 +0800
Subject: [PATCH 2/2] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=BB=BB=E5=8A=A1?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AD=9B=E9=80=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../charts/frontend/templates/_helpers.tpl | 1 +
frontend/src/i18n/locales/en/common.json | 50 ++++++-------
frontend/src/i18n/locales/zh/common.json | 53 ++++++-------
.../Create/components/CreateTaskStepOne.tsx | 74 ++++++++++++-------
.../components/OperatorOrchestration.tsx | 14 +++-
5 files changed, 102 insertions(+), 90 deletions(-)
diff --git a/deployment/helm/datamate/charts/frontend/templates/_helpers.tpl b/deployment/helm/datamate/charts/frontend/templates/_helpers.tpl
index 8bc9b2e5..49fde1fe 100644
--- a/deployment/helm/datamate/charts/frontend/templates/_helpers.tpl
+++ b/deployment/helm/datamate/charts/frontend/templates/_helpers.tpl
@@ -48,6 +48,7 @@ Selector labels
{{- define "frontend.selectorLabels" -}}
app.kubernetes.io/name: {{ include "frontend.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
+app: {{ include "frontend.name" . }}
{{- end }}
{{/*
diff --git a/frontend/src/i18n/locales/en/common.json b/frontend/src/i18n/locales/en/common.json
index 7ffc5551..0450a337 100644
--- a/frontend/src/i18n/locales/en/common.json
+++ b/frontend/src/i18n/locales/en/common.json
@@ -1346,6 +1346,10 @@
"operatorOrchestration": "Operator Orchestration"
},
"task": {
+ "sections": {
+ "taskInfo": "Task Information",
+ "dataSourceSelection": "Data Source Selection"
+ },
"columns": {
"taskName": "Task Name",
"taskId": "Task ID",
@@ -1362,35 +1366,23 @@
"dataSizeChange": "Data Size Change",
"actions": "Actions"
},
- "form": {
- "name": "Name",
- "namePlaceholder": "Enter task name",
- "description": "Description",
- "descriptionPlaceholder": "Describe the task goals and requirements",
- "srcDataset": "Source Dataset",
- "srcDatasetPlaceholder": "Please select source dataset",
- "destDatasetName": "Target Dataset Name",
- "destDatasetNamePlaceholder": "Enter or select target dataset name",
- "destDatasetType": "Target Dataset Type",
- "destDatasetTypeRequired": "Please select target dataset type",
- "useSourceDataset": "Use Source Dataset",
- "useSourceDatasetHint": "When checked, target dataset will use source dataset and cannot be modified",
- "destDatasetNameRequired": "Please enter target dataset name",
- "cannotUseSourceDataset": "Cannot use source dataset as target. Check 'Use Source Dataset' or enter a different name"
- },
- "sections": {
- "taskInfo": "Task Info",
- "dataSourceSelection": "Data Source Selection"
- },
- "messages": {
- "taskCreated": "Task created successfully",
- "taskStarted": "Task started successfully",
- "taskPaused": "Task paused successfully",
- "taskDeleted": "Task deleted successfully",
- "taskDetailFailed": "Failed to fetch task details",
- "fetchTaskResultFailed": "Failed to fetch task results",
- "fetchTaskLogFailed": "Failed to fetch task logs"
- }
+ "form": {
+ "name": "Name",
+ "namePlaceholder": "Enter task name",
+ "description": "Description",
+ "descriptionPlaceholder": "Describe the purpose",
+ "srcDataset": "Source Dataset",
+ "srcDatasetPlaceholder": "Select source dataset",
+ "destDatasetType": "Target Dataset Type",
+ "useSourceDataset": "Use Source Dataset",
+ "useSourceDatasetHint": "Output will be replaced in source dataset",
+ "cannotUseSourceDataset": "Cannot use source dataset as destination",
+ "destDatasetNameRequired": "Destination dataset name is required",
+ "destDatasetTypeRequired": "Target dataset type is required",
+ "allTypes": "All",
+ "showingDatasets": "Showing {{count}} datasets",
+ "noDatasetsFound": "No datasets found"
+ }
},
"template": {
"columns": {
diff --git a/frontend/src/i18n/locales/zh/common.json b/frontend/src/i18n/locales/zh/common.json
index 4ab35c8f..575abac3 100644
--- a/frontend/src/i18n/locales/zh/common.json
+++ b/frontend/src/i18n/locales/zh/common.json
@@ -1333,7 +1333,6 @@
"download": "下载",
"batchDownload": "批量下载",
"delete": "删除",
- "batchDownload": "批量下载",
"edit": "编辑",
"selectAll": "全选",
"search": "搜索",
@@ -1346,6 +1345,10 @@
"operatorOrchestration": "算子编排"
},
"task": {
+ "sections": {
+ "taskInfo": "任务信息",
+ "dataSourceSelection": "数据源选择"
+ },
"columns": {
"taskName": "任务名称",
"taskId": "任务ID",
@@ -1362,35 +1365,25 @@
"dataSizeChange": "数据量变化",
"actions": "操作"
},
- "form": {
- "name": "名称",
- "namePlaceholder": "输入任务名称",
- "description": "描述",
- "descriptionPlaceholder": "描述任务的目标和要求",
- "srcDataset": "源数据集",
- "srcDatasetPlaceholder": "请选择源数据集",
- "destDatasetName": "目标数据集名称",
- "destDatasetNamePlaceholder": "输入或选择目标数据集名称",
- "destDatasetType": "目标数据集类型",
- "destDatasetTypeRequired": "请选择目标数据集类型",
- "useSourceDataset": "选择源数据集",
- "useSourceDatasetHint": "勾选后目标数据集将使用源数据集,不可修改",
- "destDatasetNameRequired": "请输入目标数据集名称",
- "cannotUseSourceDataset": "不能使用源数据集作为目标数据集,请勾选\"选择源数据集\"或输入其他名称"
- },
- "sections": {
- "taskInfo": "任务信息",
- "dataSourceSelection": "数据源选择"
- },
- "messages": {
- "taskCreated": "任务已创建",
- "taskStarted": "任务已启动",
- "taskPaused": "任务已暂停",
- "taskDeleted": "任务已删除",
- "taskDetailFailed": "获取任务详情失败",
- "fetchTaskResultFailed": "获取数据处理结果失败",
- "fetchTaskLogFailed": "获取数据处理日志失败"
- }
+ "form": {
+ "name": "名称",
+ "namePlaceholder": "输入任务名称",
+ "description": "描述",
+ "descriptionPlaceholder": "描述任务的目标和要求",
+ "srcDataset": "源数据集",
+ "srcDatasetPlaceholder": "请选择源数据集",
+ "destDatasetName": "目标数据集名称",
+ "destDatasetNamePlaceholder": "输入或选择目标数据集名称",
+ "destDatasetType": "目标数据集类型",
+ "destDatasetTypeRequired": "请选择目标数据集类型",
+ "useSourceDataset": "选择源数据集",
+ "useSourceDatasetHint": "勾选后目标数据集将使用源数据集,不可修改",
+ "destDatasetNameRequired": "请输入目标数据集名称",
+ "cannotUseSourceDataset": "不能使用源数据集作为目标数据集,请勾选\"选择源数据集\"或输入其他名称",
+ "allTypes": "全部",
+ "showingDatasets": "显示 {{count}} 个数据集",
+ "noDatasetsFound": "未找到匹配的数据集"
+ }
},
"template": {
"columns": {
diff --git a/frontend/src/pages/DataCleansing/Create/components/CreateTaskStepOne.tsx b/frontend/src/pages/DataCleansing/Create/components/CreateTaskStepOne.tsx
index 19a7e96f..5ba6700d 100644
--- a/frontend/src/pages/DataCleansing/Create/components/CreateTaskStepOne.tsx
+++ b/frontend/src/pages/DataCleansing/Create/components/CreateTaskStepOne.tsx
@@ -52,7 +52,6 @@ export default function CreateTaskStepOne({
let dataset = null;
if (key === "srcDatasetId") {
dataset = datasets.find((d) => d.id === value);
- // 如果勾选了"选择源数据集",自动更新目标数据集名称
const newDestName = useSourceDataset ? (dataset?.name || "") : allValues.destDatasetName;
form.setFieldValue("destDatasetName", newDestName);
setTaskConfig({
@@ -94,7 +93,6 @@ export default function CreateTaskStepOne({
}
};
- // 过滤掉当前选中的源数据集(当不勾选"选择源数据集"时)
const getFilteredDatasetOptions = () => {
const srcDatasetId = form.getFieldValue("srcDatasetId");
if (useSourceDataset || !srcDatasetId) {
@@ -120,25 +118,47 @@ export default function CreateTaskStepOne({
{t("dataCleansing.task.sections.dataSourceSelection")}
+