|
|
@@ -10,6 +10,7 @@ using WCS.Entity;
|
|
|
using WCS.Entity.Protocol.Station;
|
|
|
using WCS.WorkEngineering.Extensions;
|
|
|
using WCS.WorkEngineering.WebApi.Controllers;
|
|
|
+using WCS.WorkEngineering.WebApi.Models.WMS.Request;
|
|
|
using WCS.WorkEngineering.Worlds;
|
|
|
using TaskStatus = WCS.Entity.TaskStatus;
|
|
|
|
|
|
@@ -158,7 +159,19 @@ namespace WCS.WorkEngineering.Systems
|
|
|
tasknew.AddWCS_TASK_DTL(db.Default, "agv", "任务下发agv执行");
|
|
|
}
|
|
|
}
|
|
|
- else
|
|
|
+ else if (agv.WorkShop == 222)//退料重绕
|
|
|
+ {
|
|
|
+ AgvApi.退料重绕(agv.Position, agv.ID.ToString(), agv.Station);
|
|
|
+ var tasknew = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.ID == agv.TaskId).First();
|
|
|
+ if (tasknew != null)
|
|
|
+ {
|
|
|
+ tasknew.Status = TaskStatus.AGVExecution;
|
|
|
+ tasknew.EditTime = DateTime.Now;
|
|
|
+ db.Default.UpdateableRowLock(tasknew).UpdateColumns(x => new { x.Status, x.EditTime }).ExecuteCommand();
|
|
|
+ tasknew.AddWCS_TASK_DTL(db.Default, "agv", "任务下发agv执行");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (agv.WorkShop != 111)
|
|
|
{
|
|
|
AgvApi.托盘回库(agv.Position, agv.ID.ToString(), agv.Station);
|
|
|
}
|
|
|
@@ -169,142 +182,236 @@ namespace WCS.WorkEngineering.Systems
|
|
|
{
|
|
|
var task = db.Default.Queryable<WCS_TaskOld>().NoLock().Where(x => x.Id == agv.TaskId).SplitTable(x => x.Take(2)).First();
|
|
|
if (task == null) throw new Exception($"未找到对应的WCS任务{agv.TaskId}");
|
|
|
-
|
|
|
- //获取当前任务可以去的目标地址
|
|
|
- var positionList = new List<string>(); //当前分配点对应的放货点
|
|
|
- var allPositionList = new List<string>(); //同库区另一侧的放货点
|
|
|
- var nearPositionList = new List<string>(); //所有的放货点
|
|
|
-
|
|
|
- GetPositionList(positionList, nearPositionList, allPositionList, task.WarehouseCode);
|
|
|
-
|
|
|
- List<WCS_AgvTaskInfo> agvs = new List<WCS_AgvTaskInfo>(); //当前分配点对应的放货点已用点
|
|
|
- List<WCS_AgvTaskInfo> agvsNear = new List<WCS_AgvTaskInfo>(); //同库区另一侧的放货点已用点
|
|
|
- List<WCS_AgvTaskInfo> agvsAll = new List<WCS_AgvTaskInfo>(); //所有的放货点已用点
|
|
|
-
|
|
|
- agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && positionList.Contains(v.Station))
|
|
|
- .SplitTable(v => v.Take(2)).ToList();
|
|
|
- agvsAll = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && allPositionList.Contains(v.Station))
|
|
|
- .SplitTable(v => v.Take(2)).ToList();
|
|
|
- agvsNear = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && nearPositionList.Contains(v.Station))
|
|
|
- .SplitTable(v => v.Take(2)).ToList();
|
|
|
- //获取放货点
|
|
|
- var agvPositionLists = agvs.Select(x => x.Station).Distinct();
|
|
|
- var agvPositionListsNear = agvsNear.Select(x => x.Station).Distinct();
|
|
|
- var agvPositionListsAll = agvsAll.Select(x => x.Station).Distinct();
|
|
|
- //获取各区域可用点
|
|
|
- var endDev = positionList.Where(x => !agvPositionLists.Contains(x)).ToList();
|
|
|
- var endNearDev = nearPositionList.Where(x => !agvPositionListsNear.Contains(x)).ToList();
|
|
|
- var endAllDev = allPositionList.Where(x => !agvPositionListsAll.Contains(x)).ToList();
|
|
|
-
|
|
|
- World.Log($"agv可用巷道信息:{JsonConvert.SerializeObject(endDev)}");
|
|
|
- World.Log($"agv可用巷道信息(所有):{JsonConvert.SerializeObject(endAllDev)}");
|
|
|
-
|
|
|
- if (!endDev.Any() && !endAllDev.Any() && !endNearDev.Any())//没有可用放货站台
|
|
|
+ if (task.BusType == TaskBusType.帘线退料重绕.GetDescription())
|
|
|
{
|
|
|
- var msg = "已无可用放货站台,任务正在执行中:";
|
|
|
- foreach (var ag in agvs)
|
|
|
+ //首先判断退料输送线是否可放货
|
|
|
+ var ph_9001 = new Device<IStation523>(Device.All.First(x => x.Code == "9001"), World);
|
|
|
+ var ph_9101 = new Device<IStation523>(Device.All.First(x => x.Code == "9101"), World);
|
|
|
+ var flag1 = !db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station == "9001")
|
|
|
+ .SplitTable(v => v.Take(2)).Any() && !ph_9001.Data.Status.HasFlag(StationStatus.PH_Status);
|
|
|
+ var flag2 = !db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station == "9101")
|
|
|
+ .SplitTable(v => v.Take(2)).Any() && !ph_9101.Data.Status.HasFlag(StationStatus.PH_Status);
|
|
|
+ if (flag2)
|
|
|
{
|
|
|
- msg += $"[任务号:{ag.ID},目标地址:{ag.Station}]";
|
|
|
+ agv.Status = AGVTaskStatus.Complete1;
|
|
|
+ agv.Station = "9101";
|
|
|
+ db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
|
|
|
+ task.AddrTo = agv.Station;
|
|
|
+ db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo }).ExecuteCommand();
|
|
|
+ task.AddWCS_TASK_DTL(db.Default, "帘线退料重绕分配目标放货点", agv.Station, $"任务分配至:{agv.Station}");
|
|
|
+ AgvApi.ContinueTask(agv.AgvID, agv.Station);
|
|
|
+ return;
|
|
|
}
|
|
|
- throw new Exception(msg);
|
|
|
- }
|
|
|
-
|
|
|
- //获取没有光电信息的设备集合
|
|
|
- try
|
|
|
- {
|
|
|
- // 获取可用站台
|
|
|
- var devs = Device.All.Where(x => endDev.Contains(x.Code)).Select(x =>
|
|
|
- new Device<IStation520, IStation521, IStation523>(x, World));
|
|
|
- devs = devs.Where(x =>
|
|
|
- !x.Data3.Status.HasFlag(StationStatus.Run) &&
|
|
|
- !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
|
|
|
- x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
|
|
|
+ else if (flag1)
|
|
|
+ {
|
|
|
+ agv.Status = AGVTaskStatus.Complete1;
|
|
|
+ agv.Station = "9001";
|
|
|
+ db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
|
|
|
+ task.AddrTo = agv.Station;
|
|
|
+ db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo }).ExecuteCommand();
|
|
|
+ task.AddWCS_TASK_DTL(db.Default, "帘线退料重绕分配目标放货点", agv.Station, $"任务分配至:{agv.Station}");
|
|
|
+ AgvApi.ContinueTask(agv.AgvID, agv.Station);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ else//请求WMS分配可用放货点
|
|
|
+ {
|
|
|
+ List<string> allDevs = new List<string> {"9201","9202","9203", "9204", "9205", "9206", "9207", "9208", "9209" };
|
|
|
|
|
|
- var devsNear = Device.All.Where(x => endNearDev.Contains(x.Code)).Select(x =>
|
|
|
- new Device<IStation520, IStation521, IStation523>(x, World));
|
|
|
- devsNear = devsNear.Where(x =>
|
|
|
- !x.Data3.Status.HasFlag(StationStatus.Run) &&
|
|
|
- !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
|
|
|
- x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
|
|
|
+ var agvStas = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && allDevs.Contains(v.Station))
|
|
|
+ .SplitTable(v => v.Take(2)).ToList();
|
|
|
+ var agvStaLists = agvStas.Select(x => x.Station).Distinct();
|
|
|
+ var devs = allDevs.Where(x => !agvStaLists.Contains(x)).ToList();
|
|
|
+ var devsPut = Device.All.Where(x => devs.Contains(x.Code)).Select(x =>
|
|
|
+ new Device<IStation520, IStation521, IStation523>(x, World));
|
|
|
+ devsPut = devsPut.Where(x =>
|
|
|
+ !x.Data3.Status.HasFlag(StationStatus.Run) &&
|
|
|
+ !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
|
|
|
+ x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
|
|
|
|
|
|
- var devsAll = Device.All.Where(x => endAllDev.Contains(x.Code)).Select(x =>
|
|
|
- new Device<IStation520, IStation521, IStation523>(x, World));
|
|
|
- devsAll = devsAll.Where(x =>
|
|
|
- !x.Data3.Status.HasFlag(StationStatus.Run) &&
|
|
|
- !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
|
|
|
- x.Data3.Status.HasFlag(StationStatus.Auto)).OrderBy(v => allPositionList.Contains(v.Entity.Code)).ToList();
|
|
|
- if (!devs.Any()) //自身所属位置无可用放货点
|
|
|
- {
|
|
|
- if (devsNear.Any())//先判断同库一侧
|
|
|
+ if (devsPut.Any())
|
|
|
{
|
|
|
- foreach (var dev in devsNear)
|
|
|
+ foreach (var dev in devsPut)
|
|
|
{
|
|
|
if (!dev.Data3.Status.HasFlag(StationStatus.Run) && !dev.Data3.Status.HasFlag(StationStatus.PH_Status) && dev.Data3.Status.HasFlag(StationStatus.Auto))
|
|
|
{
|
|
|
- World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devsAll.Select(x => x.Entity.Code).ToList())}");
|
|
|
+
|
|
|
agv.Status = AGVTaskStatus.Complete1;
|
|
|
agv.Station = dev.Entity.Code;
|
|
|
db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
|
|
|
- World.Log($"任务执行过程:完成agv任务更新{agv.ID}--{agv.Station}");
|
|
|
- task.AddWCS_TASK_DTL(db.Default, "皮盘返库任务分配巷道", agv.Station, $"任务分配至:{agv.Station}");
|
|
|
- World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
|
|
|
- AgvApi.ContinueTask(agv.AgvID, agv.Station);
|
|
|
- World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
|
|
|
+ task.AddrTo = agv.Station;
|
|
|
+ db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo }).ExecuteCommand();
|
|
|
+ task.AddWCS_TASK_DTL(db.Default, "帘线退料重绕分配目标放货点", agv.Station, $"任务分配至:{agv.Station}");
|
|
|
+ AgvApi.ContinueTask(agv.AgvID, agv.Station);
|
|
|
return;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
}
|
|
|
- else if (devsAll.Any())
|
|
|
+ else
|
|
|
+ {
|
|
|
+ throw new Exception("已无可用放货站台,请等待");
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ //获取当前任务可以去的目标地址
|
|
|
+ var positionList = new List<string>(); //当前分配点对应的放货点
|
|
|
+ var allPositionList = new List<string>(); //同库区另一侧的放货点
|
|
|
+ var nearPositionList = new List<string>(); //所有的放货点
|
|
|
+
|
|
|
+ GetPositionList(positionList, nearPositionList, allPositionList, task.WarehouseCode);
|
|
|
+
|
|
|
+ List<WCS_AgvTaskInfo> agvs = new List<WCS_AgvTaskInfo>(); //当前分配点对应的放货点已用点
|
|
|
+ List<WCS_AgvTaskInfo> agvsNear = new List<WCS_AgvTaskInfo>(); //同库区另一侧的放货点已用点
|
|
|
+ List<WCS_AgvTaskInfo> agvsAll = new List<WCS_AgvTaskInfo>(); //所有的放货点已用点
|
|
|
+
|
|
|
+ agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && positionList.Contains(v.Station))
|
|
|
+ .SplitTable(v => v.Take(2)).ToList();
|
|
|
+ agvsAll = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && allPositionList.Contains(v.Station))
|
|
|
+ .SplitTable(v => v.Take(2)).ToList();
|
|
|
+ agvsNear = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && nearPositionList.Contains(v.Station))
|
|
|
+ .SplitTable(v => v.Take(2)).ToList();
|
|
|
+ //获取放货点
|
|
|
+ var agvPositionLists = agvs.Select(x => x.Station).Distinct();
|
|
|
+ var agvPositionListsNear = agvsNear.Select(x => x.Station).Distinct();
|
|
|
+ var agvPositionListsAll = agvsAll.Select(x => x.Station).Distinct();
|
|
|
+ //获取各区域可用点
|
|
|
+ var endDev = positionList.Where(x => !agvPositionLists.Contains(x)).ToList();
|
|
|
+ var endNearDev = nearPositionList.Where(x => !agvPositionListsNear.Contains(x)).ToList();
|
|
|
+ var endAllDev = allPositionList.Where(x => !agvPositionListsAll.Contains(x)).ToList();
|
|
|
+
|
|
|
+ World.Log($"agv可用巷道信息:{JsonConvert.SerializeObject(endDev)}");
|
|
|
+ World.Log($"agv可用巷道信息(所有):{JsonConvert.SerializeObject(endAllDev)}");
|
|
|
+
|
|
|
+ if (!endDev.Any() && !endAllDev.Any() && !endNearDev.Any())//没有可用放货站台
|
|
|
+ {
|
|
|
+ var msg = "已无可用放货站台,任务正在执行中:";
|
|
|
+ foreach (var ag in agvs)
|
|
|
+ {
|
|
|
+ msg += $"[任务号:{ag.ID},目标地址:{ag.Station}]";
|
|
|
+ }
|
|
|
+ throw new Exception(msg);
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取没有光电信息的设备集合
|
|
|
+ try
|
|
|
+ {
|
|
|
+ // 获取可用站台
|
|
|
+ var devs = Device.All.Where(x => endDev.Contains(x.Code)).Select(x =>
|
|
|
+ new Device<IStation520, IStation521, IStation523>(x, World));
|
|
|
+ devs = devs.Where(x =>
|
|
|
+ !x.Data3.Status.HasFlag(StationStatus.Run) &&
|
|
|
+ !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
|
|
|
+ x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
|
|
|
+
|
|
|
+ var devsNear = Device.All.Where(x => endNearDev.Contains(x.Code)).Select(x =>
|
|
|
+ new Device<IStation520, IStation521, IStation523>(x, World));
|
|
|
+ devsNear = devsNear.Where(x =>
|
|
|
+ !x.Data3.Status.HasFlag(StationStatus.Run) &&
|
|
|
+ !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
|
|
|
+ x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
|
|
|
+
|
|
|
+ var devsAll = Device.All.Where(x => endAllDev.Contains(x.Code)).Select(x =>
|
|
|
+ new Device<IStation520, IStation521, IStation523>(x, World));
|
|
|
+ devsAll = devsAll.Where(x =>
|
|
|
+ !x.Data3.Status.HasFlag(StationStatus.Run) &&
|
|
|
+ !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
|
|
|
+ x.Data3.Status.HasFlag(StationStatus.Auto)).OrderBy(v => allPositionList.Contains(v.Entity.Code)).ToList();
|
|
|
+ if (!devs.Any()) //自身所属位置无可用放货点
|
|
|
{
|
|
|
- foreach (var dev in devsAll)
|
|
|
+ if (devsNear.Any())//先判断同库一侧
|
|
|
{
|
|
|
- if (!dev.Data3.Status.HasFlag(StationStatus.Run) && !dev.Data3.Status.HasFlag(StationStatus.PH_Status) && dev.Data3.Status.HasFlag(StationStatus.Auto))
|
|
|
+ foreach (var dev in devsNear)
|
|
|
{
|
|
|
- World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devsAll.Select(x => x.Entity.Code).ToList())}");
|
|
|
- agv.Status = AGVTaskStatus.Complete1;
|
|
|
- agv.Station = dev.Entity.Code;
|
|
|
- db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
|
|
|
- World.Log($"任务执行过程:完成agv任务更新{agv.ID}--{agv.Station}");
|
|
|
- task.AddWCS_TASK_DTL(db.Default, "皮盘返库任务分配巷道", agv.Station, $"任务分配至:{agv.Station}");
|
|
|
- World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
|
|
|
- AgvApi.ContinueTask(agv.AgvID, agv.Station);
|
|
|
- World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
|
|
|
- return;
|
|
|
+ if (!dev.Data3.Status.HasFlag(StationStatus.Run) && !dev.Data3.Status.HasFlag(StationStatus.PH_Status) && dev.Data3.Status.HasFlag(StationStatus.Auto))
|
|
|
+ {
|
|
|
+ World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devsAll.Select(x => x.Entity.Code).ToList())}");
|
|
|
+ agv.Status = AGVTaskStatus.Complete1;
|
|
|
+ agv.Station = dev.Entity.Code;
|
|
|
+ db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
|
|
|
+ World.Log($"任务执行过程:完成agv任务更新{agv.ID}--{agv.Station}");
|
|
|
+ task.AddWCS_TASK_DTL(db.Default, "皮盘返库任务分配巷道", agv.Station, $"任务分配至:{agv.Station}");
|
|
|
+ World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
|
|
|
+ AgvApi.ContinueTask(agv.AgvID, agv.Station);
|
|
|
+ World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (devsAll.Any())
|
|
|
+ {
|
|
|
+ foreach (var dev in devsAll)
|
|
|
+ {
|
|
|
+ if (!dev.Data3.Status.HasFlag(StationStatus.Run) && !dev.Data3.Status.HasFlag(StationStatus.PH_Status) && dev.Data3.Status.HasFlag(StationStatus.Auto))
|
|
|
+ {
|
|
|
+ World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devsAll.Select(x => x.Entity.Code).ToList())}");
|
|
|
+ agv.Status = AGVTaskStatus.Complete1;
|
|
|
+ agv.Station = dev.Entity.Code;
|
|
|
+ db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
|
|
|
+ World.Log($"任务执行过程:完成agv任务更新{agv.ID}--{agv.Station}");
|
|
|
+ task.AddWCS_TASK_DTL(db.Default, "皮盘返库任务分配巷道", agv.Station, $"任务分配至:{agv.Station}");
|
|
|
+ World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
|
|
|
+ AgvApi.ContinueTask(agv.AgvID, agv.Station);
|
|
|
+ World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
|
|
|
+ return;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
+ World.Log("可用站台均有货或有执行中任务");
|
|
|
+ return;
|
|
|
}
|
|
|
- World.Log("可用站台均有货或有执行中任务");
|
|
|
- return;
|
|
|
- }
|
|
|
|
|
|
- World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devs.Select(x => x.Entity.Code).ToList())}");
|
|
|
- agv.Status = AGVTaskStatus.Complete1;
|
|
|
- agv.Station = devs.MinBy(x => x.Entity.Code).Entity.Code;
|
|
|
- db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
|
|
|
- World.Log($"任务执行过程:完成agv任务更新{agv.ID}--{agv.Station}");
|
|
|
- task.AddWCS_TASK_DTL(db.Default, "皮盘返库任务分配巷道", agv.Station, $"任务分配至:{agv.Station}");
|
|
|
- World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
|
|
|
- AgvApi.ContinueTask(agv.AgvID, agv.Station);
|
|
|
- World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
|
|
|
- }
|
|
|
- catch (Exception e)
|
|
|
- {
|
|
|
- throw new Exception($"执行错误:{e.Message + e.StackTrace}");
|
|
|
+ World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devs.Select(x => x.Entity.Code).ToList())}");
|
|
|
+ agv.Status = AGVTaskStatus.Complete1;
|
|
|
+ agv.Station = devs.MinBy(x => x.Entity.Code).Entity.Code;
|
|
|
+ db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
|
|
|
+ World.Log($"任务执行过程:完成agv任务更新{agv.ID}--{agv.Station}");
|
|
|
+ task.AddWCS_TASK_DTL(db.Default, "皮盘返库任务分配巷道", agv.Station, $"任务分配至:{agv.Station}");
|
|
|
+ World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
|
|
|
+ AgvApi.ContinueTask(agv.AgvID, agv.Station);
|
|
|
+ World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ throw new Exception($"执行错误:{e.Message + e.StackTrace}");
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
break;
|
|
|
}
|
|
|
//放货站点安全交互
|
|
|
case AGVTaskStatus.RequestOrPermission2 when agv.Status != AGVTaskStatus.RequestOrPermission2:
|
|
|
{
|
|
|
if (agv.Station.IsNullOrEmpty()) throw new Exception($"无有效放货地址");
|
|
|
+ var taskBus = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.ID == agv.TaskId).First();
|
|
|
+ var flag = false;
|
|
|
+ if (taskBus != null && taskBus.BusType == "人工满托入库")
|
|
|
+ {
|
|
|
+ flag = true;
|
|
|
+ }
|
|
|
var dev = Device.All.First(x => x.Code == agv.Station);
|
|
|
var ph = new Device<IStation523>(Device.All.First(x => x.Code == agv.Station), World);
|
|
|
if (ph.Data.Status.HasFlag(StationStatus.PH_Status))
|
|
|
{
|
|
|
throw new Exception($"{agv.Station}站台有光电小车无法放货,请检查并处理");
|
|
|
}
|
|
|
+ if (flag)
|
|
|
+ {
|
|
|
+ if (!ph.Data.Status.HasFlag(StationStatus.Low_Station_2))
|
|
|
+ {
|
|
|
+ throw new Exception($"{agv.Station}站台不在低位小车无法放货,请检查并处理");
|
|
|
+ }
|
|
|
+ else if (db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot
|
|
|
+ && v.Station == agv.Station && v.GoodsSum == 1).SplitTable(tabs => tabs.Take(2)).Any())
|
|
|
+ {
|
|
|
+ throw new Exception($"{agv.Station}站台有执行中任务{agv.ID}");
|
|
|
+ }
|
|
|
+ agv.GoodsSum = 1;
|
|
|
+ }
|
|
|
+ agv.Status = AGVTaskStatus.RequestOrPermission2;
|
|
|
+ db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
|
|
|
var devinfo = new Device<IStation520, IStation521>(Device.All.First(x => x.Code == agv.Station), World);
|
|
|
devinfo.Data.CmdType = StationCmd.Res1;
|
|
|
//调继续执行任务接口
|
|
|
@@ -323,7 +430,7 @@ namespace WCS.WorkEngineering.Systems
|
|
|
db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
|
|
|
var devinfo = new Device<IStation520, IStation521>(Device.All.First(x => x.Code == agv.Station), World);
|
|
|
devinfo.Data.CmdType = StationCmd.Res2;
|
|
|
- if (taskold.LastInteractionPoint == "2") //如果是单独取空任务直接完成
|
|
|
+ if (taskold.LastInteractionPoint == "2" || taskold.BusType == TaskBusType.重绕满托入库.GetDescription() || taskold.BusType == TaskBusType.帘线退料重绕.GetDescription()) //如果是单独取空任务直接完成
|
|
|
{
|
|
|
var task = db.Default.Queryable<WCS_TaskInfo>().NoLock().Where(x => x.ID == agv.TaskId).First();
|
|
|
if (task != null)
|