| 
					
				 | 
			
			
				@@ -1,4 +1,5 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-using ServiceCenter.Extensions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using PlcSiemens.Core.Extension; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ServiceCenter.Extensions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using ServiceCenter.Logs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using ServiceCenter.SqlSugars; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 using System.ComponentModel; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -37,267 +38,234 @@ namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (obj.Entity.HasFlag(DeviceFlags.出库)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //获取所有未结束的叫料及背负式补空AGV任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 SqlSugarHelper.Do(db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    //获取所有未结束的叫料及背负式补空AGV任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var agvTaks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => (v.TaskType == AGVTaskType.CallMaterial || v.TaskType == AGVTaskType.CallForMaterial || v.TaskType == AGVTaskType.ForkliftFilling)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => (v.TaskType == AGVTaskType.CallMaterial || v.TaskType == AGVTaskType.CallForMaterial || v.TaskType == AGVTaskType.ForkliftFilling)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                                          .Where(v => v.Status < AGVTaskStatus.MissionCompleted) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                                         .SplitTable(tabs => tabs.Take(2)).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.ExRecord(obj.Entity.Code, "可用出库AGV任务列表", agvTaks.Select(v => v.ID).ToList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    foreach (var agv in agvTaks) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                                         .SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.AddTime).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //有需要处理的AGV任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (agvTaskInfos.Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.ExRecord(obj.Entity.Code, "可用出库AGV任务列表", agvTaskInfos.Select(v => v.ID).ToList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    foreach (var agv in agvTaskInfos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        //取货点安全交互 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            agv.Status = AGVTaskStatus.Complete2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            taskInfo.AddWCS_TASK_DTL(db, "agv", $"允许AGV任务{agv.ID}在站台{agv.Station}取货"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            AgvApi.ContinueTask(agv.AgvID, agv.Station); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            this.ExRecord(obj.Entity.Code, $"允许AGV任务{agv.ID}在站台{agv.Station}取货"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        //完成任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if (agv.TaskType is AGVTaskType.CallForMaterial or AGVTaskType.ForkliftFilling or AGVTaskType.CallMaterial) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            SqlSugarHelper.Do(db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                //取货点安全交互 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                     var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    if (taskInfo == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        World.Log($"未找到AGV任务{agv.ID}对应WCS任务"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                        continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    //更新AGV任务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    agv.Status = AGVTaskStatus.MissionCompleted; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    agv.Status = AGVTaskStatus.Complete2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                     db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    //更新WCS任务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    taskInfo.Status = Entity.TaskStatus.Finish; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    taskInfo.EedTime = DateTime.Now; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    db.Default.Updateable(taskInfo).ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    taskInfo.AddWCS_TASK_DTL(db, "agv", "任务完成"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    taskInfo.CompleteOrCancelTasks(db); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    this.ExRecord(obj.Entity.Code, $"完成AGV任务{agv.ID}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    taskInfos.Add(taskInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    taskInfo.AddWCS_TASK_DTL(db, "agv", $"允许AGV任务{agv.ID}在站台{agv.Station}取货"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    AgvApi.ContinueTask(agv.AgvID, agv.Station); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                catch (Exception ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                //完成任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    World.Log(ex.Message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (agv.TaskType is AGVTaskType.CallForMaterial or AGVTaskType.ForkliftFilling or AGVTaskType.CallMaterial) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        if (taskInfo == null) throw new Exception($"未找到AGV任务{agv.ID}对应WCS任务"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        //更新AGV任务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        agv.Status = AGVTaskStatus.MissionCompleted; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        //更新WCS任务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        taskInfo.Status = Entity.TaskStatus.Finish; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        taskInfo.EedTime = DateTime.Now; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        db.Default.Updateable(taskInfo).ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        taskInfo.AddWCS_TASK_DTL(db, "agv", "任务完成"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        taskInfo.CompleteOrCancelTasks(db); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        taskInfos.Add(taskInfo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        agv.Status = AGVTaskStatus.MissionCompleted; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                agv.Status = AGVTaskStatus.MissionCompleted; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                this.ExRecord(obj.Entity.Code, $"完成AGV任务{agv.ID}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        else if (agv.AgvStatus == AGVTaskStatus.Cancel && agv.Status != AGVTaskStatus.Cancel) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        catch (Exception ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //if (taskInfo == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //    World.Log($"未找到AGV任务{agv.ID}对应WCS任务"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //try { WmsApi. } catch (Exception ex) { World.Log(ex.Message, LogLevelEnum.Mid); } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            ////更新AGV任务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //agv.Status = AGVTaskStatus.Cancel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            ////更新WCS任务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //taskInfo.Status = Entity.TaskStatus.Cancel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //taskInfo.EedTime = DateTime.Now; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //db.Default.Updateable(taskInfo).ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //taskInfo.AddWCS_TASK_DTL(db, "agv", "任务完成"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //taskInfo.CompleteOrCancelTasks(db); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            World.Log(ex.Message, LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            this.ExRecord(obj.Entity.Code, ex.Message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                foreach (var item in taskInfos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    WmsApi.CompleteTask(item.ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.ExRecord(obj.Entity.Code, $"任务{item}上报WMS完成"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    foreach (var item in taskInfos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        WmsApi.CompleteTask(item.ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             else if (obj.Entity.HasFlag(DeviceFlags.入库)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //获取所有未结束的入库AGV任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 SqlSugarHelper.Do(db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    //获取所有未结束的入库AGV任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    var agvTaks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot).SplitTable(tabs => tabs.Take(2)).ToList().OrderBy(v => v.EditTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    this.ExRecord(obj.Entity.Code, "可用入库AGV任务列表", agvTaks.Select(v => v.ID).ToList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                    foreach (var agv in agvTaks) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot).SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.EditTime).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (agvTaskInfos.Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    this.ExRecord(obj.Entity.Code, "可用入库AGV任务列表", agvTaskInfos.Select(v => v.ID).ToList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    foreach (var agv in agvTaskInfos) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        //找到对应WCS任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (task == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            World.Log($"AGV任务{agv.ID}未找到对应WCS任务", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}未找到对应WCS任务"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        this.ExRecord(obj.Entity.Code, $"找到AGV任务[{agv.ID}]对应的WCS任务[{task.ID}]"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            SqlSugarHelper.Do(db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                //找到对应WCS任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                if (task == null) throw new Exception($"AGV任务{agv.ID}未找到对应WCS任务"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                #region 开始跟据AGV状态做出处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                //巷道分配 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission1 && agv.Status != AGVTaskStatus.Complete1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}开始进行巷道分配"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    //向WMS获取巷道优先级 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    var res = WmsApi.GetTunnelPriorityList(task.ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},WMS返回巷道优先级{res.ResData}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    var tunnelNo = res.ResData.Split(",").Select(v => "SRM" + v).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    //开始获取堆垛机与可用站台信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    SRM srm = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    List<Station> stations = new List<Station>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (task.Floor == 1) //一楼 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        //一楼三个入库口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        stations = devs.Where(v => v.Entity.Code is "1011" or "1013" or "1015").ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        //筛选出可用站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                           .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                           .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        //可用堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      .Select(v => new SRM(v, this.World)) //转换为SRM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    else //二楼 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        //二楼三个入库口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        stations = devs.Where(v => v.Entity.Code is "1021" or "1023" or "1025").ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        //筛选出可用站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                           .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                           .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        //可用堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      .Select(v => new SRM(v, this.World)) //转换为SRM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                      .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        #region 开始跟据AGV状态做出处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (srm == null) throw new Exception($"agv任务{agv.ID}无可用堆垛机"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        //巷道分配 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission1 && agv.Status != AGVTaskStatus.Complete1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}开始进行巷道分配"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //向WMS获取巷道优先级 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var res = WmsApi.GetTunnelPriorityList(task.ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},WMS返回巷道优先级{res.ResData}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var tunnelNo = res.ResData.Split(",").Select(v => "SRM" + v).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    //筛选出堆垛机的放货站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    var nextPos = stations.FirstOrDefault(v => v.Entity.Sources.Where(t => t.IsTunnel()).Select(t => t.Sources).SelectMany(v => v) //获取所有巷道 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                                                               .Where(t => t.HasProtocol(typeof(ISRM520)))//筛选出堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                                                               .SelectMany(v => v.Sources).Any(t => t.Code == srm.Entity.Parent.Code)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},放货站台{nextPos}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //开始获取堆垛机与可用站台信息 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            SRM srm = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            List<Station> stations = new List<Station>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if (task.Floor == 1) //一楼 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                //一楼三个入库口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                stations = devs.Where(v => v.Entity.Code is "1011" or "1013" or "1015").ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                //筛选出可用站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                   .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                   .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                //可用堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                              .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                              .Select(v => new SRM(v, this.World)) //转换为SRM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                              .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                              .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                              .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用堆垛机{srm.Entity.Code}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            else //二楼 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            {    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                //二楼三个入库口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                stations = devs.Where(v => v.Entity.Code is "1021" or "1023" or "1025").ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                //筛选出可用站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                   .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                   .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                //可用堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                              .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                              .Select(v => new SRM(v, this.World)) //转换为SRM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                              .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                              .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                              .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用堆垛机{srm.Entity.Code}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    bool flag = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (((task.BusType == "二楼湿拉线退料回立库" || task.BusType == "二楼湿拉线余料回立库") && task.Floor == 2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        flag = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        nextPos.Entity.Code = "1025"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == nextPos.Entity.Code).SplitTable(v => v.Take(2)).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (agvs.Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        var msg = "已无可用放货站台,任务正在执行中:"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        foreach (var ag in agvs) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            msg = msg + $"[任务号:{ag.ID},目标地址:{ag.Position}]"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        throw new Exception(msg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if (srm == null) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                World.Log($"agv任务{agv.ID}无可用堆垛机", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},无可用堆垛机"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //筛选出堆垛机的放货站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var nextPos = stations.FirstOrDefault(v => v.Entity.Sources.Where(t => t.IsTunnel()).Select(t => t.Sources).SelectMany(v => v) //获取所有巷道 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                                                       .Where(t => t.HasProtocol(typeof(ISRM520)))//筛选出堆垛机 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                                                                       .SelectMany(v => v.Sources).Any(t => t.Code == srm.Entity.Parent.Code)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},放货站台{nextPos}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == nextPos.Entity.Code).SplitTable(v => v.Take(2)).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if (agvs.Any()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                var msg = "已无可用放货站台,任务正在执行中:"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                foreach (var ag in agvs) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                    msg = msg + $"[任务号:{ag.ID},目标地址:{ag.Position}]"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                                        
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    //更新AGV任务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    agv.Status = AGVTaskStatus.Complete1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    agv.Position = flag == true ? "1025" : nextPos.Entity.Code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    //更新WCS任务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (flag) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        srm.Entity.Code = "SRM3"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        task.Device = srm.Entity.Code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        task.Tunnel = "3"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        task.AddrNext = "1025"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        task.Device = srm.Entity.Code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        task.Tunnel = task.Device.GetLastDigit().ToString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        task.AddrNext = agv.Position; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    }                                    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    db.Default.Updateable(task).ExecuteCommand();                                     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    task.AddWCS_TASK_DTL(db, "AGV巷道分配点", nextPos.Entity.Code, $"任务分配至堆垛机:{srm.Entity.Code}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}分配至堆垛机:{srm.Entity.Code}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    //调继续执行任务接口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    AgvApi.ContinueTask(agv.AgvID, nextPos.Entity.Code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                World.Log(msg, LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                //放货站点安全交互 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                else if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (agv.Position.IsNullOrEmpty()) throw new Exception($"无有效放货地址"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    var dev = devs.Find(v => v.Entity.Code == agv.Position); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //更新AGV任务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            agv.Status = AGVTaskStatus.Complete1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            agv.Position = nextPos.Entity.Code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //更新WCS任务状态 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            task.Device = srm.Entity.Code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            task.Tunnel = task.Device.GetLastDigit().ToString(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            task.AddrNext = agv.Position; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            db.Default.Updateable(task).ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            task.AddWCS_TASK_DTL(db, "AGV巷道分配点", nextPos.Entity.Code, $"任务分配至堆垛机:{srm.Entity.Code}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}分配至堆垛机:{srm.Entity.Code}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //调继续执行任务接口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            AgvApi.ContinueTask(agv.AgvID, nextPos.Entity.Code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        //放货站点安全交互 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        else if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            var dev = devs.Find(v => v.Entity.Code == agv.Position); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //var srmNo = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //if (dev.Entity.Code is "1011" or "1021") srmNo = "SRM1"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //else if (dev.Entity.Code is "1013" or "1023") srmNo = "SRM2"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //else if (dev.Entity.Code is "1015" or "1025") srmNo = "SRM3"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //    World.Log($"未找到对应的堆垛机", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //var srm = srms.FirstOrDefault(v => v.Entity.Code == srmNo); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //if (!srm.Data2.Status.HasFlag(SrmStatus.ForkCenter)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //    World.Log($"{srmNo}", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //    continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (dev.Data.VoucherNo != dev.Data2.VoucherNo) throw new Exception($"AGV请求放货,但{dev.Entity.Code}凭证号不一致"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (!dev.Data3.Status.HasFlag(StatusEunm.Auto)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}不在自动状态"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (dev.Data3.Status.HasFlag(StatusEunm.PH_Status)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}光电有货"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (dev.Data3.Status.HasFlag(StatusEunm.OT_Status)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}任务有货"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    if (dev.Data3.Status.HasFlag(StatusEunm.Run)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}在运行状态"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    agv.Status = AGVTaskStatus.Complete2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if (dev.Data.VoucherNo != dev.Data2.VoucherNo) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                World.Log($"AGV请求放货,但{dev.Entity.Code}凭证号不一致", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但凭证号不一致"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if (!dev.Data3.Status.HasFlag(StatusEunm.Auto)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                World.Log($"AGV请求放货,但{dev.Entity.Code}不在自动状态", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但不在自动状态"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if (dev.Data3.Status.HasFlag(StatusEunm.PH_Status)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                World.Log($"AGV请求放货,但{dev.Entity.Code}光电有货", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但光电有货"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if (dev.Data3.Status.HasFlag(StatusEunm.OT_Status)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                World.Log($"AGV请求放货,但{dev.Entity.Code}任务有货", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但任务有货"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            if (dev.Data3.Status.HasFlag(StatusEunm.Run)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                World.Log($"AGV请求放货,但{dev.Entity.Code}在运行状态", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但在运行状态"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            agv.Status = AGVTaskStatus.Complete2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            //调继续执行任务接口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            AgvApi.ContinueTask(agv.AgvID, dev.Entity.Code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,允许放货"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            dev.Data.TaskNumber = task.ID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    //调继续执行任务接口 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    AgvApi.ContinueTask(agv.AgvID, dev.Entity.Code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    dev.Data.TaskNumber = task.ID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                //完成任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    agv.Status = AGVTaskStatus.MissionCompleted; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                #endregion 开始跟据AGV状态做出处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        //完成任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        catch (Exception ex) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            agv.Status = AGVTaskStatus.MissionCompleted; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            db.Default.Updateable(agv).SplitTable().ExecuteCommand(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}完成"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            World.Log(ex.Message, LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            this.ExRecord(obj.Entity.Code, ex.Message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                            continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                        #endregion 开始跟据AGV状态做出处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |