S3PoCompletionMdpSyncJob.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using Admin.NET.Plugin.AiDOP.Supply;
  2. using Furion.Schedule;
  3. using Microsoft.Extensions.DependencyInjection;
  4. using Microsoft.Extensions.Logging;
  5. namespace Admin.NET.Plugin.AiDOP.Job;
  6. /// <summary>
  7. /// S8 Stage-3 采购完成态周期性全量对账。
  8. ///
  9. /// <para><b>这是正确性主路径,不是优化项。</b> HotWatch 只覆盖活动中的采购单:实测 5 个
  10. /// <c>PUR_ORDER</c> 关注中 3 个已提前终止(且无一是因采购完成而终止,全部走 IQC 路径终止),
  11. /// 终止后 <c>Status=1</c> 的关注永不再轮询;另有 88/98 条源行根本没有对应关注。
  12. /// 因此仅靠增量必然漏判完成与回退,全量对账不可省。</para>
  13. ///
  14. /// <para>周期取 30 分钟:与 <c>S5InventoryInboundJob</c> 的既有半小时级节奏一致。
  15. /// 源侧 Status 是收货过程产物,30 分钟的对账延迟对 Stage-3 口径可接受;
  16. /// 若日后接入 HotWatch 增量钩子,延迟会降到关注轮询级,但本 Job 仍必须保留。</para>
  17. /// </summary>
  18. [JobDetail("job_s3_po_completion_mdp_sync", Description = "S3 采购完成态(Source B)全量对账", GroupName = "default", Concurrent = false)]
  19. [Period(1800000, TriggerId = "trigger_s3_po_completion_mdp_sync", Description = "每30分钟执行")]
  20. public class S3PoCompletionMdpSyncJob : IJob
  21. {
  22. private readonly IServiceScopeFactory _scopeFactory;
  23. private readonly ILogger _logger;
  24. public S3PoCompletionMdpSyncJob(IServiceScopeFactory scopeFactory, ILoggerFactory loggerFactory)
  25. {
  26. _scopeFactory = scopeFactory;
  27. _logger = loggerFactory.CreateLogger(nameof(S3PoCompletionMdpSyncJob));
  28. }
  29. public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
  30. {
  31. if (!AidopJobGate.ShouldRun(nameof(S3PoCompletionMdpSyncJob), _logger)) return;
  32. using var scope = _scopeFactory.CreateScope();
  33. try
  34. {
  35. var svc = scope.ServiceProvider.GetRequiredService<PurchaseOrderCompletionMdpSyncService>();
  36. var r = await svc.RunFullAsync(0, "AUTO", stoppingToken);
  37. _logger.LogInformation(
  38. "S3PoCompletionMdpSyncJob 完成 batch={Batch} source={Src} rows={Rows} written={Written} "
  39. + "completed={Completed} notCompleted={NotCompleted} unknown={Unknown} skipped={Skipped} stale={Stale}",
  40. r.BatchId, r.SourceCode, r.SourceRows, r.WrittenRows,
  41. r.CompletedRows, r.NotCompletedRows, r.UnknownStatusRows, r.SkippedRows, r.StaleRemoved);
  42. }
  43. catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
  44. {
  45. _logger.LogInformation("S3PoCompletionMdpSyncJob 收到停止信号,结束本轮对账");
  46. }
  47. catch (Exception ex)
  48. {
  49. // 源绑定不合法(未配置 / 指向 DEV 源 / 源被禁用)会走到这里:
  50. // 运行日志已在 Service 内标 FAILED,这里只保证调度线程不被打断、也不吞掉异常信息。
  51. _logger.LogError(ex, "S3PoCompletionMdpSyncJob 执行失败");
  52. }
  53. }
  54. }