| 
					
				 | 
			
			
				@@ -1,8 +1,8 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-using ServiceCenter.Extensions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Newtonsoft.Json; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ServiceCenter.Extensions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using ServiceCenter.Logs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using ServiceCenter.SqlSugars; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using System.ComponentModel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-using Newtonsoft.Json; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using WCS.Core; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using WCS.Entity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using WCS.Entity.Protocol.Station; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -34,16 +34,21 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public override void Do(Truss obj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (obj.Data.VoucherNo != obj.Data2.VoucherNo) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                World.Log($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (obj.Data2.CmdType == 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var isFinish = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var isEnd = false; //是否强制结盘 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 SqlSugarHelper.Do(_db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     var db = _db.Default; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     List<int> ids = new List<int>() { obj.Data2.PalletizingRowId1, obj.Data2.PalletizingRowId2 }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var palletizingRow = db.Queryable<WCS_PalletizingRow>().UpdLock().Includes(x => x.CacheLine, c => c.Locations) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.CacheLine, c => c.Locations) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                                                                 .Includes(x => x.Locs) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                                                                 .Includes(x => x.Palletizing).Where(x => ids.Contains(x.Id)).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     List<WCS.Entity.WCS_CacheLine> deleteCacheLine = new List<WCS.Entity.WCS_CacheLine>(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -53,21 +58,29 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     //更新行数据 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     foreach (var row in palletizingRow) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var cacheLine = db.Queryable<WCS.Entity.WCS_CacheLine>().UpdLock().Includes(x => x.Locations).Single(x => x.Id == row.CacheLine.Id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var cacheLine = db.Queryable<WCS.Entity.WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.Id == row.CacheLine.Id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (cacheLine.AddTime < DateTime.Now.AddHours(-6)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            isEnd = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         //先更新对应的位信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             var index = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             foreach (var loc in row.Locs.Where(x => !x.IsEmpty).OrderBy(x => x.XYNo)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                var cacheLoc = cacheLine.Locations[index]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                cacheLoc = db.Queryable<WCS_CacheLineLoc>().UpdLock().Single(x => x.Id == cacheLoc.Id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                loc.TaskId = cacheLoc.TaskId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                loc.Finish = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                upDateableLoc.Add(loc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                deleteLoc.Add(cacheLoc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                index++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                if (index < cacheLine.Locations.Count) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    var cacheLoc = cacheLine.Locations[index]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    loc.TaskId = cacheLoc.TaskId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    loc.Finish = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    upDateableLoc.Add(loc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    deleteLoc.Add(cacheLoc); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    index++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         catch (Exception a) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -86,7 +99,7 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     db.DeleteableRowLock(deleteCacheLine).ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     var layerId = palletizingRow.FirstOrDefault().PalletizingLayerId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var layer = db.Queryable<WCS_PalletizingLayer>().UpdLock().Includes(x => x.Rows).Single(x => x.Id == layerId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var layer = db.Queryable<WCS_PalletizingLayer>().Includes(x => x.Rows).Single(x => x.Id == layerId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (layer.Rows.All(x => x.Finish || x.IsEmpty)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         layer.Finish = true; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -95,7 +108,7 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     //码垛完成后开始绑定托盘 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     var palletizingId = upDateableRow.First().Palletizing.Id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var palletizing = db.Queryable<WCS_Palletizing>().UpdLock().Single(x => x.Id == palletizingId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var palletizing = db.Queryable<WCS_Palletizing>().Single(x => x.Id == palletizingId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     palletizing.EditTime = DateTime.Now; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     db.UpdateableRowLock(palletizing).ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     var taskId = upDateableRow.SelectMany(x => x.Locs).Select(x => x.TaskId).ToList(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -103,10 +116,25 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     WmsApi.BingPallet(palletizing.PalleCode, taskList, palletizing.WarehouseCode, palletizing.PalletizingStation); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     isFinish = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (!isFinish) throw new KnownException($"绑盘失败", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!isFinish) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    World.Log("绑盘失败"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (isEnd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var dev = new Device<ITruss530>(Device.All.First(x => x.Code == obj.Data.TargetPallte1.ToString()), World); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        dev.Data.CmdType = TrussCmdType.End1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    catch (Exception e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        World.Log($"超时托盘自动结盘失败:{e.Message}--{obj.Data.TargetPallte1}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 obj.Data.CmdType = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 obj.Data.DestPosition_1 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 obj.Data.TargetPallte1 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 obj.Data.Task1_1 = 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -137,8 +165,17 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 obj.Data.PalletizingRowId2 = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (obj.Data2.CmdType == 0 && obj.Data.CmdType != 0) obj.Data.CmdType = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (obj.Data2.CmdType != 0 || obj.Data.CmdType != 0) throw new Exception($"完成信号未清除:{obj.Data2.CmdType}--{obj.Data.CmdType}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (obj.Data2.Status != TrussStatus.Idle) throw new Exception($"桁架处于{obj.Data2.Status.GetDescription()}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (obj.Data2.CmdType != 0 || obj.Data.CmdType != 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                World.Log($"完成信号未清除:{obj.Data2.CmdType}--{obj.Data.CmdType}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (obj.Data2.Status != TrussStatus.Idle) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                World.Log($"桁架处于{obj.Data2.Status.GetDescription()}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             //查找所有的可用开始搬运的线体 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             var pickUpDevices = _pickUpDevices.Where(v => v.Value.All(x => !x.Data2.Status.HasFlag(StationStatus.Run) && x.Data2.Status.HasFlag(StationStatus.Auto))) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -146,9 +183,14 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     key = x.Key.Entity.Code, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     Count = x.Value.Count(v => v.Data2.Status.HasFlag(StationStatus.PH_Status) && v.Data.TaskNumber > 0), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    HPCount = x.Value.Count(v => v.Data2.Status.HasFlag(StationStatus.PH_Status)), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     Dev = x 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (!pickUpDevices.Any()) throw new KnownException($"没有可用取货点,请在电控触摸屏检查实际可取货点是否每个位置都有光电与任务号", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }).Where(x => x.HPCount == x.Count).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (!pickUpDevices.Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                World.Log($"没有可用取货点,请在电控触摸屏检查实际可取货点是否每个位置都有光电与任务号"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             List<WCS_PalletizingRow> palletizingRowList = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             WCS_Palletizing palletizing = null; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -156,38 +198,55 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var db = _db.Default; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //找到当前桁架所属所有还有层没结束的码垛记录信息,有对应托盘 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var palletizingLsit = db.Queryable<WCS_Palletizing>().UpdLock().Includes(x => x.Layers, r => r.Rows, l => l.Locs) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var palletizingLsit = db.Queryable<WCS_Palletizing>().Includes(x => x.Layers, r => r.Rows, l => l.Locs) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     .Where(x => !x.Finish && x.DeviceCode == obj.Entity.Code) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     .Where(x => x.Layers.Any(l => !l.Finish) && x.PalletizingStation != null).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //筛选出目标位置有光电的码垛记录信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var devCode = palletizingLsit.Select(x => x.PalletizingStation); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var taskCode = palletizingLsit.Select(x => x.Id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var devList = Device.All.Where(x => devCode.Contains(x.Code)).Select(x => new Device<IStation521, IStation523, ITruss530>(x, World)).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                devList = devList.Where(x => x.Data2.Status.HasFlag(StationStatus.PH_Status) && taskCode.Contains(x.Data.TaskNumber) && !x.Data3.CmdType.HasFlag(TrussCmdType.Two)).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var devList = Device.All.Where(x => devCode.Contains(x.Code)).Select(x => new Device<IStation521, IStation523, ITruss530, ITruss531>(x, World)).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                devList = devList.Where(x => x.Data2.Status.HasFlag(StationStatus.PH_Status) && taskCode.Contains(x.Data.TaskNumber) && !x.Data4.CmdType.HasFlag(TrussCmdType.End1)).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 devCode = devList.Select(x => x.Entity.Code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (!devCode.Any()) throw new KnownException($"无可用放货码垛位,请检查实际有货位置的光电是否正常", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!devCode.Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    World.Log($"可用放货位:{JsonConvert.SerializeObject(devCode)}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    World.Log($"无可用放货码垛位,请检查实际有货位置的光电是否正常"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                World.Log($"可用放货位:{JsonConvert.SerializeObject(devCode)}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 palletizingLsit = palletizingLsit.Where(x => devCode.Contains(x.PalletizingStation)).ToList(); //可以放货的目标托盘 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //可以取货的码垛信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var pickUpCode = _pickUpDevices.Select(x => x.Key.Entity.Code.ToShort()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                World.Log($"可用取货线体1:{JsonConvert.SerializeObject(pickUpCode)}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //从缓存线信息找到可以取货的缓存线 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var cacheLines = db.Queryable<WCS_CacheLine>().UpdLock().Where(x => pickUpCode.Contains(x.LocationNo)).ToList().Where( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var cacheLines = db.Queryable<WCS_CacheLine>().Where(x => pickUpCode.Contains(x.LocationNo)).ToList().Where( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     x => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return pickUpDevices.Any(p => p.key == x.LocationNo.ToString() && p.Count == x.Quantity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var isTime = x.AddTime < DateTime.Now.AddHours(-6); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var isPut = pickUpDevices.Any(p => p.key == x.LocationNo.ToString() && p.Count == x.Quantity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        //满足取货条件,或者是超六小时 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return isPut || (pickUpDevices.Any(p => p.key == x.LocationNo.ToString()) && isTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!cacheLines.Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    World.Log($"无可用取货线体"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                World.Log($"物理可用取货线体:{JsonConvert.SerializeObject(pickUpDevices.Select(x => x.key).ToList())}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                World.Log($"可用取货线体:{JsonConvert.SerializeObject(cacheLines.Select(x => x.LocationNo).ToList())}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 //找到可用缓存线可以去的码垛信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 palletizingLsit = palletizingLsit.Where(x => x.Layers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     .Where(w => !w.Finish) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     .SelectMany(w => w.Rows) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     .Where(v => !v.Finish).Any(w => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        return cacheLines.Any(a => a.MatCodeList == w.MatCodeList && a.Quantity == w.QtyMaxCount && a.WarehouseCode == w.WarehouseCode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        return cacheLines.Any(a => a.MatCodeList == w.MatCodeList && (a.Quantity == w.QtyMaxCount || (a.AddTime < DateTime.Now.AddHours(-6) && a.Quantity <= w.QtyMaxCount)) && a.WarehouseCode == w.WarehouseCode); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     })).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                if (!palletizingLsit.Any()) throw new KnownException($"没有可用取货点,码垛信息是否正常", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!palletizingLsit.Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    World.Log($"没有可用取货点,码垛信息是否正常"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 foreach (var palletizingInfo in palletizingLsit) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -200,7 +259,7 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         .MinBy(x => x.LayerNo) //取最下层 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         .Rows 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         .Where(x => x is { Finish: false, IsEmpty: false, LineCode: null }) //不空且未结束的行 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        .Where(x => cacheLines.Any(a => a.MatCodeList == x.MatCodeList && a.Quantity == x.QtyMaxCount && a.WarehouseCode == x.WarehouseCode)); //获取可以取货的码垛信息行 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        .Where(x => cacheLines.Any(a => a.MatCodeList == x.MatCodeList && (a.Quantity == x.QtyMaxCount || (a.AddTime < DateTime.Now.AddHours(-6) && a.Quantity <= x.QtyMaxCount)) && a.WarehouseCode == x.WarehouseCode)); //获取可以取货的码垛信息行 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     //无可用行,进入下一次迭代 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     if (!palletizingRow.Any()) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -213,7 +272,7 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     //跟据缓存信息找到对应的可用取货行 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     var rowList = cacheLines.Select(x => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var b = palletizingRow.Where(w => !rowIds.Contains(w.Id) && x.MatCodeList == w.MatCodeList && x.Quantity == w.QtyMaxCount && w.WarehouseCode == x.WarehouseCode).MinBy(o => o.RowNo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var b = palletizingRow.Where(w => !rowIds.Contains(w.Id) && x.MatCodeList == w.MatCodeList && (x.Quantity == w.QtyMaxCount || (x.AddTime < DateTime.Now.AddHours(-6) && x.Quantity <= w.QtyMaxCount)) && w.WarehouseCode == x.WarehouseCode).MinBy(o => o.RowNo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         if (b != null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             rowIds.Add(b.Id); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -222,7 +281,8 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 CacheLineId = x.Id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 RowId = b.Id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 x.LocationNo, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                b.RowNo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                b.RowNo, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                x.AddTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         return new 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -230,7 +290,8 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             CacheLineId = 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             RowId = 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             x.LocationNo, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            RowNo = 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            RowNo = 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            x.AddTime 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     }).Where(x => x.CacheLineId != 0).OrderBy(x => x.RowNo).Take(2).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -244,12 +305,12 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     foreach (var row in rowList) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         //锁定缓存线 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var cacheLine = db.Queryable<WCS_CacheLine>().UpdLock().Includes(x => x.Locations).Single(x => x.Id == row.CacheLineId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var cacheLine = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.Id == row.CacheLineId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         cacheLine.IsTruss = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         cacheLine.PalletizingRowId = row.RowId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         db.UpdateableRowLock(cacheLine).ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         //解锁原有码垛信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var oldRow = db.Queryable<WCS_PalletizingRow>().UpdLock().First(x => x.CacheLineId == row.CacheLineId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var oldRow = db.Queryable<WCS_PalletizingRow>().First(x => x.CacheLineId == row.CacheLineId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         if (oldRow != null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             oldRow.CacheLineId = 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -258,7 +319,7 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         //锁定现有码垛信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var wcsRow = db.Queryable<WCS_PalletizingRow>().UpdLock().Includes(x => x.Locs).First(x => x.Id == row.RowId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        var wcsRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).First(x => x.Id == row.RowId); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         wcsRow.CacheLineId = row.CacheLineId; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         wcsRow.LineCode = row.LocationNo.ToString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         db.UpdateableRowLock(wcsRow).ExecuteCommand(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -270,13 +331,17 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            if (palletizingRowList == null || !palletizingRowList.Any()) throw new KnownException($"没有可用任务", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (palletizingRowList == null || !palletizingRowList.Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                World.Log($"没有可用任务"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             for (var i = 0; i < palletizingRowList.Count; i++) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var palletizingRow = palletizingRowList[i]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var locs = palletizingRow.Locs.OrderBy(x => x.XYNo.ToInt()).ToArray(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                var devs = pickUpDevices.FirstOrDefault(x => x.key == palletizingRow.LineCode).Dev.Value 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var devs = pickUpDevices.FirstOrDefault(x => x.key == palletizingRow.LineCode).Dev.Value.Where(x => x.Data2.Status.HasFlag(StationStatus.PH_Status)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     .OrderBy(x => x.Entity.Code).ToArray(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 switch (i) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -284,33 +349,33 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     case 0: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         obj.Data.DestPosition_1 = palletizingRow.LineCode!.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         obj.Data.TargetPallte1 = palletizing.PalletizingStation!.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (locs.Length >= 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (devs.Length >= 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Task1_1 = devs[0].Data.TaskNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Dest1_1 = locs[0].XYNo.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (locs.Length >= 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (devs.Length >= 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Task1_2 = devs[1].Data.TaskNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Dest1_2 = locs[1].XYNo.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (locs.Length >= 3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (devs.Length >= 3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Task1_3 = devs[2].Data.TaskNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Dest1_3 = locs[2].XYNo.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (locs.Length >= 4) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (devs.Length >= 4) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Task1_4 = devs[3].Data.TaskNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Dest1_4 = locs[3].XYNo.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (locs.Length == 5) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (devs.Length == 5) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Task1_5 = devs[4].Data.TaskNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Dest1_5 = locs[4].XYNo.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        obj.Data.TaskSum1 = palletizingRow.QtyMaxCount.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        obj.Data.TaskSum1 = devs.Length.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         obj.Data.PalletizingRowId1 = palletizingRow.Id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -318,33 +383,33 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         obj.Data.DestPosition_2 = palletizingRow.LineCode!.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         obj.Data.TargetPallte2 = palletizing.PalletizingStation!.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (locs.Length >= 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (devs.Length >= 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Task2_1 = devs[0].Data.TaskNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Dest2_1 = locs[0].XYNo.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (locs.Length >= 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (devs.Length >= 2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Task2_2 = devs[1].Data.TaskNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Dest2_2 = locs[1].XYNo.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (locs.Length >= 3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (devs.Length >= 3) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Task2_3 = devs[2].Data.TaskNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Dest2_3 = locs[2].XYNo.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (locs.Length >= 4) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (devs.Length >= 4) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Task2_4 = devs[3].Data.TaskNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Dest2_4 = locs[3].XYNo.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (locs.Length == 5) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        if (devs.Length == 5) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Task2_5 = devs[4].Data.TaskNumber; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             obj.Data.Dest2_5 = locs[4].XYNo.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        obj.Data.TaskSum2 = palletizingRow.QtyMaxCount.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        obj.Data.TaskSum2 = devs.Length.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         obj.Data.PalletizingRowId2 = palletizingRow.Id; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 |