diff --git a/1-sql/2026-02-05/yang.sql b/1-sql/2026-02-05/yang.sql new file mode 100644 index 00000000..20325d26 --- /dev/null +++ b/1-sql/2026-02-05/yang.sql @@ -0,0 +1,2 @@ +ALTER TABLE `spdm_baseline`.`simulation_job` + ADD COLUMN `del_flag` CHAR(1) NOT NULL DEFAULT 'N' COMMENT '逻辑删除标识:N-未删除,Y-已删除'; \ No newline at end of file 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 new file mode 100644 index 00000000..06c4307e --- /dev/null +++ b/common/src/main/java/com/sdm/common/entity/req/pbs/DelHpcJobsReq.java @@ -0,0 +1,10 @@ +package com.sdm.common.entity.req.pbs; + +import lombok.Data; + +import java.util.List; + +@Data +public class DelHpcJobsReq { + private List hpcJobIds; +} diff --git a/pbs/src/main/java/com/sdm/pbs/controller/TaskController.java b/pbs/src/main/java/com/sdm/pbs/controller/TaskController.java index dee34c2c..49e70905 100644 --- a/pbs/src/main/java/com/sdm/pbs/controller/TaskController.java +++ b/pbs/src/main/java/com/sdm/pbs/controller/TaskController.java @@ -1,6 +1,7 @@ package com.sdm.pbs.controller; import com.sdm.common.common.SdmResponse; +import com.sdm.common.entity.req.pbs.DelHpcJobsReq; import com.sdm.common.entity.req.pbs.HpcTaskFileDownReq; import com.sdm.common.entity.req.pbs.HpcTaskFileReq; import com.sdm.common.entity.req.pbs.hpc.*; @@ -13,8 +14,8 @@ import com.sdm.common.entity.resp.pbs.hpc.nodelist.NodeListResp; import com.sdm.common.utils.HpcCommandExcuteUtil; import com.sdm.pbs.model.bo.HpcJobStatusInfo; import com.sdm.pbs.model.bo.HpcResouceInfo; -import com.sdm.pbs.model.entity.SimulationJob; import com.sdm.pbs.model.entity.SimulationHpcCommand; +import com.sdm.pbs.model.entity.SimulationJob; import com.sdm.pbs.model.req.JobFileCallBackReq; import com.sdm.pbs.model.req.QueryJobReq; import com.sdm.pbs.model.req.SubmitHpcTaskReq; @@ -118,6 +119,12 @@ public class TaskController { return pbsServiceDecorator.querySoftConfig(appUuid); } + @PostMapping("/delHpcJobs") + @Operation(summary = "批量删除Hpc任务") + SdmResponse delHpcJobs(@RequestBody DelHpcJobsReq req) { + return pbsServiceDecorator.delHpcJobs(req); + } + /*====================================================================*/ diff --git a/pbs/src/main/java/com/sdm/pbs/model/entity/SimulationJob.java b/pbs/src/main/java/com/sdm/pbs/model/entity/SimulationJob.java index bb896d3a..e658420f 100644 --- a/pbs/src/main/java/com/sdm/pbs/model/entity/SimulationJob.java +++ b/pbs/src/main/java/com/sdm/pbs/model/entity/SimulationJob.java @@ -193,6 +193,10 @@ public class SimulationJob implements Serializable { @TableField("processInstanceId") private String processInstanceId; + @Schema(description = "任务是否删除,N未删除,Y已删除") + @TableField("del_flag") + private String delFlag; + @Schema(description = "任务耗时,前端展示字段") @TableField(value = "costTime",exist = false) private String costTime; diff --git a/pbs/src/main/java/com/sdm/pbs/schedule/hpc/HpcJobStatusScheduleExcutor.java b/pbs/src/main/java/com/sdm/pbs/schedule/hpc/HpcJobStatusScheduleExcutor.java index 397cb00e..e4fbff57 100644 --- a/pbs/src/main/java/com/sdm/pbs/schedule/hpc/HpcJobStatusScheduleExcutor.java +++ b/pbs/src/main/java/com/sdm/pbs/schedule/hpc/HpcJobStatusScheduleExcutor.java @@ -42,6 +42,7 @@ public class HpcJobStatusScheduleExcutor { SimulationJob::getRunId, SimulationJob::getJobId, SimulationJob::getJobStatus) + .eq(SimulationJob::getDelFlag,"N") .isNotNull(SimulationJob::getJobId) .notIn(SimulationJob::getJobStatus, "Canceled", "Failed") // 非上传中的,非回传结束的。JobStatus 结束 通知 uploading 只会有一次,回传失败后,人工改表修复 diff --git a/pbs/src/main/java/com/sdm/pbs/service/IPbsService.java b/pbs/src/main/java/com/sdm/pbs/service/IPbsService.java index 94431c2f..a93d1424 100644 --- a/pbs/src/main/java/com/sdm/pbs/service/IPbsService.java +++ b/pbs/src/main/java/com/sdm/pbs/service/IPbsService.java @@ -55,6 +55,4 @@ public interface IPbsService { */ ResponseEntity downloadFile(String jobId, String fileName,Long fileSize); - - } diff --git a/pbs/src/main/java/com/sdm/pbs/service/impl/IPbsHpcServiceImpl.java b/pbs/src/main/java/com/sdm/pbs/service/impl/IPbsHpcServiceImpl.java index b45b4e61..0baab9e4 100644 --- a/pbs/src/main/java/com/sdm/pbs/service/impl/IPbsHpcServiceImpl.java +++ b/pbs/src/main/java/com/sdm/pbs/service/impl/IPbsHpcServiceImpl.java @@ -134,7 +134,6 @@ public class IPbsHpcServiceImpl implements IPbsService { return hpcInstructionService.hpcDownloadFile(fileName,fileSize); } - private HpcResouceInfo buildHpcResourceInfo(List nodes) { HpcResouceInfo result = new HpcResouceInfo(); diff --git a/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceDecorator.java b/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceDecorator.java index 805efd5c..4749730c 100644 --- a/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceDecorator.java +++ b/pbs/src/main/java/com/sdm/pbs/service/impl/PbsServiceDecorator.java @@ -10,6 +10,7 @@ import com.sdm.common.common.SdmResponse; import com.sdm.common.common.ThreadLocalContext; import com.sdm.common.entity.enums.MessageTemplateEnum; import com.sdm.common.entity.req.flowable.AsyncCallbackRequest; +import com.sdm.common.entity.req.pbs.DelHpcJobsReq; import com.sdm.common.entity.req.system.SendMsgReq; import com.sdm.common.entity.resp.PageDataResp; import com.sdm.common.entity.resp.pbs.hpc.FileNodeInfo; @@ -73,6 +74,13 @@ public class PbsServiceDecorator implements IPbsServiceDecorator { @Value("#{'${hpc.jobs.middleOrders:Running}'.split(',')}") private List middleOrders; + // 运行中 + @Value("#{'${hpc.jobs.hpcJobIngStatus:Configuring,Queued,Running}'.split(',')}") + private List hpcJobIngStatus; + + @Value("#{'${hpc.jobs.hpcFileIngStatus:generating,uploading}'.split(',')}") + private List hpcFileIngStatus; + // 正则匹配%后的单词(\w+ 匹配字母、数字、下划线) private static final Pattern PLACEHOLDER_PATTERN = Pattern.compile("%(\\w+)"); @@ -562,12 +570,69 @@ public class PbsServiceDecorator implements IPbsServiceDecorator { return pbsService.downloadFile("", fileName,fileSize); } - public SdmResponse>> queryJobs(QueryJobReq req){ + + public SdmResponse delHpcJobs(DelHpcJobsReq req) { + if(CollectionUtils.isEmpty(req.getHpcJobIds())){ + throw new RuntimeException("删除的jobIds不能是空"); + } + // 1. 查询待删除的任务列表 + List jobList = simulationJobService.lambdaQuery() + .in(SimulationJob::getJobId, req.getHpcJobIds()) + .list(); + if (jobList.isEmpty()) { + throw new RuntimeException("未查询到待删除的HPC任务"); + } + // 2. 校验任务状态(非进行中、文件非上传中) + Pair> pairCheck= checkJobStatus(jobList); + if(!pairCheck.getLeft()){ + log.error("checkJobStatus true,{}",JSON.toJSONString(pairCheck.getRight())); + throw new RuntimeException("删除的任务状态和文件状态不能是未完成"); + } + + // 2. 调用HPC批量删除接口 todo +// boolean hpcDelSuccess = batchDeleteHpcJobs(req.getHpcJobIds()); +// if (!hpcDelSuccess) { +// return SdmResponse.fail("调用HPC批量删除接口失败"); +// } + + // 5. 逻辑删除simulation_job表数据 + boolean logicDelSuccess = logicDeleteSimulationJob(jobList); + if (!logicDelSuccess) { + return SdmResponse.failed("逻辑删除任务数据失败"); + } + return SdmResponse.success("批量删除HPC任务成功"); + } + + private boolean logicDeleteSimulationJob(List jobList) { + for (SimulationJob job : jobList) { + job.setDelFlag("Y"); + } + boolean b = simulationJobService.updateBatchById(jobList); + log.info("logicDeleteSimulationJob,b={}",b); + return b; + } + + // 任务非进行中,文件非上传中 + private Pair> checkJobStatus(List jobList) { + ListinvalidJobs=new ArrayList<>(); + boolean check = false; + for(SimulationJob job:jobList){ + if(hpcJobIngStatus.contains(job.getJobStatus())|| + hpcFileIngStatus.contains(job.getFileStatus())){ + invalidJobs.add(job); + check=true; + } + } + return Pair.of(check,invalidJobs); + } + + public SdmResponse>> queryJobs(QueryJobReq req){ PageHelper.startPage(req.getCurrent(), req.getSize()); // 构建查询条件 LambdaQueryChainWrapper queryChain = simulationJobService.lambdaQuery(); - + // 未删除的 + queryChain.eq(SimulationJob::getDelFlag,"N"); // ... 你的原有查询条件逻辑保持不变 ... if (req.getJobName() != null && !req.getJobName().trim().isEmpty()) { queryChain.like(SimulationJob::getJobName, req.getJobName().trim());