huanghongfeng
2025-09-26 83f3c63f1cae6224320a8d19251e3bc0404da096
´úÂë¹ÜÀí/WCS/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/SpeStackerCraneJob/SpeStackerCraneJob.cs
@@ -3,6 +3,7 @@
using Microsoft.AspNetCore.Hosting;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;
using Quartz;
using System;
using System.Collections;
@@ -81,7 +82,7 @@
                        //下发RGV任务之前,先读取一下安全门状态
                        //查找RGV进行下发任务
                        Dt_Task task = GetTask(speStackerCrane.DeviceCode);
                        Dt_Task task = GetTask(speStackerCrane.DeviceCode,getStackerObject);
                        if (task != null)
                        {
                            //调取写入RGV小车任务
@@ -95,46 +96,17 @@
                        }
                        else
                        {
                            int HCJGoodsplatform = 1170;    //定义的放货站台
                            //判断母车是否需要进行移动
                            AGVStation GdZiche = _agvStationService.Corridorequipment(speStackerCrane.DeviceCode);
                            if(GdZiche.Station_Area == 1)
                            if(speStackerCrane.DeviceCode=="RGV101" || speStackerCrane.DeviceCode == "RGV101")
                            {
                                switch (getStackerObject.RGVCurrentlocation)
                                {
                                    case int Whcjaddress when Whcjaddress == GdZiche.MotherCarDeviceCode:    //在第一个母车上
                                        RGVMovetask(HCJGoodsplatform, GdZiche.ChildPosiDeviceCode);
                                        break;
                                    case int Waddress when Waddress == GdZiche.MotherCardeputy:              //在第二个母车上
                                        OutNMotherCar(GdZiche.MotherCarDeviceCode);
                                        break;
                                    case int HCJaddress when HCJaddress == GdZiche.HCJStorageaddress:        //在HCJ站台上
                                        OutHCJMotherCar(GdZiche);
                                        break;
                                    default: return null;
                                }
                                //当没任务的时候,则进行移动
                                Returnposition(speStackerCrane.DeviceCode, getStackerObject.RGVCurrentlocation);
                            }
                            else
                            {
                                switch (getStackerObject.RGVCurrentlocation)
                                {
                                    case int Whcjaddress when Whcjaddress == GdZiche.MotherCarDeviceCode:    //在第一个母车上,需要判断外侧子车是否在HCJ上
                                        OutinnerSideNMotherCar(GdZiche);
                                        break;
                                    case int Waddress when Waddress == GdZiche.MotherCardeputy:              //在第二个母车上,需要判断子车与外侧母车是否在过道上
                                        OutNMotherCar(GdZiche.MotherCarDeviceCode);
                                        break;
                                    default: return null;
                                }
                            }
                        }
                        
                    }
                }
            }
            catch (Exception ex)
            {
@@ -143,117 +115,91 @@
            return Task.CompletedTask;
        }
        private Dt_Task? GetTask(string DeviceCode)
        private Dt_Task? GetTask(string DeviceCode, GetStackerObject getStackerObject)
        {
            Dt_Task task = _taskService.QueryStackerCraneTask(DeviceCode);
            if (task == null) return null;
            return task.TaskType switch
            // æ ¹æ®è®¾å¤‡åç§°ï¼ŒèŽ·å–åˆ°è®¾å¤‡ç›¸å…³æ•°æ®
            AGVStation RGVTaskdevice = _agvStationService.Corridorequipment(DeviceCode);   //根据设备获取到内容
            return RGVTaskdevice.Station_tasktype switch
            {
                (int)TaskInboundTypeEnum.Inbound => HandleInboundTask(task),
                (int)TaskOutboundTypeEnum.Outbound => HandleOutboundTask(task),
                (int)RGVTasktype.Inbound => HandleInboundTask(RGVTaskdevice, getStackerObject),
                (int)RGVTasktype.Outbound => OutboundEquipmentTask(RGVTaskdevice, getStackerObject),
                _ => null
            };
        }
        private Dt_Task? HandleInboundTask(Dt_Task task)
        {
            return task.TaskState switch
            {
                (int)TaskInStatusEnum.RGV_InNew => task,
                (int)TaskInStatusEnum.RGV_InPickupFinish => HandlePickupFinish(task),
                (int)TaskInStatusEnum.RGV_InReleaseFinish => HandInneRouterSides(task),
                (int)TaskInStatusEnum.RGV_InZicheFinish => HandleZicheFinish(task),
                (int)TaskInStatusEnum.RGV_InZicheReleaseFinish => task,
                (int)TaskInStatusEnum.RGV_InZichemoveFinish => HandleZicheMoveFinish(task),
                _ => null
            };
        }
        private Dt_Task? HandleOutboundTask(Dt_Task task)
        {
            // å‡ºåº“任务的状态判断相对简单,可以直接返回
            int[] validStates =
            {
                (int)TaskOutStatusEnum.OutNew,
                (int)TaskOutStatusEnum.RGV_OutMothercarFinish,
                (int)TaskOutStatusEnum.RGV_OutZicheFinish,
                (int)TaskOutStatusEnum.RGV_OutZicheReleaseFinish,
                (int)TaskOutStatusEnum.RGV_OutPickupFinish
            };
            return validStates.Contains(task.TaskState) ? task : null;
        }
        #region å…¥åº“方法
        #region å…¥åº“口取货完成后,进行放货(HCJ,异常出库口)
        private Dt_Task? HandlePickupFinish(Dt_Task task)
        private Dt_Task? HandleInboundTask(AGVStation RGVTaskdevice, GetStackerObject getStackerObject)
        {
            try
            if(RGVTaskdevice.Station_material== (int)RGVEquipment.InRGVForklift && getStackerObject.RgvCraneStatusValue== RgvEquipmentStatus.NoCargo)
            {
                //获取需要区分是否去入库与去不合格载货台任务
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == "HCJ2000");
                CommonStackerCrane Commonstacker = (CommonStackerCrane)device;
                DeviceProDTO? deviceProDTO = GetDeviceAddress.GetDeviceProDTO(Commonstacker, task.NextAddress, "HCJ_GoodsStatus");
                int HCJGStatus = GetDeviceAddress.GetLine(Commonstacker, deviceProDTO.DeviceProAddress);
                if (HCJGStatus == 0)    //为无货
                {
                    return task;
                }
                return _taskService.GetInkouFinhuoTask(RGVTaskdevice.ChildPosiDeviceCode, 1);
            }
            catch (Exception ex)
            else if (RGVTaskdevice.Station_material == (int)RGVEquipment.InRGVForklift && getStackerObject.RgvCraneStatusValue == RgvEquipmentStatus.HasCargo)
            {
                //记录异常情况
                _taskService.UpdateTaskExceptionMessage(task.TaskNum, $"判断HCJ站台是否有货信息出错,出错信息:{ex.Message}");
                throw;
                return _taskService.GetInkouFinhuoTask(RGVTaskdevice.ChildPosiDeviceCode, 2);
            }else if (RGVTaskdevice.Station_material == (int)RGVEquipment.Corridorcar && getStackerObject.RgvCraneStatusValue == RgvEquipmentStatus.NoCargo)
            {
                return ZichePickUpAisle(RGVTaskdevice, getStackerObject);
            }else if (RGVTaskdevice.Station_material == (int)RGVEquipment.Corridorcar && getStackerObject.RgvCraneStatusValue == RgvEquipmentStatus.HasCargo)
            {
                return GoodsPlacedCorridor(RGVTaskdevice, getStackerObject);
            }
            else if (RGVTaskdevice.Station_material == (int)RGVEquipment.Corridorcar && getStackerObject.RgvCraneStatusValue == RgvEquipmentStatus.NoCargo)
            {
                return ZicheMobile(RGVTaskdevice, getStackerObject);
            }
            else if (RGVTaskdevice.Station_material == (int)RGVEquipment.Mothertrailer && getStackerObject.RgvCraneStatusValue == RgvEquipmentStatus.HasCargo)
            {
                return MotherVehicleMovement(RGVTaskdevice);
            }
            else { return null; }
            return null;
        }
        #endregion
        #region å…¥åº“口放货完成后,进行取货内容
        private Dt_Task? HandInneRouterSides(Dt_Task task)
        #region è¿‡é“子车进行取货
        public Dt_Task? ZichePickUpAisle(AGVStation RGVTaskdevice, GetStackerObject getStackerObject)
        {
            // æ ¹æ®è®¾å¤‡åç§°ï¼ŒèŽ·å–åˆ°è®¾å¤‡ç›¸å…³æ•°æ®
            AGVStation currentStation = _agvStationService.Corridorequipment(task.Roadway);
            // èŽ·å–å­è½¦ä½ç½®
            int zicheAddress = GetDeviceAddress.GetEquipmentlocation(currentStation.ChildPosiDeviceCode);
            if (currentStation.Station_Area == 1)
            //获取子车取货任务
            Dt_Task dt_Task = _taskService.GetInzicheTask(RGVTaskdevice.ChildPosiDeviceCode,1);
            if(dt_Task.CurrentAddress== getStackerObject.RGVCurrentlocation.ToString())
            {
                // æ ¹æ®å­è½¦ä½ç½®å¤„理不同情况
                switch (zicheAddress)
                {
                    case int Whcjaddress when Whcjaddress == int.Parse(task.CurrentAddress):
                        return task;
                    case int Waddress when Waddress == currentStation.MotherCarDeviceCode:
                        return task;
                    case int Naddress when Naddress == currentStation.MotherCardeputy:
                        return HandleMedialCase(task, currentStation.MotherCarDeviceCode);
                    case int HCJaddress when HCJaddress == currentStation.HCJStorageaddress:
                        return HandleMedialCase2(task, currentStation);
                    default: return null;
                }
                return dt_Task;
            }
            else
            {
                //取HCJ位的料判断
                switch (zicheAddress)
                //如果不等于,则进行判断子车在哪个位置
                if (RGVTaskdevice.Station_Area == 1)
                {
                    case int Whcjaddress when Whcjaddress == int.Parse(task.CurrentAddress):
                        return task;
                    case int Waddress when Waddress == currentStation.MotherCarDeviceCode:
                        return task;
                    case int Naddress when Naddress == currentStation.MotherCardeputy:
                        return HandleMedialCase(task, currentStation.MotherCarDeviceCode);
                    default: return null;
                    // æ ¹æ®å­è½¦ä½ç½®å¤„理不同情况
                    switch (getStackerObject.RGVCurrentlocation)
                    {
                        case int Waddress when Waddress == RGVTaskdevice.MotherCarDeviceCode:
                            return dt_Task;
                        case int Naddress when Naddress == RGVTaskdevice.MotherCardeputy:
                            return HandleMedialCase(dt_Task, RGVTaskdevice.MotherCarDeviceCode);
                        case int HCJaddress when HCJaddress == RGVTaskdevice.HCJStorageaddress:
                            return HandleMedialCase2(dt_Task, RGVTaskdevice);
                        default: return null;
                    }
                }
                else
                {
                    //取HCJ位的料判断
                    switch (getStackerObject.RGVCurrentlocation)
                    {
                        case int Waddress when Waddress == RGVTaskdevice.MotherCarDeviceCode:
                            return dt_Task;
                        case int Naddress when Naddress == RGVTaskdevice.MotherCardeputy:
                            return HandleMedialCase(dt_Task, RGVTaskdevice.MotherCarDeviceCode);
                        default: return null;
                    }
                }
            }
        }
        /// <summary>
        /// åˆ¤æ–­å¤–侧母车是否在入口口
        /// </summary>
