FlowTimeoutJob.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. using Admin.NET.Plugin.ApprovalFlow.Service;
  2. using Furion.Schedule;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using Microsoft.Extensions.Logging;
  5. namespace Admin.NET.Plugin.ApprovalFlow;
  6. /// <summary>
  7. /// 审批超时自动处理作业 — 每 5 分钟扫描一次超时的待办任务。
  8. /// 扫描细节由 <see cref="FlowEngineService.ScanTimeoutTasks"/> 提供,以便管理员接口可复用同一段逻辑。
  9. /// </summary>
  10. [JobDetail("job_flow_timeout", Description = "审批超时自动处理",
  11. GroupName = "default", Concurrent = false)]
  12. [Period(300000, TriggerId = "trigger_flow_timeout", Description = "每5分钟执行")]
  13. public class FlowTimeoutJob : IJob
  14. {
  15. private readonly IServiceScopeFactory _scopeFactory;
  16. private readonly ILogger _logger;
  17. public FlowTimeoutJob(IServiceScopeFactory scopeFactory, ILoggerFactory loggerFactory)
  18. {
  19. _scopeFactory = scopeFactory;
  20. _logger = loggerFactory.CreateLogger("FlowTimeoutJob");
  21. }
  22. public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
  23. {
  24. using var scope = _scopeFactory.CreateScope();
  25. var engine = scope.ServiceProvider.GetRequiredService<FlowEngineService>();
  26. try
  27. {
  28. var processed = await engine.ScanTimeoutTasks(stoppingToken);
  29. if (processed > 0)
  30. _logger.LogInformation("FlowTimeoutJob 本轮处理了 {Count} 个超时任务", processed);
  31. }
  32. catch (Exception ex)
  33. {
  34. _logger.LogError(ex, "FlowTimeoutJob 扫描超时任务失败");
  35. }
  36. }
  37. }