From 2867f39be2d8b262321a0c87a566a7d5d3e0d492 Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Sat, 25 Oct 2025 16:09:16 +0800
Subject: [PATCH 1/3] refactor: enhance CleaningTaskService and related
components with validation and repository updates
---
.../services/data-cleaning-service/pom.xml | 5 ++
.../DataCleaningServiceConfiguration.java | 6 +-
.../application/CleaningTaskService.java | 6 ++
.../application/CleaningTemplateService.java | 6 +-
.../common/exception/CleanErrorCode.java | 2 +-
.../domain/model/CreateDatasetRequest.java | 26 -------
.../domain/model/DatasetFileResponse.java | 36 ---------
.../domain/model/DatasetResponse.java | 44 -----------
.../domain/model/DatasetTypeResponse.java | 23 ------
.../model/PagedDatasetFileResponse.java | 28 -------
.../repository/CleaningTaskRepository.java | 2 +
.../OperatorInstanceRepository.java | 3 -
.../converter/OperatorInstanceConverter.java | 2 +-
.../Impl/CleaningTaskRepositoryImpl.java | 6 ++
.../Impl/OperatorInstanceRepositoryImpl.java | 6 --
.../mapper/OperatorInstanceMapper.java | 7 --
.../validator/CleanTaskValidator.java | 40 ++++++++++
.../interfaces/dto/CleaningTaskDto.java | 1 +
.../interfaces/dto/CleaningTemplateDto.java | 1 +
.../cleaning/interfaces/dto/OperatorDto.java | 41 ----------
.../interfaces/dto/OperatorInstanceDto.java | 9 +++
.../rest/CleaningTaskController.java | 26 +++----
.../rest/CleaningTemplateController.java | 26 +++----
.../operator/application/LabelService.java | 21 -----
.../operator/application/OperatorService.java | 61 ++++++++++++++-
.../domain/contants/OperatorConstant.java | 7 ++
.../operator/domain/model/Category.java | 2 +
.../domain/repository/OperatorRepository.java | 2 +-
.../converter/OperatorConverter.java | 6 ++
.../exception/OperatorErrorCode.java | 19 +++++
.../infrastructure/parser/AbstractParser.java | 28 +++++++
.../infrastructure/parser/ParserHolder.java | 61 +++++++++++++++
.../infrastructure/parser/TarParser.java | 76 +++++++++++++++++++
.../infrastructure/parser/ZipParser.java | 75 ++++++++++++++++++
.../Impl/OperatorRepositoryImpl.java | 4 +-
.../operator/interfaces/dto/CategoryDto.java | 2 +
.../interfaces/dto/UploadOperatorRequest.java | 34 +++++++++
.../interfaces/rest/CategoryController.java | 6 +-
.../interfaces/rest/LabelController.java | 40 ----------
.../interfaces/rest/OperatorController.java | 33 +++++---
scripts/db/data-cleaning-init.sql | 4 +-
scripts/db/data-operator-init.sql | 35 ++++-----
42 files changed, 522 insertions(+), 346 deletions(-)
delete mode 100644 backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/CreateDatasetRequest.java
delete mode 100644 backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetFileResponse.java
delete mode 100644 backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetResponse.java
delete mode 100644 backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetTypeResponse.java
delete mode 100644 backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/PagedDatasetFileResponse.java
create mode 100644 backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/validator/CleanTaskValidator.java
delete mode 100644 backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/OperatorDto.java
delete mode 100644 backend/services/operator-market-service/src/main/java/com/datamate/operator/application/LabelService.java
create mode 100644 backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/contants/OperatorConstant.java
create mode 100644 backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/exception/OperatorErrorCode.java
create mode 100644 backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/AbstractParser.java
create mode 100644 backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/ParserHolder.java
create mode 100644 backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/TarParser.java
create mode 100644 backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/ZipParser.java
create mode 100644 backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/UploadOperatorRequest.java
delete mode 100644 backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/LabelController.java
diff --git a/backend/services/data-cleaning-service/pom.xml b/backend/services/data-cleaning-service/pom.xml
index 56b70fc56..a4f9de249 100644
--- a/backend/services/data-cleaning-service/pom.xml
+++ b/backend/services/data-cleaning-service/pom.xml
@@ -27,6 +27,11 @@
data-management-service
${project.version}
+
+ com.datamate
+ operator-market-service
+ ${project.version}
+
org.springframework.boot
spring-boot-starter-test
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/DataCleaningServiceConfiguration.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/DataCleaningServiceConfiguration.java
index 8f1dcce7a..1ea5ad099 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/DataCleaningServiceConfiguration.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/DataCleaningServiceConfiguration.java
@@ -1,6 +1,6 @@
package com.datamate.cleaning;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
@@ -8,9 +8,11 @@
* 数据归集服务配置类
* 基于DataX的数据归集和同步服务,支持多种数据源的数据采集和归集
*/
-@SpringBootApplication
@EnableAsync
@EnableScheduling
+@ComponentScan(basePackages = {
+ "com.datamate.cleaning"
+})
public class DataCleaningServiceConfiguration {
// Configuration class for JAR packaging - no main method needed
}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/application/CleaningTaskService.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/application/CleaningTaskService.java
index 9bb2a3c75..6b1d4d4b3 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/application/CleaningTaskService.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/application/CleaningTaskService.java
@@ -10,6 +10,7 @@
import com.datamate.cleaning.domain.repository.CleaningTaskRepository;
import com.datamate.cleaning.domain.repository.OperatorInstanceRepository;
+import com.datamate.cleaning.infrastructure.validator.CleanTaskValidator;
import com.datamate.cleaning.interfaces.dto.CleaningProcess;
import com.datamate.cleaning.interfaces.dto.CleaningTaskDto;
import com.datamate.cleaning.interfaces.dto.CreateCleaningTaskRequest;
@@ -59,6 +60,8 @@ public class CleaningTaskService {
private final DatasetFileApplicationService datasetFileService;
+ private final CleanTaskValidator cleanTaskValidator;
+
private final String DATASET_PATH = "/dataset";
private final String FLOW_PATH = "/flow";
@@ -80,6 +83,9 @@ public int countTasks(String status, String keywords) {
@Transactional
public CleaningTaskDto createTask(CreateCleaningTaskRequest request) {
+ cleanTaskValidator.checkNameDuplication(request.getName());
+ cleanTaskValidator.checkInputAndOutput(request.getInstance());
+
CreateDatasetRequest createDatasetRequest = new CreateDatasetRequest();
createDatasetRequest.setName(request.getDestDatasetName());
createDatasetRequest.setDatasetType(DatasetType.valueOf(request.getDestDatasetType()));
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/application/CleaningTemplateService.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/application/CleaningTemplateService.java
index 66e760077..bfd499b2d 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/application/CleaningTemplateService.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/application/CleaningTemplateService.java
@@ -5,6 +5,8 @@
import com.datamate.cleaning.domain.repository.OperatorInstanceRepository;
import com.datamate.cleaning.interfaces.dto.*;
import com.datamate.cleaning.domain.model.entity.TemplateWithInstance;
+import com.datamate.operator.domain.repository.OperatorRepository;
+import com.datamate.operator.interfaces.dto.OperatorDto;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
@@ -24,8 +26,10 @@ public class CleaningTemplateService {
private final OperatorInstanceRepository operatorInstanceRepo;
+ private final OperatorRepository operatorRepo;
+
public List getTemplates(String keywords) {
- List allOperators = operatorInstanceRepo.findAllOperators();
+ List allOperators = operatorRepo.findAllOperators();
Map operatorsMap = allOperators.stream()
.collect(Collectors.toMap(OperatorDto::getId, Function.identity()));
List allTemplates = cleaningTemplateRepo.findAllTemplates(keywords);
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/common/exception/CleanErrorCode.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/common/exception/CleanErrorCode.java
index 9548d394e..ff7e2d41f 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/common/exception/CleanErrorCode.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/common/exception/CleanErrorCode.java
@@ -12,7 +12,7 @@ public enum CleanErrorCode implements ErrorCode {
*/
DUPLICATE_TASK_NAME("clean.0001", "清洗任务名称重复"),
- CREATE_DATASET_FAILED("clean.0002", "创建数据集失败");
+ IN_AND_OUT_NOT_MATCH("clean.0002", "算子输入输出不匹配");
private final String code;
private final String message;
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/CreateDatasetRequest.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/CreateDatasetRequest.java
deleted file mode 100644
index 5c1900631..000000000
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/CreateDatasetRequest.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.datamate.cleaning.domain.model;
-
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.util.List;
-
-
-@Getter
-@Setter
-@NoArgsConstructor
-public class CreateDatasetRequest {
- /** 数据集名称 */
- private String name;
- /** 数据集描述 */
- private String description;
- /** 数据集类型 */
- private String datasetType;
- /** 标签列表 */
- private List tags;
- /** 数据源 */
- private String dataSource;
- /** 目标位置 */
- private String targetLocation;
-}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetFileResponse.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetFileResponse.java
deleted file mode 100644
index e31337364..000000000
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetFileResponse.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.datamate.cleaning.domain.model;
-
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.time.LocalDateTime;
-
-
-@Getter
-@Setter
-@NoArgsConstructor
-public class DatasetFileResponse {
- /** 文件ID */
- private String id;
- /** 文件名 */
- private String fileName;
- /** 原始文件名 */
- private String originalName;
- /** 文件类型 */
- private String fileType;
- /** 文件大小(字节) */
- private Long fileSize;
- /** 文件状态 */
- private String status;
- /** 文件描述 */
- private String description;
- /** 文件路径 */
- private String filePath;
- /** 上传时间 */
- private LocalDateTime uploadTime;
- /** 最后更新时间 */
- private LocalDateTime lastAccessTime;
- /** 上传者 */
- private String uploadedBy;
-}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetResponse.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetResponse.java
deleted file mode 100644
index 2c63a0e9c..000000000
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetResponse.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.datamate.cleaning.domain.model;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.time.LocalDateTime;
-
-/**
- * 数据集实体(与数据库表 t_dm_datasets 对齐)
- */
-@Getter
-@Setter
-@NoArgsConstructor
-@JsonIgnoreProperties(ignoreUnknown = true)
-public class DatasetResponse {
- /** 数据集ID */
- private String id;
- /** 数据集名称 */
- private String name;
- /** 数据集描述 */
- private String description;
- /** 数据集类型 */
- private String datasetType;
- /** 数据集状态 */
- private String status;
- /** 数据源 */
- private String dataSource;
- /** 目标位置 */
- private String targetLocation;
- /** 文件数量 */
- private Integer fileCount;
- /** 总大小(字节) */
- private Long totalSize;
- /** 完成率(0-100) */
- private Float completionRate;
- /** 创建时间 */
- private LocalDateTime createdAt;
- /** 更新时间 */
- private LocalDateTime updatedAt;
- /** 创建者 */
- private String createdBy;
-}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetTypeResponse.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetTypeResponse.java
deleted file mode 100644
index b085583b4..000000000
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/DatasetTypeResponse.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.datamate.cleaning.domain.model;
-
-import lombok.Getter;
-import lombok.Setter;
-import java.util.List;
-
-/**
- * 数据集类型响应DTO
- */
-@Getter
-@Setter
-public class DatasetTypeResponse {
- /** 类型编码 */
- private String code;
- /** 类型名称 */
- private String name;
- /** 类型描述 */
- private String description;
- /** 支持的文件格式 */
- private List supportedFormats;
- /** 图标 */
- private String icon;
-}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/PagedDatasetFileResponse.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/PagedDatasetFileResponse.java
deleted file mode 100644
index da33f1719..000000000
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/model/PagedDatasetFileResponse.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.datamate.cleaning.domain.model;
-
-import lombok.Getter;
-import lombok.NoArgsConstructor;
-import lombok.Setter;
-
-import java.util.List;
-
-
-@Getter
-@Setter
-@NoArgsConstructor
-public class PagedDatasetFileResponse {
- /** 文件内容列表 */
- private List content;
- /** 当前页码 */
- private Integer page;
- /** 每页大小 */
- private Integer size;
- /** 总元素数 */
- private Integer totalElements;
- /** 总页数 */
- private Integer totalPages;
- /** 是否为第一页 */
- private Boolean first;
- /** 是否为最后一页 */
- private Boolean last;
-}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/repository/CleaningTaskRepository.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/repository/CleaningTaskRepository.java
index 58a06a0d3..e8aeb1f4c 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/repository/CleaningTaskRepository.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/repository/CleaningTaskRepository.java
@@ -16,4 +16,6 @@ public interface CleaningTaskRepository extends IRepository {
void updateTask(CleaningTaskDto task);
void deleteTaskById(String taskId);
+
+ boolean isNameExist(String name);
}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/repository/OperatorInstanceRepository.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/repository/OperatorInstanceRepository.java
index 50b42e25d..4fbcc2a2f 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/repository/OperatorInstanceRepository.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/domain/repository/OperatorInstanceRepository.java
@@ -1,15 +1,12 @@
package com.datamate.cleaning.domain.repository;
import com.baomidou.mybatisplus.extension.repository.IRepository;
-import com.datamate.cleaning.interfaces.dto.OperatorDto;
import com.datamate.cleaning.interfaces.dto.OperatorInstanceDto;
import com.datamate.cleaning.domain.model.entity.OperatorInstance;
import java.util.List;
public interface OperatorInstanceRepository extends IRepository {
- List findAllOperators();
-
void insertInstance(String instanceId, List instances);
void deleteByInstanceId(String instanceId);
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/converter/OperatorInstanceConverter.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/converter/OperatorInstanceConverter.java
index 6bdda571b..eebeeecbe 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/converter/OperatorInstanceConverter.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/converter/OperatorInstanceConverter.java
@@ -3,10 +3,10 @@
import com.datamate.cleaning.domain.model.entity.OperatorInstance;
import com.datamate.cleaning.domain.model.entity.Operator;
-import com.datamate.cleaning.interfaces.dto.OperatorDto;
import com.datamate.cleaning.interfaces.dto.OperatorInstanceDto;
import com.datamate.common.infrastructure.exception.BusinessException;
import com.datamate.common.infrastructure.exception.SystemErrorCode;
+import com.datamate.operator.interfaces.dto.OperatorDto;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.mapstruct.Mapper;
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/Impl/CleaningTaskRepositoryImpl.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/Impl/CleaningTaskRepositoryImpl.java
index 8cfedf996..455f8d592 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/Impl/CleaningTaskRepositoryImpl.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/Impl/CleaningTaskRepositoryImpl.java
@@ -51,4 +51,10 @@ public void updateTask(CleaningTaskDto task) {
public void deleteTaskById(String taskId) {
mapper.deleteById(taskId);
}
+
+ public boolean isNameExist(String name) {
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(CleaningTask::getName, name);
+ return mapper.exists(queryWrapper);
+ }
}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/Impl/OperatorInstanceRepositoryImpl.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/Impl/OperatorInstanceRepositoryImpl.java
index 295d7c016..a3b197f4c 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/Impl/OperatorInstanceRepositoryImpl.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/Impl/OperatorInstanceRepositoryImpl.java
@@ -3,7 +3,6 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.repository.CrudRepository;
import com.datamate.cleaning.infrastructure.converter.OperatorInstanceConverter;
-import com.datamate.cleaning.interfaces.dto.OperatorDto;
import com.datamate.cleaning.interfaces.dto.OperatorInstanceDto;
import com.datamate.cleaning.domain.model.entity.OperatorInstance;
import com.datamate.cleaning.domain.repository.OperatorInstanceRepository;
@@ -20,11 +19,6 @@ public class OperatorInstanceRepositoryImpl extends CrudRepository findAllOperators() {
- return OperatorInstanceConverter.INSTANCE.fromEntityToDto(mapper.findAllOperators());
- }
-
@Override
public void insertInstance(String instanceId, List instances) {
List operatorInstances = new ArrayList<>();
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/mapper/OperatorInstanceMapper.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/mapper/OperatorInstanceMapper.java
index 2649d867a..0b0699d01 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/mapper/OperatorInstanceMapper.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/persistence/mapper/OperatorInstanceMapper.java
@@ -1,17 +1,10 @@
package com.datamate.cleaning.infrastructure.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.datamate.cleaning.domain.model.entity.Operator;
import com.datamate.cleaning.domain.model.entity.OperatorInstance;
import org.apache.ibatis.annotations.Mapper;
-import org.apache.ibatis.annotations.Select;
-
-import java.util.List;
@Mapper
public interface OperatorInstanceMapper extends BaseMapper {
- @Select("SELECT id, name, description, version, inputs, outputs, runtime, settings, is_star, created_at, " +
- "updated_at FROM t_operator")
- List findAllOperators();
}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/validator/CleanTaskValidator.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/validator/CleanTaskValidator.java
new file mode 100644
index 000000000..92f3d29e9
--- /dev/null
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/infrastructure/validator/CleanTaskValidator.java
@@ -0,0 +1,40 @@
+package com.datamate.cleaning.infrastructure.validator;
+
+import com.datamate.cleaning.common.exception.CleanErrorCode;
+import com.datamate.cleaning.domain.repository.CleaningTaskRepository;
+import com.datamate.cleaning.interfaces.dto.OperatorInstanceDto;
+import com.datamate.common.infrastructure.exception.BusinessException;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Locale;
+
+
+@Component
+@RequiredArgsConstructor
+public class CleanTaskValidator {
+ private final CleaningTaskRepository cleaningTaskRepo;
+
+ public void checkNameDuplication (String name) {
+ if (cleaningTaskRepo.isNameExist(name)) {
+ throw BusinessException.of(CleanErrorCode.DUPLICATE_TASK_NAME);
+ }
+ }
+
+ public void checkInputAndOutput (List operators) {
+ if (operators == null || operators.size() <= 1) {
+ return;
+ }
+ for (int i = 1; i < operators.size(); i++) {
+ OperatorInstanceDto front = operators.get(i - 1);
+ OperatorInstanceDto back = operators.get(i);
+ if (!StringUtils.equals(front.getOutputs(), back.getInputs())) {
+ throw BusinessException.of(CleanErrorCode.IN_AND_OUT_NOT_MATCH,
+ String.format(Locale.ROOT, "ops(name: [%s, %s]) inputs and outputs does not match",
+ front.getName(), back.getName()));
+ }
+ }
+ }
+}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/CleaningTaskDto.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/CleaningTaskDto.java
index be6fbc726..f2cc96516 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/CleaningTaskDto.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/CleaningTaskDto.java
@@ -5,6 +5,7 @@
import java.time.LocalDateTime;
import java.util.List;
+import com.datamate.operator.interfaces.dto.OperatorDto;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/CleaningTemplateDto.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/CleaningTemplateDto.java
index b86bb3e6b..29c710281 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/CleaningTemplateDto.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/CleaningTemplateDto.java
@@ -4,6 +4,7 @@
import java.util.ArrayList;
import java.util.List;
+import com.datamate.operator.interfaces.dto.OperatorDto;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/OperatorDto.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/OperatorDto.java
deleted file mode 100644
index 7b07fd750..000000000
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/OperatorDto.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.datamate.cleaning.interfaces.dto;
-
-import java.time.LocalDateTime;
-
-import lombok.Getter;
-import lombok.Setter;
-import org.springframework.format.annotation.DateTimeFormat;
-
-/**
- * OperatorDto
- */
-
-@Getter
-@Setter
-public class OperatorDto {
-
- private String id;
-
- private String name;
-
- private String description;
-
- private String version;
-
- private String inputs;
-
- private String outputs;
-
- private String runtime;
-
- private String settings;
-
- private Boolean isStar;
-
- @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
- private LocalDateTime createdAt;
-
- @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
- private LocalDateTime updatedAt;
-}
-
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/OperatorInstanceDto.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/OperatorInstanceDto.java
index 64439b5cd..5ea821610 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/OperatorInstanceDto.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/dto/OperatorInstanceDto.java
@@ -1,6 +1,7 @@
package com.datamate.cleaning.interfaces.dto;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
@@ -17,6 +18,14 @@ public class OperatorInstanceDto {
private String id;
+ private String name;
+
+ private String inputs;
+
+ private String outputs;
+
+ private List categories;
+
private Map overrides = new HashMap<>();
}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/rest/CleaningTaskController.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/rest/CleaningTaskController.java
index 04674b7c1..811f53e86 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/rest/CleaningTaskController.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/rest/CleaningTaskController.java
@@ -3,10 +3,8 @@
import com.datamate.cleaning.application.CleaningTaskService;
import com.datamate.cleaning.interfaces.dto.CleaningTaskDto;
import com.datamate.cleaning.interfaces.dto.CreateCleaningTaskRequest;
-import com.datamate.common.infrastructure.common.Response;
import com.datamate.common.interfaces.PagedResponse;
import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -19,41 +17,41 @@ public class CleaningTaskController {
private final CleaningTaskService cleaningTaskService;
@GetMapping
- public ResponseEntity>> cleaningTasksGet(
+ public PagedResponse cleaningTasksGet(
@RequestParam("page") Integer page,
@RequestParam("size") Integer size, @RequestParam(value = "status", required = false) String status,
@RequestParam(value = "keywords", required = false) String keywords) {
List tasks = cleaningTaskService.getTasks(status, keywords, page, size);
int count = cleaningTaskService.countTasks(status, keywords);
int totalPages = (count + size + 1) / size;
- return ResponseEntity.ok(Response.ok(PagedResponse.of(tasks, page, count, totalPages)));
+ return PagedResponse.of(tasks, page, count, totalPages);
}
@PostMapping
- public ResponseEntity> cleaningTasksPost(@RequestBody CreateCleaningTaskRequest request) {
- return ResponseEntity.ok(Response.ok(cleaningTaskService.createTask(request)));
+ public CleaningTaskDto cleaningTasksPost(@RequestBody CreateCleaningTaskRequest request) {
+ return cleaningTaskService.createTask(request);
}
@PostMapping("/{taskId}/stop")
- public ResponseEntity> cleaningTasksStop(@PathVariable("taskId") String taskId) {
+ public String cleaningTasksStop(@PathVariable("taskId") String taskId) {
cleaningTaskService.stopTask(taskId);
- return ResponseEntity.ok(Response.ok(null));
+ return taskId;
}
@PostMapping("/{taskId}/execute")
- public ResponseEntity> cleaningTasksStart(@PathVariable("taskId") String taskId) {
+ public String cleaningTasksStart(@PathVariable("taskId") String taskId) {
cleaningTaskService.executeTask(taskId);
- return ResponseEntity.ok(Response.ok(null));
+ return taskId;
}
@GetMapping("/{taskId}")
- public ResponseEntity> cleaningTasksTaskIdGet(@PathVariable("taskId") String taskId) {
- return ResponseEntity.ok(Response.ok(cleaningTaskService.getTask(taskId)));
+ public CleaningTaskDto cleaningTasksTaskIdGet(@PathVariable("taskId") String taskId) {
+ return cleaningTaskService.getTask(taskId);
}
@DeleteMapping("/{taskId}")
- public ResponseEntity> cleaningTasksTaskIdDelete(@PathVariable("taskId") String taskId) {
+ public String cleaningTasksTaskIdDelete(@PathVariable("taskId") String taskId) {
cleaningTaskService.deleteTask(taskId);
- return ResponseEntity.ok(Response.ok(null));
+ return taskId;
}
}
diff --git a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/rest/CleaningTemplateController.java b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/rest/CleaningTemplateController.java
index ffa74cc3b..5079500c6 100644
--- a/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/rest/CleaningTemplateController.java
+++ b/backend/services/data-cleaning-service/src/main/java/com/datamate/cleaning/interfaces/rest/CleaningTemplateController.java
@@ -4,10 +4,8 @@
import com.datamate.cleaning.interfaces.dto.CleaningTemplateDto;
import com.datamate.cleaning.interfaces.dto.CreateCleaningTemplateRequest;
import com.datamate.cleaning.interfaces.dto.UpdateCleaningTemplateRequest;
-import com.datamate.common.infrastructure.common.Response;
import com.datamate.common.interfaces.PagedResponse;
import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@@ -29,14 +27,14 @@ public class CleaningTemplateController {
private final CleaningTemplateService cleaningTemplateService;
@GetMapping
- public ResponseEntity>> cleaningTemplatesGet(
+ public PagedResponse cleaningTemplatesGet(
@RequestParam(value = "page", required = false) Integer page,
@RequestParam(value = "size", required = false) Integer size,
@RequestParam(value = "keywords", required = false) String keyword) {
List templates = cleaningTemplateService.getTemplates(keyword);
if (page == null || size == null) {
- return ResponseEntity.ok(Response.ok(PagedResponse.of(templates.stream()
- .sorted(Comparator.comparing(CleaningTemplateDto::getCreatedAt).reversed()).toList())));
+ return PagedResponse.of(templates.stream()
+ .sorted(Comparator.comparing(CleaningTemplateDto::getCreatedAt).reversed()).toList());
}
int count = templates.size();
int totalPages = (count + size + 1) / size;
@@ -44,31 +42,31 @@ public ResponseEntity>> cleaningTemp
.sorted(Comparator.comparing(CleaningTemplateDto::getCreatedAt).reversed())
.skip((long) page * size)
.limit(size).toList();
- return ResponseEntity.ok(Response.ok(PagedResponse.of(limitTemplates, page, count, totalPages)));
+ return PagedResponse.of(limitTemplates, page, count, totalPages);
}
@PostMapping
- public ResponseEntity> cleaningTemplatesPost(
+ public CleaningTemplateDto cleaningTemplatesPost(
@RequestBody CreateCleaningTemplateRequest request) {
- return ResponseEntity.ok(Response.ok(cleaningTemplateService.createTemplate(request)));
+ return cleaningTemplateService.createTemplate(request);
}
@GetMapping("/{templateId}")
- public ResponseEntity> cleaningTemplatesTemplateIdGet(
+ public CleaningTemplateDto cleaningTemplatesTemplateIdGet(
@PathVariable("templateId") String templateId) {
- return ResponseEntity.ok(Response.ok(cleaningTemplateService.getTemplate(templateId)));
+ return cleaningTemplateService.getTemplate(templateId);
}
@PutMapping("/{templateId}")
- public ResponseEntity> cleaningTemplatesTemplateIdPut(
+ public CleaningTemplateDto cleaningTemplatesTemplateIdPut(
@PathVariable("templateId") String templateId, @RequestBody UpdateCleaningTemplateRequest request) {
- return ResponseEntity.ok(Response.ok(cleaningTemplateService.updateTemplate(templateId, request)));
+ return cleaningTemplateService.updateTemplate(templateId, request);
}
@DeleteMapping("/{templateId}")
- public ResponseEntity> cleaningTemplatesTemplateIdDelete(
+ public String cleaningTemplatesTemplateIdDelete(
@PathVariable("templateId") String templateId) {
cleaningTemplateService.deleteTemplate(templateId);
- return ResponseEntity.noContent().build();
+ return templateId;
}
}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/application/LabelService.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/application/LabelService.java
deleted file mode 100644
index f9fe8be1b..000000000
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/application/LabelService.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package com.datamate.operator.application;
-
-import com.datamate.operator.interfaces.dto.LabelDto;
-import org.springframework.stereotype.Service;
-import java.util.List;
-import java.util.Collections;
-
-@Service
-public class LabelService {
- public List getLabels(Integer page, Integer size, String keyword) {
- // TODO: 查询标签列表
- return Collections.emptyList();
- }
- public void updateLabel(String id, List updateLabelDtoRequest) {
- // TODO: 更新标签
- }
- public void createLabels(LabelDto labelsPostRequest) {
- // TODO: 批量创建标签
- }
-}
-
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/application/OperatorService.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/application/OperatorService.java
index 54ff85823..aaa8bc19b 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/application/OperatorService.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/application/OperatorService.java
@@ -1,15 +1,25 @@
package com.datamate.operator.application;
+import com.datamate.common.domain.model.ChunkUploadPreRequest;
+import com.datamate.common.domain.model.FileUploadResult;
+import com.datamate.common.domain.service.FileService;
+import com.datamate.operator.domain.contants.OperatorConstant;
import com.datamate.operator.infrastructure.converter.OperatorConverter;
import com.datamate.operator.domain.model.OperatorView;
import com.datamate.operator.domain.repository.CategoryRelationRepository;
import com.datamate.operator.domain.repository.OperatorRepository;
import com.datamate.operator.domain.repository.OperatorViewRepository;
+import com.datamate.operator.infrastructure.parser.ParserHolder;
import com.datamate.operator.interfaces.dto.OperatorDto;
+import com.datamate.operator.interfaces.dto.UploadOperatorRequest;
import lombok.RequiredArgsConstructor;
+import org.apache.commons.io.FileUtils;
+import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
+import java.io.File;
+import java.io.IOException;
import java.util.List;
@Service
@@ -21,6 +31,17 @@ public class OperatorService {
private final CategoryRelationRepository relationRepo;
+ private final ParserHolder parserHolder;
+
+ private final FileService fileService;
+
+ @Value("${operator.base.path:/operator}")
+ private String operatorBasePath;
+
+ private final String uploadPath = operatorBasePath + File.separator + "upload";
+
+ private final String extractPath = operatorBasePath + File.separator + "extract";
+
public List getOperators(Integer page, Integer size, List categories,
String operatorName, Boolean isStar) {
List filteredOperators = operatorViewRepo.findOperatorsByCriteria(page, size, operatorName,
@@ -40,17 +61,55 @@ public OperatorDto getOperatorById(String id) {
public OperatorDto createOperator(OperatorDto req) {
operatorRepo.insertOperator(req);
relationRepo.batchInsert(req.getId(), req.getCategories());
+ parserHolder.extractTo(getFileType(req.getFileName()), uploadPath + File.separator + req.getFileName(),
+ extractPath + File.separator + getFileNameWithoutExtension(req.getFileName()));
return getOperatorById(req.getId());
}
public OperatorDto updateOperator(String id, OperatorDto req) {
operatorRepo.updateOperator(req);
relationRepo.batchInsert(id, req.getCategories());
+ parserHolder.extractTo(getFileType(req.getFileName()), uploadPath + File.separator + req.getFileName(),
+ extractPath + File.separator + getFileNameWithoutExtension(req.getFileName()));
return getOperatorById(id);
}
- public OperatorDto uploadOperator(MultipartFile file, String description) {
+ public OperatorDto uploadOperator(MultipartFile multipartFile) {
// TODO: 文件上传与解析
+ try {
+ File file = new File(multipartFile.getName());
+ // 从MultipartFile获取输入流并复制到目标文件
+ FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), file);
+ OperatorDto operatorDto = parserHolder.parseYamlFromArchive(getFileType(file.getName()), file,
+ OperatorConstant.YAML_PATH, OperatorDto.class);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
return new OperatorDto();
}
+
+ public String preUpload() {
+ ChunkUploadPreRequest request = ChunkUploadPreRequest.builder().build();
+ request.setUploadPath(operatorBasePath + File.separator + "upload");
+ request.setTotalFileNum(1);
+ request.setServiceId(OperatorConstant.SERVICE_ID);
+ return fileService.preUpload(request);
+ }
+
+ public void chunkUpload(UploadOperatorRequest request) {
+ FileUploadResult uploadResult = fileService.chunkUpload(OperatorConverter.INSTANCE.toChunkRequest(request));
+ if (uploadResult.isAllFilesUploaded()) {
+ // TODO: 文件上传与解析
+ OperatorDto operatorDto = parserHolder.parseYamlFromArchive(getFileType(uploadResult.getFileName()), uploadResult.getSavedFile(),
+ OperatorConstant.YAML_PATH, OperatorDto.class);
+ }
+ }
+
+ private String getFileType(String fileName) {
+ return fileName.substring(fileName.lastIndexOf('.') + 1);
+ }
+
+ private String getFileNameWithoutExtension(String fileName) {
+ return fileName.substring(0, fileName.lastIndexOf('.'));
+ }
}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/contants/OperatorConstant.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/contants/OperatorConstant.java
new file mode 100644
index 000000000..6abff77ed
--- /dev/null
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/contants/OperatorConstant.java
@@ -0,0 +1,7 @@
+package com.datamate.operator.domain.contants;
+
+public class OperatorConstant {
+ public static String SERVICE_ID = "operator";
+
+ public static String YAML_PATH = "metadata.yml";
+}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/model/Category.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/model/Category.java
index c8f89c6a5..83a65164b 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/model/Category.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/model/Category.java
@@ -12,6 +12,8 @@ public class Category {
private String name;
+ private String value;
+
private String type;
private Integer parentId;
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/repository/OperatorRepository.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/repository/OperatorRepository.java
index 546df447d..161db9413 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/repository/OperatorRepository.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/repository/OperatorRepository.java
@@ -7,7 +7,7 @@
import java.util.List;
public interface OperatorRepository extends IRepository {
- List findAllOperators();
+ List findAllOperators();
void updateOperator(OperatorDto operator);
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/converter/OperatorConverter.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/converter/OperatorConverter.java
index ddccf0f6c..78eac9a46 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/converter/OperatorConverter.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/converter/OperatorConverter.java
@@ -1,8 +1,10 @@
package com.datamate.operator.infrastructure.converter;
+import com.datamate.common.domain.model.ChunkUploadRequest;
import com.datamate.operator.domain.model.Operator;
import com.datamate.operator.domain.model.OperatorView;
import com.datamate.operator.interfaces.dto.OperatorDto;
+import com.datamate.operator.interfaces.dto.UploadOperatorRequest;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;
@@ -19,6 +21,8 @@ public interface OperatorConverter {
@Mapping(target = "categories", source = "categories", qualifiedByName = "stringToList")
OperatorDto fromEntityToDto(OperatorView operator);
+ List fromEntityToDto(List operator);
+
@Named("stringToList")
static List stringToList(String input) {
if (input == null || input.isEmpty()) {
@@ -28,4 +32,6 @@ static List stringToList(String input) {
}
Operator fromDtoToEntity(OperatorDto operator);
+
+ ChunkUploadRequest toChunkRequest(UploadOperatorRequest request);
}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/exception/OperatorErrorCode.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/exception/OperatorErrorCode.java
new file mode 100644
index 000000000..2fdcac459
--- /dev/null
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/exception/OperatorErrorCode.java
@@ -0,0 +1,19 @@
+package com.datamate.operator.infrastructure.exception;
+
+import com.datamate.common.infrastructure.exception.ErrorCode;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@Getter
+@AllArgsConstructor
+public enum OperatorErrorCode implements ErrorCode {
+ /**
+ * 不支持的文件类型
+ */
+ UNSUPPORTED_FILE_TYPE("op.0001", "不支持的文件类型"),
+
+ YAML_NOT_FOUND("op.0002", "算子中缺少元数据文件");
+
+ private final String code;
+ private final String message;
+}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/AbstractParser.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/AbstractParser.java
new file mode 100644
index 000000000..7cd26f02a
--- /dev/null
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/AbstractParser.java
@@ -0,0 +1,28 @@
+package com.datamate.operator.infrastructure.parser;
+
+import org.yaml.snakeyaml.Yaml;
+
+import java.io.File;
+import java.nio.file.Path;
+
+public abstract class AbstractParser {
+ // 使用 SnakeYAML 的 Yaml 实例,子类直接使用
+ protected final Yaml yaml = new Yaml();
+
+ /**
+ * 从压缩包内读取指定路径的 yaml 文件并解析为指定类型
+ * @param archive 压缩包路径(zip 或 tar)
+ * @param entryPath 压缩包内部的文件路径,例如 "config/app.yaml" 或 "./config/app.yaml"
+ * @param clazz 目标类型
+ * @param 类型参数
+ * @return 解析后的对象
+ */
+ public abstract T parseYamlFromArchive(File archive, String entryPath, Class clazz);
+
+ /**
+ * 将压缩包解压到目标目录(保持相对路径)
+ * @param archive 压缩包路径
+ * @param targetDir 目标目录
+ */
+ public abstract void extractTo(File archive, String targetDir);
+}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/ParserHolder.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/ParserHolder.java
new file mode 100644
index 000000000..4989517d3
--- /dev/null
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/ParserHolder.java
@@ -0,0 +1,61 @@
+package com.datamate.operator.infrastructure.parser;
+
+import com.datamate.common.infrastructure.exception.BusinessException;
+import com.datamate.common.infrastructure.exception.SystemErrorCode;
+import com.datamate.operator.infrastructure.exception.OperatorErrorCode;
+import jakarta.annotation.PostConstruct;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Component
+public class ParserHolder {
+ // 存放 parser:key 为 parser 类型标识(例如 "zip" 或 "tar"),value 为 parser 实例
+ private final Map parserMap = new ConcurrentHashMap<>();
+
+ // 注册 parser(可在启动时调用)
+ public void registerParser(String type, AbstractParser parser) {
+ if (type == null || parser == null) {
+ throw BusinessException.of(SystemErrorCode.UNKNOWN_ERROR);
+ }
+ parserMap.put(type, parser);
+ }
+
+ // 根据类型获取 parser(可能为 null)
+ public AbstractParser getParser(String type) {
+ return parserMap.get(type);
+ }
+
+ // 便捷代理:从指定类型的压缩包中读取 entry 并解析为 clazz
+ public T parseYamlFromArchive(String type, File archive, String entryPath, Class clazz) {
+ AbstractParser parser = getParser(type);
+ if (parser == null) {
+ throw BusinessException.of(OperatorErrorCode.UNSUPPORTED_FILE_TYPE,
+ "No parser registered for type: " + type);
+ }
+ return parser.parseYamlFromArchive(archive, entryPath, clazz);
+ }
+
+ // 便捷代理:将指定类型的压缩包解压到目标目录
+ public void extractTo(String type, File archive, String targetDir) {
+ AbstractParser parser = getParser(type);
+ if (parser == null) {
+ throw BusinessException.of(OperatorErrorCode.UNSUPPORTED_FILE_TYPE,
+ "No parser registered for type: " + type);
+ }
+ parser.extractTo(archive, targetDir);
+ }
+
+ public void extractTo(String type, String sourceDir, String targetDir) {
+ extractTo(type, new File(sourceDir), targetDir);
+ }
+
+ @PostConstruct
+ public void init() {
+ // 注册 zip 和 tar parser,key 可根据需要调整(例如 "zip"/"tar")
+ registerParser("zip", new ZipParser());
+ registerParser("tar", new TarParser());
+ }
+}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/TarParser.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/TarParser.java
new file mode 100644
index 000000000..1d1fe0ec9
--- /dev/null
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/TarParser.java
@@ -0,0 +1,76 @@
+package com.datamate.operator.infrastructure.parser;
+
+import com.datamate.common.infrastructure.exception.BusinessException;
+import com.datamate.common.infrastructure.exception.SystemErrorCode;
+import com.datamate.operator.infrastructure.exception.OperatorErrorCode;
+import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
+import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Objects;
+
+public class TarParser extends AbstractParser {
+
+ @Override
+ public T parseYamlFromArchive(File archive, String entryPath, Class clazz) {
+ // 允许带或不带前导 "./"
+ String normalized = entryPath.startsWith("./") ? entryPath.substring(2) : entryPath;
+ try (InputStream fis = Files.newInputStream(archive.toPath());
+ TarArchiveInputStream tis = new TarArchiveInputStream(fis)) {
+ TarArchiveEntry entry;
+ while ((entry = tis.getNextEntry()) != null) {
+ String name = entry.getName();
+ if (Objects.equals(name, entryPath) || Objects.equals(name, normalized)) {
+ // 使用 SnakeYAML 解析当前 entry 的内容到目标类型
+ return yaml.loadAs(tis, clazz);
+ }
+ }
+ } catch (IOException e) {
+ throw BusinessException.of(SystemErrorCode.FILE_SYSTEM_ERROR, e.getMessage());
+ }
+ throw BusinessException.of(OperatorErrorCode.YAML_NOT_FOUND, "Entry not found in tar: " + entryPath);
+ }
+
+ @Override
+ public void extractTo(File archive, String targetDir) {
+ Path targetPath = Paths.get(targetDir);
+ try (InputStream fis = Files.newInputStream(archive.toPath());
+ TarArchiveInputStream tis = new TarArchiveInputStream(fis)) {
+ Files.createDirectories(targetPath);
+ TarArchiveEntry entry;
+ while ((entry = tis.getNextEntry()) != null) {
+ String entryName = entry.getName();
+ // 去掉可能的前导 "./"
+ if (entryName.startsWith("./")) {
+ entryName = entryName.substring(2);
+ }
+
+ Path resolved = targetPath.resolve(entryName).normalize();
+ if (!resolved.startsWith(targetPath.toAbsolutePath().normalize())) {
+ throw BusinessException.of(SystemErrorCode.FILE_SYSTEM_ERROR, "Bad tar entry: " + entryName);
+ }
+
+ if (entry.isDirectory()) {
+ Files.createDirectories(resolved);
+ } else {
+ Files.createDirectories(resolved.getParent());
+ try (OutputStream os = Files.newOutputStream(resolved)) {
+ byte[] buffer = new byte[8192];
+ int len;
+ while ((len = tis.read(buffer)) != -1) {
+ os.write(buffer, 0, len);
+ }
+ }
+ }
+ }
+ } catch (IOException e) {
+ throw BusinessException.of(SystemErrorCode.FILE_SYSTEM_ERROR, e.getMessage());
+ }
+ }
+}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/ZipParser.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/ZipParser.java
new file mode 100644
index 000000000..186e864d2
--- /dev/null
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/parser/ZipParser.java
@@ -0,0 +1,75 @@
+package com.datamate.operator.infrastructure.parser;
+
+import com.datamate.common.infrastructure.exception.BusinessException;
+import com.datamate.common.infrastructure.exception.SystemErrorCode;
+import com.datamate.operator.infrastructure.exception.OperatorErrorCode;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Enumeration;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+public class ZipParser extends AbstractParser {
+
+ @Override
+ public T parseYamlFromArchive(File archive, String entryPath, Class clazz) {
+ try (ZipFile zipFile = new ZipFile(archive)) {
+ // 允许带或不带前导 "./"
+ String normalized = entryPath.startsWith("./") ? entryPath.substring(2) : entryPath;
+ ZipEntry entry = zipFile.getEntry(entryPath);
+ if (entry == null) {
+ entry = zipFile.getEntry(normalized);
+ }
+ if (entry == null) {
+ throw BusinessException.of(OperatorErrorCode.YAML_NOT_FOUND, "Entry not found in zip: " + entryPath);
+ }
+ try (InputStream is = zipFile.getInputStream(entry)) {
+ // 使用 SnakeYAML 解析为目标类型
+ return yaml.loadAs(is, clazz);
+ }
+ } catch (IOException e) {
+ throw BusinessException.of(SystemErrorCode.FILE_SYSTEM_ERROR, e.getMessage());
+ }
+ }
+
+ @Override
+ public void extractTo(File archive, String targetDir) {
+ Path targetPath = Paths.get(targetDir);
+ try (ZipFile zipFile = new ZipFile(archive)) {
+ Files.createDirectories(targetPath);
+ Enumeration extends ZipEntry> entries = zipFile.entries();
+ while (entries.hasMoreElements()) {
+ ZipEntry entry = entries.nextElement();
+ String entryName = entry.getName();
+
+ // 防止 Zip Slip:确保解压路径仍在 targetDir 下
+ Path resolved = targetPath.resolve(entryName).normalize();
+ if (!resolved.startsWith(targetPath.toAbsolutePath().normalize())) {
+ throw BusinessException.of(SystemErrorCode.FILE_SYSTEM_ERROR, "Bad zip entry: " + entryName);
+ }
+
+ if (entry.isDirectory()) {
+ Files.createDirectories(resolved);
+ } else {
+ Files.createDirectories(resolved.getParent());
+ try (InputStream is = zipFile.getInputStream(entry);
+ OutputStream os = Files.newOutputStream(resolved)) {
+ byte[] buffer = new byte[8192];
+ int len;
+ while ((len = is.read(buffer)) != -1) {
+ os.write(buffer, 0, len);
+ }
+ }
+ }
+ }
+ } catch (IOException e) {
+ throw BusinessException.of(SystemErrorCode.FILE_SYSTEM_ERROR, e.getMessage());
+ }
+ }
+}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/persistence/Impl/OperatorRepositoryImpl.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/persistence/Impl/OperatorRepositoryImpl.java
index 58a69610a..17a5c5c62 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/persistence/Impl/OperatorRepositoryImpl.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/persistence/Impl/OperatorRepositoryImpl.java
@@ -17,8 +17,8 @@ public class OperatorRepositoryImpl extends CrudRepository findAllOperators() {
- return mapper.selectList(null);
+ public List findAllOperators() {
+ return OperatorConverter.INSTANCE.fromEntityToDto(mapper.selectList(null));
}
@Override
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/CategoryDto.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/CategoryDto.java
index 9681aa3bd..a9f8fd340 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/CategoryDto.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/CategoryDto.java
@@ -10,6 +10,8 @@ public class CategoryDto {
private String name;
+ private String value;
+
private String type;
private Integer parentId;
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/UploadOperatorRequest.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/UploadOperatorRequest.java
new file mode 100644
index 000000000..c6ebb6111
--- /dev/null
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/UploadOperatorRequest.java
@@ -0,0 +1,34 @@
+package com.datamate.operator.interfaces.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 上传文件请求
+ * 用于分块上传文件时的请求参数封装,支持大文件分片上传功能
+ */
+@Getter
+@Setter
+public class UploadOperatorRequest {
+ /** 预上传返回的id,用来确认同一个任务 */
+ private String reqId;
+
+ /** 文件编号,用于标识批量上传中的第几个文件 */
+ private int fileNo;
+
+ /** 文件名称 */
+ private String fileName;
+
+ /** 文件总分块数量 */
+ private int totalChunkNum;
+
+ /** 当前分块编号,从1开始 */
+ private int chunkNo;
+
+ /** 上传的文件分块内容 */
+ private MultipartFile file;
+
+ /** 文件分块的校验和(十六进制字符串),用于验证文件完整性 */
+ private String checkSumHex;
+}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/CategoryController.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/CategoryController.java
index d9bd4625e..2a7dca83e 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/CategoryController.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/CategoryController.java
@@ -1,11 +1,9 @@
package com.datamate.operator.interfaces.rest;
-import com.datamate.common.infrastructure.common.Response;
import com.datamate.common.interfaces.PagedResponse;
import com.datamate.operator.application.CategoryService;
import com.datamate.operator.interfaces.dto.CategoryTreeResponse;
import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -20,8 +18,8 @@ public class CategoryController {
private final CategoryService categoryService;
@GetMapping("/tree")
- public ResponseEntity>> categoryTreeGet() {
+ public PagedResponse categoryTreeGet() {
List allCategories = categoryService.getAllCategories();
- return ResponseEntity.ok(Response.ok(PagedResponse.of(allCategories)));
+ return PagedResponse.of(allCategories);
}
}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/LabelController.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/LabelController.java
deleted file mode 100644
index ec07a8ba1..000000000
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/LabelController.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package com.datamate.operator.interfaces.rest;
-
-import com.datamate.common.infrastructure.common.Response;
-import com.datamate.common.interfaces.PagedResponse;
-import com.datamate.operator.application.LabelService;
-import com.datamate.operator.interfaces.dto.LabelDto;
-import lombok.RequiredArgsConstructor;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-@RestController
-@RequestMapping("/labels")
-@RequiredArgsConstructor
-public class LabelController {
- private final LabelService labelService;
-
- @GetMapping
- public ResponseEntity>> labelsGet(@RequestParam("page") Integer page,
- @RequestParam("size") Integer size,
- @RequestParam("keyword") String keyword) {
- return ResponseEntity.ok(Response.ok(PagedResponse.of(labelService.getLabels(page, size, keyword))));
- }
-
- @PutMapping("/{id}")
- public ResponseEntity> labelsIdPut(@PathVariable("id") String id,
- @RequestBody List updateLabelDtoRequest) {
- labelService.updateLabel(id, updateLabelDtoRequest);
- return ResponseEntity.ok(Response.ok(null));
- }
-
- @PostMapping
- public ResponseEntity> labelsPost(@RequestBody LabelDto labelsPostRequest) {
- labelService.createLabels(labelsPostRequest);
- return ResponseEntity.ok(Response.ok(null));
- }
-}
-
-
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/OperatorController.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/OperatorController.java
index a201b965a..727a757db 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/OperatorController.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/rest/OperatorController.java
@@ -5,6 +5,8 @@
import com.datamate.operator.application.OperatorService;
import com.datamate.operator.interfaces.dto.OperatorDto;
import com.datamate.operator.interfaces.dto.OperatorsListPostRequest;
+import com.datamate.operator.interfaces.dto.UploadOperatorRequest;
+import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@@ -19,34 +21,43 @@ public class OperatorController {
private final OperatorService operatorService;
@PostMapping("/list")
- public ResponseEntity>> operatorsListPost(@RequestBody OperatorsListPostRequest request) {
+ public PagedResponse operatorsListPost(@RequestBody OperatorsListPostRequest request) {
List responses = operatorService.getOperators(request.getPage(), request.getSize(),
request.getCategories(), request.getOperatorName(), request.getIsStar());
int count = operatorService.getOperatorsCount(request.getCategories(), request.getOperatorName(),
request.getIsStar());
int totalPages = (count + request.getSize() + 1) / request.getSize();
- return ResponseEntity.ok(Response.ok(PagedResponse.of(responses, request.getPage(), count, totalPages)));
+ return PagedResponse.of(responses, request.getPage(), count, totalPages);
}
@GetMapping("/{id}")
- public ResponseEntity> operatorsIdGet(@PathVariable("id") String id) {
- return ResponseEntity.ok(Response.ok(operatorService.getOperatorById(id)));
+ public OperatorDto operatorsIdGet(@PathVariable("id") String id) {
+ return operatorService.getOperatorById(id);
}
@PutMapping("/{id}")
- public ResponseEntity> operatorsIdPut(@PathVariable("id") String id,
+ public OperatorDto operatorsIdPut(@PathVariable("id") String id,
@RequestBody OperatorDto updateOperatorRequest) {
- return ResponseEntity.ok(Response.ok(operatorService.updateOperator(id, updateOperatorRequest)));
+ return operatorService.updateOperator(id, updateOperatorRequest);
}
@PostMapping("/create")
- public ResponseEntity> operatorsCreatePost(@RequestBody OperatorDto createOperatorRequest) {
- return ResponseEntity.ok(Response.ok(operatorService.createOperator(createOperatorRequest)));
+ public OperatorDto operatorsCreatePost(@RequestBody OperatorDto createOperatorRequest) {
+ return operatorService.createOperator(createOperatorRequest);
}
@PostMapping("/upload")
- public ResponseEntity> operatorsUploadPost(@RequestPart(value = "file") MultipartFile file,
- @RequestParam(value = "description") String description) {
- return ResponseEntity.ok(Response.ok(operatorService.uploadOperator(file, description)));
+ public OperatorDto operatorsUploadPost(@RequestPart(value = "file") MultipartFile file) {
+ return operatorService.uploadOperator(file);
+ }
+
+ @PostMapping("/upload/pre-upload")
+ public String preUpload() {
+ return operatorService.preUpload();
+ }
+
+ @PostMapping("/upload/chunk")
+ public void chunkUpload(@RequestBody UploadOperatorRequest request) {
+ operatorService.chunkUpload(request);
}
}
diff --git a/scripts/db/data-cleaning-init.sql b/scripts/db/data-cleaning-init.sql
index 47a42ba5e..3ce98ef29 100644
--- a/scripts/db/data-cleaning-init.sql
+++ b/scripts/db/data-cleaning-init.sql
@@ -3,7 +3,7 @@ USE datamate;
CREATE TABLE IF NOT EXISTS t_clean_template
(
id varchar(64) primary key not null unique,
- name varchar(64),
+ name varchar(64) unique,
description varchar(256),
created_at timestamp default current_timestamp,
updated_at timestamp default current_timestamp,
@@ -13,7 +13,7 @@ CREATE TABLE IF NOT EXISTS t_clean_template
CREATE TABLE IF NOT EXISTS t_clean_task
(
id varchar(64) primary key,
- name varchar(64),
+ name varchar(64) unique,
description varchar(256),
status varchar(256),
src_dataset_id varchar(64),
diff --git a/scripts/db/data-operator-init.sql b/scripts/db/data-operator-init.sql
index 4a1b8a63f..1979f19ca 100644
--- a/scripts/db/data-operator-init.sql
+++ b/scripts/db/data-operator-init.sql
@@ -3,7 +3,7 @@ USE datamate;
CREATE TABLE IF NOT EXISTS t_operator
(
id varchar(64) primary key,
- name varchar(64),
+ name varchar(64) unique,
description varchar(256),
version varchar(256),
inputs varchar(256),
@@ -19,7 +19,8 @@ CREATE TABLE IF NOT EXISTS t_operator
CREATE TABLE IF NOT EXISTS t_operator_category
(
id int primary key auto_increment,
- name varchar(64),
+ name varchar(64) unique ,
+ value varchar(64) unique ,
type varchar(64),
parent_id int
);
@@ -49,21 +50,21 @@ FROM t_operator_category_relation tocr
LEFT JOIN t_operator o ON tocr.operator_id = o.id
LEFT JOIN t_operator_category toc ON tocr.category_id = toc.id;
-INSERT IGNORE INTO t_operator_category(id, name, type, parent_id)
-VALUES (1, '模态', 'predefined', 0),
- (2, '语言', 'predefined', 0),
- (3, '文本', 'predefined', 1),
- (4, '图片', 'predefined', 1),
- (5, '音频', 'predefined', 1),
- (6, '视频', 'predefined', 1),
- (7, '多模态', 'predefined', 1),
- (8, 'Python', 'predefined', 2),
- (9, 'Java', 'predefined', 2),
- (10, '来源', 'predefined', 0),
- (11, '系统预置', 'predefined', 10),
- (12, '用户上传', 'predefined', 10),
- (13, '收藏状态', 'predefined', 0),
- (14, '已收藏', 'predefined', 13);
+INSERT IGNORE INTO t_operator_category(id, name, value, type, parent_id)
+VALUES (1, '模态', 'model', 'predefined', 0),
+ (2, '语言', 'language', 'predefined', 0),
+ (3, '文本', 'text', 'predefined', 1),
+ (4, '图片', 'image', 'predefined', 1),
+ (5, '音频', 'audio', 'predefined', 1),
+ (6, '视频', 'video', 'predefined', 1),
+ (7, '多模态', 'multimodal', 'predefined', 1),
+ (8, 'Python', 'python', 'predefined', 2),
+ (9, 'Java', 'java', 'predefined', 2),
+ (10, '来源', 'origin', 'predefined', 0),
+ (11, '系统预置', 'predefined', 'predefined', 10),
+ (12, '用户上传', 'customized', 'predefined', 10),
+ (13, '收藏状态', 'starStatus', 'predefined', 0),
+ (14, '已收藏', 'isStar', 'predefined', 13);
INSERT IGNORE INTO t_operator
(id, name, description, version, inputs, outputs, runtime, settings, file_name, is_star)
From 53f2e03384e4345e01f64cdbf00bf482460efa8d Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Thu, 30 Oct 2025 16:01:06 +0800
Subject: [PATCH 2/3] =?UTF-8?q?feature:=20=E6=94=AF=E6=8C=81=E7=AE=97?=
=?UTF-8?q?=E5=AD=90=E4=B8=8A=E4=BC=A0=E5=88=9B=E5=BB=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../datamate/operator/application/OperatorService.java | 4 ++--
.../domain/repository/OperatorViewRepository.java | 4 ++--
.../persistence/Impl/OperatorViewRepositoryImpl.java | 4 ++--
.../operator/interfaces/dto/OperatorsListPostRequest.java | 2 +-
deployment/helm/datamate/values.yaml | 8 ++++++--
5 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/application/OperatorService.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/application/OperatorService.java
index 2cbe6a3e3..5cd1041f9 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/application/OperatorService.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/application/OperatorService.java
@@ -35,14 +35,14 @@ public class OperatorService {
@Value("${operator.base.path:/operator}")
private String operatorBasePath;
- public List getOperators(Integer page, Integer size, List categories,
+ public List getOperators(Integer page, Integer size, List categories,
String operatorName, Boolean isStar) {
List filteredOperators = operatorViewRepo.findOperatorsByCriteria(page, size, operatorName,
categories, isStar);
return filteredOperators.stream().map(OperatorConverter.INSTANCE::fromEntityToDto).toList();
}
- public int getOperatorsCount(List categories, String operatorName, Boolean isStar) {
+ public int getOperatorsCount(List categories, String operatorName, Boolean isStar) {
return operatorViewRepo.countOperatorsByCriteria(operatorName, categories, isStar);
}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/repository/OperatorViewRepository.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/repository/OperatorViewRepository.java
index cacba8310..fbbdf6437 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/repository/OperatorViewRepository.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/domain/repository/OperatorViewRepository.java
@@ -7,9 +7,9 @@
public interface OperatorViewRepository extends IRepository {
List findOperatorsByCriteria(Integer page, Integer size, String operatorName,
- List categories, Boolean isStar);
+ List categories, Boolean isStar);
- Integer countOperatorsByCriteria(String operatorName, List categories, Boolean isStar);
+ Integer countOperatorsByCriteria(String operatorName, List categories, Boolean isStar);
OperatorView findOperatorById(String id);
}
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/persistence/Impl/OperatorViewRepositoryImpl.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/persistence/Impl/OperatorViewRepositoryImpl.java
index 19c11fd62..1a64d5a66 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/persistence/Impl/OperatorViewRepositoryImpl.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/infrastructure/persistence/Impl/OperatorViewRepositoryImpl.java
@@ -22,7 +22,7 @@ public class OperatorViewRepositoryImpl extends CrudRepository findOperatorsByCriteria(Integer page, Integer size, String operatorName,
- List categories, Boolean isStar) {
+ List categories, Boolean isStar) {
QueryWrapper queryWrapper = Wrappers.query();
queryWrapper.in(CollectionUtils.isNotEmpty(categories), "category_id", categories)
.like(StringUtils.isNotBlank(operatorName), "operator_name", operatorName)
@@ -37,7 +37,7 @@ public List findOperatorsByCriteria(Integer page, Integer size, St
}
@Override
- public Integer countOperatorsByCriteria(String operatorName, List categories, Boolean isStar) {
+ public Integer countOperatorsByCriteria(String operatorName, List categories, Boolean isStar) {
QueryWrapper queryWrapper = Wrappers.query();
queryWrapper.in(CollectionUtils.isNotEmpty(categories),"category_id", categories)
.like(StringUtils.isNotBlank(operatorName), "operator_name", operatorName)
diff --git a/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/OperatorsListPostRequest.java b/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/OperatorsListPostRequest.java
index 973157992..fde4507ca 100644
--- a/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/OperatorsListPostRequest.java
+++ b/backend/services/operator-market-service/src/main/java/com/datamate/operator/interfaces/dto/OperatorsListPostRequest.java
@@ -19,7 +19,7 @@ public class OperatorsListPostRequest {
private Integer size;
- private List categories = new ArrayList<>();
+ private List categories = new ArrayList<>();
private String operatorName;
diff --git a/deployment/helm/datamate/values.yaml b/deployment/helm/datamate/values.yaml
index d38a70e30..c4258f153 100644
--- a/deployment/helm/datamate/values.yaml
+++ b/deployment/helm/datamate/values.yaml
@@ -43,7 +43,7 @@ dataVolume: &dataVolume
operatorVolume: &operatorVolume
name: operator-volume
hostPath:
- path: /opt/datamate/data/
+ path: /opt/datamate/data/operator
backend:
volumes:
@@ -73,6 +73,7 @@ frontend:
subPath: frontend
- mountPath: /etc/nginx/conf.d/backend.conf
name: datamate-nginx-conf
+ subPath: backend.conf
database:
volumes:
@@ -112,11 +113,12 @@ ray-cluster:
name: flow-volume
- mountPath: /opt/runtime/datamate/ops/user
name: operator-volume
+ subPath: extract
sidecarContainers:
- name: runtime
image: datamate-runtime
imagePullPolicy: IfNotPresent
- command:
+ args:
- python
- /opt/runtime/datamate/operator_runtime.py
- --port
@@ -146,6 +148,7 @@ ray-cluster:
name: flow-volume
- mountPath: /opt/runtime/datamate/ops/user
name: operator-volume
+ subPath: extract
worker:
volumes:
- *datasetVolume
@@ -162,3 +165,4 @@ ray-cluster:
name: flow-volume
- mountPath: /opt/runtime/datamate/ops/user
name: operator-volume
+ subPath: extract
From 1fdfe35ebe85120571dd025eaf115c278dd1b902 Mon Sep 17 00:00:00 2001
From: hhhhsc <1710496817@qq.com>
Date: Thu, 30 Oct 2025 17:01:11 +0800
Subject: [PATCH 3/3] merge main
---
deployment/helm/datamate/values.yaml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/deployment/helm/datamate/values.yaml b/deployment/helm/datamate/values.yaml
index c4258f153..97aba1fdb 100644
--- a/deployment/helm/datamate/values.yaml
+++ b/deployment/helm/datamate/values.yaml
@@ -134,6 +134,8 @@ ray-cluster:
value: "password"
- name: MYSQL_DATABASE
value: "datamate"
+ - name: PDF_FORMATTER_BASE_URL
+ value: "http://datamate-mineru:9001"
ports:
- containerPort: 8081
volumeMounts: