소스 검색

单车跑全程

xu.lu 2 년 전
부모
커밋
8c9849e429
2개의 변경된 파일1039개의 추가작업 그리고 258개의 파일을 삭제
  1. 22 0
      Projects/永冠/WCS.Service/Helpers/SystemConfigHelpers.cs
  2. 1017 258
      Projects/永冠/WCS.Service/Works/RGV/RGVWork.cs

+ 22 - 0
Projects/永冠/WCS.Service/Helpers/SystemConfigHelpers.cs

@@ -25,5 +25,27 @@ namespace WCS.Service.Helpers
             });
             return result;
         }
+
+        /// <returns></returns>
+        public static bool GetDeviceEnabled(string CODE)
+        {
+            bool isError = false;
+            DB.Do(db =>
+            {
+                isError = db.Default.Set<WCS_SystemConfig>().AsNoTracking().Any(p => p.Code == CODE && p.ENABLED);               
+            });
+            return isError;
+        }
+
+        public static bool GetDeviceIsUsed(string CODE)
+        {
+            bool result = false;
+            DB.Do(db =>
+            {
+                var systemConfig = db.Default.Set<WCS_SystemConfig>().AsNoTracking().SingleOrDefault(p => p.DEVICECODE == CODE);
+                if (systemConfig != null) result = systemConfig.ENABLED;
+            });
+            return result;
+        }
     }
 }

+ 1017 - 258
Projects/永冠/WCS.Service/Works/RGV/RGVWork.cs

@@ -4,6 +4,7 @@ using System.Linq;
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
+using WCS.Service.Helpers;
 
 namespace WCS.Service.Works
 {
@@ -123,199 +124,548 @@ namespace WCS.Service.Works
     {
         protected override void Do(Device<IDRGV521, IDRGV520, IDRGV523> dev)
         {
-            if (dev.Data3.Fault != 0)
+            if (dev.Entity.CODE == "RGV4")
             {
-                if (dev.Entity.WakeupOn(5000))
+                if (dev.Data3.Fault != 0)
                 {
-                    WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
+                    if (dev.Entity.WakeupOn(5000))
+                    {
+                        WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
+                    }
                 }
-            }
 
-            if (Ltc.Do(dev, v => v.Data2.Trigger_1 != 0 && v.Data2.Trigger_2 != 0)) return;
-            if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
-            if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
+                if (Ltc.Do(dev, v => v.Data2.Trigger_1 != 0 && v.Data2.Trigger_2 != 0)) return;
+                if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
+                if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
 
-            #region 放货任务
+                #region 放货任务
 
-            //判断小车是否有工位有光电,小车空闲自动且有光电代表需要执行放货任务
-            if (dev.Data.PH_Status_1 || dev.Data.PH_Status_2)
-            {
-                if (dev.Data.PH_Status_1 && dev.Data.TaskType_1 != DRGVTaskType.放货) //工位一需要放货
+                //判断小车是否有工位有光电,小车空闲自动且有光电代表需要执行放货任务
+                if (dev.Data.PH_Status_1 || dev.Data.PH_Status_2)
                 {
-                    if (dev.Data.TaskID_1 < 10000) throw new Exception("有光电无任务号");
-                    string next = "";
-                    //获取任务
-                    DB.Do(db =>
+                    if (dev.Data.PH_Status_1 && dev.Data.TaskType_1 != DRGVTaskType.放货) //工位一需要放货
                     {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_1) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_1}");
-                        //var next = dev.Entity.GetNext(task.ADDRTO).CODE;
-                    });
-                    //TODO:放货站点有货检查
-                    dev.Data2.TaskID_1 = dev.Data.TaskID_1;
-                    dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.放货);
-                    dev.Data2.DestPosition_1 = dev.Data2.StartPosition_1;
-                    dev.Data.RES = dev.Data2.StartPosition_1;
-                    dev.Data2.Trigger_1 = 1;
+                        if (dev.Data.TaskID_1 < 10000) throw new Exception("有光电无任务号");                       
+                        //获取任务
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_1) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_1}");                          
+                        });
+                        //TODO:放货站点有货检查
+                        dev.Data2.TaskID_1 = dev.Data.TaskID_1;
+                        dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.放货);
+                        dev.Data2.DestPosition_1 = dev.Data2.StartPosition_1;
+                        dev.Data.RES = dev.Data2.StartPosition_1;
+                        dev.Data2.Trigger_1 = 1;
+                    }
+                    else if (dev.Data.PH_Status_2 && dev.Data.TaskType_2 != DRGVTaskType.放货)//工位二需要放货
+                    {
+                        if (dev.Data.TaskID_2 < 10000) throw new Exception("有光电无任务号");                       
+                        //获取任务
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_2) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_2}");                          
+                        });
+                        //TODO:放货站点有货检查
+                        dev.Data2.TaskID_2 = dev.Data.TaskID_2;
+                        dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.放货);
+                        dev.Data2.DestPosition_2 = dev.Data2.StartPosition_2;                     
+                        dev.Data.RES = dev.Data2.StartPosition_2;
+                        dev.Data2.Trigger_2 = 1;
+                    }
                 }
-                else if (dev.Data.PH_Status_2 && dev.Data.TaskType_2 != DRGVTaskType.放货)//工位二需要放货
-                {
-                    if (dev.Data.TaskID_2 < 10000) throw new Exception("有光电无任务号");
 
-                    string next = "";
-                    //获取任务
-                    DB.Do(db =>
+                #endregion 放货任务                
+                var station_3046 = Device.Find("3046").Device<IStation521, IStation520>();
+                if (station_3046.Data.PH_STATUS && station_3046.Data.GOODSEND == 3046 && station_3046.Data.TASKNUM > 10000)
+                {
+                    var station_2390 = Device.Find("2390").Device<IStation521, IStation520>();
+                    var arr = Device.Find("2390", "2391", "2392", "2393", "2394", "2395", "2396", "2397").Select(v => v.Device<IStation521, IStation520>()).ToArray();
+                    int count = arr.Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000).Count();
+                    if (!station_2390.Data.PH_STATUS && station_2390.Data.TASKNUM == 0 && count < 5)
                     {
-                        var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_2) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_2}");
-                        //var next = dev.Entity.GetNext(task.ADDRTO).CODE;
-                    });
-                    //TODO:放货站点有货检查
-                    dev.Data2.TaskID_2 = dev.Data.TaskID_2;
-                    dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.放货);
-                    dev.Data2.DestPosition_2 = dev.Data2.StartPosition_2;
-                    //dev.Data2.StartPosition_2 = Convert.ToInt16(next);
-                    dev.Data.RES = dev.Data2.StartPosition_2;
-                    dev.Data2.Trigger_2 = 1;
-                }
-            }
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station_3046.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station_3046.Data.TASKNUM}不存在");
+                            task.ADDRNEXT = station_2390.Entity.CODE;
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                            //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
+                            station_3046.Data2.GOODSEND = 2390;
+                            station_3046.Data2.CONFIRM = true;
+                        });
+                    }
+                }               
+                #region 取货任务
 
