S5InventoryInboundJob.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  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 库存余额/流水冷链,每 30 分钟。跨实例锁由 InventoryMdpSyncService 持有。</summary>
  7. [JobDetail("job_s5_inventory_inbound",
  8. Description = "S5库存余额/流水冷链,每30分钟",
  9. GroupName = "default", Concurrent = false)]
  10. [Cron("0,30 * * * *",
  11. TriggerId = "trigger_s5_inventory_inbound",
  12. Description = "每30分钟触发")]
  13. public sealed class S5InventoryInboundJob : IJob
  14. {
  15. private readonly IServiceScopeFactory _scopeFactory;
  16. private readonly ILogger _logger;
  17. public S5InventoryInboundJob(IServiceScopeFactory scopeFactory, ILoggerFactory loggerFactory)
  18. {
  19. _scopeFactory = scopeFactory;
  20. _logger = loggerFactory.CreateLogger(nameof(S5InventoryInboundJob));
  21. }
  22. public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
  23. {
  24. if (!AidopJobGate.ShouldRun(nameof(S5InventoryInboundJob), _logger)) return;
  25. using var scope = _scopeFactory.CreateScope();
  26. var sync = scope.ServiceProvider.GetRequiredService<InventoryMdpSyncService>();
  27. try
  28. {
  29. var result = await sync.RunIncrementalAsync(stoppingToken);
  30. _logger.LogInformation("[S5InventoryInboundJob] done skipped={Skipped} loc={Loc} trn={Trn}",
  31. result.Skipped, result.LocationPulled, result.TransPulled);
  32. }
  33. catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
  34. {
  35. _logger.LogInformation("[S5InventoryInboundJob] cancelled");
  36. throw;
  37. }
  38. catch (Exception ex)
  39. {
  40. _logger.LogError(ex, "[S5InventoryInboundJob] failed");
  41. }
  42. }
  43. }