@@ -296,22 +242,22 @@
            return null;
        }
        #endregion
        #region å–货完成后,进行放货操作
        private Dt_Task? HandleZicheFinish(Dt_Task task)
        #region è¿‡é“子车进行放货
        public Dt_Task? GoodsPlacedCorridor(AGVStation RGVTaskdevice, GetStackerObject getStackerObject)
        {
            // æ ¹æ®è®¾å¤‡åç§°ï¼ŒèŽ·å–åˆ°è®¾å¤‡ç›¸å…³æ•°æ®
            AGVStation GdaoRgvStation = _agvStationService.Corridorequipment(task.Roadway);
            Dt_Task task = _taskService.GetInzicheTask(RGVTaskdevice.ChildPosiDeviceCode, 2);
            int nexaddres = int.Parse(task.NextAddress);
            switch (nexaddres)
            {
                case int Whcjaddress when Whcjaddress == GdaoRgvStation.MotherCarDeviceCode:    //放货点在第一个过道点
                    return MotherCarMoves(task, GdaoRgvStation);
                case int Waddress when Waddress == GdaoRgvStation.MotherCardeputy:              //放货点在第二个过道点
                    return MotherCarMovesinside(task, GdaoRgvStation);
                case int HCJaddress when HCJaddress == GdaoRgvStation.HCJStorageaddress:        //放货点在HCJ上
                    return HCJMotherCarMovesinside(task, GdaoRgvStation);
                case int Whcjaddress when Whcjaddress == RGVTaskdevice.MotherCarDeviceCode:    //放货点在第一个过道点
                    return MotherCarMoves(task, RGVTaskdevice);
                case int Waddress when Waddress == RGVTaskdevice.MotherCardeputy:              //放货点在第二个过道点
                    return MotherCarMovesinside(task, RGVTaskdevice);
                case int HCJaddress when HCJaddress == RGVTaskdevice.HCJStorageaddress:        //放货点在HCJ上
                    return HCJMotherCarMovesinside(task, RGVTaskdevice);
                default: return null;
            }
        }
