using Admin.NET.Plugin.AiDOP.Manufacturing; using Furion.Schedule; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using System.Text.Json; namespace Admin.NET.Plugin.AiDOP.Job; /// /// S6 生产执行 T8 KPI 自动跑批任务。 /// 每日 02:00 / 07:00 / 12:00 / 17:00 / 22:00 共 5 次(间隔 5h;22:00 是当天最后一次跑批,22:01~01:59 安静期)。 /// 调用 S6MdpSyncTransformService.RunFullAsync(triggerType="AUTO");失败通知由 service 内部 MarkTransformRunFailedAsync 触发。 /// [JobDetail("job_s6_t8_kpi_refresh", Description = "S6 T8 KPI 自动跑批(5 次/天:02/07/12/17/22)", GroupName = "default", Concurrent = false)] [Cron("0 2,7,12,17,22 * * *", TriggerId = "trigger_s6_t8_kpi_refresh", Description = "每日 02:00/07:00/12:00/17:00/22:00 触发(5 字段:分 时 日 月 周,默认 CronStringFormat.Default)")] public class S6MdpRefreshJob : IJob { private readonly IServiceScopeFactory _scopeFactory; private readonly ILogger _logger; public S6MdpRefreshJob(IServiceScopeFactory scopeFactory, ILoggerFactory loggerFactory) { _scopeFactory = scopeFactory; _logger = loggerFactory.CreateLogger(nameof(S6MdpRefreshJob)); } public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) { using var scope = _scopeFactory.CreateScope(); var service = scope.ServiceProvider.GetRequiredService(); try { var result = await service.RunFullAsync(stoppingToken, "AUTO"); _logger.LogInformation("S6MdpRefreshJob 完成 {Payload}", JsonSerializer.Serialize(result)); } catch (OperationCanceledException) when (stoppingToken.IsCancellationRequested) { _logger.LogInformation("S6MdpRefreshJob 收到停止信号,结束本轮"); } catch (Exception ex) { // 失败通知由 service 内部 MarkTransformRunFailedAsync 触发;此处仅记录 Job 层失败 _logger.LogError(ex, "S6MdpRefreshJob 执行失败"); } } }