Merge remote-tracking branch 'origin/main'

This commit is contained in:
2025-11-25 16:37:57 +08:00
26 changed files with 277 additions and 147 deletions

2
.idea/compiler.xml generated
View File

@@ -16,6 +16,7 @@
<module name="common" />
<module name="data" />
<module name="submit" />
<module name="flowable" />
<module name="approve" />
<module name="project" />
</profile>
@@ -31,6 +32,7 @@
<module name="capability" options="-parameters" />
<module name="common" options="-parameters" />
<module name="data" options="-parameters" />
<module name="flowable" options="-parameters" />
<module name="gateway" options="-parameters" />
<module name="gateway2" options="-parameters" />
<module name="pbs" options="-parameters" />

1
.idea/encodings.xml generated
View File

@@ -5,6 +5,7 @@
<file url="file://$PROJECT_DIR$/capability/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/common/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/data/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/flowable/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/gateway/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/gateway2/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/pbs/src/main/java" charset="UTF-8" />

1
.idea/misc.xml generated
View File

@@ -5,6 +5,7 @@
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
<option value="$PROJECT_DIR$/flowable/pom.xml" />
</list>
</option>
<option name="ignoredFiles">

17
.idea/modules.xml generated
View File

@@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/approve/approve.iml" filepath="$PROJECT_DIR$/approve/approve.iml" />
<module fileurl="file://$PROJECT_DIR$/capability/capability.iml" filepath="$PROJECT_DIR$/capability/capability.iml" />
<module fileurl="file://$PROJECT_DIR$/common/common.iml" filepath="$PROJECT_DIR$/common/common.iml" />
<module fileurl="file://$PROJECT_DIR$/data/data.iml" filepath="$PROJECT_DIR$/data/data.iml" />
<module fileurl="file://$PROJECT_DIR$/gateway2/gateway2.iml" filepath="$PROJECT_DIR$/gateway2/gateway2.iml" />
<module fileurl="file://$PROJECT_DIR$/pbs/pbs.iml" filepath="$PROJECT_DIR$/pbs/pbs.iml" />
<module fileurl="file://$PROJECT_DIR$/performance/performance.iml" filepath="$PROJECT_DIR$/performance/performance.iml" />
<module fileurl="file://$PROJECT_DIR$/project/project.iml" filepath="$PROJECT_DIR$/project/project.iml" />
<module fileurl="file://$PROJECT_DIR$/system/system.iml" filepath="$PROJECT_DIR$/system/system.iml" />
<module fileurl="file://$PROJECT_DIR$/task/task.iml" filepath="$PROJECT_DIR$/task/task.iml" />
</modules>
</component>
</project>

View File

@@ -20,4 +20,13 @@ public enum NodeTypeEnum {
public String getValue() {
return value;
}
/**
* 是否节点类型
*/
public static boolean isNodeType(String value) {
return PROJECT.getValue().equals(value) || PHASE.getValue().equals(value)
|| DISCIPLINE.getValue().equals(value) || MACHINE.getValue().equals(value)
|| WORKSPACE.getValue().equals(value);
}
}

View File

