1
z8018
2025-04-16 1f361850d35ba47225951efbc49d592eea685cf8
ÏîÄ¿´úÂë/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/Gantry/GantryJob.cs
@@ -3,6 +3,7 @@
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using HslCommunication.WebSocket;
using Quartz;
using WIDESEAWCS_Common;
using WIDESEAWCS_Core.Helper;
@@ -23,37 +24,38 @@
        private readonly ITaskRepository _taskRepository;
        private readonly ITaskService _taskService;
        private readonly IContainerItemRepository _containerItemRepository;
        public GantryJob(ITaskRepository taskRepository, ITaskService taskService, IContainerItemRepository containerItemRepository)
        private readonly WebSocketServer _webSocketServer;
        public GantryJob(ITaskRepository taskRepository, ITaskService taskService, IContainerItemRepository containerItemRepository, WebSocketServer webSocketServer)
        {
            _taskRepository = taskRepository;
            _taskService = taskService;
            _containerItemRepository = containerItemRepository;
            _webSocketServer = webSocketServer;
        }
        public Task Execute(IJobExecutionContext context)
        {
            try
            bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
            if (flag && value != null && value is OtherDevice)
            {
                bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
                if (flag && value != null && value is OtherDevice)
                OtherDevice otherDevice = (OtherDevice)value;
                try
                {
                    OtherDevice otherDevice = (OtherDevice)value;
                    byte gantryStatus = otherDevice.GetValue<GantryDBName, byte>(GantryDBName.GantryStatus);
                    byte gantryAutoStatus = otherDevice.GetValue<GantryDBName, byte>(GantryDBName.GantryAutoStatus);
                    byte gantryWorkStatus = otherDevice.GetValue<GantryDBName, byte>(GantryDBName.GantryWorkStatus);
                    if(gantryStatus == 1 && gantryAutoStatus == 3 && gantryWorkStatus == 0)
                    if (gantryStatus == 1 && gantryAutoStatus == 3 && gantryWorkStatus == 0)
                    {
                        // é€»è¾‘处理
                        // 1. è¯»å–任务
                        // 2. ä»»åŠ¡æ‰§è¡Œ
                        // 3. ä»»åŠ¡å®Œæˆ
                        Dt_Task? task = _taskService.QueryAGantryUnExecuteTask(otherDevice.DeviceCode);
                        if(task != null)
                        if (task != null)
                        {
                            string[] takePositions = task.CurrentAddress.Split("*");
                            if(takePositions.Length != 5)
                            if (takePositions.Length != 5)
                            {
                                //WriteError
                                return Task.CompletedTask;
@@ -72,20 +74,127 @@
                                //WriteError
                                return Task.CompletedTask;
                            }
                            if (LightStatusStorage.LightStatusDic.TryGetValue(putPositions[0], out LightStatusEnum lightStatusDic))
                            {
                                if (lightStatusDic != LightStatusEnum.LightWorking)
                                {
                                    LightStatusStorage.LightStatusDic[putPositions[0]] = LightStatusEnum.LightWorking;
                                }
                            }
                            otherDevice.SetValue(GantryDBName.TwoHand, true);
                            otherDevice.SetValue(GantryDBName.TaskNum, task.TaskNum);
                            //otherDevice.SetValue(GantryDBName.TakePosition, Convert.ToInt32(takePositions[0]));
                            otherDevice.SetValue(GantryDBName.TakePositionX, Convert.ToInt32(takePositions[1]));
                            otherDevice.SetValue(GantryDBName.TakePositionY, Convert.ToInt32(takePositions[2]));
                            otherDevice.SetValue(GantryDBName.TakePositionZ, Convert.ToInt32(takePositions[3]));
                            otherDevice.SetValue(GantryDBName.TakePositionR, Convert.ToInt32(takePositions[4]));
                            //otherDevice.SetValue(GantryDBName.PutPosition, Convert.ToInt32(putPositions[0]));
                            otherDevice.SetValue(GantryDBName.PutPositionX, Convert.ToInt32(putPositions[1]));
                            otherDevice.SetValue(GantryDBName.PutPositionY, Convert.ToInt32(putPositions[2]));
                            otherDevice.SetValue(GantryDBName.PutPositionZ, Convert.ToInt32(putPositions[3]));
                            otherDevice.SetValue(GantryDBName.PutPositionR, Convert.ToInt32(putPositions[4]));
                            int takePoX = Convert.ToInt32(takePositions[1]);
                            int takePoY = Convert.ToInt32(takePositions[2]);
                            int takePoZ = OPositions.HPositions[takePositions[0]].PositionZ + 30 * 1000 - Convert.ToInt32(takePositions[3]) * 1000;
                            if(OPositions.HPositions[takePositions[0]].PositionZ == 0)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", "取货Z坐标读取为0");
                                return Task.CompletedTask;
                            }
                            int takePoR = 0;
                            int putPoX = Convert.ToInt32(putPositions[1]);
                            int putPoY = Convert.ToInt32(putPositions[2]);
                            int putPoZ = OPositions.HPositions[putPositions[0]].PositionZ - Convert.ToInt32(putPositions[3]) * 1000;
                            if (OPositions.HPositions[takePositions[0]].PositionZ == 0)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", "放货Z坐标读取为0");
                                return Task.CompletedTask;
                            }
                            int putPoR = 0;
                            if (Convert.ToInt32(takePositions[4]) == 1)
                            {
                                takePoX = takePoX * 1000 + OPositions.HPositions[takePositions[0]].PositionX;
                                takePoY = takePoY * 1000 + OPositions.HPositions[takePositions[0]].PositionY;
                                putPoX = putPoX * 1000 + OPositions.HPositions[putPositions[0]].PositionX;
                                putPoY = putPoY * 1000 + OPositions.HPositions[putPositions[0]].PositionY;
                                takePoR = OPositions.HPositions[takePositions[0]].PositionR;
                                putPoR = OPositions.HPositions[putPositions[0]].PositionR;
                                WriteDebug($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"取货位:{takePositions[0]},放货位:{putPositions[0]}{Environment.NewLine}取货坐标:X:{takePoX} Y:{takePoY} Z:{takePoZ} R:{takePoR}{Environment.NewLine}放货坐标:X:{putPoX} Y:{putPoY} Z:{putPoZ} R:{putPoR}{Environment.NewLine}读取PLC取货坐标:X:{OPositions.HPositions[takePositions[0]].PositionX} Y:{OPositions.HPositions[takePositions[0]].PositionY} Z:{OPositions.HPositions[takePositions[0]].PositionZ} R:{OPositions.HPositions[takePositions[0]].PositionR}{Environment.NewLine}读取PLC放货坐标:X:{OPositions.HPositions[putPositions[0]].PositionX} Y:{OPositions.HPositions[putPositions[0]].PositionY} Z:{OPositions.HPositions[putPositions[0]].PositionZ} R:{OPositions.HPositions[putPositions[0]].PositionR}");
                            }
                            else
                            {
                                takePoX = takePoX * 1000 + OPositions.ZPositions[takePositions[0]].PositionX;
                                takePoY = takePoY * 1000 + OPositions.ZPositions[takePositions[0]].PositionY;
                                putPoX = putPoX * 1000 + OPositions.ZPositions[putPositions[0]].PositionX;
                                putPoY = putPoY * 1000 + OPositions.ZPositions[putPositions[0]].PositionY;
                                takePoR = OPositions.ZPositions[takePositions[0]].PositionR;
                                putPoR = OPositions.ZPositions[putPositions[0]].PositionR;
                                WriteDebug($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"取货位:{takePositions[0]},放货位:{putPositions[0]}{Environment.NewLine}取货坐标:X:{takePoX} Y:{takePoY} Z:{takePoZ} R:{takePoR}{Environment.NewLine}放货坐标:X:{putPoX} Y:{putPoY} Z:{putPoZ} R:{putPoR}{Environment.NewLine}读取PLC取货坐标:X:{OPositions.ZPositions[takePositions[0]].PositionX} Y:{OPositions.ZPositions[takePositions[0]].PositionY} Z:{OPositions.ZPositions[takePositions[0]].PositionZ} R:{OPositions.ZPositions[takePositions[0]].PositionR}{Environment.NewLine}读取PLC放货坐标:X:{OPositions.ZPositions[putPositions[0]].PositionX} Y:{OPositions.ZPositions[putPositions[0]].PositionY} Z:{OPositions.ZPositions[putPositions[0]].PositionZ} R:{OPositions.ZPositions[putPositions[0]].PositionR}");
                            }
                            int maxX = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxX);
                            int minX = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinX);
                            int maxY = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxY);
                            int minY = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinY);
                            int maxZ = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxZ);
                            int minZ = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinZ);
                            int maxR = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MaxR);
                            int minR = otherDevice.GetValue<GantryDBName, int>(GantryDBName.MinR);
                            if(takePoX < minX || takePoX > maxX)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"X取货坐标超出范围,取货坐标:{takePoX},最大值:{maxX},最小值:{minX}");
                                return Task.CompletedTask;
                            }
                            if(putPoX < minX || putPoX > maxX)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"X放货坐标超出范围,取货坐标:{putPoX},最大值:{maxX},最小值:{minX}");
                                return Task.CompletedTask;
                            }
                            if (takePoY < minY || takePoY > maxY)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"Y取货坐标超出范围,取货坐标:{takePoY},最大值:{maxY},最小值:{minY}");
                                return Task.CompletedTask;
                            }
                            if (putPoY < minY || putPoY > maxY)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"Y放货坐标超出范围,取货坐标:{putPoY},最大值:{maxY},最小值:{minY}");
                                return Task.CompletedTask;
                            }
                            if (takePoZ < minZ || takePoZ > maxZ)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"Z取货坐标超出范围,取货坐标:{takePoZ},最大值:{maxZ},最小值:{minZ}");
                                return Task.CompletedTask;
                            }
                            if (putPoZ < minZ || putPoZ > maxZ)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"Z放货坐标超出范围,取货坐标:{putPoZ},最大值:{maxZ},最小值:{minZ}");
                                return Task.CompletedTask;
                            }
                            if (takePoR < minR || takePoR > maxR)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"R取货坐标超出范围,取货坐标:{takePoR},最大值:{maxR},最小值:{minR}");
                                return Task.CompletedTask;
                            }
                            if (putPoR < minR || putPoR > maxR)
                            {
                                WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}-坐标", $"R放货坐标超出范围,取货坐标:{putPoR},最大值:{maxR},最小值:{minR}");
                                return Task.CompletedTask;
                            }
                            otherDevice.SetValue(GantryDBName.TakePositionX, takePoX);
                            otherDevice.SetValue(GantryDBName.TakePositionY, takePoY);
                            otherDevice.SetValue(GantryDBName.TakePositionZ, takePoZ);
                            otherDevice.SetValue(GantryDBName.TakePositionR, takePoR);
                            otherDevice.SetValue(GantryDBName.PutPositionX, putPoX);
                            otherDevice.SetValue(GantryDBName.PutPositionY, putPoY);
                            otherDevice.SetValue(GantryDBName.PutPositionZ, putPoZ);
                            otherDevice.SetValue(GantryDBName.PutPositionR, putPoR);
                            otherDevice.SetValue(GantryDBName.Length, containerItem.ItemLength);
                            otherDevice.SetValue(GantryDBName.Width, containerItem.ItemWidth);
                            otherDevice.SetValue(GantryDBName.Height, containerItem.ItemHeight);