@@ -321,9 +267,11 @@
        private Dt_Task? MotherCarMoves(Dt_Task _Task, AGVStation aGVStation)
        {
            AGVStation Muche = _agvStationService.GetMothervehicle(aGVStation.ZicheMotherinlaw);
            int motherCarAddress = GetDeviceAddress.GetEquipmentlocation(Muche.ChildPosiDeviceCode);
            int motherCarAddress = GetDeviceAddress.GetEquipmentInMuche(Muche.ChildPosiDeviceCode);
            if (motherCarAddress == Muche.ZicheMotherinlaw) return _Task;
            RGVMovetask(Muche.ZicheMotherinlaw, aGVStation.ChildPosiDeviceCode);
            if(motherCarAddress!=0) RGVMovetask(Muche.ZicheMotherinlaw, aGVStation.ChildPosiDeviceCode);
            return null;
        }
@@ -338,14 +286,14 @@
            AGVStation Muche = _agvStationService.GetMothervehicle(aGVStation.MotherCarDeviceCode);  //外侧母车
            AGVStation Muche2 = _agvStationService.GetMothervehicle(aGVStation.MotherCardeputy);    //内侧母车
            int motherCarAddress = GetDeviceAddress.GetEquipmentlocation(Muche.ChildPosiDeviceCode);
            int motherCarAddress2 = GetDeviceAddress.GetEquipmentlocation(Muche2.ChildPosiDeviceCode);
            int motherCarAddress = GetDeviceAddress.GetEquipmentInMuche(Muche.ChildPosiDeviceCode);
            int motherCarAddress2 = GetDeviceAddress.GetEquipmentInMuche(Muche2.ChildPosiDeviceCode);
            // å¦‚果母车不在预期位置,下发移动任务
            if (motherCarAddress != Muche.Motherinlaw)
            if (motherCarAddress != Muche.Motherinlaw && motherCarAddress != 0)
            {
                RGVMovetask(Muche.Motherinlaw, Muche.ChildPosiDeviceCode);
            }
            if (motherCarAddress2 != Muche2.ZicheMotherinlaw)
            if (motherCarAddress2 != Muche2.ZicheMotherinlaw && motherCarAddress2 != 0)
            {
                RGVMovetask(Muche2.ZicheMotherinlaw, Muche2.ChildPosiDeviceCode);
            }
