diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/experiment/ExperimentController.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/experiment/ExperimentController.java index 1bbe9ac9..29210880 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/experiment/ExperimentController.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/controller/experiment/ExperimentController.java @@ -113,7 +113,7 @@ public class ExperimentController { */ @PutMapping("/experiments/{id}") @ApiOperation("运行实验") - public AjaxResult runExperiment(@PathVariable("id") Integer id) { + public AjaxResult runExperiment(@PathVariable("id") Integer id) throws Exception { return AjaxResult.success(this.experimentService.runExperiment(id)); } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ExperimentIns.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ExperimentIns.java index 1a539276..8b70946c 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ExperimentIns.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ExperimentIns.java @@ -42,6 +42,20 @@ public class ExperimentIns implements Serializable { private String nodesStatus; @ApiModelProperty(name = "nodes_logs") private String nodesLogs; + + /** + * 开始时间 + */ + @ApiModelProperty(name = "start_time") + private Date startTime; + + /** + * 结束时间 + */ + @ApiModelProperty(name = "finish_time") + private Date finishTime; + + /** * 创建者 */ @@ -129,6 +143,19 @@ public class ExperimentIns implements Serializable { this.nodesLogs = nodesLogs; } + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + + public Date getStartTime() {return startTime;} + + public void setFinishTime(Date finishTime) { + this.finishTime = finishTime; + } + + public Date getFinishTime() {return finishTime;} + + public String getCreateBy() { return createBy; } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/DatasetVersionDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/DatasetVersionDao.java index cd03cf26..56c4751d 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/DatasetVersionDao.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/DatasetVersionDao.java @@ -55,6 +55,8 @@ public interface DatasetVersionDao { */ int insertBatch(@Param("entities") List entities); + + /** * 批量新增或按主键更新数据(MyBatis原生foreach方法) * @@ -83,5 +85,7 @@ public interface DatasetVersionDao { List queryByDatasetId(Integer datasetId); DatasetVersion queryByDatasetVersion(DatasetVersion datasetVersion); + + } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentInsDao.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentInsDao.java index 063a1a87..48951900 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentInsDao.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/mapper/ExperimentInsDao.java @@ -29,7 +29,7 @@ public interface ExperimentInsDao { * @param pageable 分页对象 * @return 对象列表 */ - List queryAllByLimit(@Param("experimentIns")ExperimentIns experimentIns, @Param("pageable") Pageable pageable); + List queryAllByLimit(@Param("experimentIns") ExperimentIns experimentIns, @Param("pageable") Pageable pageable); /** * 统计总行数 @@ -37,7 +37,7 @@ public interface ExperimentInsDao { * @param experimentIns 查询条件 * @return 总行数 */ - long count(@Param("experimentIns")ExperimentIns experimentIns); + long count(@Param("experimentIns") ExperimentIns experimentIns); /** * 新增数据 @@ -45,7 +45,7 @@ public interface ExperimentInsDao { * @param experimentIns 实例对象 * @return 影响行数 */ - int insert(ExperimentIns experimentIns); + int insert(@Param("experimentIns") ExperimentIns experimentIns); /** * 批量新增数据(MyBatis原生foreach方法) @@ -70,7 +70,7 @@ public interface ExperimentInsDao { * @param experimentIns 实例对象 * @return 影响行数 */ - int update(ExperimentIns experimentIns); + int update(@Param("experimentIns") ExperimentIns experimentIns); /** * 通过主键删除数据 diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentInsService.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentInsService.java index 821c7e89..e86fa575 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentInsService.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/ExperimentInsService.java @@ -68,6 +68,7 @@ public interface ExperimentInsService { */ boolean deleteById(Integer id); + List queryByExperimentId(Integer id); 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 7e112e59..9e3b8a63 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 @@ -56,7 +56,7 @@ public interface ExperimentService { */ boolean deleteById(Integer id); String removeById(Integer id); - Experiment runExperiment(Integer id); + Experiment runExperiment(Integer id) throws Exception; Experiment addAndRunExperiment(Experiment experiment); diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java index 74c4aa3d..fa1eebf8 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/service/impl/ExperimentInsServiceImpl.java @@ -17,6 +17,7 @@ import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import javax.annotation.Resource; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -63,6 +64,7 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { @Override public ExperimentIns queryById(Integer id) { ExperimentIns experimentIns = this.experimentInsDao.queryById(id); + //获取实例当前状态 String currentStatus = experimentIns.getStatus(); // 检查是否需要调用接口查询状态:当原本状态为null或running或Pending时调用argo接口 @@ -76,7 +78,6 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { } } - return experimentIns; } @@ -241,6 +242,19 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { if (status == null || status.isEmpty()) { throw new RuntimeException("工作流状态为空。"); } + //解析流水线开始时间,开始时间一定存在,所以不需要判断 + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); + + String startedAtString = (String) status.get("startedAt"); + Date startTime = dateFormat.parse(startedAtString); + experimentIns.setStartTime(startTime); + + //解析流水线结束时间 + String finishedAtString = (String) status.get("finishedAt"); + if (finishedAtString != null && !finishedAtString.isEmpty()) { + Date finishTime = dateFormat.parse(finishedAtString); + experimentIns.setFinishTime(finishTime); + } // 解析nodes字段,提取节点状态并转换为JSON字符串 Map nodes = (Map) status.get("nodes"); @@ -261,7 +275,6 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { } - /** * 终止已经创建的实验实例 * @@ -303,9 +316,8 @@ public class ExperimentInsServiceImpl implements ExperimentInsService { // 检查响应是否为空或无内容 if (StringUtils.isEmpty(req)) { throw new RuntimeException("终止响应内容为空。"); - } - + } // 将响应的JSON字符串转换为Map对象 Map runResMap = JsonUtils.jsonToMap(req); // 从响应Map中直接获取"errCode"的值 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 644f206c..bb2344d5 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 @@ -5,6 +5,7 @@ import com.ruoyi.platform.domain.Experiment; import com.ruoyi.platform.domain.ExperimentIns; import com.ruoyi.platform.domain.Workflow; import com.ruoyi.platform.mapper.ExperimentDao; +import com.ruoyi.platform.mapper.ExperimentInsDao; import com.ruoyi.platform.service.ExperimentInsService; import com.ruoyi.platform.service.ExperimentService; import com.ruoyi.platform.service.WorkflowService; @@ -35,6 +36,11 @@ public class ExperimentServiceImpl implements ExperimentService { @Resource private ExperimentDao experimentDao; + @Resource + private ExperimentInsDao experimentInsDao; + + + @Resource @Lazy private WorkflowService workflowService; @@ -192,7 +198,7 @@ public class ExperimentServiceImpl implements ExperimentService { * @return 是否成功 */ @Override - public Experiment runExperiment(Integer id) { + public Experiment runExperiment(Integer id) throws Exception { //先查出实验记录 Experiment experiment = this.queryById(id); @@ -200,13 +206,18 @@ public class ExperimentServiceImpl implements ExperimentService { System.out.println("No experiment"); } + Workflow workflow = workflowService.queryById(experiment.getWorkflowId()); + if(workflow == null) { + throw new RuntimeException("流水线不存在,请先创建流水线"); + } + String dag = workflow.getDag(); // 调argo转换接口 try { String convertRes = HttpUtils.sendPost(argoUrl + argoConvert, dag); if (convertRes == null || StringUtils.isEmpty(convertRes)) { - throw new RuntimeException("Failed to convert workflow."); + throw new RuntimeException("转换流水线失败"); } Map converMap = JsonUtils.jsonToMap(convertRes); // 组装运行接口json @@ -234,13 +245,16 @@ public class ExperimentServiceImpl implements ExperimentService { experimentIns.setArgoInsNs((String) metadata.get("namespace")); experimentIns.setArgoInsName((String) metadata.get("name")); //插入ExperimentIns表中 - experimentInsService.insert(experimentIns); + experimentInsDao.insert(experimentIns); }catch (Exception e){ throw new RuntimeException(e); } List experimentIns = experimentInsService.queryByExperimentId(id); + + experiment.setExperimentInsList(experimentIns); + return experiment; } @@ -253,7 +267,11 @@ public class ExperimentServiceImpl implements ExperimentService { throw new RuntimeException("Failed to add experiment."); } // 调用runExperiment方法运行实验 - newExperiment = this.runExperiment(newExperiment.getId()); + try { + newExperiment = this.runExperiment(newExperiment.getId()); + } catch (Exception e) { + throw new RuntimeException(e); + } return newExperiment; } diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ExperimentInsDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ExperimentInsDaoMapper.xml index 8b522836..9a4462fb 100644 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ExperimentInsDaoMapper.xml +++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/ExperimentInsDaoMapper.xml @@ -10,6 +10,8 @@ + + @@ -19,25 +21,23 @@ - - select - id, experiment_id, argo_ins_name, argo_ins_ns, status, nodes_status, nodes_logs, create_by, create_time, update_by, update_time, state + id, experiment_id, argo_ins_name, argo_ins_ns, status, nodes_status, nodes_logs, start_time, finish_time, create_by, create_time, update_by, update_time, state from experiment_ins state = 1 @@ -105,6 +111,12 @@ and nodes_logs = #{experimentIns.nodesLogs} + + and start_time = #{experimentIns.startTime} + + + and finish_time = #{experimentIns.finishTime} + and create_by = #{experimentIns.createBy} @@ -149,6 +161,12 @@ and nodes_logs = #{experimentIns.nodesLogs} + + and start_time = #{experimentIns.startTime} + + + and finish_time = #{experimentIns.finishTime} + and create_by = #{experimentIns.createBy} @@ -166,25 +184,25 @@ - insert into experiment_ins(experiment_id,argo_ins_name,argo_ins_ns,status,nodes_status,nodes_logs,create_by,create_time,update_by,update_time,state) - values (#{experimentIns.experimentId},#{experimentIns.argoInsName},#{experimentIns.argoInsNs},#{experimentIns.status},#{experimentIns.nodesStatus},#{experimentIns.nodesLogs},#{experimentIns.createBy},#{experimentIns.createTime},#{experimentIns.updateBy},#{experimentIns.updateTime},#{experimentIns.state}) + insert into experiment_ins(experiment_id,argo_ins_name,argo_ins_ns,status,nodes_status,nodes_logs,start_time,finish_time,create_by,create_time,update_by,update_time,state) + values (#{experimentIns.experimentId},#{experimentIns.argoInsName},#{experimentIns.argoInsNs},#{experimentIns.status},#{experimentIns.nodesStatus},#{experimentIns.nodesLogs},#{experimentIns.startTime},#{experimentIns.finishTime},#{experimentIns.createBy},#{experimentIns.createTime},#{experimentIns.updateBy},#{experimentIns.updateTime},#{experimentIns.state}) insert into - experiment_ins(experiment_id,argo_ins_name,argo_ins_ns,status,nodes_status,nodes_logs,create_by,create_time,update_by,update_time,state) + experiment_ins(experiment_id,argo_ins_name,argo_ins_ns,status,nodes_status,nodes_logs,start_time,finish_time,create_by,create_time,update_by,update_time,state) values - (#{entity.experimentId},#{entity.argoInsName},#{entity.argoInsNs},#{entity.status},#{entity.nodesStatus},#{entity.nodesStatus},#{entity.createBy},#{entity.createTime},#{entity.updateBy},#{entity.updateTime},#{entity.state}) + (#{entity.experimentId},#{entity.argoInsName},#{entity.argoInsNs},#{entity.status},#{entity.nodesStatus},#{entity.nodesLogs},#{entity.startTime},#{entity.finishTime},#{entity.createBy},#{entity.createTime},#{entity.updateBy},#{entity.updateTime},#{entity.state}) insert into - experiment_ins(experiment_id,argo_ins_name,argo_ins_ns,status,nodes_status,create_by,create_time,update_by,update_time,state) + experiment_ins(experiment_id,argo_ins_name,argo_ins_ns,status,nodes_status,start_time,finish_time,create_by,create_time,update_by,update_time,state) values - (#{entity.experimentId},#{entity.argoInsName},#{entity.argoInsNs},#{entity.status},#{entity.nodesStatus},#{entity.createBy},#{entity.createTime},#{entity.updateBy},#{entity.updateTime},#{entity.state}) + (#{entity.experimentId},#{entity.argoInsName},#{entity.argoInsNs},#{entity.status},#{entity.nodesStatus},#{entity.startTime},#{entity.finishTime},#{entity.createBy},#{entity.createTime},#{entity.updateBy},#{entity.updateTime},#{entity.state}) on duplicate key update experiment_id = values(experiment_id)argo_ins_name = values(argo_ins_name)argo_ins_ns = @@ -213,6 +231,12 @@ nodes_logs = #{experimentIns.nodesLogs}, + + start_time = #{experimentIns.startTime}, + + + finish_time = #{experimentIns.finishTime}, + create_by = #{experimentIns.createBy}, diff --git a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/WorkflowDaoMapper.xml b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/WorkflowDaoMapper.xml index 755a11da..fe4a1fac 100644 --- a/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/WorkflowDaoMapper.xml +++ b/ruoyi-modules/management-platform/src/main/resources/mapper/managementPlatform/WorkflowDaoMapper.xml @@ -33,7 +33,7 @@ and id = #{workflow.id} - and name = #{workflow.name} + and name like "%"#{workflow.name}"%" and description = #{workflow.description} @@ -68,7 +68,7 @@ and id = #{workflow.id} - and name = #{workflow.name} + and name like "%"#{workflow.name}"%" and description = #{workflow.description} @@ -171,6 +171,7 @@ state = 1 + and name like "%"#{workflow.name}"%"