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> { Device[] DevArr; TunnelInfo[] TunnelArr; class TunnelInfo { public WCS_DEVICE Tunnel; public Device DockIn; public Device DockWating; public Device SC; } public 原膜巷道分配() { DevArr = Device.Where(v => new string[]{ "2017", "2029", "2044", "2058" } .Contains(v.CODE)) .Select(v => v.Device()) .OrderBy(v => v.Entity.CODE) .ToArray(); TunnelArr = Device.Where(v => v.IsTunnel() && v.CODE.StartsWith("TY")).Select(t => { var inbound = Device.Where(v => v.IsConv() && v.ROUTES.Any(d => d.NEXT.CODE == t.CODE)).Select(v => v.Device()).FirstOrDefault(); return new TunnelInfo { Tunnel = t, DockIn = inbound, DockWating = Device.Where(v => v.IsConv() && v.ROUTES.Any(d => d.NEXT.CODE == inbound.Entity.CODE)).Select(v => v.Device()).FirstOrDefault(), SC = t.ROUTES.Where(d => d.NEXT.IsSC()).Select(d => d.NEXT.Device()).FirstOrDefault() }; }).ToArray(); } protected override bool SelectDevice(WCS_DEVICE dev) { return DevArr.Any(d=>d.Entity.CODE==dev.CODE); } 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.Find(obj.Data.TASKNUM); if (task.STATUS >= WCS.Entity.TaskStatus.已完成) { Ltc.Log($"任务[{task.ID}][{task.STATUS}],请速至【{obj.Entity.CODE}】处理,避免入库通道堵塞!"); throw new Exception($"任务[{task.ID}][{task.STATUS}],请速至【{obj.Entity.CODE}】处理,避免入库通道堵塞!"); } var res = WMS.GetTunnelList(task.WMSTASK, obj.Entity.CODE); try { if (!res.ResType) { throw new Exception($"分配巷道失败:{res.ResMessage}"); } var tArr = TunnelArr; if (obj.Entity.CODE == "2029") tArr = TunnelArr.Skip(1).ToArray(); else if (obj.Entity.CODE == "2044") tArr = TunnelArr.Skip(3).ToArray(); else if (obj.Entity.CODE == "2058") tArr = TunnelArr.Skip(5).ToArray(); var grp = tArr.GroupBy(v => v.DockWating.Entity).ToArray(); var tsstr = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList(); //grp = grp.Where(v => v.Any(d => tsstr.Contains(d.Tunnel.CODE))).ToArray(); if (grp.Length == 0) throw new Exception($"入口分配无可用巷道{res.TunnelNum}"); Ltc.Log($"入口分配,可用入口数{grp.Length}"); //grp = grp.Where(v => v.Any(d => //{ // try // { // return d.SC.Data.Alarm == false && d.SC.Data.Mode == SCMode.远程; // } // catch // { // return false; // } //} //)).ToArray(); if (grp.Length == 0) throw new Exception($"堆垛机全不可用"); Ltc.Log($"堆垛机状态正常的入口数{grp.Length}"); Device next = null; var g = grp.Where(v => v.Key.CODE == obj.Entity.CODE).FirstOrDefault(); if (g != null) { if (g.Select(v => Locked(v.DockIn.Entity)).Sum() == 0) { next = g.Select(v => v) .Where(v => { try { return v.SC.Data.Alarm == false && v.SC.Data.Mode == SCMode.远程; } catch { return false; } }) .Where(v => tsstr.Contains(v.Tunnel.CODE)) .OrderBy(v => v.SC.Data.Status == SCRunStatus.空闲 ? 0 : 1) .ThenBy(v => tsstr.IndexOf(v.Tunnel.CODE)) .Select(v => v.DockIn) .FirstOrDefault(); } } if (next == null) { var arr = grp.Where(v => v.Key.CODE != obj.Entity.CODE) //.Where(v => v.Sum(d => Locked(d.DockIn.Entity)) == 0)//干道不缓存 .Select(v => v.Key.Device()).ToArray(); if (arr.Length == 0) { throw new Exception($"无巷道可用{res.TunnelNum}"); } next = arr.OrderBy(v => v.Entity.CODE).FirstOrDefault(); if (next == null || Locked(next.Entity) > 0) throw new Exception($"排队中{res.TunnelNum}"); } task.ADDRNEXT = next.Entity.CODE; task.UPDATETIME = DateTime.Now; task.ADDRTO = next.Entity.CODE; db.Default.SaveChanges(); obj.Data2.TASKNUM = obj.Data.TASKNUM; obj.Data2.GOODSEND = next.Entity.Code(); obj.Data2.CONFIRM = true; } catch(Exception ex) { var devs = Device.Where(v=>v.IsConv()).Where(v => v.Code() > 2017 && v.Code() < 2062).Select(v => v.Device()).ToArray(); var arr = devs.Where(v => v.Entity.Code() < obj.Entity.Code() && v.Data.GOODSEND > obj.Entity.Code()).ToArray(); if (arr.Length > 0) { if (obj.Entity.CODE == "2058") { var flag = Device.Find("2071", "2060").Select(v => v.Device()).All(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0); if (flag) { obj.Data2.TASKNUM = obj.Data.TASKNUM; obj.Data2.GOODSEND = 2017; obj.Data2.CONFIRM = true; } } else if (obj.Entity.CODE == "2044") { var emp = obj.Entity.GetPath("2058").Select(v => v.Device()).Where(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0).Count(); if (emp > 0) { obj.Data2.TASKNUM = obj.Data.TASKNUM; obj.Data2.GOODSEND = 2058; obj.Data2.CONFIRM = true; } } } //throw; Configs.UploadException(obj.Entity.CODE, ex.GetBaseException().Message); } }); } int Locked(WCS_DEVICE dev) { return Device.Where(v => v.IsConv()).Select(v => v.Device()).Where(v => v.Data.TASKNUM > 0) .Where(v => v.Data.GOODSEND == dev.Code() || v.Entity.CODE == dev.CODE) .Count(); } } }