|  | @@ -5,6 +5,7 @@ using ServiceCenter.Logs;
 | 
	
		
			
				|  |  |  using ServiceCenter.SqlSugars;
 | 
	
		
			
				|  |  |  using SqlSugar;
 | 
	
		
			
				|  |  |  using System.ComponentModel;
 | 
	
		
			
				|  |  | +using System.Threading.Tasks;
 | 
	
		
			
				|  |  |  using WCS.Core;
 | 
	
		
			
				|  |  |  using WCS.Entity;
 | 
	
		
			
				|  |  |  using WCS.Entity.Protocol.BCR;
 | 
	
	
		
			
				|  | @@ -58,6 +59,15 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 | 
	
		
			
				|  |  |                      if (item == null)
 | 
	
		
			
				|  |  |                      {
 | 
	
		
			
				|  |  |                          MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"扫码器{obj.Entity.Code}条码{bcrCode}找不到对应任务", Time = DateTime.Now }));
 | 
	
		
			
				|  |  | +                        var error = new BaseErrorinfoWcs()
 | 
	
		
			
				|  |  | +                        {
 | 
	
		
			
				|  |  | +                            ContBarCode = bcrCode,
 | 
	
		
			
				|  |  | +                            Message = $"码垛异常排出口|5251,扫码器{obj.Entity.Code},根据条码{bcrCode}查询出的任务不是码垛出库任务,自动异常排出,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}",
 | 
	
		
			
				|  |  | +                            Count = 1,
 | 
	
		
			
				|  |  | +                            Memo = "WCS"
 | 
	
		
			
				|  |  | +                        };
 | 
	
		
			
				|  |  | +                        error.UpdataErrorinfo();
 | 
	
		
			
				|  |  | +                        Circling(obj, 5038, 5173, bcrCode);
 | 
	
		
			
				|  |  |                          continue;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |                      if (item.AddrTo != "8090" && item.AddrTo != "8092" && item.AddrTo != "8096" && item.AddrTo != "8098")
 | 
	
	
		
			
				|  | @@ -65,13 +75,13 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 | 
	
		
			
				|  |  |                          var error = new BaseErrorinfoWcs()
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  |                              ContBarCode = bcrCode,
 | 
	
		
			
				|  |  | -                            Message = $"码垛异常排出口|5180,扫码器{obj.Entity.Code},根据条码{bcrCode}查询出的任务不是码垛出库任务,自动异常排出,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}",
 | 
	
		
			
				|  |  | +                            Message = $"码垛异常排出口|5251,扫码器{obj.Entity.Code},根据条码{bcrCode}查询出的任务不是码垛出库任务,自动异常排出,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}",
 | 
	
		
			
				|  |  |                              Count = 1,
 | 
	
		
			
				|  |  |                              Memo = "WCS"
 | 
	
		
			
				|  |  |                          };
 | 
	
		
			
				|  |  |                          error.UpdataErrorinfo();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                        Circling(obj, 5041, 5180, bcrCode);
 | 
	
		
			
				|  |  | +                        Circling(obj, 5038, 5180, bcrCode);
 | 
	
		
			
				|  |  |                          continue;
 | 
	
		
			
				|  |  |                      }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -87,12 +97,12 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 | 
	
		
			
				|  |  |                              var error = new BaseErrorinfoWcs()
 | 
	
		
			
				|  |  |                              {
 | 
	
		
			
				|  |  |                                  ContBarCode = bcrCode,
 | 
	
		
			
				|  |  | -                                Message = $"码垛入缓存扫码口|5041,扫码器{obj.Entity.Code},根据条码{bcrCode}查询出的任务状态大于或等于码垛抓取扫码,自动异常排出,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}",
 | 
	
		
			
				|  |  | +                                Message = $"码垛入缓存扫码口|5251,扫码器{obj.Entity.Code},根据条码{bcrCode}查询出的任务状态大于或等于码垛抓取扫码,自动异常排出,{DateTime.UtcNow.ToString("yyyyMMddHHmmfff")}",
 | 
	
		
			
				|  |  |                                  Count = 1,
 | 
	
		
			
				|  |  |                                  Memo = "WCS"
 | 
	
		
			
				|  |  |                              };
 | 
	
		
			
				|  |  |                              error.UpdataErrorinfo();
 | 
	
		
			
				|  |  | -                            Circling(obj, 5041, 5180, bcrCode);
 | 
	
		
			
				|  |  | +                            Circling(obj, 5251, 5180, bcrCode);
 | 
	
		
			
				|  |  |                              return;
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -103,11 +113,11 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                          if (task.Robot is "Robot1" or "")
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  | -                            cacheList = new List<string>() { "5100", "5086" };
 | 
	
		
			
				|  |  | +                            cacheList = new List<string>() { /*"5100",*/ "5086", "5070", "5056" };
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                          else if (task.Robot is "Robot2" or "")
 | 
	
		
			
				|  |  |                          {
 | 
	
		
			
				|  |  | -                            cacheList = new List<string>() { "5070", "5056" };
 | 
	
		
			
				|  |  | +                            cacheList = new List<string>() { "5310", "5295", "5280", "5265" };
 | 
	
		
			
				|  |  |                          }
 | 
	
		
			
				|  |  |                          //当前任务是否正在码垛
 | 
	
		
			
				|  |  |                          var isPallet = db.Default.Queryable<Palletizing>().Any(v => v.PalletizState == 0 && v.ID == task.PalletizingID);
 | 
	
	
		
			
				|  | @@ -131,9 +141,7 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 | 
	
		
			
				|  |  |                                      .Where(x => x.PalletizingID == task.PalletizingID && cacheList.Contains(x.AddrNext) && x.Status < TaskStatus.码垛缓存放行)
 | 
	
		
			
				|  |  |                                      .ToList()
 | 
	
		
			
				|  |  |                                      .GroupBy(x => x.AddrNext)
 | 
	
		
			
				|  |  | -                                    .Where(x => x.Count() < 13)
 | 
	
		
			
				|  |  | -                                    .OrderByDescending(x => x.Count())
 | 
	
		
			
				|  |  | -                                    .FirstOrDefault();
 | 
	
		
			
				|  |  | +                                    .Where(x => x.Count() < 13).MaxBy(x => x.Count());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                                  if (addNext == null || addNext.Count() >= 13)
 | 
	
		
			
				|  |  |                                  {
 | 
	
	
		
			
				|  | @@ -141,7 +149,7 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 | 
	
		
			
				|  |  |                                      var addrNextList = db.Default.Queryable<WCS_TaskInfo>().Where(x => x.Type == TaskType.OutDepot && x.BusType == "装箱码垛" && x.Status == TaskStatus.码垛缓存扫码)
 | 
	
		
			
				|  |  |                                              .ToList().Select(x => x.AddrNext).Distinct().ToList();
 | 
	
		
			
				|  |  |                                      //找到没有被使用过的下一个地址
 | 
	
		
			
				|  |  | -                                    var caches = cacheList.Where(x => !addrNextList.Contains(x)).OrderByDescending(x => x.ToShort()).ToList();
 | 
	
		
			
				|  |  | +                                    var caches = cacheList.Where(x => !addrNextList.Contains(x)).OrderBy(x => x.ToShort()).ToList();
 | 
	
		
			
				|  |  |                                      if (caches == null || caches.Count < 1) //没有可以使用的缓存位了,绕圈去
 | 
	
		
			
				|  |  |                                      {
 | 
	
		
			
				|  |  |                                          //是正在码垛的箱
 | 
	
	
		
			
				|  | @@ -159,7 +167,7 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 | 
	
		
			
				|  |  |                                              var error1 = new BaseErrorinfoWcs()
 | 
	
		
			
				|  |  |                                              {
 | 
	
		
			
				|  |  |                                                  ContBarCode = bcrCode,
 | 
	
		
			
				|  |  | -                                                Message = $"入缓存扫码|5040,当前正在码垛工字轮条码{bcrCode}已无可用缓存道,直接去往码垛位,{DateTime.Now:yyyyMMddHH}",
 | 
	
		
			
				|  |  | +                                                Message = $"入缓存扫码|5251,当前正在码垛工字轮条码{bcrCode}已无可用缓存道,直接去往码垛位,{DateTime.Now:yyyyMMddHH}",
 | 
	
		
			
				|  |  |                                                  Count = 1,
 | 
	
		
			
				|  |  |                                                  Memo = "WCS"
 | 
	
		
			
				|  |  |                                              };
 | 
	
	
		
			
				|  | @@ -170,7 +178,7 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 | 
	
		
			
				|  |  |                                          var error = new BaseErrorinfoWcs()
 | 
	
		
			
				|  |  |                                          {
 | 
	
		
			
				|  |  |                                              ContBarCode = bcrCode,
 | 
	
		
			
				|  |  | -                                            Message = $"入缓存扫码|5040,条码{bcrCode}已无可用缓存道,{DateTime.Now:yyyyMMddHH}",
 | 
	
		
			
				|  |  | +                                            Message = $"入缓存扫码|5251,条码{bcrCode}已无可用缓存道,{DateTime.Now:yyyyMMddHH}",
 | 
	
		
			
				|  |  |                                              Count = 1,
 | 
	
		
			
				|  |  |                                              Memo = "WCS"
 | 
	
		
			
				|  |  |                                          };
 | 
	
	
		
			
				|  | @@ -178,38 +186,24 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 | 
	
		
			
				|  |  |                                          Circling(obj, task.ID, 5173, bcrCode);
 | 
	
		
			
				|  |  |                                          return;
 | 
	
		
			
				|  |  |                                      }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                                      if (caches.Count == 1) //可以使用的缓存位只有一个
 | 
	
		
			
				|  |  |                                      {
 | 
	
		
			
				|  |  | -                                        //先获取任务所在机械臂的最早一条未结束的码垛信息
 | 
	
		
			
				|  |  | -                                        //0:正在码垛  1:码垛结束  2:等待码垛
 | 
	
		
			
				|  |  | -                                        var pallet = db.Default.Queryable<Palletizing>().Where(v => v.PalletizState != 1 && v.Robot == task.Robot)
 | 
	
		
			
				|  |  | -                                            .OrderBy(x => x.AddTime)
 | 
	
		
			
				|  |  | -                                            .First();
 | 
	
		
			
				|  |  | -                                        //var pallet = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock).Where(v => v.PalletizState == 0 && v.Equip == task.AddrTo).First();
 | 
	
		
			
				|  |  | -                                        if (pallet.ID != task.PalletizingID) //不是当前机械臂的第一箱(最早一箱)
 | 
	
		
			
				|  |  | +                                        if (db.Default.Queryable<WCS_TaskInfo>().Count(x => x.PalletizingID == task.PalletizingID && x.Status < Entity.TaskStatus.码垛缓存扫码) > 10)
 | 
	
		
			
				|  |  |                                          {
 | 
	
		
			
				|  |  | -                                            if (!db.Default.Queryable<WCS_TaskInfo>().Any(x => x.PalletizingID == pallet.ID && x.Status < Entity.TaskStatus.码垛抓取扫码 && addrNextList.Contains(x.AddrNext)))
 | 
	
		
			
				|  |  | -                                            {
 | 
	
		
			
				|  |  | -                                                //获取当前任务对应码垛信息
 | 
	
		
			
				|  |  | -                                                var curPallet = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock).First(x => x.ID == task.PalletizingID);
 | 
	
		
			
				|  |  | -                                                //当前机械臂中在当前任务码垛信息前未结束的码垛信息
 | 
	
		
			
				|  |  | -                                                var palletIds = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock)
 | 
	
		
			
				|  |  | -                                                    .Where(x => x.PalletizState != 1 && x.Robot == task.Robot && x.AddTime < curPallet.AddTime)
 | 
	
		
			
				|  |  | -                                                    .Select(x => x.ID).ToList();
 | 
	
		
			
				|  |  | +                                            //获取同机械臂正在码垛的另一箱任务,同一时间同一机械臂只能有一箱在码垛
 | 
	
		
			
				|  |  | +                                            var pallet = db.Default.Queryable<Palletizing>().Where(v => v.PalletizState == 0 && v.Robot == task.Robot && v.ID != task.PalletizingID).First();
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                                                //判断正在码垛的箱是否全部大于等于码垛扫码的,如果不是,就需要留下一条线用来走上一箱的最后几个轮子
 | 
	
		
			
				|  |  | -                                                var isOut = db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Any(x => palletIds.Contains(x.PalletizingID) && x.Status < Entity.TaskStatus.码垛抓取扫码);
 | 
	
		
			
				|  |  | -                                                //if (isOut)
 | 
	
		
			
				|  |  | -                                                //{
 | 
	
		
			
				|  |  | -                                                //    World.Log($"目标位置{task.AddrTo},正在码垛箱未全部离开码垛合流点,如有异常请检查正在码垛箱是否有任务小于码垛合流状态");
 | 
	
		
			
				|  |  | -                                                //    throw new Exception($"目标位置{task.AddrTo},正在码垛箱未全部离开码垛合流点,如有异常请检查正在码垛箱是否有任务小于码垛合流状态");
 | 
	
		
			
				|  |  | -                                                //}
 | 
	
		
			
				|  |  | -                                                if (isOut)
 | 
	
		
			
				|  |  | +                                            //判断获取到的码垛箱是否有未进入码垛缓存放行的任务
 | 
	
		
			
				|  |  | +                                            if (pallet != null && db.Default.Queryable<WCS_TaskInfo>().Any(x => x.PalletizingID == pallet.ID && x.Status < Entity.TaskStatus.码垛缓存扫码))
 | 
	
		
			
				|  |  | +                                            {
 | 
	
		
			
				|  |  | +                                                //没有已经分配缓存道的任务
 | 
	
		
			
				|  |  | +                                                if (!db.Default.Queryable<WCS_TaskInfo>().Any(x => x.PalletizingID == pallet.ID && x.Status == Entity.TaskStatus.码垛缓存扫码))
 | 
	
		
			
				|  |  |                                                  {
 | 
	
		
			
				|  |  |                                                      var error = new BaseErrorinfoWcs()
 | 
	
		
			
				|  |  |                                                      {
 | 
	
		
			
				|  |  |                                                          ContBarCode = bcrCode,
 | 
	
		
			
				|  |  | -                                                        Message = $"入缓存扫码|5040,,{task.PalletizingID}的上一箱未全部经过抓取扫码,需要流出缓存行走上一箱的产品,因此此产品绕圈去,{DateTime.Now:yyyyMMddHH}",
 | 
	
		
			
				|  |  | +                                                        Message = $"入缓存扫码|5251,,{task.PalletizingID}的同机械臂的另外一箱任务还没有占用任何一个缓存道,需要留出缓存行走另一箱的产品,因此此产品绕圈去,{DateTime.Now:yyyyMMddHH}",
 | 
	
		
			
				|  |  |                                                          Count = 1,
 | 
	
		
			
				|  |  |                                                          Memo = "WCS"
 | 
	
		
			
				|  |  |                                                      };
 | 
	
	
		
			
				|  | @@ -219,6 +213,36 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 | 
	
		
			
				|  |  |                                                  }
 | 
	
		
			
				|  |  |                                              }
 | 
	
		
			
				|  |  |                                          }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                        //if (pallet.ID != task.PalletizingID) //不是当前机械臂的第一箱(最早一箱)
 | 
	
		
			
				|  |  | +                                        //{
 | 
	
		
			
				|  |  | +                                        //    if (!db.Default.Queryable<WCS_TaskInfo>().Any(x => x.PalletizingID == pallet.ID && x.Status < Entity.TaskStatus.码垛抓取扫码 && addrNextList.Contains(x.AddrNext)))
 | 
	
		
			
				|  |  | +                                        //    {
 | 
	
		
			
				|  |  | +                                        //        //获取当前任务对应码垛信息
 | 
	
		
			
				|  |  | +                                        //        var curPallet = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock).First(x => x.ID == task.PalletizingID);
 | 
	
		
			
				|  |  | +                                        //        //当前机械臂中在当前任务码垛信息前未结束的码垛信息
 | 
	
		
			
				|  |  | +                                        //        var palletIds = db.Default.Queryable<Palletizing>().With(SqlWith.NoLock)
 | 
	
		
			
				|  |  | +                                        //            .Where(x => x.PalletizState != 1 && x.Robot == task.Robot && x.AddTime < curPallet.AddTime)
 | 
	
		
			
				|  |  | +                                        //            .Select(x => x.ID).ToList();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                        //        //判断正在码垛的箱是否全部大于等于码垛扫码的,如果不是,就需要留下一条线用来走上一箱的最后几个轮子
 | 
	
		
			
				|  |  | +                                        //        var isOut = db.Default.Queryable<WCS_TaskInfo>().With(SqlWith.NoLock).Any(x => palletIds.Contains(x.PalletizingID) && x.Status < Entity.TaskStatus.码垛抓取扫码);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                                        //        if (isOut)
 | 
	
		
			
				|  |  | +                                        //        {
 | 
	
		
			
				|  |  | +                                        //            var error = new BaseErrorinfoWcs()
 | 
	
		
			
				|  |  | +                                        //            {
 | 
	
		
			
				|  |  | +                                        //                ContBarCode = bcrCode,
 | 
	
		
			
				|  |  | +                                        //                Message = $"入缓存扫码|5251,,{task.PalletizingID}的上一箱未全部经过抓取扫码,需要流出缓存行走上一箱的产品,因此此产品绕圈去,{DateTime.Now:yyyyMMddHH}",
 | 
	
		
			
				|  |  | +                                        //                Count = 1,
 | 
	
		
			
				|  |  | +                                        //                Memo = "WCS"
 | 
	
		
			
				|  |  | +                                        //            };
 | 
	
		
			
				|  |  | +                                        //            error.UpdataErrorinfo();
 | 
	
		
			
				|  |  | +                                        //            Circling(obj, task.ID, 5173, bcrCode);
 | 
	
		
			
				|  |  | +                                        //            return;
 | 
	
		
			
				|  |  | +                                        //        }
 | 
	
		
			
				|  |  | +                                        //    }
 | 
	
		
			
				|  |  | +                                        //}
 | 
	
		
			
				|  |  |                                      }
 | 
	
		
			
				|  |  |                                      //判断当前箱的
 | 
	
		
			
				|  |  |                                      var cache = caches.FirstOrDefault();
 | 
	
	
		
			
				|  | @@ -305,7 +329,7 @@ namespace WCS.WorkEngineering.Systems.装箱码垛
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          public override bool Select(Device dev)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            return dev.Code == "5040";
 | 
	
		
			
				|  |  | +            return dev.Code == "5251";
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          public void Circling(Device<IBCR83, IStation525> obj, int taskNumber, short next, string bcrCode)
 |