From 60e228901907d8bb27e75ce33a9698ea4695731e Mon Sep 17 00:00:00 2001 From: Vincent <84168298+szc0616@users.noreply.github.com> Date: Fri, 7 Nov 2025 19:01:45 +0800 Subject: [PATCH] =?UTF-8?q?fix=EF=BC=9A=E4=BF=AE=E5=A4=8D=E9=85=8D?= =?UTF-8?q?=E6=AF=94=E4=BB=BB=E5=8A=A1=E6=93=8D=E4=BD=9C=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20(#66)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix:配比任务需要能够跳转到目标数据集 * feature:增加配比任务详情接口 * fix:删除不存在的配比详情页面 * fix:使用正式的逻辑来展示标签 * fix:参数默认值去掉多余的- * fix:修复配比任务相关操作 --- .../domain/model/dataset/DatasetFile.java | 8 +- .../domain/model/dataset/FileTag.java | 48 ++++++++ .../converter/DatasetConverter.java | 9 +- .../infrastructure/event/RagEtlService.java | 4 +- .../RatioTask/Create/CreateRatioTask.tsx | 110 ------------------ .../src/pages/RatioTask/Home/RatioTask.tsx | 2 +- frontend/src/pages/RatioTask/ratio.api.ts | 5 +- .../app/module/dataset/schema/dataset_file.py | 25 +++- .../module/synthesis/service/ratio_task.py | 81 +++++-------- 9 files changed, 120 insertions(+), 172 deletions(-) create mode 100644 backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/FileTag.java diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/DatasetFile.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/DatasetFile.java index a082b90..608c422 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/DatasetFile.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/DatasetFile.java @@ -2,8 +2,10 @@ package com.datamate.datamanagement.domain.model.dataset; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.*; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import java.time.LocalDateTime; @@ -17,6 +19,7 @@ import java.util.List; @Getter @Setter @Builder +@Slf4j @NoArgsConstructor @AllArgsConstructor @TableName("t_dm_dataset_files") @@ -42,11 +45,12 @@ public class DatasetFile { * * @return 标签列表 */ - public List analyzeTag() { + public List analyzeTag() { try { ObjectMapper mapper = new ObjectMapper(); - return mapper.readValue(tags, List.class); + return mapper.readValue(tags, new TypeReference>() {}); } catch (Exception e) { + log.error(e.getMessage(), e); return Collections.emptyList(); } } diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/FileTag.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/FileTag.java new file mode 100644 index 0000000..c8ebecd --- /dev/null +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/domain/model/dataset/FileTag.java @@ -0,0 +1,48 @@ +package com.datamate.datamanagement.domain.model.dataset; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +public class FileTag { + private Map value; + + private String type; + + private String id; + + private String fromName; + + public List getTags() { + List tags = new ArrayList<>(); + Object tagValues = value.get(type); + if (tagValues instanceof List) { + for (Object tag : (List) tagValues) { + if (tag instanceof String) { + tags.add((String) tag); + } + } + } else if (tagValues instanceof String) { + tags.add((String) tagValues); + } + if(StringUtils.isNotEmpty(fromName)) { + return tags.stream().map(tag -> fromName + " " + tag).toList(); + } + return tags; + } +} diff --git a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/converter/DatasetConverter.java b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/converter/DatasetConverter.java index 3728083..97749ba 100644 --- a/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/converter/DatasetConverter.java +++ b/backend/services/data-management-service/src/main/java/com/datamate/datamanagement/interfaces/converter/DatasetConverter.java @@ -2,6 +2,7 @@ package com.datamate.datamanagement.interfaces.converter; import com.datamate.common.infrastructure.exception.BusinessException; import com.datamate.common.infrastructure.exception.SystemErrorCode; +import com.datamate.datamanagement.domain.model.dataset.FileTag; import com.datamate.datamanagement.interfaces.dto.CreateDatasetRequest; import com.datamate.datamanagement.interfaces.dto.DatasetFileResponse; import com.datamate.datamanagement.interfaces.dto.DatasetResponse; @@ -71,12 +72,12 @@ public interface DatasetConverter { return distribution; } for (DatasetFile datasetFile : datasetFiles) { - List tags = datasetFile.analyzeTag(); + List tags = datasetFile.analyzeTag(); if (CollectionUtils.isEmpty(tags)) { - continue; + return distribution; } - for (String tag : tags) { - distribution.put(tag, distribution.getOrDefault(tag, 0L) + 1); + for (FileTag tag : tags) { + tag.getTags().forEach(tagName -> distribution.put(tagName, distribution.getOrDefault(tagName, 0L) + 1)); } } return distribution; diff --git a/backend/services/rag-indexer-service/src/main/java/com/datamate/rag/indexer/infrastructure/event/RagEtlService.java b/backend/services/rag-indexer-service/src/main/java/com/datamate/rag/indexer/infrastructure/event/RagEtlService.java index a89495f..ad883dd 100644 --- a/backend/services/rag-indexer-service/src/main/java/com/datamate/rag/indexer/infrastructure/event/RagEtlService.java +++ b/backend/services/rag-indexer-service/src/main/java/com/datamate/rag/indexer/infrastructure/event/RagEtlService.java @@ -51,9 +51,9 @@ import java.util.concurrent.Semaphore; public class RagEtlService { private static final Semaphore SEMAPHORE = new Semaphore(10); - @Value("${datamate.rag.milvus-host:-milvus-standalone}") + @Value("${datamate.rag.milvus-host:milvus-standalone}") private String milvusHost; - @Value("${datamate.rag.milvus-port:-19530}") + @Value("${datamate.rag.milvus-port:19530}") private int milvusPort; private final RagFileRepository ragFileRepository; diff --git a/frontend/src/pages/RatioTask/Create/CreateRatioTask.tsx b/frontend/src/pages/RatioTask/Create/CreateRatioTask.tsx index 7d0d0ef..2c94f0d 100644 --- a/frontend/src/pages/RatioTask/Create/CreateRatioTask.tsx +++ b/frontend/src/pages/RatioTask/Create/CreateRatioTask.tsx @@ -76,116 +76,6 @@ export default function CreateRatioTask() { setCreating(false); } }; - const totalConfigured = useMemo( - () => - ratioTaskForm?.ratioConfigs?.reduce?.( - (sum, c) => sum + (c.quantity || 0), - 0 - ) || 0, - [ratioTaskForm.ratioConfigs] - ); - - // dataset selection is handled inside SelectDataset via onSelectedDatasetsChange - - const updateRatioConfig = (source: string, quantity: number) => { - setRatioTaskForm((prev) => { - const existingIndex = prev.ratioConfigs.findIndex( - (config) => config.source === source - ); - const totalOtherQuantity = prev.ratioConfigs - .filter((config) => config.source !== source) - .reduce((sum, config) => sum + config.quantity, 0); - - const newConfig = { - id: source, - name: source, - type: prev.ratioType, - quantity: Math.min( - quantity, - prev.totalTargetCount - totalOtherQuantity - ), - percentage: Math.round((quantity / prev.totalTargetCount) * 100), - source, - }; - - if (existingIndex >= 0) { - const newConfigs = [...prev.ratioConfigs]; - newConfigs[existingIndex] = newConfig; - return { ...prev, ratioConfigs: newConfigs }; - } else { - return { ...prev, ratioConfigs: [...prev.ratioConfigs, newConfig] }; - } - }); - }; - - const generateAutoRatio = () => { - const selectedCount = ratioTaskForm.selectedDatasets.length; - if (selectedCount === 0) return; - - const baseQuantity = Math.floor( - ratioTaskForm.totalTargetCount / selectedCount - ); - const remainder = ratioTaskForm.totalTargetCount % selectedCount; - - const newConfigs = ratioTaskForm.selectedDatasets.map( - (datasetId, index) => { - const quantity = baseQuantity + (index < remainder ? 1 : 0); - return { - id: datasetId, - name: datasetId, - type: ratioTaskForm.ratioType, - quantity, - percentage: Math.round( - (quantity / ratioTaskForm.totalTargetCount) * 100 - ), - source: datasetId, - }; - } - ); - - setRatioTaskForm((prev) => ({ ...prev, ratioConfigs: newConfigs })); - }; - - // 标签模式下,更新某数据集的某个标签的数量 - const updateLabelRatioConfig = ( - datasetId: string, - label: string, - quantity: number - ) => { - const sourceKey = `${datasetId}_${label}`; - setRatioTaskForm((prev) => { - const existingIndex = prev.ratioConfigs.findIndex( - (c) => c.source === sourceKey - ); - const totalOtherQuantity = prev.ratioConfigs - .filter((c) => c.source !== sourceKey) - .reduce((sum, c) => sum + c.quantity, 0); - - const dist = distributions[datasetId] || {}; - const labelMax = dist[label] ?? Infinity; - const cappedQuantity = Math.max( - 0, - Math.min(quantity, prev.totalTargetCount - totalOtherQuantity, labelMax) - ); - - const newConfig = { - id: sourceKey, - name: label, - type: "label", - quantity: cappedQuantity, - percentage: Math.round((cappedQuantity / prev.totalTargetCount) * 100), - source: sourceKey, - }; - - if (existingIndex >= 0) { - const newConfigs = [...prev.ratioConfigs]; - newConfigs[existingIndex] = newConfig; - return { ...prev, ratioConfigs: newConfigs }; - } else { - return { ...prev, ratioConfigs: [...prev.ratioConfigs, newConfig] }; - } - }); - }; const handleValuesChange = (_, allValues) => { setRatioTaskForm({ ...ratioTaskForm, ...allValues }); diff --git a/frontend/src/pages/RatioTask/Home/RatioTask.tsx b/frontend/src/pages/RatioTask/Home/RatioTask.tsx index f0cea74..1e7868d 100644 --- a/frontend/src/pages/RatioTask/Home/RatioTask.tsx +++ b/frontend/src/pages/RatioTask/Home/RatioTask.tsx @@ -123,7 +123,7 @@ export default function RatioTasksPage() {