using Microsoft.AspNetCore.Components.Routing; using Quartz; using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Security.Policy; using System.Text; using System.Threading.Tasks; using WIDESEAWCS_Common.Http; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Enums; using WIDESEAWCS_Core.Helper; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_QuartzJob.Models; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_QuartzJob.StackerCrane.Enum; using WIDESEAWCS_Tasks.StackerCraneJob; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class CommonStackerCraneJob :JobBase, IJob { private readonly ITaskService _taskService; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly ITaskRepository _taskRepository; private readonly IRouterService _routerService; public CommonStackerCraneJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService) { _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _taskRepository = taskRepository; _routerService = routerService; } public string url = AppSettings.Configuration["WMS"]; public Task Execute(IJobExecutionContext context) { CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams"); try { //CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams"); if (commonStackerCrane != null) { //if (!commonStackerCrane.IsEventSubscribed) //{ // commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订阅任务完成事件 //} if (commonStackerCrane.StackerCraneAutoStatusValue == StackerCraneAutoStatus.Automatic && commonStackerCrane.StackerCraneStatusValue == StackerCraneStatus.Normal) { //commonStackerCrane.CheckStackerCraneTaskCompleted();//防止任务完成事件监测超时,再手动触发一次 if (commonStackerCrane.StackerCraneWorkStatusValue == StackerCraneWorkStatus.Standby) { Dt_Task? task = GetTask(commonStackerCrane); if (task != null) { StackerCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task); int isIn = commonStackerCrane.Communicator.Read("DB106.12.0"); if((task.TaskType == (int)TaskOutboundTypeEnum.Outbound|| task.TaskType == (int)TaskOutboundTypeEnum.OutInventory) &&isIn==1)//如果在入库中,不允计下发出库任务 { return Task.CompletedTask; } if (stackerCraneTaskCommand != null) { bool sendFlag = commonStackerCrane.SendCommand(stackerCraneTaskCommand); if (sendFlag) { if (task.TaskType == (int)TaskInboundTypeEnum.Inbound|| task.TaskType == (int)TaskInboundTypeEnum.InInventory||task.TaskType==(int)TaskInboundTypeEnum.InPick) { _taskService.UpdateTaskStatus(task.TaskId, (int)TaskInStatusEnum.SC_InExecuting); _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机入库执行中"); var response = HttpHelpers.Post(url.Replace("PDA", "Task") + "UpdateTaskStatus?taskNum=" + task.TaskNum, "", "更新任务状态"); } else if (task.TaskType == (int)TaskOutboundTypeEnum.Outbound|| task.TaskType == (int)TaskOutboundTypeEnum.OutInventory) { _taskService.UpdateTaskStatus(task.TaskId, (int)TaskOutStatusEnum.SC_OutExecuting); _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机出库执行中"); var response = HttpHelpers.Post(url.Replace("PDA", "Task") + "UpdateTaskStatus?taskNum=" + task.TaskNum, "", "更新任务状态"); } } } } } } } } catch (Exception ex) { Console.WriteLine(nameof(CommonStackerCraneJob) + ":" + ex.ToString()); } if (commonStackerCrane != null) { //读取大堆垛机任务号和任务完成确认状态(因为封装的事件经常不触发,所以加个直接读的逻辑,以免出现堆垛机一直接处于等待wcs确认) byte IsOver = commonStackerCrane.Communicator.Read("DB106.22"); int tasknum = commonStackerCrane.Communicator.Read("DB106.18"); //WriteDebug(nameof(CommonStackerCraneJob), $"大堆垛机SC01任务号堆垛机任务号:{tasknum}状态:{IsOver}"); if (IsOver == 6) { if (commonStackerCrane.GetValue(StackerCraneDBName.WorkType) != 5) { _taskService.StackCraneTaskCompleted(tasknum); Console.Out.WriteLine("TaskCompleted" + tasknum); bool issuccess = commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5); if (issuccess) { WriteDebug(nameof(CommonStackerCraneJob), $"堆垛机任务号:{tasknum},堆垛机回写5成功"); } } } } 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(CommonStackerCrane commonStackerCrane) { Dt_Task task; task = _taskService.QueryStackerCraneTask("R01"); return task; } /// /// 出库任务判断出库站台是否被占用 /// /// 任务实体 /// 如果未被占用,返回传入的任务信息,否则,返回null private Dt_Task? OutTaskStationIsOccupied([NotNull] Dt_Task task) { Dt_Router? router = _routerService.QueryNextRoutes(task.Roadway, task.NextAddress).FirstOrDefault(); if (router != null) { IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == router.ChildPosiDeviceCode); if (device != null) { CommonConveyorLine conveyorLine = (CommonConveyorLine)device; if (conveyorLine.IsOccupied(router.ChildPosi))//出库站台未被占用 { return task; } } else { _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到出库站台【{router.ChildPosiDeviceCode}】对应的通讯对象,无法判断出库站台是否被占用"); } } else { _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"未找到站台【{task.NextAddress}】信息,无法校验站台"); } 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(task.PalletCode.Substring(0,1)=="B") { stackerCraneTaskCommand.TrayType = 2; } else { stackerCraneTaskCommand.TrayType = 1; } //stackerCraneTaskCommand.TrayType = 1; 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; } } }