using Autofac.Core; 
 | 
using HslCommunication; 
 | 
using HslCommunication.Core; 
 | 
using HslCommunication.Enthernet; 
 | 
using HslCommunication.WebSocket; 
 | 
using Microsoft.Extensions.Hosting; 
 | 
using Microsoft.VisualBasic.FileIO; 
 | 
using Newtonsoft.Json; 
 | 
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; 
 | 
using Quartz; 
 | 
using SixLabors.ImageSharp.PixelFormats; 
 | 
using System; 
 | 
using System.Collections.Generic; 
 | 
using System.ComponentModel; 
 | 
using System.Diagnostics.CodeAnalysis; 
 | 
using System.Linq; 
 | 
using System.Reflection; 
 | 
using System.Text; 
 | 
using System.Threading.Tasks; 
 | 
using WIDESEAWCS_Common.TaskEnum; 
 | 
using WIDESEAWCS_Communicator; 
 | 
using WIDESEAWCS_Core; 
 | 
using WIDESEAWCS_Core.BaseRepository; 
 | 
using WIDESEAWCS_Core.Helper; 
 | 
using WIDESEAWCS_ISystemServices; 
 | 
using WIDESEAWCS_ITaskInfoService; 
 | 
using WIDESEAWCS_Model.Models; 
 | 
using WIDESEAWCS_QuartzJob; 
 | 
using WIDESEAWCS_QuartzJob.DeviceBase; 
 | 
using WIDESEAWCS_QuartzJob.StackerCrane.Enum; 
 | 
using WIDESEAWCS_TaskInfoService; 
 | 
using WIDESEAWCS_Tasks.OHT; 
 | 
  
 | 
