|  | @@ -66,6 +66,7 @@ namespace WCS.WorkEngineering.Systems
 | 
	
		
			
				|  |  |              //判断完成任务号是否大于0
 | 
	
		
			
				|  |  |              if (obj.Data2.TaskFinishiId > 0)
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  | +                WCS_TaskInfo taskInfo = null;
 | 
	
		
			
				|  |  |                  var result = SqlSugarHelper.Do(db =>
 | 
	
		
			
				|  |  |                    {
 | 
	
		
			
				|  |  |                        //根据DB521任务号获取对应任务
 | 
	
	
		
			
				|  | @@ -84,6 +85,8 @@ namespace WCS.WorkEngineering.Systems
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                            case TaskType.OutDepot:
 | 
	
		
			
				|  |  |                                task.Status = Entity.TaskStatus.ConveyorExecution;
 | 
	
		
			
				|  |  | +                              var dev = new Station(Device.All.FirstOrDefault(v => v.Code == task.SrmStation), this.World);
 | 
	
		
			
				|  |  | +                              dev.Data.TaskNumber = task.ID;
 | 
	
		
			
				|  |  |                                task.AddWCS_TASK_DTL(db, task.SrmStation, "出库任务到达放货站台");
 | 
	
		
			
				|  |  |                                break;
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -92,12 +95,23 @@ namespace WCS.WorkEngineering.Systems
 | 
	
		
			
				|  |  |                                task.EedTime = DateTime.Now;
 | 
	
		
			
				|  |  |                                task.AddWCS_TASK_DTL(db, task.AddrTo, "移库任务结束");
 | 
	
		
			
				|  |  |                                break;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                          case TaskType.EmptyInit:
 | 
	
		
			
				|  |  | +                              task.Status = Entity.TaskStatus.Finish;
 | 
	
		
			
				|  |  | +                              task.EedTime = DateTime.Now;
 | 
	
		
			
				|  |  | +                              task.AddWCS_TASK_DTL(db, task.AddrTo, "移库任务结束");
 | 
	
		
			
				|  |  | +                              break;
 | 
	
		
			
				|  |  |                        }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                        db.Default.Updateable(task).ExecuteCommand();
 | 
	
		
			
				|  |  | -                      task.CompleteOrCancelTasks(db, World);
 | 
	
		
			
				|  |  | +                      if (task.Status >= TaskStatus.Finish) task.CompleteOrCancelTasks(db);
 | 
	
		
			
				|  |  | +                      if (task.Type == TaskType.OutDepot && task.Status == TaskStatus.ConveyorExecution) WmsApi.SrmPickOutCompleted(task.ID);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +                      taskInfo = task;
 | 
	
		
			
				|  |  |                    });
 | 
	
		
			
				|  |  | -                if (!result) throw new KnownException("数据库提交事务错误", LogLevelEnum.High);
 | 
	
		
			
				|  |  | +                if (!result && taskInfo == null) throw new KnownException("数据库提交事务错误", LogLevelEnum.High);
 | 
	
		
			
				|  |  | +                //通知WMS任务完成
 | 
	
		
			
				|  |  | +                if (taskInfo.Status == TaskStatus.Finish) WmsApi.CompleteTask(taskInfo.ID);
 | 
	
		
			
				|  |  |                  // 写入信号
 | 
	
		
			
				|  |  |                  obj.Data.OkAck = 1;
 | 
	
		
			
				|  |  |              }
 | 
	
	
		
			
				|  | @@ -203,13 +217,15 @@ namespace WCS.WorkEngineering.Systems
 | 
	
		
			
				|  |  |                  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.Data.TaskNumber).Contains(v.ID));
 | 
	
		
			
				|  |  | +                    var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => (v.Type == TaskType.EnterDepot || v.Type == TaskType.EmptyInit)
 | 
	
		
			
				|  |  | +                                                                              && v.Status == TaskStatus.ConveyorExecution
 | 
	
		
			
				|  |  | +                                                                              && arrIn.Select(p => p.Data.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.Data.TaskNumber == task.ID);
 | 
	
		
			
				|  |  |                      //获取当前货物巷道
 | 
	
		
			
				|  |  | -                    var res = WmsApi.GetLocalIn(task.ID, 3, station.Entity.Code);
 | 
	
		
			
				|  |  | +                    var res = WmsApi.GetLocalIn(task.ID, task.Device, station.Entity.Code);
 | 
	
		
			
				|  |  |                      var loc = res.ResData.CellNo.Split("-");
 | 
	
		
			
				|  |  |                      task.Status = TaskStatus.StackerExecution;
 | 
	
		
			
				|  |  |                      task.AddrTo = $"{loc[0]}-{loc[1]}-{loc[2]}";
 | 
	
	
		
			
				|  | @@ -234,48 +250,60 @@ namespace WCS.WorkEngineering.Systems
 | 
	
		
			
				|  |  |              else if (enterOrOut == 3 || !lastIsOut) //出库任务
 | 
	
		
			
				|  |  |              {
 | 
	
		
			
				|  |  |                  //判断本次优先执行楼层,并设置下次执行时优先楼层
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  var floor = obj.Entity.GetFlag<int>("FloorOut");
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  floor = floor % 2 + 1;
 | 
	
		
			
				|  |  |                  obj.Entity.SetFlag("FloorOut", floor);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |                  //获取当前堆垛机所有的取货站台
 | 
	
		
			
				|  |  | -                var arrOut = PickUpDevices.First(v => v.Key == obj.Entity.Code).Value;
 | 
	
		
			
				|  |  | +                var arrOut = PutDevices.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(); //自动
 | 
	
		
			
				|  |  | +                                                && !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);
 | 
	
		
			
				|  |  | +               {
 | 
	
		
			
				|  |  | +                   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();
 | 
	
		
			
				|  |  | +               });
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -                    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();
 | 
	
		
			
				|  |  | -                });
 | 
	
		
			
				|  |  |                  if (taskInfo == null || !result) throw new KnownException("数据更新错误", LogLevelEnum.High);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  obj.Data.TaskNumber = taskInfo.ID;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  obj.Data.SLine = addrFrom[0].ToShort();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  obj.Data.SCol = addrFrom[1].ToShort();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  obj.Data.SLayer = addrFrom[2].ToShort();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |                  obj.Data.ELine = taskInfo.SrmStation.ToShort();
 | 
	
		
			
				|  |  |                  obj.Data.ECol = taskInfo.AddrNext.ToShort();
 | 
	
		
			
				|  |  |                  obj.Data.VoucherNo++;
 | 
	
	
		
			
				|  | @@ -286,7 +314,8 @@ namespace WCS.WorkEngineering.Systems
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          public override bool Select(Device dev)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  | -            return dev.Code.Contains("SRM3");
 | 
	
		
			
				|  |  | +            return dev.Code == "SRM3";
 | 
	
		
			
				|  |  | +            //return dev.HasProtocol(typeof(ISRM520));
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  }
 |