Browse Source

流水线,实验名字添加判重

pull/44/head
西大锐 1 year ago
parent
commit
c5a9b01abb
11 changed files with 88 additions and 5 deletions
  1. +2
    -0
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Experiment.java
  2. +2
    -0
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Image.java
  3. +2
    -0
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Workflow.java
  4. +5
    -1
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java
  5. +7
    -3
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java
  6. +1
    -1
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java
  7. +3
    -0
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentService.java
  8. +3
    -0
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/WorkflowService.java
  9. +24
    -0
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java
  10. +30
    -0
      ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowServiceImpl.java
  11. +9
    -0
      ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ExperimentDaoMapper.xml

+ 2
- 0
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Experiment.java View File

@@ -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
- 0
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Image.java View File

@@ -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 = "镜像描述")


+ 2
- 0
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/Workflow.java View File

@@ -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 = "流水线描述")


+ 5
- 1
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentDao.java View File

@@ -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);

} }



+ 7
- 3
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java View File

@@ -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);
} }
} }
} }


+ 1
- 1
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/DatasetService.java View File

@@ -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;




+ 3
- 0
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentService.java View File

@@ -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;
} }

+ 3
- 0
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/WorkflowService.java View File

@@ -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保存
* *


+ 24
- 0
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentServiceImpl.java View File

@@ -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());
}
}
}
}









+ 30
- 0
ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/WorkflowServiceImpl.java View File

@@ -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());
}
}
}
}





} }

+ 9
- 0
ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ExperimentDaoMapper.xml View File

@@ -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)


Loading…
Cancel
Save