S5InventoryReconcileJob.cs 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. using Admin.NET.Plugin.AiDOP.MaterialWarehouse;
  2. using Furion.Schedule;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using Microsoft.Extensions.Logging;
  5. namespace Admin.NET.Plugin.AiDOP.Job;
  6. /// <summary>S5 库存余额每周全量校准(清理 165 已删除行)。</summary>
  7. [JobDetail("job_s5_inventory_reconcile",
  8. Description = "S5库存余额每周全量校准",
  9. GroupName = "default", Concurrent = false)]
  10. [Cron("30 2 * * 0",
  11. TriggerId = "trigger_s5_inventory_reconcile",
  12. Description = "每周日 02:30")]
  13. public sealed class S5InventoryReconcileJob : IJob
  14. {
  15. private readonly IServiceScopeFactory _scopeFactory;
  16. private readonly ILogger _logger;
  17. public S5InventoryReconcileJob(IServiceScopeFactory scopeFactory, ILoggerFactory loggerFactory)
  18. {
  19. _scopeFactory = scopeFactory;
  20. _logger = loggerFactory.CreateLogger(nameof(S5InventoryReconcileJob));
  21. }
  22. public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
  23. {
  24. using var scope = _scopeFactory.CreateScope();
  25. var sync = scope.ServiceProvider.GetRequiredService<InventoryMdpSyncService>();
  26. try
  27. {
  28. var result = await sync.RunReconcileFullAsync(stoppingToken);
  29. _logger.LogInformation("[S5InventoryReconcileJob] done skipped={Skipped} invStd={Inv}",
  30. result.Skipped, result.InventoryStdRows);
  31. }
  32. catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
  33. {
  34. throw;
  35. }
  36. catch (Exception ex)
  37. {
  38. _logger.LogError(ex, "[S5InventoryReconcileJob] failed; keep previous std");
  39. }
  40. }
  41. }