using PlcSiemens.Core.Extension; using ServiceCenter.Extensions; using ServiceCenter.SqlSugars; using System.ComponentModel; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol.Station; using WCS.WorkEngineering.Worlds; using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags; using TaskStatus = WCS.Entity.TaskStatus; namespace WCS.WorkEngineering.Systems { /// /// 桁架码垛区补空托盘任务生成 /// //[BelongTo(typeof(SortingPalletizingWorld))] [Description("桁架码垛区补空托盘任务生成")] public class 桁架码垛区补空托盘任务生成 : DeviceSystem> { protected override bool ParallelDo => true; protected override bool SaveLogsToFile => true; public override void Do(Device obj) { WCS_Palletizing palletizing = null; SqlSugarHelper.Do(_db => { var db = _db.Default; //取一个时间最靠前的,没有绑定码垛工位的码垛记录 var palletizingInfo = db.Queryable().OrderBy(x => x.AddTime).First(x => x.PalletizingStation == null && !x.Finish); if (palletizingInfo == null) throw new Exception($"没有可用码垛信息"); var palleTask = db.Queryable().First(x => x.ID == palletizingInfo.TaskId && (x.Status == TaskStatus.FinishOfShunt || x.Status == TaskStatus.ConveyorExecution)); if (palleTask == null) throw new Exception($"未找到任务{palleTask.ID}"); //获取可以使用的放货站台信息 var taskAddNext = Device.All.FirstOrDefault(x => x.Code == palleTask.AddrNext).Targets.FirstOrDefault().Targets.Where(x => x.HasFlag(DeviceFlags.桁架码垛位)); if (taskAddNext == null) throw new Exception($"未找到{palleTask.AddrNext}可去的码垛工位"); var devs = Device.All.Where(x => taskAddNext.Contains(x)).Select(x => new Device(x, World)).ToList(); //获取所有的未结束且有码垛工位的码垛记录 var palletizingStation = db.Queryable().Where(x => !x.Finish && x.PalletizingStation != null).Select(x => x.PalletizingStation).ToList(); //取一个可用用于码垛的地方 var dev = devs.Where(x => !palletizingStation.Contains(x.Entity.Code)).FirstOrDefault(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status)); if (dev == null) throw new Exception($"没有可用码垛工位"); var addrFromCode = palletizingInfo.WarehouseCode switch { "1N" => "1606", "1S" => "1616", "2N" => "1626", "2S" => "1636", "3N" => "1646", "3S" => "1656", _ => "9999" }; var endDev = Device.All.Where(x => x.Code == addrFromCode).Select(x => new Device(x, World)).FirstOrDefault(); if (endDev.Data.TaskNumber != 0 || endDev.Data.GoodsEnd != 0) throw new Exception($"{endDev.Entity.Code}有残留任务信息,请处理!"); palletizingInfo.PalletizingStation = dev.Entity.Code; db.Updateable(palletizingInfo).ExecuteCommand(); palletizing = palletizingInfo; }); if (palletizing == null) return; var addrFromCode = palletizing.WarehouseCode switch { "1N" => "1606", "1S" => "1616", "2N" => "1626", "2S" => "1636", "3N" => "1646", "3S" => "1656", _ => "9999" }; var dev = Device.All.Where(x => x.Code == addrFromCode).Select(x => new Device(x, World)).FirstOrDefault(); dev.Data.TaskNumber = palletizing.Id; dev.Data.GoodsEnd = palletizing.PalletizingStation!.ToShort(); } public override bool Select(Device dev) { return dev.Code == nameof(桁架码垛区补空托盘任务生成); } } }