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.Worlds; namespace WCS.WorkEngineering.Systems { /// /// 桁架缓存放行点 /// [BelongTo(typeof(SortingPalletizingWorld))] [Description("桁架缓存放行点")] public class 桁架缓存放行点 : DeviceSystem> { protected override bool ParallelDo => true; protected override bool SaveLogsToFile => true; /// /// 取货点设备集合 /// private readonly Dictionary, List>> _cacheDevices = new(); 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.PH_Status) && obj.Data2.Request == 0) throw new KnownException("有光电无请求", LogLevelEnum.Mid); if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status) && obj.Data2.Request == 1) throw new KnownException("无光电有请求", LogLevelEnum.Mid); if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low); if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status)) throw new KnownException("无光电", LogLevelEnum.Mid); if (obj.Data2.Request != 1) throw new KnownException("无请求", LogLevelEnum.Mid); var nextDev = new Device(obj.Entity.Targets.FirstOrDefault()!, World); if (nextDev.Data2.Status1.HasFlag(StationStatus1.IsLock)) throw new KnownException($"{nextDev.Entity.Code}桁架未取货完成,线体锁定中", LogLevelEnum.Mid); //获取当前缓存线信息对应设备号的下一个地址 var devCode = Device.All.Single(x => x.Code == obj.Entity.Code).Targets.FirstOrDefault(); var nextCode = obj.Entity.Targets.FirstOrDefault().Code.ToShort(); #region 计算当前缓存线是否已全部分配任务 SqlSugarHelper.Do(_db => { var db = _db.Default; var cacheLine = db.Queryable().Includes(x => x.Locations).Single(x => x.LocationNo == obj.Entity.Code.ToShort()); //是否所有的位已全部分配位置 if (cacheLine != null && cacheLine.Locations.All(x => x is { IsEmpty: false, InStock: true })) { //判断下一个地址当前是否有对应的任务 if (db.Queryable().Any(x => x.LocationNo == nextCode && x.IsTruss == false)) return; //没有对应的任务,开始释放缓存 cacheLine.InStock = true; cacheLine.LocationNo = devCode.Code.ToShort(); cacheLine.EditTime = DateTime.Now; db.Updateable(cacheLine).ExecuteCommand(); } }); #endregion 计算当前缓存线是否已全部分配任务 WCS_TaskInfo task = null; SqlSugarHelper.Do(_db => { var db = _db.Default; //先找到下一个地址对应的缓存信息 var lineCache = db.Queryable().Includes(x => x.Locations).Single(x => x.LocationNo == nextCode && x.Locations.Any(s => s.TaskId == obj.Data2.TaskNumber)); if (lineCache == null) return; //找不到表示当前线体的任务组没有凑齐 //检测实物数量与有货总数是否相等 if (!lineCache.Put) { var qty = lineCache.Locations.Count(x => x is { IsEmpty: false, InStock: true }); var devQty = _cacheDevices.FirstOrDefault(x => x.Key.Entity.Code == obj.Entity.Code).Value .Count(x => x.Data2.Status.HasFlag(StationStatus.PH_Status)); if (qty != devQty) return; //表示当前货物未全部到位 lineCache.Put = true; db.Updateable(lineCache).ExecuteCommand(); var pr = db.Queryable().Single(x => x.Id == lineCache.PalletizingRowId); pr.LineCode = lineCache.LocationNo.ToString(); db.Updateable(pr).ExecuteCommand(); } var taskInfo = db.Queryable().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.FinishOfShunt) ?? throw new KnownException("未找到对应的WCS任务", LogLevelEnum.Mid); taskInfo.Status = Entity.TaskStatus.ConveyorExecution; taskInfo.AddrNext = obj.Entity.Targets.FirstOrDefault().Code; taskInfo.EditWho = "WCS"; taskInfo.EditTime = DateTime.Now; db.Updateable(taskInfo).ExecuteCommand(); taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, "桁架缓存放行"); task = taskInfo; }); if (task == null) return; obj.Data.TaskNumber = obj.Data2.TaskNumber; obj.Data.GoodsStart = obj.Entity.Code.ToShort(); obj.Data.GoodsEnd = task.AddrNext.ToShort(); obj.Data.VoucherNo++; } public override bool Select(Device dev) { return dev.HasFlag(Extensions.DeviceFlags.桁架缓存放行点); } public 桁架缓存放行点() { _cacheDevices.Add(new Device(Device.All.First(x => x.Code == "466"), World), Device.All.Where(x => x.Code is "466" or "467" or "468" or "469" or "470").Select(x => new Device(x, World)).ToList()); _cacheDevices.Add(new Device(Device.All.First(x => x.Code == "480"), World), Device.All.Where(x => x.Code is "481" or "482" or "483" or "484" or "480").Select(x => new Device(x, World)).ToList()); _cacheDevices.Add(new Device(Device.All.First(x => x.Code == "494"), World), Device.All.Where(x => x.Code is "494" or "495" or "496" or "497" or "498").Select(x => new Device(x, World)).ToList()); _cacheDevices.Add(new Device(Device.All.First(x => x.Code == "508"), World), Device.All.Where(x => x.Code is "508" or "509" or "510" or "511" or "512").Select(x => new Device(x, World)).ToList()); _cacheDevices.Add(new Device(Device.All.First(x => x.Code == "522"), World), Device.All.Where(x => x.Code is "522" or "523" or "524" or "525" or "526").Select(x => new Device(x, World)).ToList()); _cacheDevices.Add(new Device(Device.All.First(x => x.Code == "536"), World), Device.All.Where(x => x.Code is "536" or "537" or "538" or "539" or "540").Select(x => new Device(x, World)).ToList()); //_cacheDevices.Add(new Device(Device.All.First(x => x.Code == "545"), World), Device.All.Where(x => x.Code is "546" or "547" or "548" or "549" or "545").Select(x => new Device(x, World)).ToList()); //_cacheDevices.Add(new Device(Device.All.First(x => x.Code == "559"), World), Device.All.Where(x => x.Code is "559" or "560" or "561" or "562" or "563").Select(x => new Device(x, World)).ToList()); //_cacheDevices.Add(new Device(Device.All.First(x => x.Code == "573"), World), Device.All.Where(x => x.Code is "573" or "574" or "575" or "576" or "577").Select(x => new Device(x, World)).ToList()); //_cacheDevices.Add(new Device(Device.All.First(x => x.Code == "586"), World), Device.All.Where(x => x.Code is "586" or "587" or "588" or "589" or "590").Select(x => new Device(x, World)).ToList()); } } }