| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 | 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<IBCR80>();        }        public static short PalletType(this WCS_DEVICE source)        {            return (short)source.Get<int>("PalletType");        }        public static short ProductLine(this WCS_DEVICE source)        {            return (short)source.Get<int>("ProductLine");        }        public static short WorkShop(this WCS_DEVICE source)        {            return (short)source.Get<int>("WorkShop");        }        /// <summary>        /// 获取从source到endaddr的路径中的所有位置        /// </summary>        /// <param name="source">起始位置</param>        /// <param name="endAddr">目标位置</param>        /// <param name="condition">路径筛选条件</param>        /// <returns></returns>        public static List<WCS_DEVICE> GetPath(this WCS_DEVICE source, string endAddr, Func<List<WCS_DEVICE>, 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();        }        /// <summary>        /// 获取从source到endaddr的路径中的第一个位置        /// </summary>        /// <param name="source">起始位置</param>        /// <param name="endAddr">目标位置</param>        /// <param name="condition">路径筛选条件</param>        /// <returns></returns>        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);        }        /// <summary>        /// 获取从source到endaddr的路径中的下一个位置        /// </summary>        /// <param name="source">起始位置</param>        /// <param name="endAddr">目标位置</param>        /// <param name="condition">路径筛选条件</param>        /// <returns></returns>        public static WCS_DEVICE GetNext(this WCS_DEVICE source, string endAddr, Func<List<WCS_DEVICE>, 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);        }        /// <summary>        /// 是否堆垛机        /// </summary>        /// <param name="source"></param>        /// <returns></returns>        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<WCS_Station520>().Where(v => v.ISLAST && v.Tasknum == source.ID).Select(v => new { type = 1, v.DEVICE.CODE });            q = q.Union(db.Default.Set<WCS_RGV521>().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<WCS_SC521>().Where(v => v.ISLAST && v.TaskID == source.ID).Select(v => new { type = 2, v.DEVICE.CODE }));            //q = q.Union(db.Default.Set<WCS_Robot>().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;        }    }}
 |