-            #endregion 放货任务
+                //获取所有需要取货的站台
+                //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
+                var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
+                                 .Select(v => v.Device<IStation521, IStation520, IStation523>())
+                                 .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && !v.Data2.CONFIRM && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
+                                 .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
+                                 {
+                                     var code = v.Data.GOODSEND.ToString();
+                                     switch (v.Data.GOODSEND)
+                                     {
+                                         case 2366: code = "2359"; break; //二车间
+                                         case 2328: code = "2114"; break; //一车间
+                                         case 2385: code = "2359"; break; //三车间
+                                     };
 
-            var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
-            if (station_3033.Data.PH_STATUS && station_3033.Data.GOODSEND == 3033 && station_3033.Data.TASKNUM > 10000)
-            {
-                var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
-                if (!station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0)
+                                     var end = Device.Find(code).Device<IStation521>();
+
+                                     var res = true;
+                                     if (end.Data.TASKNUM != 0) res = false;
+                                     else if (end.Data.PH_STATUS) res = false;
+                                     // RGV可以到达放货地址,此处判断取反
+                                     else if (!dev.Entity.ROUTES.Any(p => p.NEXT.CODE == end.Entity.CODE)) res = false;
+                                     else if (dev.Data.PH_Status_1) res = false;
+
+                                     return res;
+                                 });
+                if (!validPickupPoints.Any()) return;//不需要取货
+
+                Device<IStation521, IStation520, IStation523> validPickupPoint = null;
+
+                //是否包含小车当前所在站点,写死,如有变动必须改代码
+                //这一块的作用主要是用于解决小车就近取货问题
+
+                #region RGV4
+
+                if (dev.Data.RES is 3035 or 3036) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3035" or "3036");
+                else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
+                else if (dev.Data.RES is 3047 or 3048) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3045" or "3046");
+                else if (dev.Data.RES is 2108 or 2390) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "2390" or "2108");
+
+                #endregion RGV4
+
+                //当前站点没有需要取货的
+                if (validPickupPoint == null) validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
+
+                var next1 = dev.Entity.GetNext(validPickupPoint.Data.GOODSEND.ToString());
+                if (validPickupPoint.Entity.CODE is "2108" or "2114" or "3040" or "3034") //一工位取货点
                 {
-                    DB.Do(db =>
-                    {
-                        var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
-                        if (task == null)
-                            throw new Exception($"任务号{station_3033.Data.TASKNUM}不存在");
-                        task.ADDRNEXT = station_3041.Entity.CODE;
-                        task.UPDATETIME = DateTime.Now;
-                        db.Default.SaveChanges();
-                        //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
-                        station_3033.Data2.GOODSEND = 3041;
-                        station_3033.Data2.CONFIRM = true;
-                    });
+                    dev.Data2.TaskID_1 = validPickupPoint.Data.TASKNUM;//dev.Data.TaskID_1;
+                    dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.取货);
+                    dev.Data2.StartPosition_1 = Convert.ToInt16(next1.CODE);
+                    dev.Data2.DestPosition_1 = Convert.ToInt16(validPickupPoint.Entity.CODE);
+                    dev.Data2.Trigger_1 = 1;
                 }
-            }
-            var station_3046 = Device.Find("3046").Device<IStation521, IStation520>();
-            if (station_3046.Data.PH_STATUS && station_3046.Data.GOODSEND == 3046 && station_3046.Data.TASKNUM > 10000)
-            {
-                var station_2390 = Device.Find("2390").Device<IStation521, IStation520>();
-                var arr = Device.Find("2390", "2391", "2392", "2393", "2394", "2395", "2396", "2397").Select(v => v.Device<IStation521, IStation520>()).ToArray();
-                int count = arr.Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000).Count();
-                if (!station_2390.Data.PH_STATUS && station_2390.Data.TASKNUM == 0 && count < 5)
+                else if (validPickupPoint.Entity.CODE is "3046" or "3041" or "3033") //二工位取货点
                 {
-                    DB.Do(db =>
-                    {
-                        var task = db.Default.Set<WCS_TASK>().Find(station_3046.Data.TASKNUM);
-                        if (task == null)
-                            throw new Exception($"任务号{station_3046.Data.TASKNUM}不存在");
-                        task.ADDRNEXT = station_2390.Entity.CODE;
-                        task.UPDATETIME = DateTime.Now;
-                        db.Default.SaveChanges();
-                        //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
-                        station_3046.Data2.GOODSEND = 2390;
-                        station_3046.Data2.CONFIRM = true;
-                    });
+                    dev.Data2.TaskID_2 = validPickupPoint.Data.TASKNUM;
+                    dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
+                    dev.Data2.StartPosition_2 = Convert.ToInt16(next1.CODE);
+                    dev.Data2.DestPosition_2 = Convert.ToInt16(validPickupPoint.Entity.CODE);
+                    dev.Data2.Trigger_2 = 1;
                 }
+
+                #endregion 取货任务
             }
-            var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
-            if (station_3040.Data.PH_STATUS && station_3040.Data.GOODSEND == 3040 && station_3040.Data.TASKNUM > 10000)
+            else if(dev.Entity.CODE == "RGV6")
             {
-                var station_3034 = Device.Find("3034").Device<IStation521, IStation520>();
-                if (!station_3034.Data.PH_STATUS && station_3034.Data.TASKNUM == 0)
+                //正常与之前一样逻辑
+                if (!SystemConfigHelpers.GetDeviceEnabled("CarError"))
                 {
-                    DB.Do(db =>
+                    if (dev.Data3.Fault != 0)
                     {
-                        var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
-                        if (task == null)
-                            throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
-                        task.ADDRNEXT = station_3034.Entity.CODE;
-                        task.UPDATETIME = DateTime.Now;
-                        db.Default.SaveChanges();
-                        //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
-                        station_3040.Data2.GOODSEND = 3034;
-                        station_3040.Data2.CONFIRM = true;
-                    });
-                }
-            }
+                        if (dev.Entity.WakeupOn(5000))
+                        {
+                            WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
+                        }
+                    }
 
-            #region 取货任务
-
-            //获取所有需要取货的站台
-            //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
-            var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
-                             .Select(v => v.Device<IStation521, IStation520, IStation523>())
-                             .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && !v.Data2.CONFIRM && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
-                             .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
-                             {
-                                 var code = v.Data.GOODSEND.ToString();
-                                 switch (v.Data.GOODSEND)
-                                 {
-                                     case 2366: code = "2359"; break; //二车间
-                                     case 2328: code = "2114"; break; //一车间
-                                     case 2385: code = "2359"; break; //三车间
-                                 };
+                    if (Ltc.Do(dev, v => v.Data2.Trigger_1 != 0 && v.Data2.Trigger_2 != 0)) return;
+                    if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
+                    if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
 
-                                 var end = Device.Find(code).Device<IStation521>();
+                    #region 放货任务
 
-                                 var res = true;
-                                 if (end.Data.TASKNUM != 0) res = false;
-                                 else if (end.Data.PH_STATUS) res = false;
-                                 // RGV可以到达放货地址,此处判断取反
-                                 else if (!dev.Entity.ROUTES.Any(p => p.NEXT.CODE == end.Entity.CODE)) res = false;
-                                 else if (dev.Data.PH_Status_1) res = false;
+                    //判断小车是否有工位有光电,小车空闲自动且有光电代表需要执行放货任务
+                    if (dev.Data.PH_Status_1 || dev.Data.PH_Status_2)
+                    {
+                        if (dev.Data.PH_Status_1 && dev.Data.TaskType_1 != DRGVTaskType.放货) //工位一需要放货
+                        {
+                            if (dev.Data.TaskID_1 < 10000) throw new Exception("有光电无任务号");
+                            string next = "";
+                            //获取任务
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_1) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_1}");
+                                //var next = dev.Entity.GetNext(task.ADDRTO).CODE;
+                            });
+                            //TODO:放货站点有货检查
+                            dev.Data2.TaskID_1 = dev.Data.TaskID_1;
+                            dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.放货);
+                            dev.Data2.DestPosition_1 = dev.Data2.StartPosition_1;
+                            dev.Data.RES = dev.Data2.StartPosition_1;
+                            dev.Data2.Trigger_1 = 1;
+                        }
+                        else if (dev.Data.PH_Status_2 && dev.Data.TaskType_2 != DRGVTaskType.放货)//工位二需要放货
+                        {
+                            if (dev.Data.TaskID_2 < 10000) throw new Exception("有光电无任务号");
 
-                                 return res;
-                             });
-            if (!validPickupPoints.Any()) return;//不需要取货
+                            string next = "";
+                            //获取任务
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_2) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_2}");
+                                //var next = dev.Entity.GetNext(task.ADDRTO).CODE;
+                            });
+                            //TODO:放货站点有货检查
+                            dev.Data2.TaskID_2 = dev.Data.TaskID_2;
+                            dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.放货);
+                            dev.Data2.DestPosition_2 = dev.Data2.StartPosition_2;
+                            //dev.Data2.StartPosition_2 = Convert.ToInt16(next);
+                            dev.Data.RES = dev.Data2.StartPosition_2;
+                            dev.Data2.Trigger_2 = 1;
+                        }
+                    }
 
-            Device<IStation521, IStation520, IStation523> validPickupPoint = null;
+                    #endregion 放货任务
 
-            //是否包含小车当前所在站点,写死,如有变动必须改代码
-            //这一块的作用主要是用于解决小车就近取货问题
+                    var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
+                    if (station_3033.Data.PH_STATUS && station_3033.Data.GOODSEND == 3033 && station_3033.Data.TASKNUM > 10000)
+                    {
+                        var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
+                        if (!station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0)
+                        {
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
+                                if (task == null)
+                                    throw new Exception($"任务号{station_3033.Data.TASKNUM}不存在");
+                                task.ADDRNEXT = station_3041.Entity.CODE;
+                                task.UPDATETIME = DateTime.Now;
+                                db.Default.SaveChanges();
+                                //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
+                                station_3033.Data2.GOODSEND = 3041;
+                                station_3033.Data2.CONFIRM = true;
+                            });
+                        }
+                    }                    
+                    var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
+                    if (station_3040.Data.PH_STATUS && station_3040.Data.GOODSEND == 3040 && station_3040.Data.TASKNUM > 10000)
+                    {
+                        var station_3034 = Device.Find("3034").Device<IStation521, IStation520>();
+                        if (!station_3034.Data.PH_STATUS && station_3034.Data.TASKNUM == 0)
+                        {
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
+                                if (task == null)
+                                    throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
+                                task.ADDRNEXT = station_3034.Entity.CODE;
+                                task.UPDATETIME = DateTime.Now;
+                                db.Default.SaveChanges();
+                                //station_3060.Data2.TASKNUM = station_3060.Data.TASKNUM;
+                                station_3040.Data2.GOODSEND = 3034;
+                                station_3040.Data2.CONFIRM = true;
+                            });
+                        }
+                    }
 
-            #region RGV4
+                    #region 取货任务
 
-            if (dev.Data.RES is 3035 or 3036) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3035" or "3036");
-            else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
-            else if (dev.Data.RES is 3047 or 3048) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3045" or "3046");
-            else if (dev.Data.RES is 2108 or 2390) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "2390" or "2108");
+                    //获取所有需要取货的站台
+                    //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
+                    var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
+                                     .Select(v => v.Device<IStation521, IStation520, IStation523>())
+                                     .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && !v.Data2.CONFIRM && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
+                                     .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
+                                     {
+                                         var code = v.Data.GOODSEND.ToString();                                      
+                                         var end = Device.Find(code).Device<IStation521>();
+                                         var res = true;
+                                         if (end.Data.TASKNUM != 0) res = false;
+                                         else if (end.Data.PH_STATUS) res = false;
+                                         // RGV可以到达放货地址,此处判断取反
+                                         else if (!dev.Entity.ROUTES.Any(p => p.NEXT.CODE == end.Entity.CODE)) res = false;
+                                         else if (dev.Data.PH_Status_1) res = false;
+                                         return res;
+                                     });
+                    if (!validPickupPoints.Any()) return;//不需要取货
+                    Device<IStation521, IStation520, IStation523> validPickupPoint = null;
+                    //是否包含小车当前所在站点,写死,如有变动必须改代码
+                    //这一块的作用主要是用于解决小车就近取货问题
 
-            #endregion RGV4
+                    #region RGV4
 
-            #region RGV6
+                    if (dev.Data.RES is 3035 or 3036) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3035" or "3036");
+                    else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
+                    else if (dev.Data.RES is 3047 or 3048) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3045" or "3046");
+                    else if (dev.Data.RES is 2108 or 2390) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "2390" or "2108");
 
-            else if (dev.Data.RES is 3033 or 3034) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3033" or "3034");
-            else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
+                    #endregion RGV4
 
-            #endregion RGV6
+                    #region RGV6
 
-            //当前站点没有需要取货的
-            if (validPickupPoint == null) validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
+                    else if (dev.Data.RES is 3033 or 3034) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3033" or "3034");
+                    else if (dev.Data.RES is 3041 or 3040) validPickupPoint = validPickupPoints.FirstOrDefault(v => v.Entity.CODE is "3041" or "3040");
 
