diff --git a/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobApiController.java b/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobApiController.java index 4756065b..a8c3da24 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobApiController.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/schedule/api/ScheduleJobApiController.java @@ -89,6 +89,18 @@ public class ScheduleJobApiController extends BaseController enableJob( + @Parameter(description = "任务ID", required = true) @PathVariable Long id + ) { + scheduleJobService.enableJob(id); + return Response.success(); + } + /** * 立即触发任务 */ diff --git a/backend/src/main/java/com/qqchen/deploy/backend/schedule/entity/ScheduleJob.java b/backend/src/main/java/com/qqchen/deploy/backend/schedule/entity/ScheduleJob.java index d2c135f1..218dc298 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/schedule/entity/ScheduleJob.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/schedule/entity/ScheduleJob.java @@ -81,7 +81,7 @@ public class ScheduleJob extends Entity { */ @Enumerated(EnumType.STRING) @Column(name = "status", nullable = false, length = 20) - private ScheduleJobStatusEnum status = ScheduleJobStatusEnum.ENABLED; + private ScheduleJobStatusEnum status; /** * 是否允许并发执行 diff --git a/backend/src/main/java/com/qqchen/deploy/backend/schedule/service/IScheduleJobService.java b/backend/src/main/java/com/qqchen/deploy/backend/schedule/service/IScheduleJobService.java index 0f07fd15..3c66a207 100644 --- a/backend/src/main/java/com/qqchen/deploy/backend/schedule/service/IScheduleJobService.java +++ b/backend/src/main/java/com/qqchen/deploy/backend/schedule/service/IScheduleJobService.java @@ -41,6 +41,12 @@ public interface IScheduleJobService extends IBaseService - implements IScheduleJobService { + implements IScheduleJobService { @Resource private IScheduleJobRepository jobRepository; @@ -80,7 +80,7 @@ public class ScheduleJobServiceImpl extends BaseServiceImpl content = page.getContent().stream() - .peek(job -> { - // 填充分类信息 - if (job.getCategoryId() != null) { - Optional categoryOptional = categoryRepository.findById(job.getCategoryId()); - categoryOptional.ifPresent(category -> job.setCategory(categoryConverter.toDto(category))); - } + .peek(job -> { + // 填充分类信息 + if (job.getCategoryId() != null) { + Optional categoryOptional = categoryRepository.findById(job.getCategoryId()); + categoryOptional.ifPresent(category -> job.setCategory(categoryConverter.toDto(category))); + } - // 填充表单信息 - if (job.getFormDefinitionId() != null) { - Optional formOptional = formDefinitionRepository.findById(job.getFormDefinitionId()); - formOptional.ifPresent(form -> job.setFormDefinition(formDefinitionConverter.toDto(form))); - } - }) - .collect(Collectors.toList()); + // 填充表单信息 + if (job.getFormDefinitionId() != null) { + Optional formOptional = formDefinitionRepository.findById(job.getFormDefinitionId()); + formOptional.ifPresent(form -> job.setFormDefinition(formDefinitionConverter.toDto(form))); + } + }) + .collect(Collectors.toList()); return new PageImpl<>(content, page.getPageable(), page.getTotalElements()); } @Override + @Transactional public void startJob(Long jobId) { try { ScheduleJob job = findEntityById(jobId); - + // 创建JobDetail JobDetail jobDetail = JobBuilder.newJob(DynamicJob.class) - .withIdentity(getJobKey(jobId)) - .withDescription(job.getJobDescription()) - .build(); + .withIdentity(getJobKey(jobId)) + .withDescription(job.getJobDescription()) + .build(); // 设置JobDataMap jobDetail.getJobDataMap().put("jobId", job.getId()); @@ -198,19 +199,19 @@ public class ScheduleJobServiceImpl extends BaseServiceImpl enabledJobs = jobRepository.findByStatusAndDeletedFalse(ScheduleJobStatusEnum.ENABLED); - + for (ScheduleJob job : enabledJobs) { try { startJob(job.getId()); @@ -348,7 +386,7 @@ public class ScheduleJobServiceImpl extends BaseServiceImpl runningJobs = new ArrayList<>(); List allJobs = jobRepository.findAll(); - + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); - + for (ScheduleJob job : allJobs) { // ✅ 使用 JobStatusRedisService 读取 Hash 类型的状态数据 JobStatusDTO statusDTO = jobStatusRedisService.getJobStatus(job.getId()); - + if (statusDTO != null && "RUNNING".equals(statusDTO.getStatus())) { JobDashboardDTO.RunningJobDTO runningJob = JobDashboardDTO.RunningJobDTO.builder() - .jobId(job.getId()) - .jobName(job.getJobName()) - .startTime(statusDTO.getStartTime() != null ? - statusDTO.getStartTime().format(formatter) : null) - .progress(statusDTO.getProgress()) - .message(statusDTO.getMessage()) - .status(statusDTO.getStatus()) - .build(); + .jobId(job.getId()) + .jobName(job.getJobName()) + .startTime(statusDTO.getStartTime() != null ? + statusDTO.getStartTime().format(formatter) : null) + .progress(statusDTO.getProgress()) + .message(statusDTO.getMessage()) + .status(statusDTO.getStatus()) + .build(); runningJobs.add(runningJob); } } - + // 3. 获取最近10条执行日志 PageRequest pageRequest = PageRequest.of(0, 10, Sort.by(Sort.Direction.DESC, "executeTime")); Page logPage = jobLogRepository.findAll(pageRequest); List recentLogs = logPage.getContent().stream() - .map(log -> { - ScheduleJobLogDTO dto = new ScheduleJobLogDTO(); - dto.setId(log.getId()); - dto.setJobId(log.getJobId()); - dto.setJobName(log.getJobName()); - dto.setExecuteTime(log.getExecuteTime()); - dto.setFinishTime(log.getFinishTime()); - dto.setStatus(log.getStatus()); - dto.setResultMessage(log.getResultMessage()); - dto.setExceptionInfo(log.getExceptionInfo()); - return dto; - }) - .collect(Collectors.toList()); - + .map(log -> { + ScheduleJobLogDTO dto = new ScheduleJobLogDTO(); + dto.setId(log.getId()); + dto.setJobId(log.getJobId()); + dto.setJobName(log.getJobName()); + dto.setExecuteTime(log.getExecuteTime()); + dto.setFinishTime(log.getFinishTime()); + dto.setStatus(log.getStatus()); + dto.setResultMessage(log.getResultMessage()); + dto.setExceptionInfo(log.getExceptionInfo()); + return dto; + }) + .collect(Collectors.toList()); + // 4. 构建返回结果 JobDashboardDTO.JobSummaryDTO summary = JobDashboardDTO.JobSummaryDTO.builder() - .total(total) - .enabled(enabled) - .disabled(disabled) - .paused(paused) - .running((long) runningJobs.size()) - .build(); - + .total(total) + .enabled(enabled) + .disabled(disabled) + .paused(paused) + .running((long) runningJobs.size()) + .build(); + return JobDashboardDTO.builder() - .summary(summary) - .runningJobs(runningJobs) - .recentLogs(recentLogs) - .build(); + .summary(summary) + .runningJobs(runningJobs) + .recentLogs(recentLogs) + .build(); } /**