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); } } } } }