@@ -3,6 +3,6 @@ package com.sdm.common.entity.resp.pbs.hpc;
import lombok.Data;
@Data
public class CloneJobResp {
public class CloneJobResp extends HpcBaseResp {
private String jobId;
}

View File

@@ -3,6 +3,6 @@ package com.sdm.common.entity.resp.pbs.hpc;
import lombok.Data;
@Data
public class JobCancelResp {
public class JobCancelResp extends HpcBaseResp {
private Boolean canceled;
}

View File

@@ -3,6 +3,6 @@ package com.sdm.common.entity.resp.pbs.hpc;
import lombok.Data;
@Data
public class JobFinishResp {
public class JobFinishResp extends HpcBaseResp {
private Boolean finished;
}

View File

@@ -3,6 +3,6 @@ package com.sdm.common.entity.resp.pbs.hpc;
import lombok.Data;
@Data
public class JobModifyResp {
public class JobModifyResp extends HpcBaseResp {
private Boolean modified;
}

View File

@@ -3,7 +3,7 @@ package com.sdm.common.entity.resp.pbs.hpc;
import lombok.Data;
@Data
public class JobRequeueResp {
public class JobRequeueResp extends HpcBaseResp {
private Boolean requeued;

View File

@@ -1,9 +1,10 @@
package com.sdm.common.entity.resp.pbs.hpc;
import com.sdm.common.common.SdmResponse;
import lombok.Data;
@Data
public class JobViewResp {
public class JobViewResp extends HpcBaseResp{
String id;
String state;
String name;

View File

@@ -0,0 +1,13 @@
package com.sdm.common.entity.resp.pbs.hpc.listjobs;
import com.sdm.common.entity.resp.pbs.hpc.HpcBaseResp;
import lombok.Data;
import java.util.List;
@Data
public class ListJobResp extends HpcBaseResp {
private List<ListJobs> listJobs;
}

View File

@@ -1,9 +1,9 @@
package com.sdm.common.entity.resp.pbs.hpc;
package com.sdm.common.entity.resp.pbs.hpc.listjobs;
import lombok.Data;
@Data
public class ListJobResp {
public class ListJobs {
// 任务ID对应表格Id列
private String id;
// 所有者对应表格Owner列格式\用户名

View File

@@ -1,9 +1,9 @@
package com.sdm.common.entity.resp.pbs.hpc;
package com.sdm.common.entity.resp.pbs.hpc.listtasks;
import lombok.Data;
@Data
public class ListTasksResp {
public class ListTasks {
private String taskId;
private String state;
private String taskName;

View File

@@ -0,0 +1,13 @@
package com.sdm.common.entity.resp.pbs.hpc.listtasks;
import com.sdm.common.entity.resp.pbs.hpc.HpcBaseResp;
import lombok.Data;
import java.util.List;
@Data
public class ListTasksResp extends HpcBaseResp {
private List<ListTasks> listTasks;
}

View File

@@ -63,6 +63,40 @@ public class SimulationNodeFeignClientImpl implements ISimulationNodeFeignClient
}
@Override
public SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getNodeTaskList(String uuid) {
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> response;
try {
log.info("获取节点下的task列表请求参数uuid={}", uuid);
response = ISimulationNodeFeignClient.getNodeTaskList(uuid);
if (!response.isSuccess() || response.getData() == null || response.getData().isEmpty()) {
return SdmResponse.failed("获取节点下的task列表失败");
}
} catch (Exception e) {
log.error("获取节点下的task列表失败", e);
return SdmResponse.failed("获取节点下的task列表失败");
}
return response;
}
@Override
public SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getTaskRunList(String uuid) {
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> response;
try {
log.info("获取task下的run请求参数uuid={}", uuid);
response = ISimulationNodeFeignClient.getTaskRunList(uuid);
if (!response.isSuccess() || response.getData() == null || response.getData().isEmpty()) {
return SdmResponse.failed("获取task下的run失败");
}
} catch (Exception e) {
log.error("获取task下的run失败", e);
return SdmResponse.failed("获取task下的run失败");
}
return response;
}
@Override
public SdmResponse delteNode(DelNodeReq req) {
SdmResponse response;

View File

@@ -5,6 +5,7 @@ import com.sdm.common.entity.req.project.DelNodeReq;
import com.sdm.common.entity.req.project.SpdmNodeListReq;
import com.sdm.common.entity.resp.AllNodeByProjectIdAndTypeResp;
import com.sdm.common.entity.resp.project.SimulationNodeResp;
import io.swagger.v3.oas.annotations.Operation;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -33,6 +34,18 @@ public interface ISimulationNodeFeignClient {
@GetMapping("/node/getAllNodeByProjectIdAndType")
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getAllNodeByProjectIdAndType(@RequestParam(value = "chooseNodeId") String uuid, @RequestParam(value = "nextNodeType") String nextNodeType);
/**
* 获取节点下的task列表
*/
@GetMapping("/node/getNodeTaskList")
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getNodeTaskList(@RequestParam(value = "uuid") String uuid);
/**
* 获取task下的run
*/
@GetMapping("/node/getNodeTaskRunList")
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getTaskRunList(@RequestParam(value = "uuid") String uuid);
@PostMapping("node/delteNode")
SdmResponse delteNode(@RequestBody DelNodeReq req);

View File

@@ -1,6 +1,8 @@
package com.sdm.common.utils;
import com.sdm.common.entity.resp.pbs.hpc.*;
import com.sdm.common.entity.resp.pbs.hpc.listjobs.ListJobs;
import com.sdm.common.entity.resp.pbs.hpc.listtasks.ListTasks;
import com.sdm.common.entity.resp.pbs.hpc.nodecore.NodeListCore;
import com.sdm.common.entity.resp.pbs.hpc.nodelist.NodeList;
import com.sdm.common.log.CoreLogger;
@@ -81,20 +83,17 @@ public class HpcCommandResulParseUtil {
}
}
public static List<ListJobResp> parseJobLists(String cmdOutput) {
List<ListJobResp> result = new ArrayList<>();
public static List<ListJobs> parseJobLists(String cmdOutput) {
List<ListJobs> result = new ArrayList<>();
try {
if (StringUtils.isBlank(cmdOutput)) {
CoreLogger.error("parseJobLists cmdOutput null,cmdOutput:{}",cmdOutput);
return result;
}
String[] lines = cmdOutput.split("\r?\n");
ListJobResp current = null;
ListJobs current = null;
for (String line : lines) {
if (line == null) continue;
String trimmed = line.trim();
if (StringUtils.isBlank(trimmed)) {
continue; // 空行直接跳过,不影响逻辑
@@ -121,7 +120,7 @@ public class HpcCommandResulParseUtil {
if (current != null && current.getId() != null) {
result.add(current);
}
current = new ListJobResp();
current = new ListJobs();
current.setId(value);
continue;
}
@@ -161,13 +160,13 @@ public class HpcCommandResulParseUtil {
return result;
}
public static List<ListTasksResp> parseJobTasks(String cmdOutput) {
List<ListTasksResp> result = new ArrayList<>();
public static List<ListTasks> parseJobTasks(String cmdOutput) {
List<ListTasks> result = new ArrayList<>();
if (cmdOutput == null || cmdOutput.trim().isEmpty()) {
return result;
}
String[] lines = cmdOutput.split("\r?\n");
ListTasksResp current = null;
ListTasks current = null;
String lastKey = null;
for (String line : lines) {
String trimmed = line.trim();
@@ -182,7 +181,7 @@ public class HpcCommandResulParseUtil {
// 遇到 Task Id 开头新建对象
if (trimmed.startsWith("Task Id")) {
current = new ListTasksResp();
current = new ListTasks();
}
if (current == null) continue;
if (trimmed.contains(":")) {
@@ -235,11 +234,10 @@ public class HpcCommandResulParseUtil {
}
public static JobViewResp parseJobView(String cmdOutput) {
if (cmdOutput == null || cmdOutput.trim().isEmpty()) {
return null;
}
JobViewResp job = new JobViewResp();
if (cmdOutput == null || cmdOutput.trim().isEmpty()) {
return job;
}
JobViewTaskStatus taskStatus = new JobViewTaskStatus();
boolean inTaskBlock = false; // 标识是否在 Task Count 下的嵌套块
String lastKey = null; // 记录上一行 key用于多行值累加

View File

@@ -7,6 +7,7 @@ import com.github.pagehelper.PageInfo;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.enums.DataTypeEnum;
import com.sdm.common.entity.enums.DirTypeEnum;
import com.sdm.common.entity.enums.NodeTypeEnum;
import com.sdm.common.entity.req.data.CreateDirReq;
import com.sdm.common.entity.req.data.DelDirReq;
import com.sdm.common.entity.req.data.UploadFilesReq;
@@ -26,6 +27,8 @@ import com.sdm.data.service.IDimensionTemplateHierarchyService;
import com.sdm.data.service.IDimensionTemplateService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.sdm.data.service.IFileMetadataInfoService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -38,6 +41,7 @@ import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
/**
* <p>
@@ -47,6 +51,7 @@ import java.util.Optional;
* @author author
* @since 2025-09-04
*/
@Slf4j
@Service
public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateMapper, DimensionTemplate> implements IDimensionTemplateService {
@Autowired
@@ -166,7 +171,7 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
queryWrapper.eq(DimensionTemplateHierarchy::getTemplateId, dimensionTemplateId).orderByAsc(DimensionTemplateHierarchy::getSortOrder);
List<String> dimensionNodeTyepOrderList = dimensionTemplateHierarchyService.list(queryWrapper).stream().map(DimensionTemplateHierarchy::getDisplayName).toList();
List<String> uuids = null;
List<String> uuids = new ArrayList<>();
List<FileMetadataInfo> resultDir = new ArrayList<>();
if (ObjectUtils.isEmpty(req.getFileId())) {
// 选中维度了,没有选节点,按照模版,展示模版的第一层节点数据
@@ -174,15 +179,16 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> allNodeByNodeTypeResponse = simuluationNodeFeignClient.getAllNodeByNodeType(null, rootNodeType);
if (!allNodeByNodeTypeResponse.isSuccess()) {
log.error("获取节点信息失败");
return SdmResponse.success();
}
uuids = allNodeByNodeTypeResponse.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList();
uuids.addAll(allNodeByNodeTypeResponse.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
} else {
// 选中维度了,也选中了节点,按照模版,展示该节点的下一层节点文件夹和普通文件夹
// 选中维度了,也选中了节点,按照模版,展示该节点下的普通文件夹、任务、算列、按照展示模版指定的下一层节点文件夹
Long fileId = req.getFileId();
// 先获取普通文件夹
// 1、先获取普通文件夹
List<FileMetadataInfo> dirInfos = fileMetadataInfoService
.lambdaQuery()
.eq(FileMetadataInfo::getParentId, fileId)
@@ -192,36 +198,46 @@ public class DimensionTemplateServiceImpl extends ServiceImpl<DimensionTemplateM
resultDir.addAll(dirInfos);
// 再获取节点文件夹
// 2、再获取节点文件夹
FileMetadataInfo nodeDirInfo = fileMetadataInfoService.getById(fileId);
String chooseUuid = nodeDirInfo.getRelatedResourceUuid();
String chooseNodeType = nodeDirInfo.getRelatedResourceUuidOwnType();
// chooseUuid和chooseNodeType不为空才是节点文件夹才需要查询子节点文件夹文件
if (ObjectUtils.isNotEmpty(chooseUuid) && ObjectUtils.isNotEmpty(chooseNodeType)) {
// chooseUuid和chooseNodeType不为空,并且是node节点类型才是节点文件夹,才需要查询子节点文件夹文件
if (ObjectUtils.isNotEmpty(chooseUuid) && ObjectUtils.isNotEmpty(chooseNodeType) && NodeTypeEnum.isNodeType(chooseNodeType)) {
// 从dimensionNodeTyepOrderList中获取chooseNodeType下一个位置的数据有可能chooseNodeType所在位置就是最后一层节点,SdmResponse返回空数据
int index = dimensionNodeTyepOrderList.indexOf(chooseNodeType);
if (index == -1) {
return SdmResponse.failed("选中节点类型不在数据展示维度中");
}
if (index == dimensionNodeTyepOrderList.size() - 1) {
//尾节点,直接返回空数据
return SdmResponse.success();
// 判断是否是最后一层节点,如果是最后一层节点,则不需要查询子节点文件
if (index != dimensionNodeTyepOrderList.size() - 1) {
// 获取dimensionNodeTyepOrderList的index+1位置的节点类型
String nextNodeType = dimensionNodeTyepOrderList.get(index + 1);
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> allNodeByProjectIdAndType = simuluationNodeFeignClient.getAllNodeByProjectIdAndType(chooseUuid, nextNodeType);
if (!allNodeByProjectIdAndType.isSuccess()) {
return SdmResponse.success();
}
uuids.addAll(allNodeByProjectIdAndType.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
}
}
// 3、获取当前节点下的任务、算列
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> nodeTaskList = simuluationNodeFeignClient.getNodeTaskList(chooseUuid);
if (nodeTaskList.isSuccess()) {
uuids.addAll(nodeTaskList.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
log.info("获取节点下task的uudis:{}", uuids);
}
// 获取dimensionNodeTyepOrderList的index+1位置的节点类型
String nextNodeType = dimensionNodeTyepOrderList.get(index + 1);
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> allNodeByProjectIdAndType = simuluationNodeFeignClient.getAllNodeByProjectIdAndType(chooseUuid, nextNodeType);
if (!allNodeByProjectIdAndType.isSuccess()) {
return SdmResponse.success();
}
uuids = allNodeByProjectIdAndType.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList();
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> taskRunList = simuluationNodeFeignClient.getTaskRunList(chooseUuid);
if (taskRunList.isSuccess()) {
uuids.addAll(taskRunList.getData().stream().map(AllNodeByProjectIdAndTypeResp::getUuid).toList());
log.info("获取节点下taskRun的uudis:{}", uuids);
}
}
if (ObjectUtils.isEmpty(uuids)) {
if (CollectionUtils.isEmpty(uuids)) {
return SdmResponse.success(resultDir);
}

View File

@@ -2,10 +2,9 @@ package com.sdm.pbs.controller;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.pbs.hpc.*;
import com.sdm.common.entity.resp.pbs.hpc.AddJobResp;
import com.sdm.common.entity.resp.pbs.hpc.NewJobResp;
import com.sdm.common.entity.resp.pbs.hpc.NodeViewResp;
import com.sdm.common.entity.resp.pbs.hpc.SubmitHpcJobResp;
import com.sdm.common.entity.resp.pbs.hpc.*;
import com.sdm.common.entity.resp.pbs.hpc.listjobs.ListJobResp;
import com.sdm.common.entity.resp.pbs.hpc.listtasks.ListTasksResp;
import com.sdm.common.entity.resp.pbs.hpc.nodecore.NodeListCoreResp;
import com.sdm.common.entity.resp.pbs.hpc.nodelist.NodeListResp;
import com.sdm.pbs.service.TaskService;
@@ -72,49 +71,49 @@ public class TaskController {
@PostMapping("/jobCancel")
@Operation(summary = "取消job任务")
public SdmResponse jobCancel(@RequestBody CancelJobReq req) {
public SdmResponse<JobCancelResp> jobCancel(@RequestBody CancelJobReq req) {
return taskService.jobCancel(req);
}
@PostMapping("/jobClone")
@Operation(summary = "克隆job任务")
public SdmResponse jobClone(@RequestBody CloneJobReq req) {
public SdmResponse<CloneJobResp> jobClone(@RequestBody CloneJobReq req) {
return taskService.jobClone(req);
}
@PostMapping("/jobFinish")
@Operation(summary = "优雅完成job任务")
public SdmResponse jobFinish(@RequestBody FinishJobReq req) {
public SdmResponse<JobFinishResp> jobFinish(@RequestBody FinishJobReq req) {
return taskService.jobFinish(req);
}
@PostMapping("/jobList")
@Operation(summary = "有条件查询所有job任务")
public SdmResponse jobList(@RequestBody ListJobReq req) {
public SdmResponse<ListJobResp> jobList(@RequestBody ListJobReq req) {
return taskService.jobList(req);
}
@PostMapping("/jobTasks")
@Operation(summary = "查询所有作业列表")
public SdmResponse jobTasks(@RequestBody ListTasksReq req) {
public SdmResponse<ListTasksResp> jobTasks(@RequestBody ListTasksReq req) {
return taskService.jobTasks(req);
}
@PostMapping("/jobModify")
@Operation(summary = "修改作业属性")
public SdmResponse jobModify(@RequestBody JobModifyReq req) {
public SdmResponse<JobModifyResp> jobModify(@RequestBody JobModifyReq req) {
return taskService.jobModify(req);
}
@PostMapping("/jobRequeue")
@Operation(summary = "作业重新排队")
public SdmResponse jobRequeue(@RequestBody JobRequeueReq req) {
public SdmResponse<JobRequeueResp> jobRequeue(@RequestBody JobRequeueReq req) {
return taskService.jobRequeue(req);
}
@PostMapping("/jobView")
@Operation(summary = "查看作业视图")
public SdmResponse jobView(@RequestBody JobViewReq req) {
public SdmResponse<JobViewResp> jobView(@RequestBody JobViewReq req) {
return taskService.jobView(req);
}

View File

@@ -2,10 +2,9 @@ package com.sdm.pbs.service;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.pbs.hpc.*;
import com.sdm.common.entity.resp.pbs.hpc.AddJobResp;
import com.sdm.common.entity.resp.pbs.hpc.NewJobResp;
import com.sdm.common.entity.resp.pbs.hpc.NodeViewResp;
import com.sdm.common.entity.resp.pbs.hpc.SubmitHpcJobResp;
import com.sdm.common.entity.resp.pbs.hpc.*;
import com.sdm.common.entity.resp.pbs.hpc.listjobs.ListJobResp;
import com.sdm.common.entity.resp.pbs.hpc.listtasks.ListTasksResp;
import com.sdm.common.entity.resp.pbs.hpc.nodecore.NodeListCoreResp;
import com.sdm.common.entity.resp.pbs.hpc.nodelist.NodeListResp;
import org.springframework.http.ResponseEntity;
@@ -29,21 +28,21 @@ public interface TaskService {
SdmResponse<SubmitHpcJobResp> jobMergeSubmit(MergeSubmitHpcJobReq req);
SdmResponse jobCancel(CancelJobReq req);
SdmResponse<JobCancelResp> jobCancel(CancelJobReq req);
SdmResponse jobClone(CloneJobReq req);
SdmResponse<CloneJobResp> jobClone(CloneJobReq req);
SdmResponse jobFinish(FinishJobReq req);
SdmResponse<JobFinishResp> jobFinish(FinishJobReq req);
SdmResponse jobList(ListJobReq req);
SdmResponse<ListJobResp> jobList(ListJobReq req);
SdmResponse jobTasks(ListTasksReq req);
SdmResponse<ListTasksResp> jobTasks(ListTasksReq req);
SdmResponse jobModify(JobModifyReq req);
SdmResponse<JobModifyResp> jobModify(JobModifyReq req);
SdmResponse jobRequeue(JobRequeueReq req);
SdmResponse<JobRequeueResp> jobRequeue(JobRequeueReq req);
SdmResponse jobView(JobViewReq req);
SdmResponse<JobViewResp> jobView(JobViewReq req);
SdmResponse hpcChunkUploadFile(HpcChunkUploadFileReq req);

View File

@@ -6,6 +6,10 @@ import com.sdm.common.entity.constants.PermConstants;
import com.sdm.common.entity.pojo.pbs.hpc.*;
import com.sdm.common.entity.req.pbs.hpc.*;
import com.sdm.common.entity.resp.pbs.hpc.*;
import com.sdm.common.entity.resp.pbs.hpc.listjobs.ListJobResp;
import com.sdm.common.entity.resp.pbs.hpc.listjobs.ListJobs;
import com.sdm.common.entity.resp.pbs.hpc.listtasks.ListTasks;
import com.sdm.common.entity.resp.pbs.hpc.listtasks.ListTasksResp;
import com.sdm.common.entity.resp.pbs.hpc.nodecore.NodeListCore;
import com.sdm.common.entity.resp.pbs.hpc.nodecore.NodeListCoreResp;
import com.sdm.common.entity.resp.pbs.hpc.nodelist.NodeList;
@@ -189,135 +193,123 @@ public class TaskServiceImpl implements TaskService {
}
@Override
public SdmResponse jobCancel(CancelJobReq req) {
public SdmResponse<JobCancelResp> jobCancel(CancelJobReq req) {
String prefixStr = HpcCommandBuilderUtil.initCancelJobPrefixStr(req.getJobId(),req.getCancelWay());
CancelJobParam cancelJobParam = new CancelJobParam();
BeanUtils.copyProperties(req, cancelJobParam);
String cancelJobCommand = HpcCommandBuilderUtil.buildHpcCommandStr(prefixStr, cancelJobParam, "");
String result = hpcCommandExcuteUtil.excuteCmd(cancelJobCommand,hpcExcuteWay);
JobCancelResp jobCancelResp = HpcCommandResulParseUtil.parseJobCancel(result);
Map<String, Object> map = new HashMap<>();
map.put("hpcCommand", cancelJobCommand);
jobCancelResp.setHpcCommand(cancelJobCommand);
if(Objects.isNull(jobCancelResp)||Objects.equals(false,jobCancelResp.getCanceled())){
map.put("errMsg", result);
return SdmResponse.failed(map);
jobCancelResp.setErrMsg(result);
return SdmResponse.failed(result,jobCancelResp);
}
map.put("result", jobCancelResp);
return SdmResponse.success(map);
return SdmResponse.success(jobCancelResp);
}
@Override
public SdmResponse jobClone(CloneJobReq req) {
public SdmResponse<CloneJobResp> jobClone(CloneJobReq req) {
String prefixStr = HpcCommandBuilderUtil.initCloneJobPrefixStr(req.getJobId());
CloneJobParam cloneJobParam = new CloneJobParam();
BeanUtils.copyProperties(req, cloneJobParam);
String cloneJobCommand = HpcCommandBuilderUtil.buildHpcCommandStr(prefixStr, cloneJobParam, "");
String result = hpcCommandExcuteUtil.excuteCmd(cloneJobCommand,hpcExcuteWay);
CloneJobResp cloneJobResp = HpcCommandResulParseUtil.parseJobCloneResult(result);
Map<String, Object> map = new HashMap<>();
map.put("hpcCommand", cloneJobCommand);
cloneJobResp.setHpcCommand(cloneJobCommand);
if(Objects.isNull(cloneJobResp)||StringUtils.isBlank(cloneJobResp.getJobId())){
map.put("errMsg", result);
return SdmResponse.failed(map);
cloneJobResp.setErrMsg(result);
return SdmResponse.failed(result,cloneJobResp);
}
map.put("result", cloneJobResp);
return SdmResponse.success(map);
return SdmResponse.success(cloneJobResp);
}
@Override
public SdmResponse jobFinish(FinishJobReq req) {
public SdmResponse<JobFinishResp> jobFinish(FinishJobReq req) {
String prefixStr = HpcCommandBuilderUtil.initFinishJobPrefixStr(req.getJobId(),req.getFinshWay());
FinishJobParam finishJobParam = new FinishJobParam();
BeanUtils.copyProperties(req, finishJobParam);
String finishJobCommand = HpcCommandBuilderUtil.buildHpcCommandStr(prefixStr, finishJobParam, "");
String result = hpcCommandExcuteUtil.excuteCmd(finishJobCommand,hpcExcuteWay);
JobFinishResp jobFinishResp = HpcCommandResulParseUtil.parseJobFinish(result);
Map<String, Object> map = new HashMap<>();
map.put("hpcCommand", finishJobCommand);
jobFinishResp.setHpcCommand(finishJobCommand);
if(Objects.isNull(jobFinishResp)||Objects.equals(false,jobFinishResp.getFinished())){
map.put("errMsg", result);
return SdmResponse.failed(map);
jobFinishResp.setErrMsg(result);
return SdmResponse.failed(result,jobFinishResp);
}
map.put("result", jobFinishResp);
return SdmResponse.success(map);
return SdmResponse.success(jobFinishResp);
}
@Override
public SdmResponse jobList(ListJobReq req) {
public SdmResponse<ListJobResp> jobList(ListJobReq req) {
String prefixStr = HpcCommandBuilderUtil.initListJobPrefixStr(req.getAll());
ListJobParam listJobParam = new ListJobParam();
BeanUtils.copyProperties(req, listJobParam);
String listJobCommand = HpcCommandBuilderUtil.buildHpcCommandStr(prefixStr, listJobParam, "");
String result = hpcCommandExcuteUtil.excuteCmd(listJobCommand,hpcExcuteWay);
List<ListJobResp> jobLists = HpcCommandResulParseUtil.parseJobLists(result);
Map<String, Object> map = new HashMap<>();
map.put("hpcCommand", listJobCommand);
map.put("result", jobLists);
return SdmResponse.success(map);
List<ListJobs> jobLists = HpcCommandResulParseUtil.parseJobLists(result);
ListJobResp listJobResp = new ListJobResp();
listJobResp.setListJobs(jobLists);
listJobResp.setHpcCommand(listJobCommand);
return SdmResponse.success(listJobResp);
}
@Override
public SdmResponse jobTasks(ListTasksReq req) {
public SdmResponse<ListTasksResp> jobTasks(ListTasksReq req) {
String prefixStr = HpcCommandBuilderUtil.initTasksJobPrefixStr(req.getJobId(),req.getExpand());
ListTasksParam listTasksParam = new ListTasksParam();
BeanUtils.copyProperties(req, listTasksParam);
String listTasksJobCommand = HpcCommandBuilderUtil.buildHpcCommandStr(prefixStr, listTasksParam, "");
String result = hpcCommandExcuteUtil.excuteCmd(listTasksJobCommand,hpcExcuteWay);
List<ListTasksResp> jobTaskResp = HpcCommandResulParseUtil.parseJobTasks(result);
Map<String, Object> map = new HashMap<>();
map.put("hpcCommand", listTasksJobCommand);
map.put("result", jobTaskResp);
return SdmResponse.success(map);
List<ListTasks> jobTaskResp = HpcCommandResulParseUtil.parseJobTasks(result);
ListTasksResp listTasksResp = new ListTasksResp();
listTasksResp.setListTasks(jobTaskResp);
listTasksResp.setHpcCommand(listTasksJobCommand);
return SdmResponse.success(listTasksResp);
}
@Override
public SdmResponse jobModify(JobModifyReq req) {
public SdmResponse<JobModifyResp> jobModify(JobModifyReq req) {
String prefixStr = HpcCommandBuilderUtil.initModifyJobPrefixStr(req.getJobId(),req.getClearexcludednodes());
JobModifyParam jobModifyParam = new JobModifyParam();
BeanUtils.copyProperties(req, jobModifyParam);
String modifyJobCommand = HpcCommandBuilderUtil.buildHpcCommandStr(prefixStr, jobModifyParam, "");
String result = hpcCommandExcuteUtil.excuteCmd(modifyJobCommand,hpcExcuteWay);
JobModifyResp jobModifyResp = HpcCommandResulParseUtil.parseJobModify(result);
Map<String, Object> map = new HashMap<>();
map.put("hpcCommand", modifyJobCommand);
jobModifyResp.setHpcCommand(modifyJobCommand);
if(Objects.isNull(jobModifyResp)||Objects.equals(false,jobModifyResp.getModified())){
map.put("errMsg", result);
return SdmResponse.failed(map);
jobModifyResp.setErrMsg(result);
return SdmResponse.failed(result,jobModifyResp);
}
map.put("result", jobModifyResp);
return SdmResponse.success(map);
return SdmResponse.success(jobModifyResp);
}
@Override
public SdmResponse jobRequeue(JobRequeueReq req) {
public SdmResponse<JobRequeueResp> jobRequeue(JobRequeueReq req) {
String prefixStr = HpcCommandBuilderUtil.initRequeueJobPrefixStr(req.getJobId());
JobRequeueParam jobRequeueParam = new JobRequeueParam();
BeanUtils.copyProperties(req, jobRequeueParam);
String requeueJobCommand = HpcCommandBuilderUtil.buildHpcCommandStr(prefixStr, jobRequeueParam, "");
String result = hpcCommandExcuteUtil.excuteCmd(requeueJobCommand,hpcExcuteWay);
JobRequeueResp jobRequeueResp = HpcCommandResulParseUtil.parseJobRequeue(result);
Map<String, Object> map = new HashMap<>();
map.put("hpcCommand", requeueJobCommand);
jobRequeueResp.setHpcCommand(requeueJobCommand);
if(Objects.isNull(jobRequeueResp)||Objects.equals(false,jobRequeueResp.getRequeued())){
map.put("errMsg", result);
return SdmResponse.failed(map);
jobRequeueResp.setErrMsg(result);
return SdmResponse.failed(result,jobRequeueResp);
}
map.put("result", jobRequeueResp);
return SdmResponse.success(map);
return SdmResponse.success(jobRequeueResp);
}
@Override
public SdmResponse jobView(JobViewReq req) {
public SdmResponse<JobViewResp> jobView(JobViewReq req) {
String prefixStr = HpcCommandBuilderUtil.initViewJobPrefixStr(req.getJobId());
JobViewParam jobViewParam = new JobViewParam();
BeanUtils.copyProperties(req, jobViewParam);
String viewJobCommand = HpcCommandBuilderUtil.buildHpcCommandStr(prefixStr, jobViewParam, "");
String result = hpcCommandExcuteUtil.excuteCmd(viewJobCommand,hpcExcuteWay);
JobViewResp jobViewResp = HpcCommandResulParseUtil.parseJobView(result);
Map<String, Object> map = new HashMap<>();
map.put("hpcCommand", viewJobCommand);
map.put("result", jobViewResp);
return SdmResponse.success(map);
jobViewResp.setHpcCommand(viewJobCommand);
return SdmResponse.success(jobViewResp);
}
/**

12
pom.xml
View File

@@ -21,6 +21,7 @@
<module>system</module>
<module>submit</module>
<module>common</module>
<module>flowable</module>
</modules>
<!--引入Spring Boot项目子项目都是这个版本-->
@@ -37,7 +38,6 @@
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring-boot.version>3.3.5</spring-boot.version>
<java.version>17</java.version>
<mybatis.plus.version>3.5.3.1</mybatis.plus.version>
<mybatis-plus-boot.version>3.5.9</mybatis-plus-boot.version>
<mysql.version>8.4.0</mysql.version>
<fastjson.version>2.0.50</fastjson.version>
@@ -50,11 +50,6 @@
<!-- 对子项目依赖进行版本管理 子模块引用无需声明版本号 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>${mybatis.plus.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
@@ -121,11 +116,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- mybatis-plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>

View File

@@ -141,6 +141,24 @@ public class SimulationNodeController implements ISimulationNodeFeignClient {
return nodeService.getAllNodeByProjectIdAndType(uuid, nextNodeType);
}
/**
* 获取节点下的task列表
*/
@GetMapping("/getNodeTaskList")
@Operation(summary = "获取节点下的task列表", description = "获取节点下的task列表")
public SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getNodeTaskList(@RequestParam(value = "uuid") String uuid) {
return nodeService.getNodeTaskList(uuid);
}
/**
* 获取task下的run
*/
@GetMapping("/getNodeTaskRunList")
@Operation(summary = "获取task下的run", description = "获取task下的run")
public SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getTaskRunList(@RequestParam(value = "uuid") String uuid) {
return nodeService.getTaskRunList(uuid);
}
/**
* 用户组项目统计

View File

@@ -11,6 +11,7 @@ import com.sdm.common.entity.resp.project.SimulationNodeResp;
import com.sdm.project.model.entity.SimulationNode;
import com.sdm.project.model.req.*;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@@ -35,6 +36,10 @@ public interface INodeService extends IService<SimulationNode> {
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getAllNodeByProjectIdAndType(String uuid, String nextNodeType);
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getNodeTaskList(String uuid);
SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getTaskRunList(String uuid);
SdmResponse getUserGroupProjectStatistics(Long userGroupId, Long userId);
SdmResponse getUserGroupTaskCompleteStatistics(GetUserGroupTaskCompleteStatisticsReq req);

View File

@@ -756,6 +756,49 @@ public class NodeServiceImpl extends ServiceImpl<SimulationNodeMapper, Simulatio
return SdmResponse.success(allNodeByProjectIdAndTypeRespList);
}
@Override
public SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getNodeTaskList(String uuid) {
if(ObjectUtils.isEmpty(uuid)){
return SdmResponse.success();
}
List<SimulationTask> simulationTasks = simulationTaskService.lambdaQuery().eq(SimulationTask::getNodeId, uuid).list();
if(CollectionUtils.isEmpty(simulationTasks)){
return SdmResponse.success();
}
List<AllNodeByProjectIdAndTypeResp> allNodeByProjectIdAndTypeRespList = new ArrayList<>();
simulationTasks.forEach(simulationTask -> {
AllNodeByProjectIdAndTypeResp allNodeByProjectIdAndTypeResp = new AllNodeByProjectIdAndTypeResp();
allNodeByProjectIdAndTypeResp.setId(simulationTask.getId().longValue());
allNodeByProjectIdAndTypeResp.setUuid(simulationTask.getUuid());
allNodeByProjectIdAndTypeResp.setNodeName(simulationTask.getTaskName());
allNodeByProjectIdAndTypeResp.setNodeType(NodeTypeEnum.TASK.getValue());
allNodeByProjectIdAndTypeRespList.add(allNodeByProjectIdAndTypeResp);
});
return SdmResponse.success(allNodeByProjectIdAndTypeRespList);
}
@Override
public SdmResponse<List<AllNodeByProjectIdAndTypeResp>> getTaskRunList(String uuid) {
if(ObjectUtils.isEmpty(uuid)){
return SdmResponse.success();
}
List<SimulationRun> simulationRunList = simulationRunService.lambdaQuery().eq(SimulationRun::getTaskId, uuid).list();
if(CollectionUtils.isEmpty(simulationRunList)){
return SdmResponse.success();
}
List<AllNodeByProjectIdAndTypeResp> allNodeByProjectIdAndTypeRespList = new ArrayList<>();
simulationRunList.forEach(simulationRun -> {
AllNodeByProjectIdAndTypeResp allNodeByProjectIdAndTypeResp = new AllNodeByProjectIdAndTypeResp();
allNodeByProjectIdAndTypeResp.setId(simulationRun.getId().longValue());
allNodeByProjectIdAndTypeResp.setUuid(simulationRun.getUuid());
allNodeByProjectIdAndTypeResp.setNodeName(simulationRun.getRunName());
allNodeByProjectIdAndTypeResp.setNodeType(NodeTypeEnum.RUN.getValue());
allNodeByProjectIdAndTypeRespList.add(allNodeByProjectIdAndTypeResp);
});
return SdmResponse.success(allNodeByProjectIdAndTypeRespList);
}
public static void setTagProperty(Object obj, String propertyName, Object value) throws Exception {
Class<?> clazz = obj.getClass();
Field field = clazz.getDeclaredField(propertyName);