-            var next1 = dev.Entity.GetNext(validPickupPoint.Data.GOODSEND.ToString());
-            if (validPickupPoint.Entity.CODE is "2108" or "2114" or "3040" or "3034") //一工位取货点
-            {
-                dev.Data2.TaskID_1 = validPickupPoint.Data.TASKNUM;//dev.Data.TaskID_1;
-                dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.取货);
-                dev.Data2.StartPosition_1 = Convert.ToInt16(next1.CODE);
-                dev.Data2.DestPosition_1 = Convert.ToInt16(validPickupPoint.Entity.CODE);
-                dev.Data2.Trigger_1 = 1;
-            }
-            else if (validPickupPoint.Entity.CODE is "3046" or "3041" or "3033") //二工位取货点
-            {
-                dev.Data2.TaskID_2 = validPickupPoint.Data.TASKNUM;
-                dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
-                dev.Data2.StartPosition_2 = Convert.ToInt16(next1.CODE);
-                dev.Data2.DestPosition_2 = Convert.ToInt16(validPickupPoint.Entity.CODE);
-                dev.Data2.Trigger_2 = 1;
-            }
+                    #endregion RGV6
+
+                    //当前站点没有需要取货的
+                    if (validPickupPoint == null) validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
+
+                    var next1 = dev.Entity.GetNext(validPickupPoint.Data.GOODSEND.ToString());
+                    if (validPickupPoint.Entity.CODE is  "3040" or "3034") //一工位取货点
+                    {
+                        dev.Data2.TaskID_1 = validPickupPoint.Data.TASKNUM;//dev.Data.TaskID_1;
+                        dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.取货);
+                        dev.Data2.StartPosition_1 = Convert.ToInt16(next1.CODE);
+                        dev.Data2.DestPosition_1 = Convert.ToInt16(validPickupPoint.Entity.CODE);
+                        dev.Data2.Trigger_1 = 1;
+                    }
+                    else if (validPickupPoint.Entity.CODE is  "3041" or "3033") //二工位取货点
+                    {
+                        dev.Data2.TaskID_2 = validPickupPoint.Data.TASKNUM;
+                        dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.取货);
+                        dev.Data2.StartPosition_2 = Convert.ToInt16(next1.CODE);
+                        dev.Data2.DestPosition_2 = Convert.ToInt16(validPickupPoint.Entity.CODE);
+                        dev.Data2.Trigger_2 = 1;
+                    }
 
-            #endregion 取货任务
+                    #endregion 取货任务
+                }
+                else if(SystemConfigHelpers.GetDeviceIsUsed("RGV6"))
+                {
+                    if (dev.Data3.Fault != 0)
+                    {
+                        if (dev.Entity.WakeupOn(5000))
+                        {
+                            WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
+                        }
+                    }
+                    if (Ltc.Do(dev, v => v.Data2.Trigger_1 != 0 && v.Data2.Trigger_2 != 0)) return;
+                    if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
+                    if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
+
+                    //执行任务之前优先处理缓存位上的任务 出:3028、3012   入:3019、3033
+                    //有入库的先执行入库,做出库要判断是否有入库               
+                    var inPort = Device.Find("3019", "3033").Select(v => v.Device<IStation521, IStation520>());
+                    var outPort = Device.Find("3028", "3012").Select(v => v.Device<IStation521, IStation520>());
+                    var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
+                    var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
+                    var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
+
+                    var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
+                    var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
+                    var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
+                    var station_3012 = Device.Find("3012").Device<IStation521, IStation520>();
+
+                    //是否可以执行缓存位的出库任务
+                    bool doOut = true;
+                    DB.Do(db =>
+                    {
+                        var flag = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
+                        if (flag)
+                        {
+                            doOut = false;
+                        }
+                        var inPos = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
+                        if (inPos.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) doOut = false;
+                    });
+
+                    if (inPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 && !station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0))
+                    {
+                        if (station_3033.Data.PH_STATUS && station_3033.Data.TASKNUM > 0)
+                        {
+                            if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
+                                if (task == null)
+                                    throw new Exception($"任务号{station_3033.Data.TASKNUM}不存在");
+                                task.ADDRNEXT = "3041";
+                                task.UPDATETIME = DateTime.Now;
+                                db.Default.SaveChanges();
+                            });
+                            dev.Data2.TaskID_2 = station_3033.Data.TASKNUM;
+                            dev.Data2.StartPosition_2 = 3033;
+                            dev.Data2.DestPosition_2 = 3041;
+                            dev.Data2.Trigger_2 = 1;
+                        }
+                        else if (station_3019.Data.PH_STATUS && station_3019.Data.TASKNUM > 0)
+                        {
+                            if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
+                                if (task == null)
+                                    throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
+                                task.ADDRNEXT = "3041";
+                                task.UPDATETIME = DateTime.Now;
+                                db.Default.SaveChanges();
+                            });
+                            dev.Data2.TaskID_2 = station_3019.Data.TASKNUM;
+                            dev.Data2.StartPosition_2 = 3019;
+                            dev.Data2.DestPosition_2 = 3041;
+                            dev.Data2.Trigger_2 = 1;
+                        }
+                    }
+                    else if (outPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0) && doOut && !station_3060.Data.PH_STATUS && station_3060.Data.TASKNUM == 0)
+                    {
+                        if (station_3012.Data.PH_STATUS && station_3012.Data.TASKNUM > 0)
+                        {
+                            if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
+                            var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
+                            if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
+                            {
+                                if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
+                                if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
+                                if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
+
+                                DB.Do(db =>
+                                {
+                                    var task = db.Default.Set<WCS_TASK>().Find(station_3012.Data.TASKNUM);
+                                    if (task == null)
+                                        throw new Exception($"任务号{station_3012.Data.TASKNUM}不存在");
+                                    task.ADDRNEXT = "3060";
+                                    task.UPDATETIME = DateTime.Now;
+                                    db.Default.SaveChanges();
+                                    //station.Data2.TASKNUM = station.Data.TASKNUM;
+                                    station_3012.Data2.GOODSEND = 3060;
+                                    station_3012.Data2.GOODSTYPE = 2;
+                                    station_3012.Data2.CONFIRM = true;
+                                });
+                            }
+                            dev.Data2.TaskID_1 = station_3012.Data.TASKNUM;
+                            dev.Data2.StartPosition_1 = 3012;
+                            dev.Data2.DestPosition_1 = 3060;
+                            dev.Data2.Trigger_1 = 1;
+                        }
+                        else if (station_3028.Data.PH_STATUS && station_3028.Data.TASKNUM > 0)
+                        {
+                            if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
+                            var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
+                            if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
+                            {
+                                if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
+                                if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
+                                if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
+                                DB.Do(db =>
+                                {
+                                    var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
+                                    if (task == null)
+                                        throw new Exception($"任务号{station_3028.Data.TASKNUM}不存在");
+                                    task.ADDRNEXT = "3060";
+                                    task.UPDATETIME = DateTime.Now;
+                                    db.Default.SaveChanges();
+                                    //station.Data2.TASKNUM = station.Data.TASKNUM;
+                                    station_3028.Data2.GOODSEND = 3060;
+                                    station_3028.Data2.GOODSTYPE = 2;
+                                    station_3028.Data2.CONFIRM = true;
+                                });
+                            }
+                            dev.Data2.TaskID_1 = station_3028.Data.TASKNUM;
+                            dev.Data2.StartPosition_1 = 3028;
+                            dev.Data2.DestPosition_1 = 3060;
+                            dev.Data2.Trigger_1 = 1;
+                        }
+                    }
+
+                    #region 放货任务
+
+                    //判断小车是否有工位有光电,小车空闲自动且有光电代表需要执行放货任务
+                    if (dev.Data.PH_Status_1 || dev.Data.PH_Status_2)
+                    {
+                        if (dev.Data.PH_Status_1 && dev.Data.TaskType_1 != DRGVTaskType.放货) //工位一需要放货
+                        {
+                            if (dev.Data.TaskID_1 < 10000) throw new Exception("有光电无任务号");                  
+                            //获取任务
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_1) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_1}");                             
+                            });
+                            //TODO:放货站点有货检查
+                            dev.Data2.TaskID_1 = dev.Data.TaskID_1;
+                            dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.放货);
+                            dev.Data2.DestPosition_1 = dev.Data2.DestPosition_1;
+                            dev.Data.RES = dev.Data2.DestPosition_1; ;
+                            dev.Data2.Trigger_1 = 1;
+                        }
+                        else if (dev.Data.PH_Status_2 && dev.Data.TaskType_2 != DRGVTaskType.放货)//工位二需要放货
+                        {
+                            if (dev.Data.TaskID_2 < 10000) throw new Exception("有光电无任务号");                            
+                            //获取任务
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().FirstOrDefault(v => v.ID == dev.Data.TaskID_2) ?? throw new Exception($"WCS不存在任务{dev.Data.TaskID_2}");                              
+                            });
+                            //TODO:放货站点有货检查
+                            dev.Data2.TaskID_2 = dev.Data.TaskID_2;
+                            dev.Data2.TaskType_2 = Convert.ToInt16(DRGVTaskType.放货);
+                            dev.Data2.DestPosition_2 = dev.Data2.DestPosition_2;                       
+                            dev.Data.RES = dev.Data2.DestPosition_2;
+                            dev.Data2.Trigger_2 = 1;
+                        }
+                    }
+
+                    #endregion 放货任务
+
+                    bool isOK = true;
+                    DB.Do(db =>
+                    {
+                        //判断是否可以分配RGV出库任务
+                        isOK = !db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
+                        var inArr = Device.Find("3001", "3004", "3005", "3006").Select(v => v.Device<IStation521, IStation520>());
+                        if (inArr.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) isOK = false;
+                    });
+                  
+                    #region 取货任务
+                    if (station_3040.Data.PH_STATUS && station_3040.Data.GOODSEND == 3040 && station_3040.Data.TASKNUM > 10000 && isOK)
+                    {
+                        short outTemp = 3060;
+                        var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
+                        if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
+                        {
+                            if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
+                            if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
+                            if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
+                                if (task == null)
+                                    throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
+                                task.ADDRNEXT = outTemp.ToString();
+                                task.UPDATETIME = DateTime.Now;
+                                db.Default.SaveChanges();
+                                station_3040.Data2.GOODSEND = outTemp;
+                                station_3040.Data2.GOODSTYPE = 2;
+                                station_3040.Data2.CONFIRM = true;
+                            });
+                            dev.Data2.TaskID_1 = station_3040.Data.TASKNUM;
+                            dev.Data2.TaskType_1 = Convert.ToInt16(DRGVTaskType.取货);
+                            dev.Data2.StartPosition_1 = 3040;
+                            dev.Data2.DestPosition_1 = 3060;
+                            dev.Data2.Trigger_1 = 1;
+                        }
+                    }
+                    else if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSEND == 3060 && station_3060.Data.TASKNUM > 10000)
+                    {
+                        if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
+                            task.ADDRNEXT = "3041";
+                            task.ADDRTO = "2017";
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();                          
+                        });
+                        dev.Data2.TaskID_2 = station_3060.Data.TASKNUM;
+                        dev.Data2.StartPosition_2 = 3060;
+                        dev.Data2.DestPosition_2 = 3041;
+                        dev.Data2.Trigger_2 = 1;
+                    }
+                    #endregion
+                }
+            }
         }
 
         protected override bool SelectDevice(WCS_DEVICE dev)
