using Quartz; using System; using System.Diagnostics.CodeAnalysis; using System.IO; using System.Threading.Tasks; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.StackerCrane; using WIDESEAWCS_Tasks.StackerCraneJob; using WIDESEA_Core; using WIDESEAWCS_QuartzJob.Service; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class CommonStackerCraneJob : IJob { private readonly ITaskService _taskService; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly ITaskRepository _taskRepository; private readonly StackerCraneCommandConfig _config; private readonly StackerCraneTaskSelector _taskSelector; private readonly StackerCraneCommandBuilder _commandBuilder; public CommonStackerCraneJob( ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, HttpClientHelper httpClientHelper) { _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _taskRepository = taskRepository; _config = LoadConfig(); _taskSelector = new StackerCraneTaskSelector(taskService, routerService, httpClientHelper); _commandBuilder = new StackerCraneCommandBuilder(taskService, routerService, _config); } /// /// 加载配置(优先级:配置文件 > 默认配置) /// private static StackerCraneCommandConfig LoadConfig() { try { string configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "StackerCraneJob", "stackercrane-command-config.json"); if (File.Exists(configPath)) { string json = File.ReadAllText(configPath); return System.Text.Json.JsonSerializer.Deserialize(json) ?? new StackerCraneCommandConfig(); } } catch (Exception ex) { Console.WriteLine($"配置加载失败: {ex.Message},使用默认配置"); } return new StackerCraneCommandConfig(); } public Task Execute(IJobExecutionContext context) { try { Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " CommonStackerCraneJob Start"); bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); if (!flag || value is not IStackerCrane commonStackerCrane) { return Task.CompletedTask; } // 订阅一次任务完成事件。 if (!commonStackerCrane.IsEventSubscribed) { commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler; } if (!commonStackerCrane.IsCanSendTask(commonStackerCrane.Communicator, commonStackerCrane.DeviceProDTOs, commonStackerCrane.DeviceProtocolDetailDTOs)) { return Task.CompletedTask; } commonStackerCrane.CheckStackerCraneTaskCompleted(); // 任务选择下沉到专用选择器。 Dt_Task? task = _taskSelector.SelectTask(commonStackerCrane); if (task == null) { return Task.CompletedTask; } // 命令构建下沉到专用构建器。 object? stackerCraneTaskCommand = _commandBuilder.ConvertToStackerCraneTaskCommand(task); if (stackerCraneTaskCommand == null) { return Task.CompletedTask; } bool sendFlag = SendStackerCraneCommand(commonStackerCrane, stackerCraneTaskCommand); if (sendFlag) { commonStackerCrane.LastTaskType = task.TaskType; _taskService.UpdateTaskStatusToNext(task.TaskNum); } } catch (Exception ex) { Console.WriteLine($"CommonStackerCraneJob Error: {ex.Message}"); } return Task.CompletedTask; } /// /// 任务完成事件订阅的方法 /// private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, StackerCraneTaskCompletedEventArgs e) { CommonStackerCrane? commonStackerCrane = sender as CommonStackerCrane; if (commonStackerCrane != null) { Console.Out.WriteLine("TaskCompleted" + e.TaskNum); _taskService.StackCraneTaskCompleted(e.TaskNum); commonStackerCrane.SetValue(StackerCraneDBName.WorkAction, 5); } } private static bool SendStackerCraneCommand(IStackerCrane commonStackerCrane, object command) { return command switch { FormationStackerCraneTaskCommand formationCommand => commonStackerCrane.SendCommand(formationCommand), StackerCraneTaskCommand standardCommand => commonStackerCrane.SendCommand(standardCommand), _ => false }; } } }