|
@@ -158,6 +158,7 @@ namespace WCS.Service.Works.SRM
|
|
|
else if (LastIsOut)
|
|
|
{
|
|
|
#region 入库
|
|
|
+
|
|
|
var floor = obj.Entity.Get<int>("LastInFloor");
|
|
|
floor = floor % 2 + 1;
|
|
|
obj.Entity.Set("LastInFloor", floor);
|
|
@@ -257,126 +258,130 @@ namespace WCS.Service.Works.SRM
|
|
|
{
|
|
|
#region 出库
|
|
|
|
|
|
- var floor = obj.Entity.Get<int>("LastOutFloor");
|
|
|
- floor = floor % 2 + 1;
|
|
|
- obj.Entity.Set("LastOutFloor", floor);
|
|
|
- if (enterPriority != null && outPriority != null && enterPriority.Priority > outPriority.Priority) return;
|
|
|
-
|
|
|
- //获取当前堆垛机所有的放货点
|
|
|
- var list = obj.GetDeliveryPoint();
|
|
|
-
|
|
|
- list = list.Where(v =>
|
|
|
+ obj.EXOutStock(obj =>
|
|
|
{
|
|
|
- //true:满足条件 false:不满足条件
|
|
|
- //返回结果为无货的设备 默认无货
|
|
|
- var res = true;
|
|
|
- //放货点是否有货
|
|
|
- if (v.Data.VoucherNo != v.Data2.VoucherNo) res = false;
|
|
|
- else if (v.Data3.Status.HasFlag(StationStatus.运行状态位)) res = false;
|
|
|
- else if (v.Data2.Status.HasFlag(IstationStatus.光电状态)) res = false;
|
|
|
- else if (v.Data2.Request == IstationRequest.堆垛机放货完成请求目标地址) res = false;
|
|
|
- else if (v.Data2.Tasknum > 10000) res = false;
|
|
|
- return res;
|
|
|
- }).ToList();
|
|
|
-
|
|
|
- //没有可用货位
|
|
|
- if (list.Count == 0) return;
|
|
|
-
|
|
|
- //月台所有设备当前有的任务号
|
|
|
- var taskidList = DockDevs.Select(v => v.Data2.Tasknum).Where(v => v > 10000).ToList();
|
|
|
- //堆垛机设备
|
|
|
- var srm = obj.Entity.CODE;
|
|
|
- DB.Do(db =>
|
|
|
- {
|
|
|
- //堆垛机当前是否有正在执行的任务
|
|
|
- if (db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)) throw new WarnException($"[{deviceCode}]有正在执行的出库任务");
|
|
|
-
|
|
|
- //找出等待执行的出库任务
|
|
|
- var waitTask = db.Default.Set<WCS_TASK>().Where(v => v.STATUS == TaskStatus.新建)
|
|
|
- .Where(v => v.DEVICE == srm)
|
|
|
- .Where(v => v.TYPE == TaskType.出库)
|
|
|
- .Where(v => !db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)).ToList();
|
|
|
-
|
|
|
- //同时对结果进行排序,分组
|
|
|
- var maxnum = ProtocolProxy.YGWMS150Redis.Get("SaleTaskGroupCount").ToInt();
|
|
|
- var outDepotList = waitTask.Where(v =>
|
|
|
- {
|
|
|
- var max = v.ADDRTO == "G1340" ? 4 : maxnum;
|
|
|
- return db.Default.Set<WCS_TASK>()
|
|
|
- .AsNoTracking()
|
|
|
- .Where(d => d.TYPE == TaskType.出库)
|
|
|
- .Where(d => d.STATUS > TaskStatus.新建)
|
|
|
- .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
|
|
|
- .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
|
|
|
- .GroupBy(d => d.TaskGroupKey).Count() < max;
|
|
|
- })
|
|
|
- .OrderByDescending(v => v.Priority)
|
|
|
- .ThenBy(v => v.FLOOR == floor ? 0 : 1)
|
|
|
- .ThenBy(v =>
|
|
|
- {
|
|
|
- return db.Default.Set<WCS_TASK>()
|
|
|
- .AsNoTracking()
|
|
|
- .Where(d => d.TYPE == TaskType.出库)
|
|
|
- .Where(d => d.STATUS > TaskStatus.新建)
|
|
|
- .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
|
|
|
- .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
|
|
|
- .GroupBy(d => d.TaskGroupKey).Count();
|
|
|
- })
|
|
|
- .ThenBy(v => v.CREATETIME)
|
|
|
- .GroupBy(v => v.ADDRTO).ToArray();
|
|
|
-
|
|
|
- //获取两个个可执行任务,此时这两个任务的目标地址是一致的
|
|
|
- var tasks = outDepotList.GetSrmValidTaskList(db, obj).GetOutTask();
|
|
|
-
|
|
|
- #region 校验两个产品是否为同规格
|
|
|
-
|
|
|
- if (tasks.Length == 2)
|
|
|
- {
|
|
|
- var length = tasks.OrderByDescending(v => v.Length).ToArray();
|
|
|
- //较大的长度减去较小的长度,差大于两百表示为不同规格产品
|
|
|
- if (length[0].Length - length[1].Length > 200)
|
|
|
- {
|
|
|
- tasks = tasks.Take(1).ToArray();
|
|
|
- }
|
|
|
- }
|
|
|
+ obj.CheckOutTask();
|
|
|
+ var floor = obj.Entity.Get<int>("LastOutFloor");
|
|
|
+ floor = floor % 2 + 1;
|
|
|
+ obj.Entity.Set("LastOutFloor", floor);
|
|
|
+ if (enterPriority != null && outPriority != null && enterPriority.Priority > outPriority.Priority) return;
|
|
|
|
|
|
- #endregion 校验两个产品是否为同规格
|
|
|
+ //获取当前堆垛机所有的放货点
|
|
|
+ var list = obj.GetDeliveryPoint();
|
|
|
|
|
|
- for (int i = 0; i < tasks.Length; i++)
|
|
|
+ list = list.Where(v =>
|
|
|
{
|
|
|
- var item = tasks[i];
|
|
|
- var task = db.Default.Set<WCS_TASK>().Find(item.ID);
|
|
|
- var oldTaskSTATUS = task.STATUS;
|
|
|
- task.STARTTIME = DateTime.Now;
|
|
|
- task.UPDATETIME = DateTime.Now;
|
|
|
- task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
|
|
|
- task.DEVICE = obj.Entity.CODE;
|
|
|
- task.TaskGroupKey = tasks.Length switch
|
|
|
+ //true:满足条件 false:不满足条件
|
|
|
+ //返回结果为无货的设备 默认无货
|
|
|
+ var res = true;
|
|
|
+ //放货点是否有货
|
|
|
+ if (v.Data.VoucherNo != v.Data2.VoucherNo) res = false;
|
|
|
+ else if (v.Data3.Status.HasFlag(StationStatus.运行状态位)) res = false;
|
|
|
+ else if (v.Data2.Status.HasFlag(IstationStatus.光电状态)) res = false;
|
|
|
+ else if (v.Data2.Request == IstationRequest.堆垛机放货完成请求目标地址) res = false;
|
|
|
+ else if (v.Data2.Tasknum > 10000) res = false;
|
|
|
+ return res;
|
|
|
+ }).ToList();
|
|
|
+
|
|
|
+ //没有可用货位
|
|
|
+ if (list.Count == 0) return;
|
|
|
+
|
|
|
+ //月台所有设备当前有的任务号
|
|
|
+ var taskidList = DockDevs.Select(v => v.Data2.Tasknum).Where(v => v > 10000).ToList();
|
|
|
+ //堆垛机设备
|
|
|
+ var srm = obj.Entity.CODE;
|
|
|
+ DB.Do(db =>
|
|
|
+ {
|
|
|
+ //堆垛机当前是否有正在执行的任务
|
|
|
+ if (db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)) throw new WarnException($"[{deviceCode}]有正在执行的出库任务");
|
|
|
+
|
|
|
+ //找出等待执行的出库任务
|
|
|
+ var waitTask = db.Default.Set<WCS_TASK>().Where(v => v.STATUS == TaskStatus.新建)
|
|
|
+ .Where(v => v.DEVICE == srm)
|
|
|
+ .Where(v => v.TYPE == TaskType.出库)
|
|
|
+ .Where(v => !db.Default.Set<WCS_TASK>().Any(d => d.DEVICE == srm && d.STATUS == TaskStatus.堆垛机执行)).ToList();
|
|
|
+
|
|
|
+ //同时对结果进行排序,分组
|
|
|
+ var maxnum = ProtocolProxy.YGWMS150Redis.Get("SaleTaskGroupCount").ToInt();
|
|
|
+ var outDepotList = waitTask.Where(v =>
|
|
|
{
|
|
|
- 1 => $"{tasks[0].ID}_0",
|
|
|
- 2 => $"{tasks[0].ID}_{tasks[1].ID}",
|
|
|
- _ => throw new WarnException($"可用任务数异常{tasks.Length}"),
|
|
|
- };
|
|
|
- var fork = obj.GetFork(item, i);
|
|
|
- //获取站台及下一个地址
|
|
|
- task.GetSrmStationAndaddNext(fork);
|
|
|
- var msg = "";
|
|
|
- if (fork == SrmFork.货叉1)
|
|
|
- msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_1}-{obj.Data.SCol_1}-{obj.Data.SLayer_1}][{obj.Data.ELine_1}][{obj.Data.VoucherNo_1}]";
|
|
|
- else
|
|
|
- msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_2}-{obj.Data.SCol_2}-{obj.Data.SLayer_2}][{obj.Data.ELine_2}][{obj.Data.VoucherNo_2}]";
|
|
|
- task.CreateStatusLog(db, msg, this.GetType());
|
|
|
- item.SRMSTATION = task.SRMSTATION;
|
|
|
- if (fork == SrmFork.货叉1) // 列数较小的放一工位
|
|
|
+ var max = v.ADDRTO == "G1340" ? 4 : maxnum;
|
|
|
+ return db.Default.Set<WCS_TASK>()
|
|
|
+ .AsNoTracking()
|
|
|
+ .Where(d => d.TYPE == TaskType.出库)
|
|
|
+ .Where(d => d.STATUS > TaskStatus.新建)
|
|
|
+ .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
|
|
|
+ .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
|
|
|
+ .GroupBy(d => d.TaskGroupKey).Count() < max;
|
|
|
+ })
|
|
|
+ .OrderByDescending(v => v.Priority)
|
|
|
+ .ThenBy(v => v.FLOOR == floor ? 0 : 1)
|
|
|
+ .ThenBy(v =>
|
|
|
+ {
|
|
|
+ return db.Default.Set<WCS_TASK>()
|
|
|
+ .AsNoTracking()
|
|
|
+ .Where(d => d.TYPE == TaskType.出库)
|
|
|
+ .Where(d => d.STATUS > TaskStatus.新建)
|
|
|
+ .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
|
|
|
+ .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
|
|
|
+ .GroupBy(d => d.TaskGroupKey).Count();
|
|
|
+ })
|
|
|
+ .ThenBy(v => v.CREATETIME)
|
|
|
+ .GroupBy(v => v.ADDRTO).ToArray();
|
|
|
+
|
|
|
+ //获取两个个可执行任务,此时这两个任务的目标地址是一致的
|
|
|
+ var tasks = outDepotList.GetSrmValidTaskList(db, obj).GetOutTask();
|
|
|
+
|
|
|
+ #region 校验两个产品是否为同规格
|
|
|
+
|
|
|
+ if (tasks.Length == 2)
|
|
|
{
|
|
|
- obj.WriteTask1(item, (short)tasks.Length);
|
|
|
+ var length = tasks.OrderByDescending(v => v.Length).ToArray();
|
|
|
+ //较大的长度减去较小的长度,差大于两百表示为不同规格产品
|
|
|
+ if (length[0].Length - length[1].Length > 200)
|
|
|
+ {
|
|
|
+ tasks = tasks.Take(1).ToArray();
|
|
|
+ }
|
|
|
}
|
|
|
- else if (fork == SrmFork.货叉2) //列数较大的放二工位
|
|
|
+
|
|
|
+ #endregion 校验两个产品是否为同规格
|
|
|
+
|
|
|
+ for (int i = 0; i < tasks.Length; i++)
|
|
|
{
|
|
|
- obj.WriteTask2(item, (short)tasks.Length);
|
|
|
+ var item = tasks[i];
|
|
|
+ var task = db.Default.Set<WCS_TASK>().Find(item.ID);
|
|
|
+ var oldTaskSTATUS = task.STATUS;
|
|
|
+ task.STARTTIME = DateTime.Now;
|
|
|
+ task.UPDATETIME = DateTime.Now;
|
|
|
+ task.STATUS = WCS.Entity.TaskStatus.堆垛机执行;
|
|
|
+ task.DEVICE = obj.Entity.CODE;
|
|
|
+ task.TaskGroupKey = tasks.Length switch
|
|
|
+ {
|
|
|
+ 1 => $"{tasks[0].ID}_0",
|
|
|
+ 2 => $"{tasks[0].ID}_{tasks[1].ID}",
|
|
|
+ _ => throw new WarnException($"可用任务数异常{tasks.Length}"),
|
|
|
+ };
|
|
|
+ var fork = obj.GetFork(item, i);
|
|
|
+ //获取站台及下一个地址
|
|
|
+ task.GetSrmStationAndaddNext(fork);
|
|
|
+ var msg = "";
|
|
|
+ if (fork == SrmFork.货叉1)
|
|
|
+ msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_1}-{obj.Data.SCol_1}-{obj.Data.SLayer_1}][{obj.Data.ELine_1}][{obj.Data.VoucherNo_1}]";
|
|
|
+ else
|
|
|
+ msg = $"状态由[{oldTaskSTATUS}]变更为[{task.STATUS}][{obj.Data.SLine_2}-{obj.Data.SCol_2}-{obj.Data.SLayer_2}][{obj.Data.ELine_2}][{obj.Data.VoucherNo_2}]";
|
|
|
+ task.CreateStatusLog(db, msg, this.GetType());
|
|
|
+ item.SRMSTATION = task.SRMSTATION;
|
|
|
+ if (fork == SrmFork.货叉1) // 列数较小的放一工位
|
|
|
+ {
|
|
|
+ obj.WriteTask1(item, (short)tasks.Length);
|
|
|
+ }
|
|
|
+ else if (fork == SrmFork.货叉2) //列数较大的放二工位
|
|
|
+ {
|
|
|
+ obj.WriteTask2(item, (short)tasks.Length);
|
|
|
+ }
|
|
|
+ db.Default.SaveChanges();
|
|
|
}
|
|
|
- db.Default.SaveChanges();
|
|
|
- }
|
|
|
+ });
|
|
|
});
|
|
|
|
|
|
#endregion 出库
|