using Quartz;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_ITaskInfoRepository;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_QuartzJob.StackerCrane;
using WIDESEAWCS_QuartzJob.StackerCrane.Enum;
using WIDESEAWCS_Tasks.StackerCraneJob;
namespace WIDESEAWCS_Tasks
{
[DisallowConcurrentExecution]
public class FormationCommonStackerCraneJob : IJob
{
private readonly ITaskService _taskService;
private readonly ITaskExecuteDetailService _taskExecuteDetailService;
private readonly ITaskRepository _taskRepository;
private readonly FormationStackerCraneTaskSelector _taskSelector;
private readonly FormationStackerCraneCommandBuilder _commandBuilder;
public FormationCommonStackerCraneJob(
ITaskService taskService,
ITaskExecuteDetailService taskExecuteDetailService,
ITaskRepository taskRepository,
IRouterService routerService)
{
_taskService = taskService;
_taskExecuteDetailService = taskExecuteDetailService;
_taskRepository = taskRepository;
_taskSelector = new FormationStackerCraneTaskSelector(taskService, routerService);
_commandBuilder = new FormationStackerCraneCommandBuilder(taskService, routerService);
}
public Task Execute(IJobExecutionContext context)
{
try
{
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " FormationCommonStackerCraneJob Start");
bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
if (!flag || value is not SpeFormationStackerCrane commonStackerCrane)
{
return Task.CompletedTask;
}
if (!commonStackerCrane.IsEventSubscribed)
{
commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;
}
if (commonStackerCrane.StackerCraneStatusValue != FormationStackerCraneRunStatus.Standby)
{
return Task.CompletedTask;
}
commonStackerCrane.CheckStackerCraneTaskCompleted();
if (commonStackerCrane.StackerCraneWorkStatusValue != FormationStackerCraneOperationStatus.Idle)
{
return Task.CompletedTask;
}
Dt_Task? task = _taskSelector.SelectTask(commonStackerCrane);
if (task == null)
{
return Task.CompletedTask;
}
var stackerCraneTaskCommand = _commandBuilder.ConvertToStackerCraneTaskCommand(task);
if (stackerCraneTaskCommand == null)
{
return Task.CompletedTask;
}
bool sendFlag = commonStackerCrane.SendCommand(stackerCraneTaskCommand);
if (sendFlag)
{
commonStackerCrane.LastTaskType = task.TaskType;
_taskService.UpdateTaskStatusToNext(task.TaskNum);
}
}
catch (Exception ex)
{
Console.WriteLine($"FormationCommonStackerCraneJob Error: {ex.Message}");
}
return Task.CompletedTask;
}
///
/// 任务完成事件订阅的方法
///
private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, StackerCraneTaskCompletedEventArgs e)
{
SpeFormationStackerCrane? commonStackerCrane = sender as SpeFormationStackerCrane;
if (commonStackerCrane != null)
{
if (commonStackerCrane.GetValue(FormationStackerCraneDBName.WorkType) != 7)
{
Console.Out.WriteLine("TaskCompleted" + e.TaskNum);
_taskService.StackCraneTaskCompleted(e.TaskNum);
commonStackerCrane.SetValue(FormationStackerCraneDBName.WorkType, 4);
}
}
}
}
}