using PlcSiemens.Core.Extension; using ServiceCenter.Extensions; using ServiceCenter.Logs; using ServiceCenter.SqlSugars; using SqlSugar; using System.ComponentModel; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol.Station; using WCS.WorkEngineering.Extensions; using WCS.WorkEngineering.WebApi.Controllers; using WCS.WorkEngineering.Worlds; using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags; using TaskStatus = WCS.Entity.TaskStatus; namespace WCS.WorkEngineering.Systems { /// /// 分流点 /// //[BelongTo(typeof(SortingBranchWorld))] [Description("环形库分流点")] public class 环形库分流点 : DeviceSystem> { protected override bool ParallelDo => true; protected override bool SaveLogsToFile => true; public override void Do(Device obj) { if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High); if (obj.Data3.Status.HasFlag(StationStatus.Run)) throw new KnownException("设备运行中", LogLevelEnum.Low); if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low); if (obj.Data2.Request != 1) throw new KnownException("无请求", LogLevelEnum.Mid); var isPut = false; var nextAdd = GetNext(obj); int taskId = 0; SqlSugarHelper.Do(_db => { var db = _db.Default; var taskInfo = db.Queryable().First(v => v.ID == obj.Data2.TaskNumber && v.Status == TaskStatus.WaitingToExecute && !v.BarCode.Contains("Error")); if (obj.Data2.TaskNumber == 1) { var type = obj.Data4.Length.ToInt().ToString(); //找到一条起点是当前位置且状态小于2的任务 taskInfo = db.Queryable().OrderBy(x => x.AddTime).First(x => x.AddrFrom == obj.Entity.Code && x.Status == TaskStatus.WaitingToExecute && x.BarCode.Contains("Error") && x.AddrNext == null); if (taskInfo == null) { WmsApi.PalletizingCreateseErrorTasks(obj.Entity.Code, type); return; } } else if (taskInfo == null) throw new KnownException($"未找到对应的WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid); switch (obj.Entity.Code) { case "418": if (taskInfo.WarehouseCode != "1N") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid); break; case "618": if (taskInfo.WarehouseCode != "1S") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid); break; case "818": if (taskInfo.WarehouseCode != "2N") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid); break; case "1018": if (taskInfo.WarehouseCode != "2S") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid); break; case "1218": if (taskInfo.WarehouseCode != "3N") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid); break; case "1418": if (taskInfo.WarehouseCode != "3S") throw new KnownException($"当前任务应该当前往{taskInfo.WarehouseCode}库", LogLevelEnum.Mid); break; }; taskId = taskInfo.ID; if (obj.Data4.Length.ToInt() != 9) //09工字轮在环形库分流点只分配下一个地址,不作任何变更 { taskInfo.AddrNext = nextAdd.ToString(); taskInfo.Status = TaskStatus.FinishOfShunt; taskInfo.EditTime = DateTime.Now; taskInfo.WarehouseCode = taskInfo.WarehouseCode.Contains("R") ? taskInfo.WarehouseCode : taskInfo.WarehouseCode + "R"; taskInfo.AddrTo = "Robot"; taskInfo.GoodsType = obj.Data4.Length.ToInt(); db.Updateable(taskInfo).ExecuteCommand(); taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, nextAdd.ToString(), "工字轮完成环形库分流"); } else { taskInfo.AddrNext = nextAdd.ToString(); taskInfo.EditTime = DateTime.Now; taskInfo.GoodsType = obj.Data4.Length.ToInt(); db.Updateable(taskInfo).ExecuteCommand(); taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, nextAdd.ToString(), "工字轮途径环形库分流点"); } isPut = true; }); if (!isPut) return; obj.Data.TaskNumber = taskId; obj.Data.GoodsStart = obj.Entity.Code.ToShort(); obj.Data.GoodsEnd = nextAdd; obj.Data.VoucherNo++; World.Log($"执行记录:任务号[{taskId}]-[{obj.Data.VoucherNo}]"); } public override bool Select(Device dev) { return dev.Code is "418" or "618" or "818" or "1018" or "1218" or "1418"; } /// /// 计算非零九的去向 /// /// /// public short GetNext(Device obj) { return obj.Data4.Length switch { 9 => obj.Entity.Code switch { "418" => 455, "618" => 655, "818" => 855, "1018" => 1055, "1218" => 1255, "1418" => 1455, _ => 9999 }, 18 => obj.Entity.Code switch { "418" => 442, "618" => 642, "818" => 842, "1018" => 1042, "1218" => 1242, "1418" => 1442, _ => 9999 }, 50 => obj.Entity.Code switch { "418" => 424, "618" => 624, "818" => 824, "1018" => 1024, "1218" => 1224, "1418" => 1424, _ => 9999 }, 34 => obj.Entity.Code switch { "418" => 433, "618" => 633, "818" => 833, "1018" => 1033, "1218" => 1233, "1418" => 1433, _ => 9999 }, _ => 9999 }; } } }