From 09d4e3bd0d5e39d2d7865e4cb9dac8b08fc246b0 Mon Sep 17 00:00:00 2001 From: yangyang Date: Thu, 16 Apr 2026 18:41:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=EF=BC=9AHPC=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E5=8F=96=E6=B6=88&=E5=88=A0=E9=99=A4=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/entity/req/pbs/DelHpcJobsReq.java | 1 + .../com/sdm/pbs/controller/TaskAdapter.java | 110 ++++++++++++++++++ .../sdm/pbs/model/entity/HpcJobStatus.java | 16 +++ 3 files changed, 127 insertions(+) diff --git a/common/src/main/java/com/sdm/common/entity/req/pbs/DelHpcJobsReq.java b/common/src/main/java/com/sdm/common/entity/req/pbs/DelHpcJobsReq.java index 06c4307e..7e61e33a 100644 --- a/common/src/main/java/com/sdm/common/entity/req/pbs/DelHpcJobsReq.java +++ b/common/src/main/java/com/sdm/common/entity/req/pbs/DelHpcJobsReq.java @@ -6,5 +6,6 @@ import java.util.List; @Data public class DelHpcJobsReq { + private List ids; private List hpcJobIds; } diff --git a/pbs/src/main/java/com/sdm/pbs/controller/TaskAdapter.java b/pbs/src/main/java/com/sdm/pbs/controller/TaskAdapter.java index df734e94..065e0438 100644 --- a/pbs/src/main/java/com/sdm/pbs/controller/TaskAdapter.java +++ b/pbs/src/main/java/com/sdm/pbs/controller/TaskAdapter.java @@ -3,11 +3,13 @@ package com.sdm.pbs.controller; import com.alibaba.fastjson2.JSONObject; import com.sdm.common.common.SdmResponse; import com.sdm.common.common.ThreadLocalContext; +import com.sdm.common.entity.req.pbs.DelHpcJobsReq; import com.sdm.common.entity.req.pbs.SubmitHpcTaskRemoteReq; import com.sdm.common.feign.inter.pbs.ITaskFeignClient; import com.sdm.common.utils.FilesUtil; import com.sdm.pbs.config.PbsCommonConstant; import com.sdm.pbs.model.bo.BatchWebSubmitResp; +import com.sdm.pbs.model.entity.HpcJobStatus; import com.sdm.pbs.model.entity.SimulationJob; import com.sdm.pbs.model.req.BatchHpcTaskReq; import com.sdm.pbs.model.req.OneHpcTaskReq; @@ -30,6 +32,7 @@ import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; @Slf4j @RestController @@ -117,6 +120,113 @@ public class TaskAdapter implements ITaskFeignClient { return SdmResponse.success("提交成功"); } + @GetMapping("/stopHpcJobAdapter") + @Operation(summary = "作业停止-根据数据主键") + public SdmResponse stopHpcJob(@RequestParam Long id) { + if(Objects.isNull(id)) { + return SdmResponse.failed("id不能为空"); + } + SimulationJob jobDb = simulationJobService.lambdaQuery().eq(SimulationJob::getId,id).one(); + if(Objects.isNull(jobDb)) { + return SdmResponse.failed("数据不存在"); + } + if(jobDb.getJobStatus().equals(HpcJobStatus.Canceled.name())|| + jobDb.getJobStatus().equals(HpcJobStatus.Finished.name())|| + jobDb.getJobStatus().equals(HpcJobStatus.Failed.name())) { + return SdmResponse.failed("任务状态为完成态,不能取消"); + } + // 未入hpc节点的 + if(StringUtils.isBlank(jobDb.getJobId())){ + log.info("stopHpcJobAdapter 未入hpc节点的,更新状态为已取消jobName:{}",jobDb.getJobName()); + }else { + SdmResponse response = taskController.stopHpcJob(jobDb.getJobId()); + if(!response.isSuccess()){ + throw new RuntimeException("hpc作业取消失败"); + } + log.info("stopHpcJobAdapter 已入hpc节点的,更新状态为已取消jobName:{}",jobDb.getJobName()); + } + jobDb.setJobStatus(HpcJobStatus.Canceled.name()); + boolean b = simulationJobService.updateById(jobDb); + log.info("stopHpcJobAdapter 更新状态为已取消jobName:{},b:{}",jobDb.getJobName(),b); + return SdmResponse.success(b); + } + + @PostMapping("/delHpcJobsAdapter") + @Operation(summary = "批量删除Hpc任务") + public SdmResponse delHpcJobsAdapter(@RequestBody DelHpcJobsReq req) { + // 1. 入参校验 + if (CollectionUtils.isEmpty(req.getIds())) { + return SdmResponse.failed("删除数据id不能为空"); + } + + // 2. 查询任务列表 + List jobList = simulationJobService.lambdaQuery() + .select(SimulationJob::getId, SimulationJob::getJobId, SimulationJob::getJobStatus) + .in(SimulationJob::getId, req.getIds()) + .list(); + if (CollectionUtils.isEmpty(jobList)) { + return SdmResponse.failed("未查询到对应任务数据"); + } + + for (SimulationJob job : jobList) { + if(!HpcJobStatus.getFinishedStatusNames().contains(job.getJobStatus())) { + throw new RuntimeException("数据任务状态非完成态,不能删除"); + } + } + + // 3. 分组:空jobId / 有效jobId + List emptyJobIds = filterEmptyJobIds(jobList); + List validJobIds = filterValidJobIds(jobList); + + // 4. 处理本地标记删除 + updateDelFlagForEmptyJobs(emptyJobIds); + + // 5. 有有效ID则调用HPC删除 + if (CollectionUtils.isNotEmpty(validJobIds)) { + DelHpcJobsReq delHpcJobsReq = new DelHpcJobsReq(); + delHpcJobsReq.setHpcJobIds(validJobIds); + return taskController.delHpcJobs(delHpcJobsReq); + } + + return SdmResponse.success("批量删除HPC任务成功"); + } + + + /** + * 筛选出 jobId 为空的 主键ID + */ + private List filterEmptyJobIds(List jobList) { + return jobList.stream() + .filter(job -> StringUtils.isBlank(job.getJobId())) + .map(SimulationJob::getId) + .collect(Collectors.toList()); + } + + /** + * 筛选出 jobId 不为空的 有效HPC任务ID + */ + private List filterValidJobIds(List jobList) { + return jobList.stream() + .filter(job -> StringUtils.isNotBlank(job.getJobId())) + .map(SimulationJob::getJobId) + .collect(Collectors.toList()); + } + + /** + * 批量更新 delFlag = Y + */ + private void updateDelFlagForEmptyJobs(List emptyJobIds) { + if (CollectionUtils.isEmpty(emptyJobIds)) { + return; + } + boolean updateSuccess = simulationJobService.lambdaUpdate() + .in(SimulationJob::getId, emptyJobIds) + .set(SimulationJob::getDelFlag, "Y") + .update(); + log.info("[HPC任务删除] 本地标记删除成功,数量:{},结果:{}", emptyJobIds.size(), updateSuccess); + } + + private void getSimulationFile(SubmitHpcTaskRemoteReq req,SubmitHpcTaskReq submitHpcTaskReq,String batchFilePath ) { log.info("提交请求参数:{}", JSONObject.toJSONString(req)); String masterFilepath=""; diff --git a/pbs/src/main/java/com/sdm/pbs/model/entity/HpcJobStatus.java b/pbs/src/main/java/com/sdm/pbs/model/entity/HpcJobStatus.java index 680a45e3..c6427333 100644 --- a/pbs/src/main/java/com/sdm/pbs/model/entity/HpcJobStatus.java +++ b/pbs/src/main/java/com/sdm/pbs/model/entity/HpcJobStatus.java @@ -2,6 +2,8 @@ package com.sdm.pbs.model.entity; import lombok.AllArgsConstructor; import lombok.Getter; +import java.util.List; + @Getter @AllArgsConstructor public enum HpcJobStatus { @@ -16,4 +18,18 @@ public enum HpcJobStatus { Failed("任务失败"); private final String desc; + + /** + * 获取所有完成态的枚举名称(name)集合 + * 完成态:已取消、已完成、任务失败 + */ + public static List getFinishedStatusNames() { + return List.of( + Canceled.name(), + Finished.name(), + Failed.name() + ); + } + + } \ No newline at end of file