@@ -353,59 +301,67 @@
            // æ¯è½¦å·²åœ¨æ­£ç¡®ä½ç½®
            return null;
        }
        /// <summary>
        /// åˆ¤æ–­æ”¾åœ¨HCJ上面
        /// </summary>
        /// <param name="_Task"></param>
        /// <param name="aGVStation"></param>
        /// <returns></returns>
        private Dt_Task? HCJMotherCarMovesinside(Dt_Task _Task, AGVStation aGVStation)
        {
            AGVStation Muche = _agvStationService.GetMothervehicle(aGVStation.MotherCarDeviceCode);  //外侧母车
            AGVStation Muche2 = _agvStationService.GetMothervehicle(aGVStation.MotherCardeputy);    //内侧母车
            AGVStation Ziche3 = _agvStationService.GetZicheDeep(aGVStation.HCJStorageaddress);    //内侧子车
            int motherCarAddress = GetDeviceAddress.GetEquipmentlocation(Muche.ChildPosiDeviceCode);
            int motherCarAddress2 = GetDeviceAddress.GetEquipmentlocation(Muche2.ChildPosiDeviceCode);
            int ZiCarAddress3 = GetDeviceAddress.GetEquipmentlocation(Ziche3.ChildPosiDeviceCode);
            int motherCarAddress = GetDeviceAddress.GetEquipmentInMuche(Muche.ChildPosiDeviceCode);
            int motherCarAddress2 = GetDeviceAddress.GetEquipmentInMuche(Muche2.ChildPosiDeviceCode);
            int ZiCarAddress3 = GetDeviceAddress.GetEquipmentInMuche(Ziche3.ChildPosiDeviceCode);
            // å¦‚果母车不在预期位置,下发移动任务
            if (motherCarAddress != Muche.Motherinlaw)
            if (motherCarAddress != Muche.Motherinlaw && motherCarAddress != 0)
            {
                RGVMovetask(Muche.Motherinlaw, Muche.ChildPosiDeviceCode);
            }
            if (motherCarAddress2 != Muche2.Motherinlaw)
            if (motherCarAddress2 != Muche2.Motherinlaw && motherCarAddress2 != 0)
            {
                RGVMovetask(Muche2.Motherinlaw, Muche2.ChildPosiDeviceCode);
            }
            if(ZiCarAddress3== Ziche3.HCJStorageaddress)
            if (ZiCarAddress3 == Ziche3.HCJStorageaddress && ZiCarAddress3!=0)
            {
                //判断目标站台是入库到几号堆垛机
                if (_Task.TargetAddress == "3")     //入库至3号堆垛机
                {
                    //判断外侧母车位置(2区域)
                    AGVStation MucheN = _agvStationService.GetMothervehicle(Ziche3.MotherCarDeviceCode);  //外侧母车
                    int motNCarAddress = GetDeviceAddress.GetEquipmentlocation(MucheN.ChildPosiDeviceCode); //获取到母车当前位置
                    if(MucheN.ZicheMotherinlaw== motNCarAddress)
                    int motNCarAddress = GetDeviceAddress.GetEquipmentInMuche(MucheN.ChildPosiDeviceCode); //获取到母车当前位置
                    if (motNCarAddress!=0)
                    {
                        RGVMovetask(Ziche3.MotherCarDeviceCode, Ziche3.ChildPosiDeviceCode);
                    }
                    else
                    {
                        RGVMovetask(MucheN.ZicheMotherinlaw, MucheN.ChildPosiDeviceCode);
                        if (MucheN.ZicheMotherinlaw == motNCarAddress)
                        {
                            RGVMovetask(Ziche3.MotherCarDeviceCode, Ziche3.ChildPosiDeviceCode);
                        }
                        else
                        {
                            RGVMovetask(MucheN.ZicheMotherinlaw, MucheN.ChildPosiDeviceCode);
                        }
                    }
                }
                else if (_Task.TargetAddress == "4")    //入库至4号堆垛机
                {
                    //判断外侧母车位置(2区域)
                    AGVStation MucheN = _agvStationService.GetMothervehicle(Ziche3.MotherCarDeviceCode);  //外侧母车
                    int motNCarAddress = GetDeviceAddress.GetEquipmentlocation(MucheN.ChildPosiDeviceCode); //获取到母车当前位置
                    if (MucheN.Motherinlaw != motNCarAddress)
                    int motNCarAddress = GetDeviceAddress.GetEquipmentInMuche(MucheN.ChildPosiDeviceCode); //获取到母车当前位置
                    if (MucheN.Motherinlaw != motNCarAddress && motNCarAddress!=0)
                    {
                        RGVMovetask(MucheN.Motherinlaw, MucheN.ChildPosiDeviceCode);
                    }
                    AGVStation MucheN2 = _agvStationService.GetMothervehicle(Ziche3.MotherCardeputy);  //外侧母车
                    int motNCarAddress2 = GetDeviceAddress.GetEquipmentlocation(MucheN2.ChildPosiDeviceCode); //获取到母车当前位置
                    if (MucheN2.ZicheMotherinlaw != motNCarAddress2)
                    int motNCarAddress2 = GetDeviceAddress.GetEquipmentInMuche(MucheN2.ChildPosiDeviceCode); //获取到母车当前位置
                    if (MucheN2.ZicheMotherinlaw != motNCarAddress2 && motNCarAddress2!=0)
                    {
                        RGVMovetask(MucheN2.ZicheMotherinlaw, MucheN2.ChildPosiDeviceCode);
                    }
                    if(MucheN.Motherinlaw == motNCarAddress && MucheN2.ZicheMotherinlaw == motNCarAddress2)
                    if (MucheN.Motherinlaw == motNCarAddress && MucheN2.ZicheMotherinlaw == motNCarAddress2)
                    {
                        RGVMovetask(Ziche3.MotherCardeputy, Ziche3.ChildPosiDeviceCode);
                    }
@@ -418,13 +374,22 @@
        }
        #endregion
        #region æ¯è½¦ç§»åŠ¨è‡³å…¥åº“å£
        private Dt_Task? HandleZicheMoveFinish(Dt_Task task)
        #region å­è½¦ç§»åŠ¨ä»»åŠ¡(后续可能需要优化一下)
        public Dt_Task? ZicheMobile(AGVStation RGVTaskdevice, GetStackerObject getStackerObject)
        {
            Dt_Task task = _taskService.GetInzicheTaskMobile(RGVTaskdevice.ChildPosiDeviceCode, 1);
            return task;
        }
        #endregion
        #region æ¯è½¦ç§»åŠ¨ä»»åŠ¡
        public Dt_Task? MotherVehicleMovement(AGVStation RGVTaskdevice)
        {
            Dt_Task task = _taskService.GetInzicheTaskMobile(RGVTaskdevice.ChildPosiDeviceCode, 2);
            int curradder = int.Parse(task.CurrentAddress);
            AGVStation GdZiche = _agvStationService.GetMotheaisle(curradder);
            int motherCarAddress = GetDeviceAddress.GetEquipmentlocation(GdZiche.ChildPosiDeviceCode);
            if (motherCarAddress != curradder) return task;
            int motherCarAddress = GetDeviceAddress.GetEquipmentInformation(GdZiche.ChildPosiDeviceCode);
            if (motherCarAddress != curradder && motherCarAddress!=0) return task;
            RGVMovetask(GdZiche.Motherinlaw, GdZiche.ChildPosiDeviceCode);
            return null;
        }
@@ -432,8 +397,134 @@
        #endregion
        #region å‡ºåº“方法
        public Dt_Task? OutboundEquipmentTask(AGVStation RGVTaskdevice, GetStackerObject getStackerObject)
        {
            return (RGVTaskdevice.Station_material, getStackerObject.RgvCraneStatusValue) switch
            {
                ((int)RGVEquipment.Mothertrailer, RgvEquipmentStatus.HasCargo)
                    => Mothertaskdistribution(RGVTaskdevice),
                ((int)RGVEquipment.Corridorcar, RgvEquipmentStatus.NoCargo)
                    => ChildPickupAddres(RGVTaskdevice),
                ((int)RGVEquipment.Corridorcar, RgvEquipmentStatus.HasCargo)
                    => Findshippingtask(RGVTaskdevice),
                ((int)RGVEquipment.OutRGVForklift, RgvEquipmentStatus.NoCargo)
                    => _taskService.GetOutkouFinhuoTask(RGVTaskdevice.ChildPosiDeviceCode,
                       RGVTaskdevice.HCJStorageaddress.ToString(), 1),
                ((int)RGVEquipment.OutRGVForklift, RgvEquipmentStatus.HasCargo)
                    => _taskService.GetOutkouFinhuoTask(RGVTaskdevice.ChildPosiDeviceCode,
                       RGVTaskdevice.HCJStorageaddress.ToString(), 2),
                _ => null
            };
        }
        #region ä¸‹å‘母车任务,需要判断当前行小车在哪个位子
        private Dt_Task? Mothertaskdistribution(AGVStation GdZiche)
        {
            // æå‰æ£€æŸ¥æ— æ•ˆçš„Area值
            if (GdZiche.Station_Area < 1 || GdZiche.Station_Area > 4)
                return null;
            AGVStation ZicheinnerSide = _agvStationService.GetMotheaisle(GdZiche.ZicheMotherinlaw);
            int ZiCarAddress3 = GetDeviceAddress.GetEquipmentInformation(ZicheinnerSide.ChildPosiDeviceCode);
            // ä½¿ç”¨switch语句提高可读性
            return GdZiche.Station_Area switch
            {
                4 when ZiCarAddress3 != GdZiche.ZicheMotherinlaw
                    => _taskService.QueryStackerCraneTask(GdZiche.ChildPosiDeviceCode),
                3 when ZiCarAddress3 == ZicheinnerSide.HCJStorageaddress
                    => _taskService.QueryStackerCraneTask(GdZiche.ChildPosiDeviceCode),
                2 when ZiCarAddress3 != GdZiche.MotherCardeputy && ZiCarAddress3 != GdZiche.HCJStorageaddress
                    => _taskService.QueryStackerCraneTask(GdZiche.ChildPosiDeviceCode),
                1 when ZiCarAddress3 == ZicheinnerSide.HCJStorageaddress
                    => _taskService.QueryStackerCraneTask(GdZiche.ChildPosiDeviceCode),
                _ => null
            };
        }
        #endregion
        #region åˆ¤æ–­å·²ç§»åŠ¨å‡ºæ¥çš„æ¯è½¦ï¼Œå†åˆ¤æ–­å°è½¦ä½ç½®
        public Dt_Task? ChildPickupAddres(AGVStation GdZiche)
        {
            if (GdZiche.Station_Area == 5)
                return _taskService.ChildVehicleMission(GdZiche);
            var task = _taskService.ChildVehicleMission(GdZiche);
            // å¿«é€Ÿè¿”回条件检查
            if (task.CurrentAddress != GdZiche.HCJStorageaddress.ToString())
                return task;
            var innerStation = _agvStationService.GetZicheDeep(GdZiche.HCJStorageaddress);
            if (GetDeviceAddress.GetEquipmentInformation(innerStation.ChildPosiDeviceCode) != innerStation.HCJStorageaddress)
                return task;
            var motherStation = _agvStationService.GetMothervehicle(innerStation.MotherCarDeviceCode);
            if (GetDeviceAddress.ReturnCurrentStatus(motherStation.ChildPosiDeviceCode))
                RGVMovetask(innerStation.MotherCarDeviceCode, innerStation.ChildPosiDeviceCode);
            return null;
        }
        #endregion
        #region æŸ¥æ‰¾å­è½¦æ”¾è´§ä»»åŠ¡
        public Dt_Task? Findshippingtask(AGVStation GdZiche)
        {
            Dt_Task task = _taskService.GetFinhuoTask(GdZiche.ChildPosiDeviceCode);
            if (GetDeviceAddress.HCJIsstock(task.NextAddress)) return task;
            return null;
        }
        #endregion
        #endregion
        #region å‡ºåº“小车移动任务下发
        public void Returnposition(string DeviceCode, int RGVCurrentlocation)
        {
            int HCJGoodsplatform = 1170;    //定义的放货站台
                                            //判断母车是否需要进行移动
            AGVStation GdZiche = _agvStationService.Corridorequipment(DeviceCode);
            if (GdZiche.Station_Area == 1)
            {
                switch (RGVCurrentlocation)
                {
                    case int Whcjaddress when Whcjaddress == GdZiche.MotherCarDeviceCode:    //在第一个母车上
                        RGVMovetask(HCJGoodsplatform, GdZiche.ChildPosiDeviceCode);
                        break;
                    case int Waddress when Waddress == GdZiche.MotherCardeputy:              //在第二个母车上
                        OutNMotherCar(GdZiche.MotherCarDeviceCode);
                        break;
                    case int HCJaddress when HCJaddress == GdZiche.HCJStorageaddress:        //在HCJ站台上
                        OutHCJMotherCar(GdZiche);
                        break;
                    default: break;
                }
            }
            else
            {
                switch (RGVCurrentlocation)
                {
                    case int Whcjaddress when Whcjaddress == GdZiche.MotherCarDeviceCode:    //在第一个母车上,需要判断外侧子车是否在HCJ上
                        OutinnerSideNMotherCar(GdZiche);
                        break;
                    case int Waddress when Waddress == GdZiche.MotherCardeputy:              //在第二个母车上,需要判断子车与外侧母车是否在过道上
                        OutinnerSideMotherCar(GdZiche);
                        break;
                    default: break;
                }
            }
        }
        #region å¤–侧小车回归到起始点位
        /// <summary>
@@ -469,7 +560,6 @@
        }
        #endregion
        #region å¤–侧小车回归到起始点位
        /// <summary>
        /// åœ¨ç¬¬ä¸€ä¸ªä½ç½®ï¼Œåˆ™åˆ¤æ–­å¤–侧子车是否在HCJ站台下面
@@ -479,38 +569,32 @@
        /// <returns></returns>
        private void OutinnerSideNMotherCar(AGVStation aGVStation)
        {
            AGVStation Ziche3 = _agvStationService.GetZicheDeep(aGVStation.HCJStorageaddress);    //内侧子车
            AGVStation Ziche3 = _agvStationService.GetZicheOuterSide(aGVStation.HCJStorageaddress);    //外侧子车
            int ZiCarAddress3 = GetDeviceAddress.GetEquipmentlocation(Ziche3.ChildPosiDeviceCode);
            if (ZiCarAddress3 == Ziche3.HCJStorageaddress)
            {
                OutHCJMotherCar(Ziche3);
            }
            else
            {
                //RGVMovetask(Muche.Motherinlaw, Muche.ChildPosiDeviceCode);
                RGVMovetask(aGVStation.HCJStorageaddress, aGVStation.ChildPosiDeviceCode);
            }
        }
        private void OutinnerSideMotherCar(AGVStation aGVStation)
        {
            AGVStation Muche = _agvStationService.GetMothervehicle(aGVStation.MotherCarDeviceCode);  //外侧母车
            AGVStation Muche2 = _agvStationService.GetMothervehicle(aGVStation.MotherCardeputy);    //内侧母车
            int motherCarAddress = GetDeviceAddress.GetEquipmentlocation(Muche.ChildPosiDeviceCode);
            int motherCarAddress2 = GetDeviceAddress.GetEquipmentlocation(Muche2.ChildPosiDeviceCode);
            // å¦‚果母车不在预期位置,下发移动任务
            if (motherCarAddress != Muche.Motherinlaw)
            {
                RGVMovetask(Muche.Motherinlaw, Muche.ChildPosiDeviceCode);
            }
            if (motherCarAddress2 != Muche2.Motherinlaw)
            {
                RGVMovetask(Muche2.Motherinlaw, Muche2.ChildPosiDeviceCode);
            }
            OutinnerSideNMotherCar(aGVStation);
        }
        #endregion
        #endregion
        /// <summary>
@@ -571,10 +655,12 @@
            try
            {
                IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeviceCode);
                CommonStackerCrane Commonstacker = (CommonStackerCrane)device;
                SpeStackerCrane Commonstacker = (SpeStackerCrane)device;
                DeviceProDTO? deviceProDTO = GetDeviceAddress.GetDeviceProDTO(Commonstacker, DeviceCode, "RGV_Rgvtaskstutas");
                int MCGStatus = GetDeviceAddress.GetLine(Commonstacker, deviceProDTO.DeviceProAddress);
                DeviceProDTO? deviceProDTO = GetDeviceAddress.GetRGVDeviceProDTO(Commonstacker, DeviceCode, "RGV_Rgvtaskstutas");
                int MCGStatus = GetDeviceAddress.RGVGetLine(Commonstacker, deviceProDTO.DeviceProAddress);
                if (Commonstacker.IsConnected)
                {
                    if (MCGStatus == (int)RgvJobCraneStatus.Ready)