using Admin.NET.Plugin.AiDOP.Production;
using Furion.Schedule;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using SqlSugar;
namespace Admin.NET.Plugin.AiDOP.Job;
///
/// S2 定时自动全量排产。默认关闭,由配置 S2:AutoSchedule:Enabled=true 开启;
/// 周期默认 60 分钟(可在作业管理中调整触发器)。
/// 每个有在制工单的租户提交一次异步排程(与手工按钮共用单飞与 run_id)。
///
[JobDetail("job_s2_auto_schedule", Description = "S2 定时自动全量排产", GroupName = "default", Concurrent = false)]
[Period(S2AutoScheduleJob.IntervalMs, TriggerId = "trigger_s2_auto_schedule", Description = "S2 自动排产节拍(默认60分钟)")]
public class S2AutoScheduleJob : IJob
{
public const int IntervalMs = 3600000;
private readonly IServiceScopeFactory _scopeFactory;
private readonly IConfiguration _configuration;
private readonly ILogger _logger;
public S2AutoScheduleJob(
IServiceScopeFactory scopeFactory,
IConfiguration configuration,
ILoggerFactory loggerFactory)
{
_scopeFactory = scopeFactory;
_configuration = configuration;
_logger = loggerFactory.CreateLogger(nameof(S2AutoScheduleJob));
}
public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken)
{
if (!_configuration.GetValue("S2:AutoSchedule:Enabled", false))
return;
using var scope = _scopeFactory.CreateScope();
var db = scope.ServiceProvider.GetRequiredService();
var action = scope.ServiceProvider.GetRequiredService();
var tenants = await db.Ado.SqlQueryAsync(
"""
SELECT DISTINCT tenant_id
FROM WorkOrdMaster
WHERE IFNULL(IsActive, 0) = 1
AND IFNULL(Status, '') NOT IN ('c', 'C')
AND tenant_id IS NOT NULL AND tenant_id > 0
""");
foreach (var tenantId in tenants)
{
if (stoppingToken.IsCancellationRequested)
break;
try
{
var domain = tenantId.ToString();
await action.SubmitGenerateAsync(
tenantId, domain, "sys-auto-schedule",
enableCapacityConstraint: false,
trigger: "auto");
_logger.LogInformation("S2AutoScheduleJob 已提交租户 {TenantId}", tenantId);
}
catch (Exception ex)
{
// 单飞冲突或业务拒绝:记日志,继续下一租户
_logger.LogWarning(ex, "S2AutoScheduleJob 跳过租户 {TenantId}", tenantId);
}
}
}
}