using PlcSiemens.Core.Extension; using ServiceCenter.Extensions; using ServiceCenter.Logs; using ServiceCenter.Redis; using ServiceCenter.SqlSugars; using System.ComponentModel; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol.Station; using WCS.WorkEngineering.Extensions; using WCS.WorkEngineering.Worlds; using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags; using TaskStatus = WCS.Entity.TaskStatus; namespace WCS.WorkEngineering.Systems { /// /// 无交互系统 /// [BelongTo(typeof(NoInteractionWorld))] [Description("无交互系统")] public class NoInteractionSystems : DeviceSystem> { public NoInteractionSystems() { } protected override bool ParallelDo => true; protected override bool SaveLogsToFile => true; public override void Do(Device obj) { RedisHub.Do(obj.Entity.Code, redis => { var taskInfos = new List(); SqlSugarHelper.Do(db => { //获取所有的新建任务,组盘任务不需要 taskInfos = db.Default.Queryable().Where(t => t.Status == Entity.TaskStatus.NewBuild && !(t.Type == TaskType.SetPlate && t.AddrFrom == "Robot")).ToList(); }); if (!taskInfos.Any()) return; foreach (var item in taskInfos) { try { SqlSugarHelper.Do(db => { var task = db.Default.Queryable().Where(t => t.ID == item.ID).First() ?? throw new Exception($"未找到对应的WCS任务[{item.ID}]"); switch (task.Type) { case TaskType.SetPlate: if (task.AddrFrom != "Robot") { //更新任务状态 task.Status = TaskStatus.WaitingToExecute; db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息"); } break; case TaskType.EnterDepot: //更新任务状态 task.Status = Entity.TaskStatus.WaitingToExecute; switch (task.WarehouseCode) { case "1N": task.Device = "SRM1"; break; } if (task.AddrFrom is "1666" or "1661") { task.Device = "SRM1"; } //计算下一个地址 var path1 = DevicePath.GetPath(task.AddrFrom, task.Device); task.AddrNext = path1.Points[1].Code; task.SrmStation = task.BarCode.Contains("TPA") || task.BarCode.Contains("TPB") ? task.AddrFrom : path1.Points[2].Code; db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息"); break; case TaskType.OutDepot: { if (task.Device.Contains("Robot")) { var pos = task.AddrFrom.Split("-"); task.Status = Entity.TaskStatus.WaitingToExecute; task.Line = pos[0].ToShort(); task.Col = pos[1].ToShort(); task.Layer = pos[2].ToShort(); task.Depth = pos[3].ToShort(); db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}"); } else { if (task.SrmStation == "1") { var srmStation = new string[2]; switch (task.Device) { case "SRM1": srmStation[0] = "2534"; srmStation[1] = "2533"; break; case "SRM2": srmStation[0] = ""; srmStation[1] = ""; break; } //TODO:暂时不考虑入库卡控 //开始计算当前这个任务要从哪个站台出 //计算两个站台小于取货完成数量的AGV任务 var agv1 = db.Default.Queryable().SplitTable(x => x.Take(2)).Count(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[0]); var agv2 = db.Default.Queryable().SplitTable(x => x.Take(2)).Count(x => x.Status <= AGVTaskStatus.LeaveGet && x.Station == srmStation[1]); task.SrmStation = ""; task.AddrTo = agv1 > agv2 ? srmStation[1] : srmStation[0]; } if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台 { if (task.Device.IsNullOrEmpty()) { task.Device = "SRM" + task.Tunnel.GetLastDigit(); } //获取堆垛机到目标地址的路径信息 var path = DevicePath.GetPath(task.Device, task.AddrTo); task.SrmStation = path.Points[1].Code; } var devs = Device.All.Where(x => x.HasFlag(DeviceFlags.AGV取货站台口)).Select(x => x.Code); if (devs.Contains(task.SrmStation)) { //开始处理车间叫料AGV任务任务 db.Default.Insertable(new WCS_AgvTaskInfo() { ID = db.GetAgvTaskId(), TaskType = AGVTaskType.CallMaterial, Status = AGVTaskStatus.NewBuild, TaskId = task.ID, Position = task.WorkBench, Station = task.SrmStation, AddWho = "WCS", AddTime = DateTime.Now }).SplitTable().ExecuteCommand(); db.Default.Insertable(new WCS_AgvTaskInfo() { ID = db.GetAgvTaskId(), TaskType = AGVTaskType.EnterDepot, Status = AGVTaskStatus.NewBuild, TaskId = task.ID, Position = task.WorkBench, Station = "2501", AddWho = "WCS", AddTime = DateTime.Now }).SplitTable().ExecuteCommand(); } //更新任务状态 task.Status = Entity.TaskStatus.WaitingToExecute; db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}"); } break; } case TaskType.Delivery: break; case TaskType.EmptyInit: break; } }); } catch (Exception ex) { World.Log(ex.Message, LogLevelEnum.Mid); } } }); } public override bool Select(Device dev) { return dev.Code == nameof(NoInteractionSystems); } } }