namespace WIDESEAWCS_Tasks 
 | 
{ 
 | 
    [DisallowConcurrentExecution] 
 | 
    public class OHTJob : JobBase, IJob 
 | 
    { 
 | 
        public static string InorOut = "In"; 
 | 
        public static OHTReadData oHTReadData = new OHTReadData(); 
 | 
        private readonly ITaskService _taskService; 
 | 
        private readonly Idt_ErrormsginfoService _ErrormsginfoService; 
 | 
        private readonly IRepository<Dt_Task_hty> _taskhtyRepository; 
 | 
        WebSocketServer _webSocketServer; 
 | 
        OtherDevice devicese; 
 | 
        OtherDevice deviceses; 
 | 
        public OHTJob(ITaskService taskService, WebSocketServer webSocketServer, Idt_ErrormsginfoService errormsginfoService, IRepository<Dt_Task_hty> taskhtyRepository) 
 | 
        { 
 | 
            _taskService = taskService;//注入 
 | 
            _webSocketServer = webSocketServer; 
 | 
            _ErrormsginfoService = errormsginfoService; 
 | 
            _taskhtyRepository = taskhtyRepository; 
 | 
        } 
 | 
        public Task Execute(IJobExecutionContext context) 
 | 
        { 
 | 
            //return Task.CompletedTask; 
 | 
            bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value); 
 | 
            if (flag && value != null) 
 | 
            { 
 | 
                //天车PLC对象 
 | 
                OtherDevice device = (OtherDevice)value; 
 | 
                OtherDevice zxj = (OtherDevice)Storage.Devices.Find(v => v.DeviceName == "阳极整形机"); 
 | 
                OtherDevice gzj = (OtherDevice)Storage.Devices.Find(v => v.DeviceName == "阳极规整机"); 
 | 
                devicese = zxj; 
 | 
                deviceses = gzj; 
 | 
  
 | 
                 
 | 
                //整形机PLC对象 
 | 
                var ZXJdevice = Storage.Devices.Find(v => v.DeviceName == "阳极整形机"); 
 | 
                //规整机PLC对象 
 | 
                var GZJevice = Storage.Devices.Find(v => v.DeviceName == "阳极规整机"); 
 | 
                //if (!device.Communicator.IsConnected || !ZXJdevice.Communicator.IsConnected || !GZJevice.Communicator.IsConnected) 
 | 
                //{ 
 | 
                //    return Task.CompletedTask; 
 | 
                //} 
 | 
                try 
 | 
                { 
 | 
                    #region 天车完成任务逻辑 
 | 
                    //因为天的任务需要分段发送,所以取货完成与放货完成需要单独做逻辑控制 
 | 
                    //判断天车当前有没有取货完成任务信号 
 | 
                    if (oHTReadData.R_RunState == (int)RunStateEnum.PickUpCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete) 
 | 
                    { 
 | 
                        //天车取货完成逻辑 
 | 
                        var nawtask = _taskService.QueryTakNnmTask(oHTReadData.R_TaskNumber); 
 | 
                        if (nawtask == null) 
 | 
                        { 
 | 
                            throw new Exception(string.Format("天车取货完成任务未查询到任务号{0}", oHTReadData.R_TaskNumber)); 
 | 
                        } 
 | 
                        //入库 
 | 
                        if (nawtask.TaskType == (int)TaskInboundTypeEnum.Inbound) 
 | 
                        { 
 | 
                            //如果任务的状态是否是天车入库取货执行中 
 | 
                            if (nawtask.TaskState == (int)TaskInStatusEnum.Line_InGrabExecuting) 
 | 
                            { 
 | 
                                //修改状态 
 | 
                                WebResponseContent result = _taskService.UpdateTaskStatusToLine_Ingrab(nawtask); 
 | 
                                if (result.Status) 
 | 
                                { 
 | 
                                    device.SetValue(DeviceDBName.W_ConfirmSignal, 3); 
 | 
                                } 
 | 
                            } 
 | 
                        } 
 | 
                        //出库 
 | 
                        else if (nawtask.TaskType == (int)TaskOutboundTypeEnum.Outbound) 
 | 
                        { 
 | 
                            //如果任务状态是否是天车出库取货执行中 
 | 
                            if (nawtask.TaskState == (int)TaskOutStatusEnum.Line_OutGrabExecuting) 
 | 
                            { 
 | 
                                //修改状态 
 | 
                                WebResponseContent result = _taskService.UpdateTaskStatusToLine_Outgrab(nawtask); 
 | 
                                if (result.Status) 
 | 
                                { 
 | 
                                    device.SetValue(DeviceDBName.W_ConfirmSignal, 3); 
 | 
                                } 
 | 
                            } 
 | 
                        } 
 | 
                        //直接出库 
 | 
                        else if (nawtask.TaskType == (int)TaskOutboundTypeEnum.OutInventory) 
 | 
                        { 
 | 
                            //修改状态 
 | 
                            WebResponseContent result = _taskService.UpdateTaskStatusToLine_Outgrab(nawtask); 
 | 
                            if (result.Status) 
 | 
                            { 
 | 
                                device.SetValue(DeviceDBName.W_ConfirmSignal, 3); 
 | 
                            } 
 | 
                        } 
 | 
                        //剔除出库 
 | 
                        else if (nawtask.TaskType == (int)TaskOutboundTypeEnum.TiChuChuKu) 
 | 
                        { 
 | 
                            //修改状态 
 | 
                            WebResponseContent result = _taskService.UpdateTaskStatusToLine_Outgrab(nawtask); 
 | 
                            if (result.Status) 
 | 
                            { 
 | 
                                //gzj.SetValue(DeviceDBName.W_GZJ_LockGZJ, true); 
 | 
                                device.SetValue(DeviceDBName.W_ConfirmSignal, 3); 
 | 
                            } 
 | 
                        } 
 | 
                        //剔除入库 
 | 
                        else if (nawtask.TaskType == (int)TaskInboundTypeEnum.TiChuRuKu) 
 | 
                        { 
 | 
                            //修改状态 
 | 
                            WebResponseContent result = _taskService.UpdateTaskStatusToLine_Ingrab(nawtask); 
 | 
                            if (result.Status) 
 | 
                            { 
 | 
                                device.SetValue(DeviceDBName.W_ConfirmSignal, 3); 
 | 
                            } 
 | 
                        } 
 | 
                        //剔除直接出库 
 | 
                        else if (nawtask.TaskType == (int)TaskOutboundTypeEnum.TiChuZhiJieChuKu) 
 | 
                        { 
 | 
                            //修改状态 
 | 
                            WebResponseContent result = _taskService.UpdateTaskStatusToLine_Outgrab(nawtask); 
 | 
                            if (result.Status) 
 | 
                            { 
 | 
                                //gzj.SetValue(DeviceDBName.W_GZJ_LockGZJ, true); 
 | 
                                device.SetValue(DeviceDBName.W_ConfirmSignal, 3); 
 | 
                            } 
 | 
                        } 
 | 
                        return Task.CompletedTask; 
 | 
                    } 
 | 
                    else if (oHTReadData.R_RunState == (int)RunStateEnum.PutCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete) 
 | 
                    { 
 | 
                        //天车放货完成逻辑 
 | 
                        WebResponseContent result = _taskService.StackCraneTaskCompleted(oHTReadData.R_TaskNumber, oHTReadData.weight); 
 | 
                        if (result.Status) 
 | 
                        { 
 | 
                            device.SetValue(DeviceDBName.W_ConfirmSignal, 3); 
 | 
                        } 
 | 
  
 | 
                        var nawtask = _taskService.QueryTakNnmTask(oHTReadData.R_TaskNumber); 
 | 
                        if (nawtask == null) 
 | 
                        { 
 | 
                            throw new Exception(string.Format("天车取货完成任务未查询到任务号{0}", oHTReadData.R_TaskNumber)); 
 | 
                        } 
 | 
                        //剔除出库与剔除直接出库 
 | 
                        //if (nawtask.TaskType == (int)TaskOutboundTypeEnum.TiChuChuKu || nawtask.TaskType == (int)TaskOutboundTypeEnum.TiChuZhiJieChuKu) 
 | 
                        //{ 
 | 
                        //    gzj.SetValue(DeviceDBName.W_GZJ_LockGZJ, false); 
 | 
                        //} 
 | 
                        return Task.CompletedTask; 
 | 
                    } 
 | 
                    else if (oHTReadData.R_RunState == (int)RunStateEnum.MoveCompleted && oHTReadData.R_TaskState == (int)TaskStateEnum.TaskComplete) 
 | 
                    { 
 | 
                        //天车移动完成 
 | 
                        WebResponseContent result = _taskService.StackCraneTaskCompleted(oHTReadData.R_TaskNumber, oHTReadData.weight); 
 | 
                        if (result.Status) 
 | 
                        { 
 | 
                            //剔除出库、直接出库给完成信号 
 | 
                            //List<Dt_Task_hty> Task_hty = _taskhtyRepository.QueryData(); 
 | 
                            //int shu = Task_hty.Count - 1; 
 | 
                            //int zhi = Task_hty[shu].TaskId; 
 | 
                            //Dt_Task_hty lishi = _taskhtyRepository.QueryFirst(x => x.TaskId == zhi); 
 | 
                            //if (lishi.TargetAddress == "40-2-1") 
 | 
                            //{ 
 | 
                            //    gzj.SetValue(DeviceDBName.W_GZJ_LockGZJ, false); 
 | 
                            //} 
 | 
                            device.SetValue(DeviceDBName.W_ConfirmSignal, 3); 
 | 
                        } 
 | 
                        return Task.CompletedTask; 
 | 
                    } 
 | 
                    #endregion 
 | 
  
 | 
                    #region 天车发送任务逻辑 
 | 
                    if (oHTReadData.R_RunMode == (int)RunModeEnum.Automatic) 
 | 
                    { 
 | 
                        if (oHTReadData.R_RunState == (int)RunStateEnum.Standby) 
 | 
                        { 
 | 
                            //查看任务池中是否存在执行中的任务 
 | 
                            var tasking = _taskService.QueryTasking(); 
 | 
                            if (tasking==null) 
 | 
                            { 
 | 
                                Dt_Task? task = GetTask(InorOut); 
 | 
                                if (task != null) 
 | 
                                { 
 | 
                                    OHTTaskCommand? oHTTaskCommand = ConvertToOHTTaskCommand(task); 
 | 
                                    if (oHTTaskCommand != null) 
 | 
                                    { 
 | 
                                        //给天车下发任务之前将此值写0 
 | 
                                        device.SetValue(DeviceDBName.W_ConfirmSignal, 0); 
 | 
                                        //todo:写入任务命令 
 | 
                                        device.SetValue(DeviceDBName.W_Task_Type, oHTTaskCommand.W_Task_Type); 
 | 
                                        device.SetValue(DeviceDBName.W_Pick_Line, oHTTaskCommand.W_Pick_Line); 
 | 
                                        device.SetValue(DeviceDBName.W_Pick_Column, oHTTaskCommand.W_Pick_Column); 
 | 
                                        device.SetValue(DeviceDBName.W_Put_Line, oHTTaskCommand.W_Put_Line); 
 | 
                                        device.SetValue(DeviceDBName.W_Put_Column, oHTTaskCommand.W_Put_Column); 
 | 
                                        device.SetValue(DeviceDBName.W_Catch_1, oHTTaskCommand.W_Catch_1); 
 | 
                                        device.SetValue(DeviceDBName.W_Catch_2, oHTTaskCommand.W_Catch_2); 
 | 
                                        device.SetValue(DeviceDBName.W_TaskNumber, oHTTaskCommand.W_TaskNumber); 
 | 
                                        device.SetValue(DeviceDBName.W_CheckValue, oHTTaskCommand.W_CheckValue); 
 | 
                                        //确认信号写入1,任务下达完成 
 | 
                                        device.SetValue(DeviceDBName.W_ConfirmSignal, 1); 
 | 
                                        Thread.Sleep(500); 
 | 
                                        //WCS检测到天车的R_TaskState=1,通过W_ConfirmSignal置2表示让天车开始执行任务 
 | 
                                        int R_TaskState = device.GetValue<DeviceDBName, short>(DeviceDBName.R_TaskState); 
 | 
                                        if (R_TaskState == 1) 
 | 
                                        { 
 | 
                                            device.SetValue(DeviceDBName.W_ConfirmSignal, 2); 
 | 
                                        } 
 | 
                                        //下发成功,修改任务状态 
 | 
                                        _taskService.UpdateTaskStatus(task.TaskId, oHTTaskCommand.W_Task_Type); 
 | 
                                    } 
 | 
                                } 
 | 
                            } 
 | 
                        } 
 | 
                    } 
 | 
                    #endregion 
 | 
                } 
 | 
                catch (Exception ex) 
 | 
                {  
 | 
                    _ErrormsginfoService.UpdateErrorMsg(ex.Message, 1); 
 | 
                } 
 | 
            } 
 | 
            return Task.CompletedTask; 
 | 
        } 
 | 
  
 | 
  
 | 
        /// <summary> 
 | 
        /// 任务实体转换成命令Model 
 | 
        /// </summary> 
 | 
        /// <param name="task">任务实体</param> 
 | 
        /// <returns></returns> 
 | 
        /// <exception cref="Exception"></exception> 
 | 
        public OHTTaskCommand? ConvertToOHTTaskCommand([NotNull] Dt_Task task) 
 | 
        { 
 | 
            OHTTaskCommand oHtTaskCommand = new OHTTaskCommand(); 
 | 
             
 | 
            if (task.TaskState == (int)TaskInStatusEnum.InNew || task.TaskState == (int)TaskOutStatusEnum.OutNew) 
 | 
            { 
 | 
                oHtTaskCommand.W_Task_Type = 2; 
 | 
                string[] SourceCodes = task.SourceAddress.Split("-"); 
 | 
                if (SourceCodes.Length == 3) 
 | 
                { 
 | 
                    oHtTaskCommand.W_Pick_Line = Convert.ToInt16(SourceCodes[0]); 
 | 
                    oHtTaskCommand.W_Pick_Column = Convert.ToInt16(SourceCodes[1]); 
 | 
                    oHtTaskCommand.W_Put_Line = 0; 
 | 
                    oHtTaskCommand.W_Put_Column = 0; 
 | 
  
 | 
                    //剔除出库(不需要发送信号) 
 | 
                    //剔除入库 
 | 
                    if (task.TaskType == (int)TaskInboundTypeEnum.TiChuRuKu) 
 | 
                    { 
 | 
                        devicese.SetValue(DeviceDBName.W_ZXJ_LockLocation, true); 
 | 
                    } 
 | 
                    //剔除直接出库 
 | 
                    else if (task.TaskType == (int)TaskOutboundTypeEnum.TiChuZhiJieChuKu) 
 | 
                    { 
 | 
                        devicese.SetValue(DeviceDBName.W_ZXJ_LockLocation, true); 
 | 
                    } 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    //数据配置错误 
 | 
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!"); 
 | 
                    return null; 
 | 
                } 
 | 
                oHtTaskCommand.W_CheckValue = 2 + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]); 
 | 
            } 
 | 
            else if (task.TaskState == (int)TaskInStatusEnum.Line_Ingrab || task.TaskState == (int)TaskOutStatusEnum.SC_OutExecuting) 
 | 
            { 
 | 
                oHtTaskCommand.W_Task_Type = 3; 
 | 
                string[] SourceCodes = task.TargetAddress.Split("-"); 
 | 
                if (SourceCodes.Length == 3) 
 | 
                { 
 | 
                    oHtTaskCommand.W_Pick_Line = 0; 
 | 
                    oHtTaskCommand.W_Pick_Column =0; 
 | 
                    oHtTaskCommand.W_Put_Line = Convert.ToInt16(SourceCodes[0]); 
 | 
                    oHtTaskCommand.W_Put_Column = Convert.ToInt16(SourceCodes[1]); 
 | 
  
 | 
                    //剔除出库 
 | 
                    //if (task.TaskType == (int)TaskOutboundTypeEnum.TiChuChuKu) 
 | 
                    //{ 
 | 
                    //    deviceses.SetValue(DeviceDBName.W_GZJ_LockGZJ, true); 
 | 
                    //} 
 | 
                    //剔除入库 
 | 
                    if (task.TaskType == (int)TaskInboundTypeEnum.TiChuRuKu) 
 | 
                    { 
 | 
  
 | 
                        devicese.SetValue(DeviceDBName.W_ZXJ_LockLocation, false); 
 | 
                    } 
 | 
                    //剔除直接出库 
 | 
                    else if (task.TaskType == (int)TaskOutboundTypeEnum.TiChuZhiJieChuKu) 
 | 
                    { 
 | 
  
 | 
                        //deviceses.SetValue(DeviceDBName.W_GZJ_LockGZJ, true); 
 | 
                        devicese.SetValue(DeviceDBName.W_ZXJ_LockLocation, false); 
 | 
                    } 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    //数据配置错误 
 | 
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!"); 
 | 
                    return null; 
 | 
                } 
 | 
                oHtTaskCommand.W_CheckValue = 3 + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]); 
 | 
            } 
 | 
            else if(task.TaskState == (int)TaskMoveStatusEnum.OutNewMove ) 
 | 
            { 
 | 
                oHtTaskCommand.W_Task_Type = 4; 
 | 
                string[] SourceCodes = task.TargetAddress.Split("-"); 
 | 
                if (SourceCodes.Length == 3) 
 | 
                { 
 | 
                    oHtTaskCommand.W_Pick_Line = 0; 
 | 
                    oHtTaskCommand.W_Pick_Column = 0; 
 | 
                    oHtTaskCommand.W_Put_Line = Convert.ToInt16(SourceCodes[0]); 
 | 
                    oHtTaskCommand.W_Put_Column = Convert.ToInt16(SourceCodes[1]); 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    //数据配置错误 
 | 
                    _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"任务源地址配置错误!"); 
 | 
                    return null; 
 | 
                } 
 | 
                oHtTaskCommand.W_CheckValue = 4 + Convert.ToInt16(SourceCodes[0]) + Convert.ToInt16(SourceCodes[1]); 
 | 
            } 
 | 
             
 | 
            if (task.WMSId==1) 
 | 
            { 
 | 
                oHtTaskCommand.W_Catch_1 = 1; 
 | 
                oHtTaskCommand.W_Catch_2 = 0; 
 | 
                oHtTaskCommand.W_CheckValue += 1; 
 | 
            } 
 | 
            else if (task.WMSId == 2) 
 | 
            { 
 | 
                oHtTaskCommand.W_Catch_1 = 0; 
 | 
                oHtTaskCommand.W_Catch_2 = 1; 
 | 
                oHtTaskCommand.W_CheckValue += 1; 
 | 
            } 
 | 
            else if (task.WMSId == 3) 
 | 
            { 
 | 
                oHtTaskCommand.W_Catch_1 = 1; 
 | 
                oHtTaskCommand.W_Catch_2 = 1; 
 | 
                oHtTaskCommand.W_CheckValue += 2; 
 | 
            } 
 | 
            oHtTaskCommand.W_TaskNumber = task.TaskId; 
 | 
            oHtTaskCommand.W_CheckValue += task.TaskId; 
 | 
            return oHtTaskCommand; 
 | 
        } 
 | 
  
 | 
  
 | 
        /// <summary> 
 | 
        /// 获取任务 
 | 
        /// </summary> 
 | 
        /// <returns></returns> 
 | 
        private Dt_Task? GetTask(string workType) 
 | 
        { 
 | 
            Dt_Task task; 
 | 
            task = _taskService.QueryStackerCraneTask(workType); 
 | 
            if (task!=null && (task.TaskState==(int)TaskInStatusEnum.InNew|| task.TaskState == (int)TaskOutStatusEnum.OutNew)) 
 | 
            { 
 | 
                if (task.TaskType == (int)TaskInboundTypeEnum.Inbound) 
 | 
                { 
 | 
                    InorOut = "Out"; 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    InorOut = "In"; 
 | 
                } 
 | 
            } 
 | 
            else 
 | 
            { 
 | 
                if (workType.Equals("In")) 
 | 
                { 
 | 
                    InorOut = "Out"; 
 | 
                } 
 | 
                else 
 | 
                { 
 | 
                    InorOut = "In"; 
 | 
                } 
 | 
            } 
 | 
            return task; 
 | 
        } 
 | 
    } 
 | 
} 
 |