@@ -329,145 +679,554 @@ namespace WCS.Service.Works
     {
         protected override void Do(Device<IRGV521, IRGV520, IRGV523> dev)
         {
-            if (dev.Data3.Fault != 0)
+            //没有RGV故障
+            if (!SystemConfigHelpers.GetDeviceEnabled("CarError"))
             {
-                if (dev.Entity.WakeupOn(5000))
+                if (dev.Data3.Fault != 0)
                 {
-                    WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
+                    if (dev.Entity.WakeupOn(5000))
+                    {
+                        WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
+                    }
                 }
-            }
 
-            if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) return;
-            if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
-            if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
+                if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) return;
+                if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
+                if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
 
-            //分配目标地址
-            var station = Device.Find("3012").Device<IStation521, IStation520>();
-            var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
-            var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
-            var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
-            if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSEND == 3060 && station_3060.Data.TASKNUM > 10000)
-            {
-                var station_3013 = Device.Find("3013").Device<IStation521, IStation520>();
-                if (!station_3013.Data.PH_STATUS && station_3013.Data.TASKNUM == 0)
+                //分配目标地址
+                var station = Device.Find("3012").Device<IStation521, IStation520>();
+                var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
+                var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
+                var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
+                if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSEND == 3060 && station_3060.Data.TASKNUM > 10000)
                 {
-                    DB.Do(db =>
+                    var station_3013 = Device.Find("3013").Device<IStation521, IStation520>();
+                    if (!station_3013.Data.PH_STATUS && station_3013.Data.TASKNUM == 0)
                     {
-                        var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
-                        if (task == null)
-                            throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
-                        if (task.TYPE == TaskType.出库) return;                      
-                        task.ADDRNEXT = station_3060.Entity.CODE;
-                        task.ADDRTO = "2017";
-                        task.UPDATETIME = DateTime.Now;
-                        db.Default.SaveChanges();                       
-                        station_3060.Data2.GOODSEND = 3013;
-                        station_3060.Data2.CONFIRM = true;
-                    });
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
+                            if (task.TYPE == TaskType.出库) return;
+                            task.ADDRNEXT = station_3060.Entity.CODE;
+                            task.ADDRTO = "2017";
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                            station_3060.Data2.GOODSEND = 3013;
+                            station_3060.Data2.CONFIRM = true;
+                        });
+                    }
                 }
