using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Quartz; namespace WebApi.Controllers; /// /// 定时任务管理控制器 /// [ApiController] [Route("api/[controller]")] public class JobController( ISchedulerFactory schedulerFactory, ILogger logger) : ControllerBase { /// /// 手动触发邮件同步任务 /// [HttpPost("sync-email")] [Authorize] public async Task TriggerEmailSync() { try { var scheduler = await schedulerFactory.GetScheduler(); var jobKey = new JobKey("EmailSyncJob"); // 立即触发任务 await scheduler.TriggerJob(jobKey); logger.LogInformation("手动触发邮件同步任务成功"); return Ok(new { message = "邮件同步任务已触发" }); } catch (Exception ex) { logger.LogError(ex, "触发邮件同步任务失败"); return StatusCode(500, new { message = "触发任务失败", error = ex.Message }); } } /// /// 手动触发周期性账单任务 /// [HttpPost("periodic-bill")] [Authorize] public async Task TriggerPeriodicBill() { try { var scheduler = await schedulerFactory.GetScheduler(); var jobKey = new JobKey("PeriodicBillJob"); // 立即触发任务 await scheduler.TriggerJob(jobKey); logger.LogInformation("手动触发周期性账单任务成功"); return Ok(new { message = "周期性账单任务已触发" }); } catch (Exception ex) { logger.LogError(ex, "触发周期性账单任务失败"); return StatusCode(500, new { message = "触发任务失败", error = ex.Message }); } } /// /// 获取所有任务的状态 /// [HttpGet("status")] [Authorize] public async Task GetJobStatus() { try { var scheduler = await schedulerFactory.GetScheduler(); var jobGroups = await scheduler.GetJobGroupNames(); var jobStatuses = new List(); foreach (var group in jobGroups) { var jobKeys = await scheduler.GetJobKeys(Quartz.Impl.Matchers.GroupMatcher.GroupEquals(group)); foreach (var jobKey in jobKeys) { var triggers = await scheduler.GetTriggersOfJob(jobKey); var jobDetail = await scheduler.GetJobDetail(jobKey); foreach (var trigger in triggers) { var triggerState = await scheduler.GetTriggerState(trigger.Key); var nextFireTime = trigger.GetNextFireTimeUtc(); var previousFireTime = trigger.GetPreviousFireTimeUtc(); jobStatuses.Add(new { jobName = jobKey.Name, jobGroup = jobKey.Group, triggerName = trigger.Key.Name, triggerState = triggerState.ToString(), nextFireTime = nextFireTime?.LocalDateTime, previousFireTime = previousFireTime?.LocalDateTime, description = trigger.Description, jobType = jobDetail?.JobType.Name }); } } } return Ok(jobStatuses); } catch (Exception ex) { logger.LogError(ex, "获取任务状态失败"); return StatusCode(500, new { message = "获取任务状态失败", error = ex.Message }); } } /// /// 暂停指定任务 /// [HttpPost("pause/{jobName}")] [Authorize] public async Task PauseJob(string jobName) { try { var scheduler = await schedulerFactory.GetScheduler(); var jobKey = new JobKey(jobName); if (!await scheduler.CheckExists(jobKey)) { return NotFound(new { message = $"任务 {jobName} 不存在" }); } await scheduler.PauseJob(jobKey); logger.LogInformation("任务 {JobName} 已暂停", jobName); return Ok(new { message = $"任务 {jobName} 已暂停" }); } catch (Exception ex) { logger.LogError(ex, "暂停任务 {JobName} 失败", jobName); return StatusCode(500, new { message = "暂停任务失败", error = ex.Message }); } } /// /// 恢复指定任务 /// [HttpPost("resume/{jobName}")] [Authorize] public async Task ResumeJob(string jobName) { try { var scheduler = await schedulerFactory.GetScheduler(); var jobKey = new JobKey(jobName); if (!await scheduler.CheckExists(jobKey)) { return NotFound(new { message = $"任务 {jobName} 不存在" }); } await scheduler.ResumeJob(jobKey); logger.LogInformation("任务 {JobName} 已恢复", jobName); return Ok(new { message = $"任务 {jobName} 已恢复" }); } catch (Exception ex) { logger.LogError(ex, "恢复任务 {JobName} 失败", jobName); return StatusCode(500, new { message = "恢复任务失败", error = ex.Message }); } } }