@@ -96,15 +205,42 @@
                            _taskRepository.UpdateData(task);
                        }
                    }
                    else if(gantryWorkStatus == 5)
                    else if (gantryWorkStatus == 5)
                    {
                        int currentTaskNum = otherDevice.GetValue<GantryDBName, int>(GantryDBName.CurrentTaskNum);
                        if (currentTaskNum > 0)
                        {
                            Dt_Task task = _taskRepository.QueryFirst(x => x.TaskNum == currentTaskNum);
                            if (task != null)
                            {
                                _taskService.TaskComplete(task);
                                string[] putPositions = task.NextAddress.Split("*");
                                if (putPositions.Length != 5)
                                {
                                    //WriteError
                                    return Task.CompletedTask;
                                }
                                if (LightStatusStorage.LightStatusDic.TryGetValue(putPositions[0], out LightStatusEnum lightStatusDic))
                                {
                                    if (lightStatusDic != LightStatusEnum.Ready)
                                    {
                                        LightStatusStorage.LightStatusDic[putPositions[0]] = LightStatusEnum.Ready;
                                    }
                                }
                            }
                        }
                        otherDevice.SetValue(GantryDBName.WorkType, 5);
                    }
                }
                catch (Exception ex)
                {
                    WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", ex.Message, ex);
                }
            }
            catch (Exception ex)
            else
            {
                WriteError(nameof(GantryJob), "参数错误,未传递设备参数或设备类型错误");
            }
            return Task.CompletedTask;
        }