-            }
-            if (station.Data.PH_STATUS && station.Data.GOODSEND == 3012 && station.Data.TASKNUM > 10000)
-            {
-                short outTemp = 3060;
-                var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
-                if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
+                if (station.Data.PH_STATUS && station.Data.GOODSEND == 3012 && station.Data.TASKNUM > 10000)
                 {
-                    if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
-                    if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
-                    if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
+                    short outTemp = 3060;
+                    var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
+                    if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
+                    {
+                        if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
+                        if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
+                        if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
 
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station.Data.TASKNUM}不存在");
+                            task.ADDRNEXT = outTemp.ToString();
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                            //station.Data2.TASKNUM = station.Data.TASKNUM;
+                            station.Data2.GOODSEND = outTemp;
+                            station.Data2.GOODSTYPE = 2;
+                            station.Data2.CONFIRM = true;
+                        });
+                    }
+                }
+                if (station_3028.Data.PH_STATUS && station_3028.Data.GOODSEND == 3028 && station_3028.Data.TASKNUM > 10000)
+                {
+                    var station_3020 = Device.Find("3020").Device<IStation521, IStation520>();
+                    if (!station_3020.Data.PH_STATUS && station_3020.Data.TASKNUM == 0)
+                    {
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station.Data.TASKNUM}不存在");
+                            task.ADDRNEXT = station_3020.Entity.CODE;
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                            //station_3028.Data2.TASKNUM = station.Data.TASKNUM;
+                            station_3028.Data2.GOODSEND = 3020;
+                            station_3028.Data2.CONFIRM = true;
+                        });
+                    }
+                }
+                if (station_3019.Data.PH_STATUS && station_3019.Data.GOODSEND == 3019 && station_3019.Data.TASKNUM > 10000)
+                {
+                    var station_3029 = Device.Find("3029").Device<IStation521, IStation520>();
+                    if (!station_3029.Data.PH_STATUS && station_3029.Data.TASKNUM == 0)
+                    {
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
+                            task.ADDRNEXT = station_3029.Entity.CODE;
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                            //station_3019.Data2.TASKNUM = station.Data.TASKNUM;
+                            station_3019.Data2.GOODSEND = 3029;
+                            station_3019.Data2.CONFIRM = true;
+                        });
+                    }
+                }
+                bool agvTaks = false;
+                if (dev.Entity.CODE == "RGV8")
+                {
                     DB.Do(db =>
                     {
-                        var task = db.Default.Set<WCS_TASK>().Find(station.Data.TASKNUM);
-                        if (task == null)
-                            throw new Exception($"任务号{station.Data.TASKNUM}不存在");
-                        task.ADDRNEXT = outTemp.ToString();
-                        task.UPDATETIME = DateTime.Now;
-                        db.Default.SaveChanges();
-                        //station.Data2.TASKNUM = station.Data.TASKNUM;
-                        station.Data2.GOODSEND = outTemp;
-                        station.Data2.GOODSTYPE = 2;
-                        station.Data2.CONFIRM = true;
+                        agvTaks = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
+                        var station_3060 = Device.Find("3001", "3004", "3005", "3006").Select(v => v.Device<IStation521, IStation520>());
+                        if (station_3060.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) agvTaks = false;
+
                     });
-                }              
+                };
+                //获取所有需要取货的站台
+                //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
+                var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
+                                .Select(v => v.Device<IStation521, IStation520, IStation523>())
+                                .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
+                                .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
+                                {
+                                    var end = Device.Find(v.Data.GOODSEND.ToString()).Device<IStation521>();
+                                    var res = end.Data.TASKNUM == 0 && end.Data.PH_STATUS == false;
+                                    if (v.Entity.CODE == "3012")
+                                    {
+                                        if (agvTaks) res = false;
+                                    }
+                                    return res;
+                                });
+
+                if (!validPickupPoints.Any()) return;//不需要取货
+
+                var validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
+
+                dev.Data2.TaskID = validPickupPoint.Data.TASKNUM;
+                dev.Data2.StartPosition = Convert.ToInt16(validPickupPoint.Entity.CODE);
+                dev.Data2.DestPosition = validPickupPoint.Data.GOODSEND;
+                dev.Data2.Trigger = 1;
             }
-            if (station_3028.Data.PH_STATUS && station_3028.Data.GOODSEND == 3028 && station_3028.Data.TASKNUM > 10000)
+            else if (SystemConfigHelpers.GetDeviceIsUsed("RGV7") && dev.Entity.CODE == "RGV7")
             {
-                var station_3020 = Device.Find("3020").Device<IStation521, IStation520>();
-                if (!station_3020.Data.PH_STATUS && station_3020.Data.TASKNUM == 0)
+                if (dev.Data3.Fault != 0)
+                {
+                    if (dev.Entity.WakeupOn(5000))
+                    {
+                        WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
+                    }
+                }
+                if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) return;
+                if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
+                if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
+
+                //执行任务之前优先处理缓存位上的任务 出:3028、3012   入:3019、3033
+                //有入库的先执行入库,做出库要判断是否有入库               
+                var inPort = Device.Find("3019", "3033").Select(v => v.Device<IStation521, IStation520>());
+                var outPort = Device.Find("3028", "3012").Select(v => v.Device<IStation521, IStation520>());
+                var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
+                var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
+                var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
+
+                var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
+                var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
+                var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
+                var station_3012 = Device.Find("3012").Device<IStation521, IStation520>();
+                //是否可以执行缓存位的出库任务
+                bool doOut = true;
+                DB.Do(db =>
+                {
+                    var flag = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
+                    if (flag)
+                    {
+                        doOut = false;
+                    }
+                    var inPos = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
+                    if (inPos.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) doOut = false;
+                });
+
+                if (inPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 && !station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0))
+                {
+                    if (station_3019.Data.PH_STATUS && station_3019.Data.TASKNUM > 0)
+                    {
+                        if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
+                            task.ADDRNEXT = "3041";
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                        });
+                        dev.Data2.TaskID = station_3019.Data.TASKNUM;
+                        dev.Data2.StartPosition = 3019;
+                        dev.Data2.DestPosition = 3041;
+                        dev.Data2.Trigger = 1;
+                    }
+                    else if (station_3033.Data.PH_STATUS && station_3033.Data.TASKNUM > 0)
+                    {
+                        if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station_3033.Data.TASKNUM}不存在");
+                            task.ADDRNEXT = "3041";
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                        });
+                        dev.Data2.TaskID = station_3033.Data.TASKNUM;
+                        dev.Data2.StartPosition = 3033;
+                        dev.Data2.DestPosition = 3041;
+                        dev.Data2.Trigger = 1;
+                    }
+                }
+                else if (outPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0) && doOut && !station_3060.Data.PH_STATUS && station_3060.Data.TASKNUM == 0)
                 {
+                    if (station_3012.Data.PH_STATUS && station_3012.Data.TASKNUM > 0)
+                    {
+                        if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
+                        var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
+                        if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
+                        {
+                            if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
+                            if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
+                            if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
+
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().Find(station_3012.Data.TASKNUM);
+                                if (task == null)
+                                    throw new Exception($"任务号{station_3012.Data.TASKNUM}不存在");
+                                task.ADDRNEXT = "3060";
+                                task.UPDATETIME = DateTime.Now;
+                                db.Default.SaveChanges();
+                                //station.Data2.TASKNUM = station.Data.TASKNUM;
+                                station_3012.Data2.GOODSEND = 3060;
+                                station_3012.Data2.GOODSTYPE = 2;
+                                station_3012.Data2.CONFIRM = true;
+                            });
+                        }
+                        dev.Data2.TaskID = station_3012.Data.TASKNUM;
+                        dev.Data2.StartPosition = 3012;
+                        dev.Data2.DestPosition = 3060;
+                        dev.Data2.Trigger = 1;
+                    }
+                    else if (station_3028.Data.PH_STATUS && station_3028.Data.TASKNUM > 0)
+                    {
+                        if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
+                        var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
+                        if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
+                        {
+                            if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
+                            if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
+                            if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
+                                if (task == null)
+                                    throw new Exception($"任务号{station_3028.Data.TASKNUM}不存在");
+                                task.ADDRNEXT = "3060";
+                                task.UPDATETIME = DateTime.Now;
+                                db.Default.SaveChanges();
+                                //station.Data2.TASKNUM = station.Data.TASKNUM;
+                                station_3028.Data2.GOODSEND = 3060;
+                                station_3028.Data2.GOODSTYPE = 2;
+                                station_3028.Data2.CONFIRM = true;
+                            });
+                        }
+                        dev.Data2.TaskID = station_3028.Data.TASKNUM;
+                        dev.Data2.StartPosition = 3028;
+                        dev.Data2.DestPosition = 3060;
+                        dev.Data2.Trigger = 1;
+                    }
+                }
+
+                bool isOK = false;
+                DB.Do(db =>
+                {
+                    //判断是否可以分配RGV出库任务
+                    var inArr = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
+                    bool falg = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
+                    if (falg)
+                    {
+                        isOK = false;
+                    }
+                    else if (inArr.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060))))
+                    {
+                        isOK = false;
+                    }
+                    else
+                    {
+                        isOK = true;
+                    }
+                });
+                if (isOK && station_3040.Data.PH_STATUS && station_3040.Data.GOODSEND == 3040 && station_3040.Data.TASKNUM > 10000)
+                {
+                    short outTemp = 3060;
+                    var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
+                    if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
+                    {
+                        if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
+                        if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
+                        if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
+
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
+                            task.ADDRNEXT = outTemp.ToString();
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                            station_3040.Data2.GOODSEND = outTemp;
+                            station_3040.Data2.GOODSTYPE = 2;
+                            station_3040.Data2.CONFIRM = true;
+                        });
+                        dev.Data2.TaskID = station_3040.Data.TASKNUM;
+                        dev.Data2.StartPosition = 3040;
+                        dev.Data2.DestPosition = 3060;
+                        dev.Data2.Trigger = 1;
+                    }
+                }
+                else if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSEND == 3060 && station_3060.Data.TASKNUM > 10000)
+                {
+                    if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
                     DB.Do(db =>
                     {
-                        var task = db.Default.Set<WCS_TASK>().Find(station_3028.Data.TASKNUM);
+                        var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
                         if (task == null)
-                            throw new Exception($"任务号{station.Data.TASKNUM}不存在");
-                        task.ADDRNEXT = station_3020.Entity.CODE;
+                            throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
+                        else if (task.TYPE == TaskType.出库 || station_3060.Data.GOODSTYPE == 2) return;
+                        task.ADDRNEXT = "3041";
+                        task.ADDRTO = "2017";
                         task.UPDATETIME = DateTime.Now;
                         db.Default.SaveChanges();
-                        //station_3028.Data2.TASKNUM = station.Data.TASKNUM;
-                        station_3028.Data2.GOODSEND = 3020;
-                        station_3028.Data2.CONFIRM = true;
                     });
+                    dev.Data2.TaskID = station_3060.Data.TASKNUM;
+                    dev.Data2.StartPosition = 3060;
+                    dev.Data2.DestPosition = 3041;
+                    dev.Data2.Trigger = 1;
                 }
             }
