using DBHelper; using System; using System.Collections.Generic; using System.Linq; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol; using WCS.Entity.Protocol.Station; namespace WCS.Service { public static class DeviceExtentions { public static IBCR80 BCR(this WCS_DEVICE source) { var dev = Device.Find("BCR" + source.CODE); return dev.PROTOCOLS.First().Data(); } public static short PalletType(this WCS_DEVICE source) { return (short)source.Get("PalletType"); } public static short ProductLine(this WCS_DEVICE source) { return (short)source.Get("ProductLine"); } public static short WorkShop(this WCS_DEVICE source) { return (short)source.Get("WorkShop"); } /// /// 获取从source到endaddr的路径中的所有位置 /// /// 起始位置 /// 目标位置 /// 路径筛选条件 /// public static List GetPath(this WCS_DEVICE source, string endAddr, Func, bool> condition = null) { var q = source.PATHS.Where(v => v.START == source & v.END.CODE.Contains(endAddr.ToUpper())) .Select(v => v.PATH.Split('-').Select(v => Device.Find(v)).ToList()); if (condition != null) q = q.Where(condition); return q.FirstOrDefault(); } /// /// 获取从source到endaddr的路径中的第一个位置 /// /// 起始位置 /// 目标位置 /// 路径筛选条件 /// public static WCS_DEVICE GetPath(this WCS_DEVICE source, string endAddr) { var q = source.PATHS.Where(v => v.START == source && v.END.CODE.Contains(endAddr.ToUpper())) .Select(v => v.PATH.Split('-').Select(v => Device.Find(v)).ToList()); return q.FirstOrDefault().FirstOrDefault(); } public static WCS_DEVICE GetNext(this WCS_DEVICE source, string endAddr) { return source.GetNext(endAddr, null); } /// /// 获取从source到endaddr的路径中的下一个位置 /// /// 起始位置 /// 目标位置 /// 路径筛选条件 /// public static WCS_DEVICE GetNext(this WCS_DEVICE source, string endAddr, Func, bool> condition) { var path = source.GetPath(endAddr, condition); if (Ltc.Do(path, v => v == null || v.Count == 0)) return null; if (source.IsConv()) { var obj = path.FirstOrDefault(v => !v.IsConv()); if (obj == null) { return path.Last(); } //else if (obj.IsSC() || obj.IsTunnel()) //{ // var lastConv = path.TakeWhile(v => v.IsConv()).LastOrDefault(); // return lastConv; //} else if (obj.IsRGV()) { var target = path.Skip(path.IndexOf(obj) + 1).FirstOrDefault(); return target; } else return null; } else { return path.First(); } } public static bool IsRGV(this WCS_DEVICE source) { return source.PROTOCOLS.Any(v => v.DB.PROTOCOL == typeof(IRGV520).AssemblyQualifiedName); } public static bool IsConv(this WCS_DEVICE source) { return source.PROTOCOLS.Any(v => v.DB.PROTOCOL == typeof(IStation521).AssemblyQualifiedName); } public static bool IsDevGroup(this WCS_DEVICE source) { return source.CODE.Contains("G"); } /// /// 是否堆垛机 /// /// /// public static bool IsSC(this WCS_DEVICE source) { return source.PROTOCOLS.Any(v => v.DB.PROTOCOL == typeof(ISRM520).AssemblyQualifiedName); } //public static bool IsRobot(this WCS_DEVICE source) //{ // return source.PROTOCOLS.Any(v => v.DB.PROTOCOL == typeof(IRobot).AssemblyQualifiedName); //} //public static bool IsRobotStation(this WCS_DEVICE source) //{ // return source.PROTOCOLS.Any(v => v.DB.PROTOCOL == typeof(IRobotStation).AssemblyQualifiedName); //} public static bool IsTunnel(this WCS_DEVICE source) { return source.PROTOCOLS.Count == 0 && source.CODE.StartsWith("T"); } } public static class TaskExtentions { public static string AddrCurrent(this WCS_TASK source, DB db) { var q = db.Default.Set().Where(v => v.ISLAST && v.Tasknum == source.ID).Select(v => new { type = 1, v.DEVICE.CODE }); q = q.Union(db.Default.Set().Where(v => v.ISLAST && (v.TaskID_1 == source.ID || v.TaskID_2 == source.ID)).Select(v => new { type = 2, v.DEVICE.CODE })); //q = q.Union(db.Default.Set().Where(v => v.ISLAST && v.TaskID == source.ID).Select(v => new { type = 2, v.DEVICE.CODE })); //q = q.Union(db.Default.Set().Where(v => v.ISLAST && v.TaskID == source.ID).Select(v => new { type = 2, v.DEVICE.CODE })); var res = q.OrderBy(v => v.type).FirstOrDefault(); if (res == null) return ""; return res.CODE; } } }