SmartOpsKpiMdpBootstrapJob.cs 4.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. using Admin.NET.Plugin.AiDOP.Infrastructure;
  2. using Admin.NET.Plugin.AiDOP.Order;
  3. using Admin.NET.Plugin.AiDOP.ProcurementExecution;
  4. using Admin.NET.Plugin.AiDOP.Production;
  5. using Admin.NET.Plugin.AiDOP.Supply;
  6. using Furion.Schedule;
  7. using Microsoft.Extensions.DependencyInjection;
  8. using Microsoft.Extensions.Logging;
  9. using SqlSugar;
  10. using System.Text.Json;
  11. namespace Admin.NET.Plugin.AiDOP.Job;
  12. /// <summary>
  13. /// 应用启动后按 S1→S2→S3→S4 顺序执行 MDP 全量同步,构建模块 KPI 汇总与 KPI 原子聚合层。
  14. /// 新环境发布后无需等待 hourly 任务即可在看板筛选中看到数据。
  15. /// </summary>
  16. [JobDetail("job_smart_ops_kpi_mdp_bootstrap", Description = "智慧运营KPI:启动时按序执行S1→S2→S3→S4 MDP同步(含原子聚合层)", GroupName = "default", Concurrent = false)]
  17. [PeriodSeconds(1, TriggerId = "trigger_smart_ops_kpi_mdp_bootstrap", Description = "应用启动后立即执行一次", MaxNumberOfRuns = 1, RunOnStart = true)]
  18. public class SmartOpsKpiMdpBootstrapJob : IJob
  19. {
  20. private readonly IServiceScopeFactory _scopeFactory;
  21. private readonly ILogger _logger;
  22. public SmartOpsKpiMdpBootstrapJob(IServiceScopeFactory scopeFactory, ILoggerFactory loggerFactory)
  23. {
  24. _scopeFactory = scopeFactory;
  25. _logger = loggerFactory.CreateLogger(nameof(SmartOpsKpiMdpBootstrapJob));
  26. }
  27. public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
  28. {
  29. using var scope = _scopeFactory.CreateScope();
  30. var db = scope.ServiceProvider.GetRequiredService<ISqlSugarClient>();
  31. try
  32. {
  33. AidopTenantMigration.EnsureKpiAtomicTable(db);
  34. _logger.LogInformation("SmartOpsKpiMdpBootstrapJob: ado_smart_ops_kpi_atomic_day 已就绪");
  35. }
  36. catch (Exception ex)
  37. {
  38. _logger.LogError(ex, "SmartOpsKpiMdpBootstrapJob: 原子聚合表初始化失败");
  39. }
  40. await RunStepAsync("S1", stoppingToken, async sp =>
  41. {
  42. var result = await sp.GetRequiredService<S1MdpSyncTransformService>().RunFullAsync(stoppingToken, "BOOTSTRAP");
  43. return new { result.StageRows, result.StandardRows, result.DwdRows, result.KpiRows, result.AtomicRows };
  44. });
  45. await RunStepAsync("S2", stoppingToken, async sp =>
  46. {
  47. var result = await sp.GetRequiredService<S2MdpSyncTransformService>().RunFullAsync(stoppingToken, "BOOTSTRAP");
  48. return new { result.StageRows, result.StandardRows, result.DwdRows, result.KpiRows, result.AtomicRows };
  49. });
  50. await RunStepAsync("S3", stoppingToken, async sp =>
  51. {
  52. var result = await sp.GetRequiredService<S3MdpSyncTransformService>().RunFullAsync(stoppingToken, "BOOTSTRAP");
  53. return new { result.StageRows, result.StandardRows, result.DwdRows, result.KpiRows, result.AtomicRows };
  54. });
  55. await RunStepAsync("S4", stoppingToken, async sp =>
  56. {
  57. var result = await sp.GetRequiredService<S4MdpSyncTransformService>().RunFullAsync(stoppingToken, "BOOTSTRAP");
  58. return new { result.StageRows, result.StandardRows, result.DwdRows, result.KpiRows };
  59. });
  60. _logger.LogInformation("SmartOpsKpiMdpBootstrapJob: 全部 MDP 引导同步已完成");
  61. }
  62. private async Task RunStepAsync(string step, CancellationToken stoppingToken, Func<IServiceProvider, Task<object>> action)
  63. {
  64. using var scope = _scopeFactory.CreateScope();
  65. try
  66. {
  67. stoppingToken.ThrowIfCancellationRequested();
  68. var payload = await action(scope.ServiceProvider);
  69. _logger.LogInformation("SmartOpsKpiMdpBootstrapJob {Step} 完成 {Payload}", step, JsonSerializer.Serialize(payload));
  70. }
  71. catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested)
  72. {
  73. _logger.LogInformation("SmartOpsKpiMdpBootstrapJob {Step} 收到停止信号", step);
  74. throw;
  75. }
  76. catch (Exception ex)
  77. {
  78. _logger.LogError(ex, "SmartOpsKpiMdpBootstrapJob {Step} 执行失败,继续后续步骤", step);
  79. }
  80. }
  81. }