-            if (station_3019.Data.PH_STATUS && station_3019.Data.GOODSEND == 3019 && station_3019.Data.TASKNUM > 10000)
+            else if (SystemConfigHelpers.GetDeviceIsUsed("RGV8") && dev.Entity.CODE == "RGV8")
             {
-                var station_3029 = Device.Find("3029").Device<IStation521, IStation520>();
-                if (!station_3029.Data.PH_STATUS && station_3029.Data.TASKNUM == 0)
+                if (dev.Data3.Fault != 0)
                 {
-                    DB.Do(db =>
+                    if (dev.Entity.WakeupOn(5000))
                     {
-                        var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
-                        if (task == null)
-                            throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
-                        task.ADDRNEXT = station_3029.Entity.CODE;
-                        task.UPDATETIME = DateTime.Now;
-                        db.Default.SaveChanges();
-                        //station_3019.Data2.TASKNUM = station.Data.TASKNUM;
-                        station_3019.Data2.GOODSEND = 3029;
-                        station_3019.Data2.CONFIRM = true;
-                    });
+                        WMS.DevInfo(dev.Entity.CODE, dev.Data3.Fault.ToString());
+                    }
                 }
-            }
+                if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) return;
+                if (Ltc.Do(dev, v => v.Data.WorkMode != RGVMode.自动)) return;
+                if (Ltc.Do(dev, v => v.Data.SystemStatus != RGVRunStatus.空闲)) return;
 
-            bool agvTaks = false;
-            if (dev.Entity.CODE == "RGV8")
-            {
+                //执行任务之前先处理缓存位上的任务 出:3028、3012   入:3019、3033
+                //有入库的先执行入库,做出库要判断是否有入库               
+                var inPort = Device.Find("3019", "3033").Select(v => v.Device<IStation521, IStation520>());
+                var outPort = Device.Find("3028", "3012").Select(v => v.Device<IStation521, IStation520>());
+                var station_3040 = Device.Find("3040").Device<IStation521, IStation520>();
+                var station_3060 = Device.Find("3060").Device<IStation521, IStation520>();
+                var station_3041 = Device.Find("3041").Device<IStation521, IStation520>();
+
+                var station_3019 = Device.Find("3019").Device<IStation521, IStation520>();
+                var station_3033 = Device.Find("3033").Device<IStation521, IStation520>();
+                var station_3028 = Device.Find("3028").Device<IStation521, IStation520>();
+                var station_3012 = Device.Find("3012").Device<IStation521, IStation520>();
+                //是否可以执行缓存位的出库任务
+                bool doOut = true;
                 DB.Do(db =>
                 {
-                    agvTaks = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
-                    var station_3060 = Device.Find("3001", "3004", "3005", "3006").Select(v => v.Device<IStation521, IStation520>());
-                    if (station_3060.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) agvTaks = false;
-
+                    var flag = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
+                    if (flag)
+                    {
+                        doOut = false;
+                    }                     
+                    var inPos = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
+                    if (inPos.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060)))) doOut = false;
                 });
