using ServiceCenter.Extensions; using ServiceCenter.Logs; using ServiceCenter.SqlSugars; using System.ComponentModel; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol.Station; using WCS.WorkEngineering.Extensions; using WCS.WorkEngineering.Model.WMS; using WCS.WorkEngineering.WebApi.Controllers; using WCS.WorkEngineering.WebApi.Models.WMS.Response; using WCS.WorkEngineering.Worlds; using TaskStatus = WCS.Entity.TaskStatus; namespace WCS.WorkEngineering.Systems.环形库 { /// /// 环形库分配货位 /// [BelongTo(typeof(SortingBranchWorld))] [Description("环形库分配货位")] public class 环形库分配货位 : DeviceSystem> { protected override bool ParallelDo => true; public override void Do(Device obj) { if (obj.Data.VoucherNo != obj.Data2.VoucherNo) { World.Log($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}"); return; } if (obj.Data3.Status.HasFlag(StationStatus.Run)) { World.Log("设备运行中"); return; } ; if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status)) { World.Log("站台货物信息与实际占用不一致"); return; } if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status)) { } ; if (obj.Data2.Request != 1) { World.Log("无请求"); return; } WCS_TaskInfo taskInfo = null; int sideNum = 0; //开始获取货位号 SqlSugarHelper.Do(db => { var task = db.Default.Queryable().First(v => obj.Data2.TaskNumber == v.ID); if (task == null) { World.Log($"未找到任务[{obj.Data2.TaskNumber}],请人工接入处理!!!!"); return; } if (task.Type != TaskType.SetPlate) { World.Log($"任务[{obj.Data2.TaskNumber}]任务类型错误,应该是组盘任务,请人工接入处理!!!!"); return; } if (task.Status != TaskStatus.FinishOfShunt) { World.Log($"任务[{obj.Data2.TaskNumber}]任务状态错误,当前状态应该市分流结束,,请人工接入处理!!!!"); return; } var robot = GetRobotDevice(obj.Entity); if (robot == null) { World.Log($"未检索到对应的机械臂设备号", LogLevelEnum.High); return; } if (robot.GetIsDirectPalletizing(db.Default)) { //获取对应的码垛信息 var ringPalletizingInfo = db.Default.Queryable().Single(x => x.Id == task.TaskGroupKey.ToLong()); // 获取对应码垛工位所有的码垛信息 var ringPalletizingInfos = db.Default.Queryable().Where(x => x.MaDuoGongWei == ringPalletizingInfo.MaDuoGongWei && x.Out == false).ToList(); if (ringPalletizingInfos.Count > 1) //有多条需判断是否能进行放行 { //获取所有此码垛工位所有已经分配的任务 var ringPalletizingMaDuoGongWeilList = ringPalletizingInfos.Select(x => x.Id.ToString()).ToList(); var tasks = db.Default.Queryable().Where(x => ringPalletizingMaDuoGongWeilList.Contains(x.TaskGroupKey) && x.Status < TaskStatus.Finish && x.ProdLine == 1).ToList(); //暂时不考虑同一个码垛工位,会有出现第一条信息还没被放行,第二条码垛信息就被创建的情况 if (tasks.GroupBy(x => x.TaskGroupKey).Count() != 1) { World.Log($"同时有两组未结束的码垛信息被放行,请检查码垛工位{ringPalletizingInfo.MaDuoGongWei}的实际情况,是否存在上组任务未结束或任务乱等情况", LogLevelEnum.High); return; } if (tasks.First().TaskGroupKey == ringPalletizingInfo.Id.ToString()) { task.LastInteractionPoint = obj.Entity.Code; task.AddrTo = ringPalletizingInfo.MaDuoGongWei; task.Device = obj.Entity.Code; task.ProdLine = 1; //标识放行 task.EditWho = "WCS"; db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo, x.LastInteractionPoint, x.ProdLine, x.Device, x.EditWho }).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"直接码垛放行{task.AddrTo}"); //var invNow = db.Default.Queryable().NoLock().First(x => x.ContGrpBarCode == task.BarCode); //默认信息 sideNum = 1; taskInfo = task; } else { World.Log($"同时有两组未结束的码垛信息被放行,请检查码垛工位{ringPalletizingInfo.MaDuoGongWei}的实际情况,是否存在上组任务未结束或任务乱等情况", LogLevelEnum.High); return; } } else { task.LastInteractionPoint = obj.Entity.Code; task.AddrTo = ringPalletizingInfo.MaDuoGongWei; task.Device = obj.Entity.Code; task.ProdLine = 1; //标识放行 task.EditWho = "WCS"; db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo, x.LastInteractionPoint, x.ProdLine, x.Device, x.EditWho }).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"直接码垛放行{task.AddrTo}"); //var invNow = db.Default.Queryable().NoLock().First(x => x.ContGrpBarCode == task.BarCode); //默认信息 sideNum = 1; taskInfo = task; } } else { var res = WmsApi.RingApplyStockInLoc(task.ID, task.Device, obj.Entity.Code, task.GoodsType); if (res.ResCode != ResponseStatusCodeEnum.Sucess) { World.Log(res.ResMsg, ServiceCenter.Logs.LogLevelEnum.High); return; } task.AddrTo = res.ResData.CellNo; task.Line = res.ResData.Row; task.Col = res.ResData.Colomn; task.Layer = res.ResData.Layer; task.Depth = res.ResData.Row; task.LastInteractionPoint = obj.Entity.Code; task.Device = obj.Entity.Code; task.EditWho = "WCS"; db.Default.UpdateableRowLock(task).UpdateColumns(x => new { x.AddrTo, x.Line, x.Col, x.Layer, x.Depth, x.LastInteractionPoint, x.Device, x.EditWho }).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, task.AddrTo, $"任务分配货位{task.AddrTo}"); var invNow = db.Default.Queryable().NoLock().First(x => x.ContGrpBarCode == task.BarCode); sideNum = invNow.SideNum; taskInfo = task; } }); if (taskInfo == null) return; var next = (taskInfo.AddrNext.ToShort() - 2).ToShort(); obj.Data.TaskNumber = taskInfo.ID; obj.Data.TaskNumber = taskInfo.ID; obj.Data.GoodsStart = obj.Entity.Code.ToShort(); obj.Data.GoodsStart = obj.Entity.Code.ToShort(); obj.Data.GoodsEnd = next; if (sideNum == 2) //反面 { obj.Data.CmdType = StationCmd.Res6; obj.Data.CmdType = StationCmd.Res6; } obj.Data.GoodsEnd = next; obj.Data.SetVoucherNo(); } public override bool Select(Device dev) { var codes = new List() { "444","644","844","1044","1244","1444", "426","626","826","1026","1226","1426", "435","635","835","1035","1235","1435" }; return codes.Any(x => x == dev.Code); } public Device? GetRobotDevice(Device dev) { var robotCode = dev.Code switch { "435" => "Robot1", "635" => "Robot2", "835" => "Robot3", "1035" => "Robot4", "1235" => "Robot5", "1435" => "Robot6", "444" => "Robot1", "644" => "Robot2", "844" => "Robot3", "1044" => "Robot4", "1244" => "Robot5", "1444" => "Robot6", "426" => "Robot1", "626" => "Robot2", "826" => "Robot3", "1026" => "Robot4", "1226" => "Robot5", "1426" => "Robot6", _ => "99999" }; return Device.All.FirstOrDefault(v => v.Code == robotCode); } } }