| 
					
				 | 
			
			
				@@ -0,0 +1,290 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ServiceCenter; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ServiceCenter.Extensions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using ServiceCenter.SqlSugars; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.ComponentModel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using WCS.Core; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using WCS.Entity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using WCS.Entity.Protocol.SRM; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using WCS.Entity.Protocol.Station; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using WCS.WorkEngineering.Extensions; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using WCS.WorkEngineering.WebApi.Controllers; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using WCS.WorkEngineering.Worlds; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using WCS.WorkEngineering.Worlds.Logs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using KnownException = WCS.WorkEngineering.Worlds.Logs.KnownException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using TaskStatus = WCS.Entity.TaskStatus; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace WCS.WorkEngineering.Systems 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// 堆垛机系统 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    [BelongTo(typeof(MainWorld))] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    [Description("堆垛机系统")] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public class SrmSystems : DeviceSystem<SRM> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 取货点设备集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private Dictionary<string, List<Station>> PickUpDevices = new Dictionary<string, List<Station>>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// <summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// 放货设备 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        /// </summary> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        private Dictionary<string, List<Station>> PutDevices = new Dictionary<string, List<Station>>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public SrmSystems() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //获取所有的巷道集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var devices = ServiceHub.deviceInfos.Where(x => x.IsTunnel()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //开始分配 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            foreach (var item in devices) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //取货设备 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var deviceCode = item.FormerRoutes.Select(v => v.DeviceCode).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                PickUpDevices.Add(item.NextRoutes.First().DeviceCode, World.Devices.Where(v => deviceCode.Contains(v.Code)).Select(v => new Station(v)).ToList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //放货设备 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                deviceCode = ServiceHub.deviceInfos.First(x => item.NextRoutes.First().DeviceCode == x.Code).NextRoutes.Select(v => v.NextCode).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                PutDevices.Add(item.NextRoutes.First().DeviceCode, World.Devices.Where(v => deviceCode.Contains(v.Code)).Select(v => new Station(v)).ToList()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        protected override bool ParallelDo => true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        protected override bool SaveLogsToFile => true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public override void Do(SRM obj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //判断堆垛机是否报警 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (obj.Data2.Status.HasFlag(SrmStatus.Alarm)) throw new KnownException(obj.Data3.Alarm.ToString(), LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //判断DB520 完成任务确认清除信号 是否为1 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (obj.Data.OkAck == 1) throw new KnownException("任务完成确认信号未清除", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //判断完成任务号是否大于0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (obj.Data2.TaskFinishiId > 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var result = SqlSugarHelper.Do(db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      //根据DB521任务号获取对应任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskFinishiId) ?? throw new KnownException($"未找到任务{obj.Data2.TaskFinishiId}", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      if (task.Status != Entity.TaskStatus.StackerExecution) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          throw new KnownException($"任务{task.ID}状态是{task.Status.Description()}.堆垛机完成任务需要对应任务状态处于堆垛机执行中", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      //根据任务类型做不同的处理 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      switch (task.Type) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          case TaskType.EnterDepot: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              //完成任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              task.Status = Entity.TaskStatus.Finish; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              task.EedTime = DateTime.Now; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              task.AddWCS_TASK_DTL(db, task.AddrTo, "入库任务结束"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          case TaskType.OutDepot: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              task.Status = Entity.TaskStatus.ConveyorExecution; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              task.AddWCS_TASK_DTL(db, task.SrmStation, "出库任务到达放货站台"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          case TaskType.TransferDepot: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              task.Status = Entity.TaskStatus.Finish; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              task.EedTime = DateTime.Now; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              task.AddWCS_TASK_DTL(db, task.AddrTo, "移库任务结束"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      db.Default.Updateable(task).AddQueue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      task.CompleteOrCancelTasks(db, World); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      db.Default.SaveQueues(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                  }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!result) throw new KnownException("数据库提交事务错误", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 写入信号 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.OkAck = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //堆垛机是否可以下发任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (obj.Data2.VoucherNo != obj.Data.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo},DB521:{obj.Data2.VoucherNo}", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (obj.Data2.AutoStatus != SrmAutoStatus.Automatic) throw new KnownException($"堆垛机处于{obj.Data2.AutoStatus}模式", LogLevelEnum.Low); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (obj.Data2.RunStatus != SrmRunStatus.Idle) throw new KnownException($"堆垛机处于{obj.Data2.RunStatus}状态", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //默认没有移库任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            bool isTransfer = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //出入库优先级任务 1:无优先 2:入库 3:出库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            int enterOrOut = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //再检查是否有等待执行的货物 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            SqlSugarHelper.Do(db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //获取当前堆垛机的所有未完成任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Status < Entity.TaskStatus.Finish && (v.Device == obj.Entity.Code)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //任务集合是否有处于堆垛机执行状态的任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (tasks.Any(v => v.Status == Entity.TaskStatus.StackerExecution)) throw new KnownException($"有任务处于堆垛机执行状态", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //判断是否存在调整优先级任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!tasks.Any(v => v.Type != TaskType.TransferDepot && v.Status < Entity.TaskStatus.StackerExecution && v.Priority > 0)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //不存在调整优先级任务,判断是否存在移库任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    isTransfer = tasks.Any(v => v.Type == TaskType.TransferDepot && v.Status == Entity.TaskStatus.NewBuild); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                else //存在调整优先级任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //获取出库任务中新建状态最大优先级 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var outPriorityNewBuild = tasks.Where(v => v.Type == TaskType.OutDepot && v.Status == Entity.TaskStatus.NewBuild).Max(v => v.Priority); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //获取入库任务中最大优先级 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var enterPriority = tasks.Where(v => v.Type == TaskType.EnterDepot && v.Status < Entity.TaskStatus.StackerExecution).Max(v => v.Priority); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //出入库最大优先级相加大于零 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    if (outPriorityNewBuild + enterPriority > 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        //出入库优先级任务 1:无优先 2:入库 3:出库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        enterOrOut = enterPriority > outPriorityNewBuild ? 2 : 3; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            #region 移库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (isTransfer) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                WCS_TaskInfo taskInfo = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var result = SqlSugarHelper.Do(db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       //获取一条当前堆垛机优先级最高的新建移库任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Device == obj.Entity.Code && v.Type == TaskType.TransferDepot && v.Status == Entity.TaskStatus.NewBuild) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                                      .OrderByDescending(v => v.Priority) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                                      .First() ?? throw new KnownException("未找到移库任务", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       //任务状态改为堆垛机执行中 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       task.Status = Entity.TaskStatus.StackerExecution; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       task.StartTime = DateTime.Now; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       task.AddWCS_TASK_DTL(db, task.AddrFrom, task.Device, $"堆垛机{obj.Entity.Code}开始执行任务"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       db.Default.Updateable(task).AddQueue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       db.Default.SaveQueues(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                       taskInfo = task; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (taskInfo == null || !result) throw new KnownException("数据更新错误", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var addrFrom = taskInfo.AddrFrom.Split("-"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var addrTo = taskInfo.AddrTo.Split("-"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //下发任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.TaskNumber = taskInfo.ID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.RowPos1 = addrFrom[0].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.TravelPos1 = addrFrom[1].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.LiftPos1 = addrFrom[2].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.RowPos2 = addrTo[0].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.TravelPos2 = addrTo[1].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.LiftPos2 = addrTo[2].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.VoucherNo++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            #endregion 移库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            #region 出入库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //上一个周期是不是出库任务 第一次获取返回结果会是false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var lastIsOut = obj.Entity.Get<bool>("LastIsOut"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            obj.Entity.Set("LastIsOut", !lastIsOut); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            //入库任务优先 或 上一个周期是出库任务并且出库任务无优先 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (enterOrOut == 2 || (lastIsOut && enterOrOut == 1)) //入库任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //判断本次优先执行楼层,并设置下次执行时优先楼层 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var floor = obj.Entity.Get<int>("FloorIn"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                floor = floor % 2 + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Entity.Set("FloorIn", floor); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //获取当前堆垛机所有的取货站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var arrIn = PickUpDevices.First(v => v.Key == obj.Entity.Code).Value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!arrIn.Any()) throw new KnownException($"堆垛机{obj.Entity.Code}无取货路径点", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //获取有货的设备 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                arrIn = arrIn.Where(v => v.Data2.TaskNumber > 0 && v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!arrIn.Any()) throw new KnownException($"[{obj.Entity.Code}]等待入库任务输送到位", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                WCS_TaskInfo taskInfo = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Station station = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var result = SqlSugarHelper.Do(db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //根据有货设备的任务号获取所有类型为入库状态为输送机执行中的任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Type == TaskType.EnterDepot && v.Status == TaskStatus.ConveyorExecution && arrIn.Select(p => p.Data2.TaskNumber).Contains(v.ID)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //按条件先后排序获取一条排序后第一条结果1.优先级2.所在楼层与本次优先执行楼层 TODO:待验证排序结果 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var task = tasks.OrderByDescending(v => v.Priority).OrderByDescending(v => v.Floor == floor ? 1 : 0).First() ?? throw new KnownException($"{obj.Entity.Code}未找到入库任务", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //获取任务所有设备 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    station = arrIn.First(v => v.Data2.TaskNumber == task.ID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //获取当前货物巷道 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var loc = WmsApi.GetLocalIn(task.ID, task.Tunnel, station.Entity.Code); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    task.Status = TaskStatus.StackerExecution; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    task.AddrTo = $"{loc.Row}-{loc.Colomn}-{loc.Layer}"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    task.LastInteractionPoint = station.Entity.Code; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    task.EditWho = "WCS"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    task.AddWCS_TASK_DTL(db, station.Entity.Code, task.AddrTo, "任务下发堆垛机执行"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    db.Default.Updateable(task).AddQueue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    db.Default.SaveQueues(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (taskInfo == null || !result) throw new KnownException("数据更新错误", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var addrTo = taskInfo.AddrTo.Split("-"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //下发任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.TaskNumber = taskInfo.ID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.RowPos1 = station.Entity.Code.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.RowPos2 = addrTo[0].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.TravelPos2 = addrTo[1].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.LiftPos2 = addrTo[2].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.VoucherNo++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            else if (enterOrOut == 3 || !lastIsOut) //出库任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //判断本次优先执行楼层,并设置下次执行时优先楼层 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var floor = obj.Entity.Get<int>("FloorOut"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                floor = floor % 2 + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Entity.Set("FloorOut", floor); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //获取当前堆垛机所有的取货站台 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var arrOut = PickUpDevices.First(v => v.Key == obj.Entity.Code).Value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!arrOut.Any()) throw new KnownException($"堆垛机{obj.Entity.Code}无放货路径点", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                //获取可以放货的设备集合 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                arrOut = arrOut.Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) //无光电 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        && !v.Data3.Status.HasFlag(StatusEunm.Run) //未运行 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        && !v.Data3.Status.HasFlag(StatusEunm.OT_Status) //无任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        && !v.Data3.Status.HasFlag(StatusEunm.UnassignedTask) //未分配任务 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                        && v.Data3.Status.HasFlag(StatusEunm.Auto)).ToList(); //自动 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                if (!arrOut.Any()) throw new KnownException($"[{obj.Entity.Code}]等待出库任务输送到位", LogLevelEnum.Mid); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                WCS_TaskInfo taskInfo = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                string[] addrFrom = null; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var result = SqlSugarHelper.Do(db => 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var allOutCode = arrOut.Select(v => v.Entity.Code).ToList(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    //按条件先后排序获取一条排序后第一条结果1.优先级2.所在楼层与本次优先执行楼层 TODO:待验证排序结果 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Type == TaskType.OutDepot && v.Status == TaskStatus.WaitingToExecute) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                                   .Where(v => allOutCode.Contains(v.SrmStation)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                                   .OrderByDescending(v => v.Priority) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                                   .OrderByDescending(v => v.Floor == floor ? 1 : 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                                                   .First() ?? throw new KnownException($"{obj.Entity.Code}未找到出库任务", LogLevelEnum.High); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    addrFrom = task.AddrFrom.Split("-"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    task.Status = TaskStatus.StackerExecution; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    task.LastInteractionPoint = task.Device; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    task.EditWho = "WCS"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    task.AddWCS_TASK_DTL(db, task.Device, task.SrmStation, "任务下发堆垛机执行"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    db.Default.Updateable(task).AddQueue(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    taskInfo = task; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    db.Default.SaveQueues(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.TaskNumber = taskInfo.ID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.RowPos1 = addrFrom[0].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.TravelPos1 = addrFrom[1].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.LiftPos1 = addrFrom[2].ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.RowPos2 = taskInfo.SrmStation.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.TravelPos2 = taskInfo.AddrNext.ToShort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                obj.Data.VoucherNo++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            #endregion 出入库 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public override bool Select(Device dev) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return dev.Code.Contains("SRM"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |