using Quartz; using Quartz.Impl.Matchers; namespace Application; /// /// 任务状态 /// public record JobStatus { public string Name { get; init; } = string.Empty; public string JobDescription { get; init; } = string.Empty; public string TriggerDescription { get; init; } = string.Empty; public string Status { get; init; } = string.Empty; public string NextRunTime { get; init; } = string.Empty; } /// /// 任务应用服务接口 /// public interface IJobApplication { Task> GetJobsAsync(); Task ExecuteAsync(string jobName); Task PauseAsync(string jobName); Task ResumeAsync(string jobName); } /// /// 任务应用服务实现 /// public class JobApplication( ISchedulerFactory schedulerFactory ) : IJobApplication { public async Task> GetJobsAsync() { var scheduler = await schedulerFactory.GetScheduler(); var jobKeys = await scheduler.GetJobKeys(GroupMatcher.AnyGroup()); var jobStatuses = new List(); foreach (var jobKey in jobKeys) { var jobDetail = await scheduler.GetJobDetail(jobKey); var triggers = await scheduler.GetTriggersOfJob(jobKey); var trigger = triggers.FirstOrDefault(); var status = "Unknown"; DateTime? nextFireTime = null; if (trigger != null) { var triggerState = await scheduler.GetTriggerState(trigger.Key); status = triggerState.ToString(); nextFireTime = trigger.GetNextFireTimeUtc()?.ToLocalTime().DateTime; } jobStatuses.Add(new JobStatus { Name = jobKey.Name, JobDescription = jobDetail?.Description ?? jobKey.Name, TriggerDescription = trigger?.Description ?? string.Empty, Status = status, NextRunTime = nextFireTime?.ToString("yyyy-MM-dd HH:mm:ss") ?? "无" }); } return jobStatuses; } public async Task ExecuteAsync(string jobName) { if (string.IsNullOrWhiteSpace(jobName)) { throw new ValidationException("任务名称不能为空"); } var scheduler = await schedulerFactory.GetScheduler(); await scheduler.TriggerJob(new JobKey(jobName)); return true; } public async Task PauseAsync(string jobName) { if (string.IsNullOrWhiteSpace(jobName)) { throw new ValidationException("任务名称不能为空"); } var scheduler = await schedulerFactory.GetScheduler(); await scheduler.PauseJob(new JobKey(jobName)); return true; } public async Task ResumeAsync(string jobName) { if (string.IsNullOrWhiteSpace(jobName)) { throw new ValidationException("任务名称不能为空"); } var scheduler = await schedulerFactory.GetScheduler(); await scheduler.ResumeJob(new JobKey(jobName)); return true; } }