using HslCommunication; using Microsoft.AspNetCore.Components.Routing; using Quartz; using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Communicator; using WIDESEAWCS_Core.Enums; using WIDESEAWCS_IBasicRepository; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Models; using WIDESEAWCS_QuartzJob.Repository; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_QuartzJob.StackerCrane; using WIDESEAWCS_QuartzJob.StackerCrane.Enum; using WIDESEAWCS_TaskInfoService; using WIDESEAWCS_Tasks.StackerCraneJob; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class DoubleStackerCraneJob : JobBase, IJob { private readonly ITaskService _taskService; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly ITaskRepository _taskRepository; private readonly IRouterService _routerService; private readonly IDeviceInfoService _deviceInfoService; private readonly IDeviceInfoRepository _deviceInfoRepository; private readonly ILocationInfoRepository _locationInfoRepository; public DoubleStackerCraneJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IDeviceInfoService deviceInfoService, IDeviceInfoRepository deviceInfoRepository, ILocationInfoRepository locationInfoRepository) { _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _taskRepository = taskRepository; _routerService = routerService; _deviceInfoService = deviceInfoService; _deviceInfoRepository = deviceInfoRepository; _locationInfoRepository = locationInfoRepository; } public Task Execute(IJobExecutionContext context) { try { CommonStackerCrane? stackerCraneOne = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "SC02") as CommonStackerCrane; CommonStackerCrane? stackerCraneTwo = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "SC03") as CommonStackerCrane; //Dt_DeviceInfo deviceSC02= _deviceInfoRepository.QueryFirst(x => x.DeviceCode == "SC02"); //Dt_DeviceInfo deviceSC03 = _deviceInfoRepository.QueryFirst(x => x.DeviceCode == "SC03"); //if(deviceSC02.DeviceStatus=="0") //{ // stackerCraneOne = null; //} //if(deviceSC03.DeviceStatus=="0") //{ // stackerCraneTwo = null; //} stackerCraneOne.CheckStackerCraneTaskCompleted(); Dt_Task? task = GetTask(); if (task != null) { CommonStackerCrane? StackerCrane= GetStrackerCrane(task, stackerCraneOne, stackerCraneTwo); if(StackerCrane != null) { StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task); if (stackerCraneTaskCommand != null) { bool sendFlag = StackerCrane.SendCommand(stackerCraneTaskCommand); ; if (sendFlag) { _taskService.UpdateTaskStatus(task.TaskId, (int)TaskOutStatusEnum.SC_OutExecuting); _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机出库执行中"); } else { _taskService.UpdateTaskExceptionMessage(task.TaskNum, "堆垛机执行任务命令失败!"); WriteDebug(nameof(CommonStackerCraneJob), "堆垛机执行任务命令失败!"); } } } else { WriteDebug(nameof(CommonStackerCraneJob), "未查询到当前可以执行上料任务的小堆垛机!"); } } } catch (Exception ex) { WriteError(nameof(CommonStackerCraneJob), "小堆垛机执行任务异常!", ex); } return Task.CompletedTask; } /// /// 任务完成事件订阅的方法 /// /// /// private void CommonStackerCrane_StackerCraneTaskCompletedEventHandler(object? sender, WIDESEAWCS_QuartzJob.StackerCrane.StackerCraneTaskCompletedEventArgs e) { CommonStackerCrane? commonStackerCrane = sender as CommonStackerCrane; if (commonStackerCrane != null) { if (commonStackerCrane.GetValue(StackerCraneDBName.WorkType) != 5) { Console.Out.WriteLine("TaskCompleted" + e.TaskNum); _taskService.StackCraneTaskCompleted(e.TaskNum); commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5); } } } /// /// 获取任务 /// /// 堆垛机对象 /// private Dt_Task? GetTask() { Dt_Task task; task = _taskService.QueryStackerCraneTask(); return task; } /// /// 查询上料的堆垛机,先查询默认堆垛机,如果不正常,再查询另外一台堆垛机,如果都不正常返回null /// /// private CommonStackerCrane? GetStrackerCrane(Dt_Task task, CommonStackerCrane stackerCraneOne, CommonStackerCrane stackerCraneTwo) { if(task.Roadway=="SC02") { if (stackerCraneOne != null) { if (!stackerCraneOne.IsEventSubscribed) { stackerCraneOne.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件 } if (stackerCraneOne.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && stackerCraneOne.StackerCraneStatusValue == StackerCraneStatus.Normal) { stackerCraneOne.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次 if (stackerCraneOne.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby) { return stackerCraneOne; } } else//SC02不能正常工作状态,这里需要判断sc02是否禁用,如果已禁用,才可以启动sc03 { Dt_DeviceInfo deviceSC02 = _deviceInfoRepository.QueryFirst(x => x.DeviceCode == "SC02"); if (deviceSC02.DeviceStatus=="0"&& stackerCraneTwo != null) { if (!stackerCraneTwo.IsEventSubscribed) { stackerCraneTwo.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件 } if (stackerCraneTwo.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && stackerCraneTwo.StackerCraneStatusValue == StackerCraneStatus.Normal) { stackerCraneTwo.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次 if (stackerCraneTwo.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby) { return stackerCraneTwo; } } } } } } else if (task.Roadway=="SC03") { if (stackerCraneTwo != null) { if (!stackerCraneTwo.IsEventSubscribed) { stackerCraneTwo.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件 } if (stackerCraneTwo.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && stackerCraneOne.StackerCraneStatusValue == StackerCraneStatus.Normal) { stackerCraneTwo.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次 if (stackerCraneTwo.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby) { return stackerCraneTwo; } } else//SC03不能正常工作状态,这里需要判断sc03是否禁用,如果已禁用,才可以启动sc02 { Dt_DeviceInfo deviceSC03 = _deviceInfoRepository.QueryFirst(x => x.DeviceCode == "SC03"); if (deviceSC03.DeviceStatus=="0"&&stackerCraneOne != null) { if (!stackerCraneOne.IsEventSubscribed) { stackerCraneOne.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件 } if (stackerCraneOne.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && stackerCraneTwo.StackerCraneStatusValue == StackerCraneStatus.Normal) { stackerCraneOne.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次 if (stackerCraneOne.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby) { return stackerCraneOne; } } } } } } return null; } /// /// 任务实体转换成命令Model /// /// 任务实体 /// /// public StackerCraneTaskCommand? ConvertToStackerCraneTaskCommand([NotNull] Dt_Task task) { StackerCraneTaskCommand stackerCraneTaskCommand = new StackerCraneTaskCommand(); stackerCraneTaskCommand.Barcode = task.PalletCode; stackerCraneTaskCommand.TaskNum = task.TaskNum; stackerCraneTaskCommand.WorkType = 1; if(string.IsNullOrEmpty(task.Remark))//总层数和层数是否为空 { return null; } string[] Levels = task.Remark.Split("-"); if (Levels.Length == 2) { //托盘类型 1:9层 2:4层 if (!string.IsNullOrEmpty(Levels[0])) { if (Levels[0].ToString()=="9") { stackerCraneTaskCommand.TrayType = 1; } else { stackerCraneTaskCommand.TrayType = 2; } } //料车具体的层数 if (!string.IsNullOrEmpty(Levels[1])) { stackerCraneTaskCommand.StartLayer =Convert.ToInt16(Levels[1]); } } else { return null; } string[] SourceCodes = task.SourceAddress.Split("-"); if (SourceCodes.Length == 4) { stackerCraneTaskCommand.StartRow = Convert.ToInt16(SourceCodes[1]); stackerCraneTaskCommand.StartColumn = Convert.ToInt16(SourceCodes[2]); // stackerCraneTaskCommand.StartLayer = Convert.ToInt16(SourceCodes[3]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!"); return null; } string[] targetCodes = task.TargetAddress.Split("-"); if (targetCodes.Length == 4) { stackerCraneTaskCommand.EndRow = Convert.ToInt16(targetCodes[1]); stackerCraneTaskCommand.EndColumn = Convert.ToInt16(targetCodes[2]); stackerCraneTaskCommand.EndLayer = Convert.ToInt16(targetCodes[3]); } else { //数据配置错误 _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务目标地址配置错误"); return null; } return stackerCraneTaskCommand; } } }