SmartOpsImprovementActionReminderJob.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using Admin.NET.Core;
  2. using Admin.NET.Plugin.AiDOP.Entity;
  3. using Admin.NET.Plugin.AiDOP.Infrastructure;
  4. using Admin.NET.Plugin.AiDOP.SmartOps;
  5. using Furion.Schedule;
  6. using Microsoft.Extensions.DependencyInjection;
  7. using Microsoft.Extensions.Logging;
  8. namespace Admin.NET.Plugin.AiDOP.Job;
  9. [JobDetail("job_smart_ops_action_reminder", Description = "智慧诊断行动项到期/逾期提醒", GroupName = "default", Concurrent = false)]
  10. [Daily(TriggerId = "trigger_smart_ops_action_reminder", Description = "每日扫描改善行动项提醒")]
  11. public class SmartOpsImprovementActionReminderJob : IJob
  12. {
  13. private readonly IServiceScopeFactory _scopeFactory;
  14. private readonly ILogger _logger;
  15. public SmartOpsImprovementActionReminderJob(IServiceScopeFactory scopeFactory, ILoggerFactory loggerFactory)
  16. {
  17. _scopeFactory = scopeFactory;
  18. _logger = loggerFactory.CreateLogger(nameof(SmartOpsImprovementActionReminderJob));
  19. }
  20. public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
  21. {
  22. using var scope = _scopeFactory.CreateScope();
  23. var rootDb = scope.ServiceProvider.GetRequiredService<ISqlSugarClient>();
  24. var today = DateTime.Today;
  25. List<long> tenantIds;
  26. try
  27. {
  28. tenantIds = await rootDb.CopyNew().Queryable<AdoSmartOpsImprovementAction>()
  29. .Where(x => x.TenantId != null
  30. && x.TenantId > 0
  31. && x.TenantId != SmartOpsTrustedScopeRules.PlatformTenantId)
  32. .Select(x => x.TenantId!.Value)
  33. .Distinct()
  34. .ToListAsync(stoppingToken);
  35. }
  36. catch (Exception ex)
  37. {
  38. _logger.LogWarning(ex, "行动项提醒作业读取租户失败");
  39. return;
  40. }
  41. var service = new SmartOpsImprovementActionService(rootDb);
  42. foreach (var tenantId in tenantIds)
  43. {
  44. stoppingToken.ThrowIfCancellationRequested();
  45. try
  46. {
  47. var db = rootDb.CopyNew();
  48. var sent = await service.SendDueRemindersAsync(db, tenantId, today);
  49. if (sent > 0)
  50. _logger.LogInformation("行动项提醒 tenant={TenantId} sent={Sent}", tenantId, sent);
  51. }
  52. catch (Exception ex)
  53. {
  54. _logger.LogError(ex, "行动项提醒失败 tenant={TenantId}", tenantId);
  55. }
  56. }
  57. }
  58. }