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