diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Experiment.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Experiment.java index 831302b7..01118a23 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Experiment.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Experiment.java @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonRawValue; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.annotation.JsonNaming; import com.ruoyi.common.core.web.domain.BaseEntity; +import com.ruoyi.platform.annotations.CheckDuplicate; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -28,6 +29,7 @@ public class Experiment implements Serializable { @ApiModelProperty(value = "主键") private Integer id; @ApiModelProperty(value = "名称") + @CheckDuplicate private String name; @ApiModelProperty(value = "工作流ID") diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Image.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Image.java index 981289a1..d3b97185 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Image.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Image.java @@ -2,6 +2,7 @@ package com.ruoyi.platform.domain; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.ruoyi.platform.annotations.CheckDuplicate; import io.swagger.annotations.ApiModelProperty; import java.util.Date; @@ -25,6 +26,7 @@ public class Image implements Serializable { * 镜像名称 */ @ApiModelProperty(value = "名称") + @CheckDuplicate private String name; @ApiModelProperty(value = "镜像描述") diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Workflow.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Workflow.java index 487f7653..97ac1eba 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Workflow.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Workflow.java @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonRawValue; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.annotation.JsonNaming; +import com.ruoyi.platform.annotations.CheckDuplicate; import com.ruoyi.platform.handler.BaseMetaObjectHandler; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -33,6 +34,7 @@ public class Workflow extends BaseMetaObjectHandler implements Serializable { private Long id; @ApiModelProperty(value = "工作流名称") + @CheckDuplicate private String name; @ApiModelProperty(value = "流水线描述") diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java index d1db8828..6a24e02e 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java @@ -1,5 +1,6 @@ package com.ruoyi.platform.mapper; +import com.ruoyi.platform.domain.Dataset; import com.ruoyi.platform.domain.Experiment; import org.apache.ibatis.annotations.Param; import org.springframework.data.domain.Pageable; @@ -80,6 +81,9 @@ public interface ExperimentDao { */ int deleteById(Integer id); - List queryByExperiment(@Param("experiment")Experiment experiment); + List queryByExperiment(@Param("experiment") Experiment experiment); + + Experiment findByName(@Param("name") String name); + } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java index c1bfa662..b7ea8648 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java @@ -30,6 +30,7 @@ public class ExperimentInstanceStatusTask { private ExperimentInsDao experimentInsDao; private List experimentIds = new ArrayList<>(); + @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 public void executeExperimentInsStatus() throws IOException { // 首先查到所有非终止态的实验实例 @@ -47,15 +48,16 @@ public class ExperimentInstanceStatusTask { } if (!StringUtils.equals(oldStatus,experimentIns.getStatus())){ experimentIns.setUpdateTime(new Date()); + // 线程安全的添加操作 synchronized (experimentIds) { - experimentIds.add(experimentIns.getExperimentId()); // 线程安全的添加操作 + experimentIds.add(experimentIns.getExperimentId()); } updateList.add(experimentIns); - } experimentInsDao.update(experimentIns); } + } if (updateList.size() > 0){ experimentInsDao.insertOrUpdateBatch(updateList); @@ -85,11 +87,13 @@ public class ExperimentInstanceStatusTask { updateExperiments.add(experiment); } } + if (!updateExperiments.isEmpty()) { experimentDao.insertOrUpdateBatch(updateExperiments); for (int index = 0; index < updateExperiments.size(); index++) { + // 线程安全的删除操作 synchronized (experimentIds) { - experimentIds.remove(index); // 线程安全的删除操作 + experimentIds.remove(index); } } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java index 0f8cc707..edfe8cbe 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java @@ -79,7 +79,7 @@ DatasetService { List getDatasetVersions(Integer datasetId) throws Exception; String insertDatasetAndVersion(DatasetVo datasetVo) throws Exception; - public void checkDeclaredName(Dataset insert) throws Exception; + void checkDeclaredName(Dataset insert) throws Exception; ResponseEntity downloadAllDatasetFiles(Integer datasetId, String version) throws Exception; diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentService.java index 44af21bc..67e60ac2 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentService.java @@ -1,6 +1,7 @@ package com.ruoyi.platform.service; import com.ruoyi.platform.domain.Experiment; +import com.ruoyi.platform.domain.Workflow; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.http.ResponseEntity; @@ -75,4 +76,6 @@ public interface ExperimentService { ResponseEntity showExperimentConfig(Experiment experiment); List queryByWorkflowId(Long id); + + void checkDeclaredName(Experiment insert) throws Exception; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/WorkflowService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/WorkflowService.java index 41397348..772c9bd6 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/WorkflowService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/WorkflowService.java @@ -1,6 +1,7 @@ package com.ruoyi.platform.service; import com.fasterxml.jackson.core.JsonProcessingException; +import com.ruoyi.platform.domain.Dataset; import com.ruoyi.platform.domain.Workflow; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; @@ -64,6 +65,8 @@ public interface WorkflowService { Workflow duplicateWorkflow(Long id); + void checkDeclaredName(Workflow insert) throws Exception; + /** * 按流水线id保存 * diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java index 3cef14d1..3eed94e1 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java @@ -1,6 +1,7 @@ package com.ruoyi.platform.service.impl; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.platform.annotations.CheckDuplicate; import com.ruoyi.platform.domain.Experiment; import com.ruoyi.platform.domain.ExperimentIns; import com.ruoyi.platform.domain.Workflow; @@ -25,6 +26,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.IOException; +import java.lang.reflect.Field; import java.util.*; /** @@ -317,6 +319,28 @@ public class ExperimentServiceImpl implements ExperimentService { return experimentDao.queryByExperiment(experiment); } + public void checkDeclaredName(Experiment insert) throws Exception { + Experiment existingExperiment = experimentDao.findByName(insert.getName()); + + if (existingExperiment != null) { + // 检查找到的流水线是否与要插入的流水线相同 + if (insert.getId() != null && insert.getId().equals(existingExperiment.getId())) { + // 这是相同的流水线,更新操作中没有重复名称问题 + return; + } + // 现在我们知道还有另一个具有相同名称的流水线 + Field[] fields = Experiment.class.getDeclaredFields(); + for (Field field : fields) { + field.setAccessible(true); // 使私有字段可访问 + if ("name".equals(field.getName()) && field.isAnnotationPresent(CheckDuplicate.class)) { + // 如果字段是“name”并且标记了CheckDuplicate注解 + CheckDuplicate annotation = field.getAnnotation(CheckDuplicate.class); + throw new Exception("重复的实验名称: " + insert.getName() + ". " + annotation.message()); + } + } + } + } + diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowServiceImpl.java index 59cb170d..d09312dc 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowServiceImpl.java @@ -1,6 +1,8 @@ package com.ruoyi.platform.service.impl; import com.ruoyi.common.security.utils.SecurityUtils; +import com.ruoyi.platform.annotations.CheckDuplicate; +import com.ruoyi.platform.domain.Dataset; import com.ruoyi.platform.domain.Experiment; import com.ruoyi.platform.domain.Workflow; import com.ruoyi.platform.mapper.WorkflowDao; @@ -18,6 +20,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.lang.reflect.Field; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -191,7 +194,34 @@ public class WorkflowServiceImpl implements WorkflowService { } return null; + + } + public void checkDeclaredName(Workflow insert) throws Exception { + List existingWorkflowList = workflowDao.queryByName(insert.getName()); + + Workflow existingWorkflow = existingWorkflowList.stream().findFirst().orElse(null); + if (existingWorkflow != null) { + // 检查找到的流水线是否与要插入的流水线相同 + if (insert.getId() != null && insert.getId().equals(existingWorkflow.getId())) { + // 这是相同的流水线,更新操作中没有重复名称问题 + return; + } + // 现在我们知道还有另一个具有相同名称的流水线 + Field[] fields = Workflow.class.getDeclaredFields(); + for (Field field : fields) { + field.setAccessible(true); // 使私有字段可访问 + if ("name".equals(field.getName()) && field.isAnnotationPresent(CheckDuplicate.class)) { + // 如果字段是“name”并且标记了CheckDuplicate注解 + CheckDuplicate annotation = field.getAnnotation(CheckDuplicate.class); + throw new Exception("重复的流水线名称: " + insert.getName() + ". " + annotation.message()); + } + } + } + } + + + } diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ExperimentDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ExperimentDaoMapper.xml index c39dcd9e..80a53eb1 100644 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ExperimentDaoMapper.xml +++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ExperimentDaoMapper.xml @@ -24,6 +24,14 @@ where id = #{id} and state = 1 + + + + insert into experiment(name,workflow_id, global_param, status_list, description, create_by, create_time, update_by, update_time, state)