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