|
@@ -11,6 +11,7 @@ using WCS.WorkEngineering.Protocol.Station;
|
|
|
using WCS.WorkEngineering.WebApi.Controllers;
|
|
|
using WCS.WorkEngineering.WebApi.Models.AGV.Response;
|
|
|
using WCS.WorkEngineering.Worlds;
|
|
|
+using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
|
|
|
using KnownException = ServiceCenter.Logs.KnownException;
|
|
|
using TaskStatus = WCS.Entity.TaskStatus;
|
|
|
|
|
@@ -35,6 +36,19 @@ namespace WCS.WorkEngineering.Systems
|
|
|
|
|
|
public SrmSystems()
|
|
|
{
|
|
|
+ //获取所有的巷道集合
|
|
|
+ var devices = Device.All.Where(v => v.HasFlag(DeviceFlags.巷道));
|
|
|
+
|
|
|
+ //开始分配
|
|
|
+ foreach (var item in devices)
|
|
|
+ {
|
|
|
+ //取货设备
|
|
|
+ var srm = item.Targets.Where(v => v.HasFlag(DeviceFlags.堆垛机)).FirstOrDefault();
|
|
|
+ PickUpDevices.Add(srm.Code, item.Targets.Where(v => v.HasFlag(DeviceFlags.输送机)).Select(v => new Station(v, this.World)).ToList());
|
|
|
+ //放货设备
|
|
|
+ srm = item.Sources.Where(v => v.HasFlag(DeviceFlags.堆垛机)).FirstOrDefault();
|
|
|
+ PutDevices.Add(srm.Code, item.Sources.Where(v => v.HasFlag(DeviceFlags.输送机)).Select(v => new Station(v, this.World)).ToList());
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
protected override bool ParallelDo => true;
|
|
@@ -218,12 +232,7 @@ namespace WCS.WorkEngineering.Systems
|
|
|
|
|
|
//入库任务优先 或 上一个周期是出库任务并且出库任务无优先
|
|
|
if (enterOrOut == 2 || (lastIsOut && enterOrOut == 1)) //入库任务
|
|
|
- {
|
|
|
- //判断本次优先执行楼层,并设置下次执行时优先楼层
|
|
|
- var floor = obj.Entity.GetFlag<int>("FloorIn");
|
|
|
- floor = floor % 2 + 1;
|
|
|
- obj.Entity.SetFlag("FloorIn", floor);
|
|
|
-
|
|
|
+ {
|
|
|
//获取当前堆垛机所有的取货站台
|
|
|
var arrIn = PickUpDevices.First(v => v.Key == obj.Entity.Code).Value;
|
|
|
if (!arrIn.Any()) throw new KnownException($"堆垛机{obj.Entity.Code}无取货路径点", LogLevelEnum.High);
|
|
@@ -231,19 +240,21 @@ namespace WCS.WorkEngineering.Systems
|
|
|
//获取有货的设备
|
|
|
arrIn = arrIn.Where(v => v.Data.TaskNumber > 0 && v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.Run)).ToList();
|
|
|
if (!arrIn.Any()) throw new KnownException($"[{obj.Entity.Code}]等待入库任务输送到位", LogLevelEnum.Mid);
|
|
|
+
|
|
|
WCS_TaskInfo taskInfo = null;
|
|
|
Station station = null;
|
|
|
SqlSugarHelper.Do(db =>
|
|
|
{
|
|
|
//根据有货设备的任务号获取所有类型为入库状态为输送机执行中的任务
|
|
|
- var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => (v.Type == TaskType.EnterDepot || v.Type == TaskType.EmptyInit)
|
|
|
+ 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));
|
|
|
//按条件先后排序获取一条排序后第一条结果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);
|
|
|
+ var task = tasks.OrderByDescending(v => v.Priority)
|
|
|
+ .OrderBy(v => v.AddrNext == "TY" + obj.Data2.Res4 ? 0 : 1).First() ?? throw new KnownException($"{obj.Entity.Code}未找到入库任务", LogLevelEnum.High);
|
|
|
|
|
|
- //获取任务所有设备
|
|
|
- station = arrIn.First(v => v.Data.TaskNumber == task.ID);
|
|
|
+ //获取任务所有设备
|
|
|
+ station = arrIn.First(v => v.Data2.TaskNumber == task.ID);
|
|
|
//获取当前货物巷道
|
|
|
var res = WmsApi.GetLocalIn(task.ID, task.Device, station.Entity.Code);
|
|
|
var loc = res.ResData.CellNo.Split("-");
|
|
@@ -275,13 +286,9 @@ 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 = PutDevices.First(v => v.Key == obj.Entity.Code).Value;
|
|
|
|
|
|
if (!arrOut.Any()) throw new KnownException($"堆垛机{obj.Entity.Code}无放货路径点", LogLevelEnum.High);
|
|
@@ -305,12 +312,11 @@ namespace WCS.WorkEngineering.Systems
|
|
|
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)
|
|
|
.OrderBy(v => v.AddTime)
|
|
|
.First();
|
|
|
if (task == null) throw new KnownException($"{obj.Entity.Code}未找到出库任务", LogLevelEnum.High);
|
|
|
- var taskId = task.ID;
|
|
|
-
|
|
|
+ var taskId = task.ID;
|
|
|
+
|
|
|
//判断是否是二深位任务
|
|
|
var addrFrom = task.AddrFrom.Split("-");
|
|
|
if (addrFrom[4] == "02")
|