S3PoCompletionMdpSyncJob.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. using var scope = _scopeFactory.CreateScope();
  32. try
  33. {
  34. var svc = scope.ServiceProvider.GetRequiredService<PurchaseOrderCompletionMdpSyncService>();
  35. var r = await svc.RunFullAsync(0, "AUTO", stoppingToken);
  36. _logger.LogInformation(
  37. "S3PoCompletionMdpSyncJob 完成 batch={Batch} source={Src} rows={Rows} written={Written} "
  38. + "completed={Completed} notCompleted={NotCompleted} unknown={Unknown} skipped={Skipped} stale={Stale}",
  39. r.BatchId, r.SourceCode, r.SourceRows, r.WrittenRows,
  40. r.CompletedRows, r.NotCompletedRows, r.UnknownStatusRows, r.SkippedRows, r.StaleRemoved);
  41. }
  42. catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
  43. {
  44. _logger.LogInformation("S3PoCompletionMdpSyncJob 收到停止信号,结束本轮对账");
  45. }
  46. catch (Exception ex)
  47. {
  48. // 源绑定不合法(未配置 / 指向 DEV 源 / 源被禁用)会走到这里:
  49. // 运行日志已在 Service 内标 FAILED,这里只保证调度线程不被打断、也不吞掉异常信息。
  50. _logger.LogError(ex, "S3PoCompletionMdpSyncJob 执行失败");
  51. }
  52. }
  53. }