S5InventoryInboundJob.cs 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  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. using var scope = _scopeFactory.CreateScope();
  25. var sync = scope.ServiceProvider.GetRequiredService<InventoryMdpSyncService>();
  26. try
  27. {
  28. var result = await sync.RunIncrementalAsync(stoppingToken);
  29. _logger.LogInformation("[S5InventoryInboundJob] done skipped={Skipped} loc={Loc} trn={Trn}",
  30. result.Skipped, result.LocationPulled, result.TransPulled);
  31. }
  32. catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
  33. {
  34. _logger.LogInformation("[S5InventoryInboundJob] cancelled");
  35. throw;
  36. }
  37. catch (Exception ex)
  38. {
  39. _logger.LogError(ex, "[S5InventoryInboundJob] failed");
  40. }
  41. }
  42. }