|
@@ -253,129 +253,129 @@ namespace WCS.Service.Works.SRM
|
|
|
floor = floor % 2 + 1;
|
|
|
obj.Entity.Set("LastFloor", floor);
|
|
|
if (enterPriority != null && outPriority != null && enterPriority.Priority > outPriority.Priority) return;
|
|
|
- obj.EXOutStock(obj =>
|
|
|
- {
|
|
|
- //obj.CheckOutTask();
|
|
|
- //获取当前堆垛机所有的放货点
|
|
|
- var list = obj.GetDeliveryPoint();
|
|
|
+ //obj.EXOutStock(obj =>
|
|
|
+ //{
|
|
|
+ //obj.CheckOutTask();
|
|
|
+ //获取当前堆垛机所有的放货点
|
|
|
+ var list = obj.GetDeliveryPoint();
|
|
|
|
|
|
- list = list.Where(v =>
|
|
|
+ list = list.Where(v =>
|
|
|
+ {
|
|
|
+ //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 empties = list.Select(v => v.Entity.CODE).ToArray();
|
|
|
+ //月台所有设备当前有的任务号
|
|
|
+ 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 outDepot = waitTask.Where(v =>
|
|
|
+ {
|
|
|
+ var max = v.ADDRTO == "G1340" ? 4 : 3;
|
|
|
+ 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)
|
|
|
+ .FirstOrDefault();
|
|
|
+
|
|
|
+ if (outDepot == null)
|
|
|
{
|
|
|
- //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 empties = list.Select(v => v.Entity.CODE).ToArray();
|
|
|
- //月台所有设备当前有的任务号
|
|
|
- var taskidList = DockDevs.Select(v => v.Data2.Tasknum).Where(v => v > 10000).ToList();
|
|
|
- //堆垛机设备
|
|
|
- var srm = obj.Entity.CODE;
|
|
|
- DB.Do(db =>
|
|
|
+ Ltc.Log($"{deviceCode}无出库任务可执行");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //获取两个个可执行任务,此时这两个任务的目标地址是一致的
|
|
|
+ var tasks = outDepot.Select(v => v).ToList().GetOutTask();
|
|
|
+
|
|
|
+ //根据任务的目标地址获取对应的设备组
|
|
|
+ var devs = Device.Find($"{tasks.OrderBy(v => v.ADDRTO).FirstOrDefault().ADDRTO}").Create<StationDeviceGroup>().Items.OrderByDescending(v => v.Entity.CODE).ToArray();
|
|
|
+ var dev1 = devs[0];
|
|
|
+ var dev2 = devs[1];
|
|
|
+
|
|
|
+ for (int i = 0; i < tasks.Length; i++)
|
|
|
{
|
|
|
- //堆垛机当前是否有正在执行的任务
|
|
|
- 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 outDepot = waitTask.Where(v =>
|
|
|
- {
|
|
|
- var max = v.ADDRTO == "G1340" ? 4 : 3;
|
|
|
- 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)
|
|
|
- .FirstOrDefault();
|
|
|
-
|
|
|
- if (outDepot == null)
|
|
|
+ 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;
|
|
|
+ switch (tasks.Length)
|
|
|
{
|
|
|
- Ltc.Log($"{deviceCode}无出库任务可执行");
|
|
|
- return;
|
|
|
- }
|
|
|
- //获取两个个可执行任务,此时这两个任务的目标地址是一致的
|
|
|
- var tasks = outDepot.Select(v => v).ToList().GetOutTask();
|
|
|
+ case 1:
|
|
|
+ task.TaskGroupKey = $"{tasks[0].ID}_0";
|
|
|
+ break;
|
|
|
|
|
|
- //根据任务的目标地址获取对应的设备组
|
|
|
- var devs = Device.Find($"{tasks.OrderBy(v => v.ADDRTO).FirstOrDefault().ADDRTO}").Create<StationDeviceGroup>().Items.OrderByDescending(v => v.Entity.CODE).ToArray();
|
|
|
- var dev1 = devs[0];
|
|
|
- var dev2 = devs[1];
|
|
|
-
|
|
|
- for (int i = 0; i < tasks.Length; i++)
|
|
|
+ case 2:
|
|
|
+ task.TaskGroupKey = $"{tasks[0].ID}_{tasks[1].ID}";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ var fork = obj.GetFork(item, i);
|
|
|
+ //获取站台及下一个地址
|
|
|
+ task.GetSrmStationAndaddNext(fork);
|
|
|
+ db.Default.SaveChanges();
|
|
|
+ Uploader.Upload(db);
|
|
|
+ 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 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;
|
|
|
- switch (tasks.Length)
|
|
|
- {
|
|
|
- case 1:
|
|
|
- task.TaskGroupKey = $"{tasks[0].ID}_0";
|
|
|
- break;
|
|
|
-
|
|
|
- case 2:
|
|
|
- task.TaskGroupKey = $"{tasks[0].ID}_{tasks[1].ID}";
|
|
|
- break;
|
|
|
- }
|
|
|
- var fork = obj.GetFork(item, i);
|
|
|
- //获取站台及下一个地址
|
|
|
- task.GetSrmStationAndaddNext(fork);
|
|
|
- db.Default.SaveChanges();
|
|
|
- Uploader.Upload(db);
|
|
|
- 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);
|
|
|
- }
|
|
|
- else if (fork == SrmFork.货叉2) //列数较大的放二工位
|
|
|
- {
|
|
|
- obj.WriteTask2(item);
|
|
|
- }
|
|
|
+ obj.WriteTask1(item);
|
|
|
}
|
|
|
- });
|
|
|
+ else if (fork == SrmFork.货叉2) //列数较大的放二工位
|
|
|
+ {
|
|
|
+ obj.WriteTask2(item);
|
|
|
+ }
|
|
|
+ }
|
|
|
});
|
|
|
+ //});
|
|
|
|
|
|
#endregion 出库
|
|
|
}
|