-            };
-
-            //获取所有需要取货的站台
-            //获取下一个地址为当前RGV的站台,此处不考虑一台车跑全程
-            var validPickupPoints = Device.Where(v => v.ROUTES.Any(p => p.NEXT.CODE == dev.Entity.CODE)).ToList()
-                            .Select(v => v.Device<IStation521, IStation520, IStation523>())
-                            .Where(v => v.Data.PH_STATUS && v.Data.TASKNUM > 10000 && v.Data.GOODSEND != Convert.ToInt16(v.Entity.CODE))//需要取货的站点
-                            .Where(v => //是否可以进行取货,主要用于判断放货位是否有货
+
+                if (inPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 && !station_3041.Data.PH_STATUS && station_3041.Data.TASKNUM == 0))
+                {
+                    if (station_3019.Data.PH_STATUS && station_3019.Data.TASKNUM > 0)
+                    {
+                        if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station_3019.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
+                            task.ADDRNEXT = "3041";
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                        });
+                        dev.Data2.TaskID = station_3019.Data.TASKNUM;
+                        dev.Data2.StartPosition = 3019;
+                        dev.Data2.DestPosition = 3041;
+                        dev.Data2.Trigger = 1;
+                    }
+                    else if (station_3033.Data.PH_STATUS && station_3033.Data.TASKNUM > 0)
+                    {
+                        if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station_3033.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station_3019.Data.TASKNUM}不存在");
+                            task.ADDRNEXT = "3041";
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                        });
+                        dev.Data2.TaskID = station_3033.Data.TASKNUM;
+                        dev.Data2.StartPosition = 3033;
+                        dev.Data2.DestPosition = 3041;
+                        dev.Data2.Trigger = 1;
+                    }
+                }
+                else if (outPort.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM > 0 ) && doOut && !station_3060.Data.PH_STATUS && station_3060.Data.TASKNUM == 0)
+                {
+                    if (station_3012.Data.PH_STATUS && station_3012.Data.TASKNUM > 0)
+                    {
+                        if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
+                        var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
+                        if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
+                        {
+                            if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
+                            if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
+                            if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
+
+                            DB.Do(db =>
                             {
-                                var end = Device.Find(v.Data.GOODSEND.ToString()).Device<IStation521>();
-                                var res = end.Data.TASKNUM == 0 && end.Data.PH_STATUS == false;
-                                if (v.Entity.CODE == "3012")
-                                {
-                                    if (agvTaks) res = false;
-                                }
-                                return res;
+                                var task = db.Default.Set<WCS_TASK>().Find(station_3012.Data.TASKNUM);
+                                if (task == null)
+                                    throw new Exception($"任务号{station_3012.Data.TASKNUM}不存在");
+                                task.ADDRNEXT = "3060";
+                                task.UPDATETIME = DateTime.Now;
+                                db.Default.SaveChanges();
+                                //station.Data2.TASKNUM = station.Data.TASKNUM;
+                                station_3012.Data2.GOODSEND = 3060;
+                                station_3012.Data2.GOODSTYPE = 2;
+                                station_3012.Data2.CONFIRM = true;
                             });
+                        }
+                        dev.Data2.TaskID = station_3012.Data.TASKNUM;
+                        dev.Data2.StartPosition = 3012;
+                        dev.Data2.DestPosition = 3060;
+                        dev.Data2.Trigger = 1;
+                    }
+                    else if (station_3028.Data.PH_STATUS && station_3028.Data.TASKNUM > 0)
+                    {
+                        if (station_3060.Data.PH_STATUS || station_3060.Data.TASKNUM > 10000) return;
+                        var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
+                        if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
+                        {
+                            if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
+                            if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
+                            if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
+                            DB.Do(db =>
+                            {
+                                var task = db.Default.Set<WCS_TASK>().Find(station_3012.Data.TASKNUM);
+                                if (task == null)
+                                    throw new Exception($"任务号{station_3012.Data.TASKNUM}不存在");
+                                task.ADDRNEXT = "3060";
+                                task.UPDATETIME = DateTime.Now;
+                                db.Default.SaveChanges();
+                                //station.Data2.TASKNUM = station.Data.TASKNUM;
+                                station_3028.Data2.GOODSEND = 3060;
+                                station_3028.Data2.GOODSTYPE = 2;
+                                station_3028.Data2.CONFIRM = true;
+                            });
+                        }
+                        dev.Data2.TaskID = station_3028.Data.TASKNUM;
+                        dev.Data2.StartPosition = 3028;
+                        dev.Data2.DestPosition = 3060;
+                        dev.Data2.Trigger = 1;
+                    }
+                }
 
-            if (!validPickupPoints.Any()) return;//不需要取货
+                bool isOK = false;
+                DB.Do(db =>
+                {
+                    //判断是否可以分配RGV出库任务
+                    var inArr = Device.Find("3001", "3004", "3005", "3060").Select(v => v.Device<IStation521, IStation520>());
+                    bool falg = db.Default.Set<WCS_AGVTask>().Any(v => v.TaskType == AGVTaskType.入库 && v.Status <= AGVTaskStatus.完成 && v.Status >= AGVTaskStatus.确认 && v.Status != AGVTaskStatus.执行 && v.Station == "3001");
+                    if (falg)
+                    {
+                        isOK = false;
+                    }
+                    else if (inArr.Any(v => v.Data2.CONFIRM == true || (v.Data.PH_STATUS && v.Data.TASKNUM > 0 && (v.Data.GOODSEND is 0 or 1 or 2 or 3 or 3060))))
+                    {
+                        isOK = false;
+                    }
+                    else
+                    {
+                        isOK = true;
+                    }
+                });
 
-            var validPickupPoint = validPickupPoints.OrderBy(v => v.UpdateTime).FirstOrDefault() ?? throw new Exception("没有站台需要取货");
+                
+                if (isOK && station_3040.Data.PH_STATUS && station_3040.Data.GOODSEND == 3040 && station_3040.Data.TASKNUM > 10000)
+                {
+                    short outTemp = 3060;
+                    var arr = Device.Find("3006", "3060", "3001", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).ToArray();
+                    if (!arr.Any(v => v.Data.GOODSEND is 3060 or 3013))
+                    {
+                        if (arr.Any(v => v.Data.GOODSTYPE == 1)) throw new Exception("交通管制,提升机被入库任务占用");
+                        if (arr.Any(v => v.Data.PH_STATUS && v.Data.TASKNUM == 0)) throw new Exception("有光电无任务,交通管制,提升机被入库任务占用");
+                        if (arr.Any(v => !v.Data.PH_STATUS && v.Data.TASKNUM > 10000)) throw new Exception("有任务无光电,请检查光电是否异常");
 
-            dev.Data2.TaskID = validPickupPoint.Data.TASKNUM;
-            dev.Data2.StartPosition = Convert.ToInt16(validPickupPoint.Entity.CODE);
-            dev.Data2.DestPosition = validPickupPoint.Data.GOODSEND;
-            dev.Data2.Trigger = 1;
+                        DB.Do(db =>
+                        {
+                            var task = db.Default.Set<WCS_TASK>().Find(station_3040.Data.TASKNUM);
+                            if (task == null)
+                                throw new Exception($"任务号{station_3040.Data.TASKNUM}不存在");
+                            task.ADDRNEXT = outTemp.ToString();
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                            station_3040.Data2.GOODSEND = outTemp;
+                            station_3040.Data2.GOODSTYPE = 2;
+                            station_3040.Data2.CONFIRM = true;
+                        });
+                        dev.Data2.TaskID = station_3040.Data.TASKNUM;
+                        dev.Data2.StartPosition = 3040;
+                        dev.Data2.DestPosition = 3060;
+                        dev.Data2.Trigger = 1;
+                    }
+                }
+                else if (station_3060.Data.PH_STATUS && station_3060.Data.GOODSEND == 3060 && station_3060.Data.TASKNUM > 10000)
+                {
+                    if (station_3041.Data.PH_STATUS || station_3041.Data.TASKNUM > 10000) return;
+                    DB.Do(db =>
+                    {
+                        var task = db.Default.Set<WCS_TASK>().Find(station_3060.Data.TASKNUM);
+                        if (task == null)
+                            throw new Exception($"任务号{station_3060.Data.TASKNUM}不存在");
+                        else if (task.TYPE == TaskType.出库 || station_3060.Data.GOODSTYPE == 2) return;
+                        task.ADDRNEXT = "3041";
+                        task.ADDRTO = "2017";
+                        task.UPDATETIME = DateTime.Now;
+                        db.Default.SaveChanges();
+                    });
+                    dev.Data2.TaskID = station_3060.Data.TASKNUM;
+                    dev.Data2.StartPosition = 3060;
+                    dev.Data2.DestPosition = 3041;
+                    dev.Data2.Trigger = 1;
+                }
+            }
         }
-
         protected override bool SelectDevice(WCS_DEVICE dev)
         {
             return dev.CODE is "RGV7" or "RGV8";