| @@ -8,6 +8,7 @@ import com.fasterxml.jackson.annotation.JsonRawValue; | |||||
| import com.fasterxml.jackson.databind.PropertyNamingStrategy; | import com.fasterxml.jackson.databind.PropertyNamingStrategy; | ||||
| import com.fasterxml.jackson.databind.annotation.JsonNaming; | import com.fasterxml.jackson.databind.annotation.JsonNaming; | ||||
| import com.ruoyi.common.core.web.domain.BaseEntity; | import com.ruoyi.common.core.web.domain.BaseEntity; | ||||
| import com.ruoyi.platform.annotations.CheckDuplicate; | |||||
| import io.swagger.annotations.ApiModel; | import io.swagger.annotations.ApiModel; | ||||
| import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
| @@ -28,6 +29,7 @@ public class Experiment implements Serializable { | |||||
| @ApiModelProperty(value = "主键") | @ApiModelProperty(value = "主键") | ||||
| private Integer id; | private Integer id; | ||||
| @ApiModelProperty(value = "名称") | @ApiModelProperty(value = "名称") | ||||
| @CheckDuplicate | |||||
| private String name; | private String name; | ||||
| @ApiModelProperty(value = "工作流ID") | @ApiModelProperty(value = "工作流ID") | ||||
| @@ -2,6 +2,7 @@ package com.ruoyi.platform.domain; | |||||
| import com.fasterxml.jackson.databind.PropertyNamingStrategy; | import com.fasterxml.jackson.databind.PropertyNamingStrategy; | ||||
| import com.fasterxml.jackson.databind.annotation.JsonNaming; | import com.fasterxml.jackson.databind.annotation.JsonNaming; | ||||
| import com.ruoyi.platform.annotations.CheckDuplicate; | |||||
| import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
| import java.util.Date; | import java.util.Date; | ||||
| @@ -25,6 +26,7 @@ public class Image implements Serializable { | |||||
| * 镜像名称 | * 镜像名称 | ||||
| */ | */ | ||||
| @ApiModelProperty(value = "名称") | @ApiModelProperty(value = "名称") | ||||
| @CheckDuplicate | |||||
| private String name; | private String name; | ||||
| @ApiModelProperty(value = "镜像描述") | @ApiModelProperty(value = "镜像描述") | ||||
| @@ -5,6 +5,7 @@ import com.fasterxml.jackson.annotation.JsonFormat; | |||||
| import com.fasterxml.jackson.annotation.JsonRawValue; | import com.fasterxml.jackson.annotation.JsonRawValue; | ||||
| import com.fasterxml.jackson.databind.PropertyNamingStrategy; | import com.fasterxml.jackson.databind.PropertyNamingStrategy; | ||||
| import com.fasterxml.jackson.databind.annotation.JsonNaming; | import com.fasterxml.jackson.databind.annotation.JsonNaming; | ||||
| import com.ruoyi.platform.annotations.CheckDuplicate; | |||||
| import com.ruoyi.platform.handler.BaseMetaObjectHandler; | import com.ruoyi.platform.handler.BaseMetaObjectHandler; | ||||
| import io.swagger.annotations.ApiModel; | import io.swagger.annotations.ApiModel; | ||||
| import io.swagger.annotations.ApiModelProperty; | import io.swagger.annotations.ApiModelProperty; | ||||
| @@ -33,6 +34,7 @@ public class Workflow extends BaseMetaObjectHandler implements Serializable { | |||||
| private Long id; | private Long id; | ||||
| @ApiModelProperty(value = "工作流名称") | @ApiModelProperty(value = "工作流名称") | ||||
| @CheckDuplicate | |||||
| private String name; | private String name; | ||||
| @ApiModelProperty(value = "流水线描述") | @ApiModelProperty(value = "流水线描述") | ||||
| @@ -1,5 +1,6 @@ | |||||
| package com.ruoyi.platform.mapper; | package com.ruoyi.platform.mapper; | ||||
| import com.ruoyi.platform.domain.Dataset; | |||||
| import com.ruoyi.platform.domain.Experiment; | import com.ruoyi.platform.domain.Experiment; | ||||
| import org.apache.ibatis.annotations.Param; | import org.apache.ibatis.annotations.Param; | ||||
| import org.springframework.data.domain.Pageable; | import org.springframework.data.domain.Pageable; | ||||
| @@ -80,6 +81,9 @@ public interface ExperimentDao { | |||||
| */ | */ | ||||
| int deleteById(Integer id); | int deleteById(Integer id); | ||||
| List<Experiment> queryByExperiment(@Param("experiment")Experiment experiment); | |||||
| List<Experiment> queryByExperiment(@Param("experiment") Experiment experiment); | |||||
| Experiment findByName(@Param("name") String name); | |||||
| } | } | ||||
| @@ -30,6 +30,7 @@ public class ExperimentInstanceStatusTask { | |||||
| private ExperimentInsDao experimentInsDao; | private ExperimentInsDao experimentInsDao; | ||||
| private List<Integer> experimentIds = new ArrayList<>(); | private List<Integer> experimentIds = new ArrayList<>(); | ||||
| @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 | @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 | ||||
| public void executeExperimentInsStatus() throws IOException { | public void executeExperimentInsStatus() throws IOException { | ||||
| // 首先查到所有非终止态的实验实例 | // 首先查到所有非终止态的实验实例 | ||||
| @@ -47,15 +48,16 @@ public class ExperimentInstanceStatusTask { | |||||
| } | } | ||||
| if (!StringUtils.equals(oldStatus,experimentIns.getStatus())){ | if (!StringUtils.equals(oldStatus,experimentIns.getStatus())){ | ||||
| experimentIns.setUpdateTime(new Date()); | experimentIns.setUpdateTime(new Date()); | ||||
| // 线程安全的添加操作 | |||||
| synchronized (experimentIds) { | synchronized (experimentIds) { | ||||
| experimentIds.add(experimentIns.getExperimentId()); // 线程安全的添加操作 | |||||
| experimentIds.add(experimentIns.getExperimentId()); | |||||
| } | } | ||||
| updateList.add(experimentIns); | updateList.add(experimentIns); | ||||
| } | } | ||||
| experimentInsDao.update(experimentIns); | experimentInsDao.update(experimentIns); | ||||
| } | } | ||||
| } | } | ||||
| if (updateList.size() > 0){ | if (updateList.size() > 0){ | ||||
| experimentInsDao.insertOrUpdateBatch(updateList); | experimentInsDao.insertOrUpdateBatch(updateList); | ||||
| @@ -85,11 +87,13 @@ public class ExperimentInstanceStatusTask { | |||||
| updateExperiments.add(experiment); | updateExperiments.add(experiment); | ||||
| } | } | ||||
| } | } | ||||
| if (!updateExperiments.isEmpty()) { | if (!updateExperiments.isEmpty()) { | ||||
| experimentDao.insertOrUpdateBatch(updateExperiments); | experimentDao.insertOrUpdateBatch(updateExperiments); | ||||
| for (int index = 0; index < updateExperiments.size(); index++) { | for (int index = 0; index < updateExperiments.size(); index++) { | ||||
| // 线程安全的删除操作 | |||||
| synchronized (experimentIds) { | synchronized (experimentIds) { | ||||
| experimentIds.remove(index); // 线程安全的删除操作 | |||||
| experimentIds.remove(index); | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| @@ -79,7 +79,7 @@ DatasetService { | |||||
| List<String> getDatasetVersions(Integer datasetId) throws Exception; | List<String> getDatasetVersions(Integer datasetId) throws Exception; | ||||
| String insertDatasetAndVersion(DatasetVo datasetVo) throws Exception; | String insertDatasetAndVersion(DatasetVo datasetVo) throws Exception; | ||||
| public void checkDeclaredName(Dataset insert) throws Exception; | |||||
| void checkDeclaredName(Dataset insert) throws Exception; | |||||
| ResponseEntity<InputStreamResource> downloadAllDatasetFiles(Integer datasetId, String version) throws Exception; | ResponseEntity<InputStreamResource> downloadAllDatasetFiles(Integer datasetId, String version) throws Exception; | ||||
| @@ -1,6 +1,7 @@ | |||||
| package com.ruoyi.platform.service; | package com.ruoyi.platform.service; | ||||
| import com.ruoyi.platform.domain.Experiment; | import com.ruoyi.platform.domain.Experiment; | ||||
| import com.ruoyi.platform.domain.Workflow; | |||||
| import org.springframework.data.domain.Page; | import org.springframework.data.domain.Page; | ||||
| import org.springframework.data.domain.PageRequest; | import org.springframework.data.domain.PageRequest; | ||||
| import org.springframework.http.ResponseEntity; | import org.springframework.http.ResponseEntity; | ||||
| @@ -75,4 +76,6 @@ public interface ExperimentService { | |||||
| ResponseEntity<Experiment> showExperimentConfig(Experiment experiment); | ResponseEntity<Experiment> showExperimentConfig(Experiment experiment); | ||||
| List<Experiment> queryByWorkflowId(Long id); | List<Experiment> queryByWorkflowId(Long id); | ||||
| void checkDeclaredName(Experiment insert) throws Exception; | |||||
| } | } | ||||
| @@ -1,6 +1,7 @@ | |||||
| package com.ruoyi.platform.service; | package com.ruoyi.platform.service; | ||||
| import com.fasterxml.jackson.core.JsonProcessingException; | import com.fasterxml.jackson.core.JsonProcessingException; | ||||
| import com.ruoyi.platform.domain.Dataset; | |||||
| import com.ruoyi.platform.domain.Workflow; | import com.ruoyi.platform.domain.Workflow; | ||||
| import org.springframework.data.domain.Page; | import org.springframework.data.domain.Page; | ||||
| import org.springframework.data.domain.PageRequest; | import org.springframework.data.domain.PageRequest; | ||||
| @@ -64,6 +65,8 @@ public interface WorkflowService { | |||||
| Workflow duplicateWorkflow(Long id); | Workflow duplicateWorkflow(Long id); | ||||
| void checkDeclaredName(Workflow insert) throws Exception; | |||||
| /** | /** | ||||
| * 按流水线id保存 | * 按流水线id保存 | ||||
| * | * | ||||
| @@ -1,6 +1,7 @@ | |||||
| package com.ruoyi.platform.service.impl; | package com.ruoyi.platform.service.impl; | ||||
| import com.ruoyi.common.security.utils.SecurityUtils; | import com.ruoyi.common.security.utils.SecurityUtils; | ||||
| import com.ruoyi.platform.annotations.CheckDuplicate; | |||||
| import com.ruoyi.platform.domain.Experiment; | import com.ruoyi.platform.domain.Experiment; | ||||
| import com.ruoyi.platform.domain.ExperimentIns; | import com.ruoyi.platform.domain.ExperimentIns; | ||||
| import com.ruoyi.platform.domain.Workflow; | import com.ruoyi.platform.domain.Workflow; | ||||
| @@ -25,6 +26,7 @@ import org.springframework.stereotype.Service; | |||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.lang.reflect.Field; | |||||
| import java.util.*; | import java.util.*; | ||||
| /** | /** | ||||
| @@ -317,6 +319,28 @@ public class ExperimentServiceImpl implements ExperimentService { | |||||
| return experimentDao.queryByExperiment(experiment); | 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()); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -1,6 +1,8 @@ | |||||
| package com.ruoyi.platform.service.impl; | package com.ruoyi.platform.service.impl; | ||||
| import com.ruoyi.common.security.utils.SecurityUtils; | 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.Experiment; | ||||
| import com.ruoyi.platform.domain.Workflow; | import com.ruoyi.platform.domain.Workflow; | ||||
| import com.ruoyi.platform.mapper.WorkflowDao; | import com.ruoyi.platform.mapper.WorkflowDao; | ||||
| @@ -18,6 +20,7 @@ import org.springframework.data.domain.PageRequest; | |||||
| import org.springframework.stereotype.Service; | import org.springframework.stereotype.Service; | ||||
| import javax.annotation.Resource; | import javax.annotation.Resource; | ||||
| import java.lang.reflect.Field; | |||||
| import java.util.Date; | import java.util.Date; | ||||
| import java.util.HashMap; | import java.util.HashMap; | ||||
| import java.util.List; | import java.util.List; | ||||
| @@ -191,7 +194,34 @@ public class WorkflowServiceImpl implements WorkflowService { | |||||
| } | } | ||||
| return null; | return null; | ||||
| } | } | ||||
| public void checkDeclaredName(Workflow insert) throws Exception { | |||||
| List<Workflow> 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()); | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -24,6 +24,14 @@ | |||||
| where id = #{id} and state = 1 | where id = #{id} and state = 1 | ||||
| </select> | </select> | ||||
| <!--查询单个--> | |||||
| <select id="findByName" resultMap="ExperimentMap"> | |||||
| select | |||||
| id,name, workflow_id, global_param, status_list, description, create_by, create_time, update_by, update_time, state | |||||
| from experiment | |||||
| where name = #{name} and state = 1 limit 1 | |||||
| </select> | |||||
| <!--根据experiment查询--> | <!--根据experiment查询--> | ||||
| <select id="queryByExperiment" resultMap="ExperimentMap"> | <select id="queryByExperiment" resultMap="ExperimentMap"> | ||||
| select | select | ||||
| @@ -145,6 +153,7 @@ | |||||
| </where> | </where> | ||||
| </select> | </select> | ||||
| <!--新增所有列--> | <!--新增所有列--> | ||||
| <insert id="insert" keyProperty="id" useGeneratedKeys="true"> | <insert id="insert" keyProperty="id" useGeneratedKeys="true"> | ||||
| insert into experiment(name,workflow_id, global_param, status_list, description, create_by, create_time, update_by, update_time, state) | insert into experiment(name,workflow_id, global_param, status_list, description, create_by, create_time, update_by, update_time, state) | ||||