using DBHelper; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol; namespace WCS.Service.Works.Stations { //[WorkTitle(typeof(ProductHandler), "出库交通管制", true)] public class 出库交通管制 : DeviceWork> { protected override void Do(Device obj) { if (Ltc.Do(obj, v => v.Data2.CONFIRM == true)) return; if (Ltc.Do(obj, v => v.Data.TASKNUM == 0)) return; if (Ltc.Do(obj, v => v.Data.PH_STATUS == false)) return; if (Ltc.Do(obj, v => v.Data.GOODSEND != v.Entity.Code())) return; DB.Do(db => { var task = db.Default.Set().Find(obj.Data.TASKNUM); if (task.TYPE == TaskType.出库) { //var outPath = obj.Entity.GetPath(task.ADDRTO); //var tasks = db.Default.Set().Where(v => v.TYPE == TaskType.入库 || v.TYPE == TaskType.组盘) //.Where(v => v.STATUS < WCS.Entity.TaskStatus.堆垛机执行 && v.STATUS > WCS.Entity.TaskStatus.新建) //.Where(v => v.ADDRFROM == task.ADDRTO).ToArray(); ////tasks = tasks.Where(v => v.ID == 17328).ToArray(); //var arr = tasks.Select(v => //{ // var current = v.AddrCurrent(db); // var path = Device.Find(current).GetPath(v.ADDRNEXT); // if (path == null) // path = new List(); // return new // { // Task = v, // Path = path.Concat(new List { Device.Find(current) }) // }; //}).ToArray(); //var t = arr.Where(v => v.Path.Intersect(outPath).Where(v => v.IsConv()).Count() > 0).FirstOrDefault(); //if (t != null) //{ // throw new Exception("交通管制,与任务" + t.Task.ID + "路径冲突"); //} var any = false; if (obj.Entity.CODE == "2366") any = Device.Find("2123", "2125", "2126", "2327", "2128", "2131").Select(v => v.Device()).Where(v => v.Data.GOODSEND == 2153 || v.Data.GOODSEND == 2161).Any(); else any = Device.Find("2114", "2116", "2117", "2328", "2119", "2122").Select(v => v.Device()).Where(v => v.Data.GOODSEND == 2359).Any(); if (any) throw new Exception($"交通管制,有正在执行的入库任务"); var q = db.Default.Set().Where(v => v.TaskType == AGVTaskType.入库 && v.Status < AGVTaskStatus.完成扫码 && v.Status > AGVTaskStatus.新建); if (task.ADDRTO == "2086") { q = q.Where(v => v.Station == "2088"); } else { q = q.Where(v => v.Station == task.ADDRTO); } var agvtask = q.FirstOrDefault(); if (agvtask != null) { throw new Exception("交通管制,与AGV任务" + agvtask.ID + "冲突"); } task.ADDRNEXT = task.ADDRTO; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); obj.Data2.GOODSEND = short.Parse(task.ADDRNEXT); obj.Data2.TASKNUM = task.ID; obj.Data2.GOODSCODE = obj.Data.GOODSCODE; obj.Data2.GOODSSIZE = obj.Data.GOODSSIZE; obj.Data2.GOODSTYPE = obj.Data.GOODSTYPE; obj.Data2.HEIGHT = obj.Data.HEIGHT; obj.Data2.CONFIRM = true; } }); } protected override bool SelectDevice(WCS_DEVICE dev) { return false;// new string[] { "2108" }.Contains(dev.CODE); } } [WorkTitle(typeof(ProductHandler), "交管2325", true)] public class 交管2325 : DeviceWork> { protected override void Do(Device obj) { if (Ltc.Do(obj, v => v.Data2.CONFIRM == true)) return; if (Ltc.Do(obj, v => v.Data.TASKNUM == 0)) return; if (Ltc.Do(obj, v => v.Data.PH_STATUS == false)) return; if (Ltc.Do(obj, v => v.Data.GOODSEND != v.Entity.Code())) return; //if (Ltc.Do(obj, v => !v.Entity.WakeupOn(5000, "交通管制"))) // return; DB.Do(db => { var task = db.Default.Set().Find(obj.Data.TASKNUM); if (task.TYPE == TaskType.出库) { var rgv = Device.Find("RGV5").Device(); if (rgv.Data2.Trigger == 1) throw new Exception("等待WCS与RGV5交互完成"); var outqty = (rgv.Data.DestPosition == 2081 && rgv.Data.SystemStatus != RGVRunStatus.空闲) ? 1 : 0; outqty += Device.Where(v => "2325,2081,2083,2084,2086".Split(',').Contains(v.CODE)).Select(v => v.Device()) .Where(v => v.Data.GOODSEND == 2086 || (v.Data2.GOODSEND == 2086 && v.Data2.CONFIRM)) .Count(); if (outqty >= 2) { throw new Exception($"流量控制,放行任务数已达{outqty}"); } var inqty = Device.Where(v => "2081,2083,2088".Split(',').Contains(v.CODE)).Select(v => v.Device()) .Where(v => v.Data.GOODSEND == 2324||(v.Data2.GOODSEND==2324&&v.Data2.CONFIRM)) .Count(); if (inqty > 0) { throw new Exception($"交通管制,正在入库的任务数{inqty}"); } //var outPath = obj.Entity.GetPath(task.ADDRTO); //var tasks = db.Default.Set().Where(v => v.TYPE == TaskType.入库).Where(v => v.ADDRFROM == "2088") //.Where(v => v.STATUS < WCS.Entity.TaskStatus.堆垛机执行 && v.STATUS > WCS.Entity.TaskStatus.新建).ToArray(); //var arr = tasks.Select(v => //{ // var current = v.AddrCurrent(db); // var path = Device.Find(current).GetPath(v.ADDRNEXT); // if (path == null) // path = new List(); // return new // { // Task = v, // Path = path.Concat(new List { Device.Find(current) }) // }; //}).ToArray(); //var t = arr.Where(v => v.Path.Intersect(outPath).Where(v => v.IsConv()).Count() > 0).FirstOrDefault(); //if (t != null) //{ // throw new Exception("交通管制,与任务" + t.Task.ID + "路径冲突"); //} task.ADDRNEXT = task.ADDRTO; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); obj.Data2.GOODSEND = short.Parse(task.ADDRNEXT); obj.Data2.TASKNUM = task.ID; obj.Data2.GOODSCODE = obj.Data.GOODSCODE; obj.Data2.GOODSSIZE = obj.Data.GOODSSIZE; obj.Data2.GOODSTYPE = obj.Data.GOODSTYPE; obj.Data2.HEIGHT = obj.Data.HEIGHT; obj.Data2.CONFIRM = true; } }); } protected override bool SelectDevice(WCS_DEVICE dev) { return new string[] { "2325" }.Contains(dev.CODE); } } }