Exemple #1
0
        /// <summary>
        /// 没有任何作业时,如果缓存位被占用,则强制回挪,
        /// TV分配,挪移车位分配
        /// </summary>
        /// <param name="frlct"></param>
        /// <param name="tolct"></param>
        /// <returns></returns>
        public Device PPYAllocateTvOfTransfer(Location frlct, out Location tolct)
        {
            tolct = null;
            CWLocation      cwlctn    = new CWLocation();
            CWICCard        cwiccd    = new CWICCard();
            List <Location> allLocLst = cwlctn.FindLocList();
            var             query     = from loc in allLocLst
                                        where loc.Type == EnmLocationType.Normal &&
                                        loc.Status == EnmLocationStatus.Space &&
                                        loc.Region == frlct.Region &&
                                        cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null &&
                                        loc.NeedBackup == 0 &&
                                        compareSize(loc.LocSize, frlct.LocSize) >= 0
                                        orderby Math.Abs(frlct.LocColumn - loc.LocColumn)
                                        select loc;

            List <Location> lctnLst = query.ToList();

            if (lctnLst.Count > 0)
            {
                tolct = lctnLst.FirstOrDefault();

                Device tv = new CWDevice().Find(d => d.Region == frlct.Region);
                return(tv);
            }
            return(null);
        }
Exemple #2
0
        /// <summary>
        /// 6174平面移动库挪移车位查找,库区只有一个车位尺寸
        /// </summary>
        /// <param name="frLct"></param>
        /// <returns></returns>
        public Location PPYAllocateLctnNeedTransfer(Location frLct)
        {
            CWLocation cwlctn = new CWLocation();
            CWICCard   cwiccd = new CWICCard();

            List <Location> lctnLst = cwlctn.FindLocList();
            //找出1、2边空闲的车位
            var query_same = from loc in lctnLst
                             where loc.Type == EnmLocationType.Normal &&
                             loc.Status == EnmLocationStatus.Space &&
                             loc.Region == frLct.Region &&
                             loc.LocSide != 3 &&
                             compareSize(loc.LocSize, frLct.LocSize) >= 0 &&
                             cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null
                             orderby Math.Abs(frLct.LocColumn - loc.LocColumn)
                             select loc;

            List <Location> availLst = new List <Location>();

            foreach (Location loc in query_same)
            {
                //如果是1边车位,后面的车位要是空闲或占用的
                if (loc.LocSide == 1)
                {
                    string   backAddrs = string.Format((loc.LocSide + 2).ToString() + loc.Address.Substring(1));
                    Location back      = cwlctn.FindLocation(lc => lc.Address == backAddrs);
                    if (back != null)
                    {
                        if (back.Status == EnmLocationStatus.Space ||
                            back.Status == EnmLocationStatus.Occupy)
                        {
                            availLst.Add(loc);
                        }
                    }
                }
                else
                {
                    availLst.Add(loc);
                }
            }

            //再找缓存车位
            var query_temp = from loc in lctnLst
                             where loc.Type == EnmLocationType.Temporary &&
                             loc.Status == EnmLocationStatus.Space &&
                             loc.Region == frLct.Region &&
                             compareSize(loc.LocSize, frLct.LocSize) >= 0
                             orderby Math.Abs(frLct.LocColumn - loc.LocColumn)
                             select loc;

            availLst.AddRange(query_temp);
            if (availLst.Count > 0)
            {
                return(availLst[0]);
            }
            return(null);
        }
Exemple #3
0
        /// <summary>
        /// 分配车位:
        /// 1、优先分配中间区域的车位
        /// 2、判断ETV可达,车厅可达
        /// </summary>
        /// <param name="checkcode"></param>
        /// <returns></returns>
        public Location AllocateLoc(string checkcode)
        {
            //优先分配中间区域的车位
            int middlecolmn = 9;

            CWLocation cwlctn   = new CWLocation();
            CWDevice   cwdevice = new CWDevice();
            CWTask     cwtask   = new CWTask();
            CWICCard   cwiccd   = new CWICCard();

            #region 依距车厅的远近找出所有车位的集合
            List <Location> allLocLst  = cwlctn.FindLocList();
            List <Customer> fixCustLst = cwiccd.FindCustList(cu => cu.Type == EnmICCardType.FixedLocation || cu.Type == EnmICCardType.VIP);
            //排除固定车位
            List <Location> suitLocsLst = allLocLst.FindAll(lc => fixCustLst.Exists(cc => cc.LocAddress == lc.Address && cc.Warehouse == lc.Warehouse) == false);


            List <Location> sameLctnLst = new List <Location>();

            var locList_small = from loc in suitLocsLst
                                where loc.Type == EnmLocationType.Normal &&
                                loc.Status == EnmLocationStatus.Space &&
                                string.Compare(loc.LocSize, checkcode) == 0
                                orderby loc.LocSide ascending, Math.Abs(loc.LocColumn - middlecolmn) ascending
            select loc;

            var locList_big = from loc in suitLocsLst
                              where loc.Type == EnmLocationType.Normal &&
                              loc.Status == EnmLocationStatus.Space &&
                              string.Compare(loc.LocSize, checkcode) > 0
                              orderby loc.LocSide ascending, Math.Abs(loc.LocColumn - middlecolmn) ascending
            select loc;

            sameLctnLst.AddRange(locList_small);
            sameLctnLst.AddRange(locList_big);

            List <Location> lctnLst = new List <Location>();
            #region 如果是重列车位,优先分配前面车位是空闲的,其次是占用的,最后才是执行中的
            List <Location> spaceLctnLst  = new List <Location>();
            List <Location> occupyLctnLst = new List <Location>();
            List <Location> otherLctnLst  = new List <Location>();
            foreach (Location loc in sameLctnLst)
            {
                if (loc.LocSide == 4)
                {
                    #region 判断前面车位状态
                    string   fwdAddrs = "2" + loc.Address.Substring(1);
                    Location forward  = cwlctn.FindLocation(l => l.Address == fwdAddrs);
                    if (forward != null)
                    {
                        if (forward.Type == EnmLocationType.Normal)
                        {
                            if (forward.Status == EnmLocationStatus.Space)
                            {
                                spaceLctnLst.Add(loc);
                            }
                            else if (forward.Status == EnmLocationStatus.Occupy)
                            {
                                occupyLctnLst.Add(loc);
                            }
                            else
                            {
                                otherLctnLst.Add(loc);
                            }
                        }
                    }
                    #endregion
                }
                else if (loc.LocSide == 2)
                {
                    #region 判断后面车位状态
                    string   bckAddrs = "4" + loc.Address.Substring(1);
                    Location back     = cwlctn.FindLocation(l => l.Address == bckAddrs);
                    if (back != null)
                    {
                        if (back.Type == EnmLocationType.Normal)
                        {
                            if (back.Status == EnmLocationStatus.Space)
                            {
                                spaceLctnLst.Add(loc);
                            }
                            else if (back.Status == EnmLocationStatus.Occupy)
                            {
                                occupyLctnLst.Add(loc);
                            }
                            else
                            {
                                otherLctnLst.Add(loc);
                            }
                        }
                        else //禁用的
                        {
                            spaceLctnLst.Add(loc);
                        }
                    }

                    #endregion
                }
                else
                {
                    spaceLctnLst.Add(loc);
                }
            }
            lctnLst.AddRange(spaceLctnLst);
            lctnLst.AddRange(occupyLctnLst);
            lctnLst.AddRange(otherLctnLst);
            #endregion

            if (lctnLst.Count == 0)
            {
                return(null);
            }

            List <Device> nEtvList     = cwdevice.FindList(d => d.Type == EnmSMGType.ETV);
            WorkScope     workscope    = new WorkScope(nEtvList);
            List <Device> availHallLst = cwdevice.FindList(d => d.Type == EnmSMGType.Hall && d.Mode == EnmModel.Automatic);
            List <Device> availEtvLst  = nEtvList.FindAll(d => d.Mode == EnmModel.Automatic);

            if (availEtvLst.Count == 0 ||
                availHallLst.Count == 0)
            {
                return(null);
            }

            if (availEtvLst.Count == 2 && availHallLst.Count == 2)
            {
                return(lctnLst.FirstOrDefault());
            }
            if (availEtvLst.Count == 1)
            {
                CScope scope = workscope.GetEtvScope(availEtvLst[0]);
                if (availHallLst.Count == 2)
                {
                    foreach (Location loc in lctnLst)
                    {
                        if (loc.LocColumn >= scope.LeftCol && loc.LocColumn <= scope.RightCol)
                        {
                            return(loc);
                        }
                    }
                }
                else
                {
                    Device hall      = availHallLst[0];
                    int    hallcolmn = Convert.ToInt32(hall.Address.Substring(1, 2));
                    if (hallcolmn >= scope.LeftCol && hallcolmn <= scope.RightCol)
                    {
                        foreach (Location loc in lctnLst)
                        {
                            if (loc.LocColumn >= scope.LeftCol && loc.LocColumn <= scope.RightCol)
                            {
                                return(loc);
                            }
                        }
                    }
                }
            }

            #endregion

            return(null);
        }
Exemple #4
0
        /// <summary>
        /// 依ETV作业范围,找出符合尺寸的车位
        /// 如果是重列车位,则前面的车位,一定是空闲的
        /// </summary>
        /// <param name="etv"></param>
        /// <returns></returns>
        public Location AllocateLocOfEtvScope(Device etv, string checkcode)
        {
            CWLocation cwlctn = new CWLocation();
            CWDevice cwdevice = new CWDevice();
            CWTask cwtask = new CWTask();
            CWICCard cwiccd = new CWICCard();

            List<Device> nEtvList = cwdevice.FindList(d => d.Type == EnmSMGType.ETV);
            WorkScope workscope = new WorkScope(nEtvList);
            CScope scope = workscope.GetEtvScope(etv);
            int etvColmn = Convert.ToInt32(etv.Address.Substring(1, 2));

            List<Location> allLocsLst = cwlctn.FindLocList();
            List<Customer> fixCustLst = cwiccd.FindCustList(cu => cu.Type == EnmICCardType.FixedLocation || cu.Type == EnmICCardType.VIP);
            //排除固定车位
            List<Location> suitLocsLst = allLocsLst.FindAll(lc => fixCustLst.Exists(cc => cc.LocAddress == lc.Address && cc.Warehouse == lc.Warehouse) == false);

            var queryLstsmall = from loc in suitLocsLst
                                where loc.Type == EnmLocationType.Normal &&
                                      loc.Status == EnmLocationStatus.Space &&
                                      compareSize(loc.LocSize, checkcode) == 1 &&
                                      cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null
                                orderby Math.Abs(loc.LocColumn - etvColmn) ascending,
                                        loc.LocSide ascending
                                select loc;

            List<Location> priorLocsLst = new List<Location>();
            List<Location> nextLocsLst = new List<Location>();
            foreach (Location loc in queryLstsmall)
            {
                if (loc.LocColumn >= scope.LeftCol && loc.LocColumn <= scope.RightCol)
                {
                    #region
                    if (loc.LocSide == 2)
                    {
                        #region 如果后边的车位在作业,则最后分配
                        string bckAddrs = "4" + loc.Address.Substring(1);
                        Location back = cwlctn.FindLocation(l => l.Address == bckAddrs);
                        if (back != null)
                        {
                            if (back.Type == EnmLocationType.Normal)
                            {
                                if (back.Status == EnmLocationStatus.Space)
                                {
                                    priorLocsLst.Add(loc);
                                }
                                else
                                {
                                    nextLocsLst.Add(loc);
                                }
                            }
                            else if (back.Type == EnmLocationType.Disable)
                            {
                                priorLocsLst.Add(loc);
                            }
                        }
                        #endregion
                    }
                    else if (loc.LocSide == 4)
                    {
                        #region 如果是重列,则前面的车位一定是空闲的
                        string fwdAddrs = "2" + loc.Address.Substring(1);
                        Location forward = cwlctn.FindLocation(l => l.Address == fwdAddrs);
                        if (forward != null)
                        {
                            if (forward.Type == EnmLocationType.Normal &&
                                forward.Status == EnmLocationStatus.Space)
                            {
                                priorLocsLst.Add(loc);
                            }
                        }
                        #endregion
                    }
                    else if (loc.LocSide == 1)
                    {
                        priorLocsLst.Add(loc);
                    }
                    #endregion
                }
            }
            if (priorLocsLst.Count > 0)
            {
                return priorLocsLst[0];
            }
            if (nextLocsLst.Count > 0)
            {
                return nextLocsLst[0];
            }

            var queryLstbig = from loc in suitLocsLst
                              where loc.Type == EnmLocationType.Normal &&
                                    loc.Status == EnmLocationStatus.Space &&
                                    compareSize(loc.LocSize, checkcode) > 1 &&
                                    cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null
                              orderby Math.Abs(loc.LocColumn - etvColmn) ascending,
                                      loc.LocSide ascending
                              select loc;

            List<Location> priorLocsLstbig = new List<Location>();
            List<Location> nextLocsLstbig = new List<Location>();
            foreach (Location loc in queryLstbig)
            {
                if (loc.LocColumn >= scope.LeftCol && loc.LocColumn <= scope.RightCol)
                {
                    #region
                    if (loc.LocSide == 2)
                    {
                        #region 如果后边的车位在作业,则最后分配
                        string bckAddrs = "4" + loc.Address.Substring(1);
                        Location back = cwlctn.FindLocation(l => l.Address == bckAddrs);
                        if (back != null)
                        {
                            if (back.Type == EnmLocationType.Normal)
                            {
                                if (back.Status == EnmLocationStatus.Space)
                                {
                                    priorLocsLstbig.Add(loc);
                                }
                                else
                                {
                                    nextLocsLstbig.Add(loc);
                                }
                            }
                            else if (back.Type == EnmLocationType.Disable)
                            {
                                priorLocsLstbig.Add(loc);
                            }
                        }
                        #endregion
                    }
                    else if (loc.LocSide == 4)
                    {
                        #region 如果是重列,则前面的车位一定是空闲的
                        string fwdAddrs = "2" + loc.Address.Substring(1);
                        Location forward = cwlctn.FindLocation(l => l.Address == fwdAddrs);
                        if (forward != null)
                        {
                            if (forward.Type == EnmLocationType.Normal &&
                                forward.Status == EnmLocationStatus.Space)
                            {
                                priorLocsLstbig.Add(loc);
                            }
                        }
                        #endregion
                    }
                    else if (loc.LocSide == 1)
                    {
                        priorLocsLstbig.Add(loc);
                    }
                    #endregion
                }
            }

            if (priorLocsLstbig.Count > 0)
            {
                return priorLocsLstbig[0];
            }
            if (nextLocsLstbig.Count > 0)
            {
                return nextLocsLstbig[0];
            }

            return null;
        }
        /// <summary>
        /// 巷道堆垛临时卡车位分配
        /// </summary>
        /// <returns></returns>
        private Location PXDAllocate(Device hall, string checkCode, out int smg)
        {
            smg = 0;
            #region
            CWLocation cwlctn   = new CWLocation();
            CWDevice   cwdevice = new CWDevice();
            CWTask     cwtask   = new CWTask();
            CWICCard   cwiccd   = new CWICCard();

            List <Device> nEtvList  = cwdevice.FindList(d => d.Type == EnmSMGType.ETV);
            WorkScope     workscope = new WorkScope(nEtvList);
            int           hallColmn = Convert.ToInt32(hall.Address.Substring(1, 2));
            List <Device> reachHall = new List <Device>();
            #region 找出可达车厅、可用的ETV集合
            foreach (Device dev in nEtvList)
            {
                CScope scope = workscope.GetEtvScope(dev);
                if (scope.LeftCol <= hallColmn && hallColmn <= scope.RightCol)
                {
                    if (dev.IsAble == 1)
                    {
                        reachHall.Add(dev);
                    }
                }
            }
            #endregion

            List <Location> lctnLst = new List <Location>();
            #region 依距车厅的远近找出所有车位的集合
            List <Location> allLocLst  = cwlctn.FindLocList();
            List <Customer> fixCustLst = cwiccd.FindCustList(cu => cu.Type == EnmICCardType.FixedLocation || cu.Type == EnmICCardType.VIP);
            //排除固定车位
            allLocLst = allLocLst.FindAll(lc => fixCustLst.Exists(cc => cc.LocAddress == lc.Address && cc.Warehouse == lc.Warehouse) == false);

            #region 车位尺寸一致
            List <Location> sameLctnLst = new List <Location>();

            #region
            #region 首先 分配与车厅同一个区域的,车位尺寸一致的, 4-2-1依次排列,
            var L42_locList_small = from loc in allLocLst
                                    where loc.Type == EnmLocationType.Normal &&
                                    loc.Status == EnmLocationStatus.Space &&
                                    compareSize(loc.LocSize, checkCode) == 1 &&
                                    loc.LocSide != 1 &&
                                    loc.Region == hall.Region
                                    orderby Math.Abs(loc.LocColumn - hallColmn) ascending,
                loc.LocSide descending
            select loc;

            //1边
            var L1_locList_small = from loc in allLocLst
                                   where loc.Type == EnmLocationType.Normal &&
                                   loc.Status == EnmLocationStatus.Space &&
                                   compareSize(loc.LocSize, checkCode) == 1 &&
                                   loc.LocSide == 1 &&
                                   loc.Region == hall.Region
                                   orderby Math.Abs(loc.LocColumn - hallColmn) ascending
                                   select loc;

            #endregion
            sameLctnLst.AddRange(L42_locList_small);
            sameLctnLst.AddRange(L1_locList_small);

            #region 再次分配与车厅同一个区域,车位尺寸(仅宽度)偏大点的
            var L42_locList_width = from loc in allLocLst
                                    where loc.Type == EnmLocationType.Normal &&
                                    loc.Status == EnmLocationStatus.Space &&
                                    compareSize(loc.LocSize, checkCode) == 2 &&
                                    loc.LocSide != 1 &&
                                    loc.Region == hall.Region
                                    orderby Math.Abs(loc.LocColumn - hallColmn) ascending,
                loc.LocSide descending
            select loc;

            //1边
            var L1_locList_width = from loc in allLocLst
                                   where loc.Type == EnmLocationType.Normal &&
                                   loc.Status == EnmLocationStatus.Space &&
                                   compareSize(loc.LocSize, checkCode) == 2 &&
                                   loc.LocSide == 1 &&
                                   loc.Region == hall.Region
                                   orderby Math.Abs(loc.LocColumn - hallColmn) ascending
                                   select loc;

            #endregion
            sameLctnLst.AddRange(L42_locList_width);
            sameLctnLst.AddRange(L1_locList_width);

            #region 再分配与车厅不是同一个区域的
            //4边2边
            var L42_locList_small_dif = from loc in allLocLst
                                        where loc.Type == EnmLocationType.Normal &&
                                        loc.Status == EnmLocationStatus.Space &&
                                        compareSize(loc.LocSize, checkCode) == 1 &&
                                        loc.LocSide != 1 &&
                                        loc.Region != hall.Region
                                        orderby Math.Abs(loc.LocColumn - hallColmn) ascending,
                loc.LocSide descending
            select loc;

            //1边
            var L1_locList_small_dif = from loc in allLocLst
                                       where loc.Type == EnmLocationType.Normal &&
                                       loc.Status == EnmLocationStatus.Space &&
                                       compareSize(loc.LocSize, checkCode) == 1 &&
                                       loc.LocSide == 1 &&
                                       loc.Region != hall.Region
                                       orderby Math.Abs(loc.LocColumn - hallColmn) ascending
                                       select loc;

            #endregion
            sameLctnLst.AddRange(L42_locList_small_dif);
            sameLctnLst.AddRange(L1_locList_small_dif);

            #region 再次分配与车厅不同区域,车位尺寸(仅宽度)偏大点的
            var L42_locList_width_dif = from loc in allLocLst
                                        where loc.Type == EnmLocationType.Normal &&
                                        loc.Status == EnmLocationStatus.Space &&
                                        compareSize(loc.LocSize, checkCode) == 2 &&
                                        loc.LocSide != 1 &&
                                        loc.Region != hall.Region
                                        orderby Math.Abs(loc.LocColumn - hallColmn) ascending,
                loc.LocSide descending
            select loc;

            //1边
            var L1_locList_width_dif = from loc in allLocLst
                                       where loc.Type == EnmLocationType.Normal &&
                                       loc.Status == EnmLocationStatus.Space &&
                                       compareSize(loc.LocSize, checkCode) == 2 &&
                                       loc.LocSide == 1 &&
                                       loc.Region != hall.Region
                                       orderby Math.Abs(loc.LocColumn - hallColmn) ascending
                                       select loc;

            #endregion
            sameLctnLst.AddRange(L42_locList_width_dif);
            sameLctnLst.AddRange(L1_locList_width_dif);
            #endregion

            #region 如果是重列车位,优先分配前面车位是空闲的,其次是占用的,最后才是执行中的
            List <Location> spaceLctnLst  = new List <Location>();
            List <Location> occupyLctnLst = new List <Location>();
            List <Location> otherLctnLst  = new List <Location>();
            foreach (Location loc in sameLctnLst)
            {
                if (loc.LocSide == 4)
                {
                    #region 判断前面车位状态
                    string   fwdAddrs = "2" + loc.Address.Substring(1);
                    Location forward  = cwlctn.FindLocation(l => l.Address == fwdAddrs);
                    if (forward != null)
                    {
                        if (forward.Type == EnmLocationType.Normal)
                        {
                            if (forward.Status == EnmLocationStatus.Space)
                            {
                                spaceLctnLst.Add(loc);
                            }
                            else if (forward.Status == EnmLocationStatus.Occupy)
                            {
                                occupyLctnLst.Add(loc);
                            }
                            else
                            {
                                otherLctnLst.Add(loc);
                            }
                        }
                    }
                    #endregion
                }
                else if (loc.LocSide == 2)
                {
                    #region 判断后面车位状态
                    string   bckAddrs = "4" + loc.Address.Substring(1);
                    Location back     = cwlctn.FindLocation(l => l.Address == bckAddrs);
                    if (back != null)
                    {
                        if (back.Type == EnmLocationType.Normal)
                        {
                            if (back.Status == EnmLocationStatus.Space)
                            {
                                spaceLctnLst.Add(loc);
                            }
                            else if (back.Status == EnmLocationStatus.Occupy)
                            {
                                occupyLctnLst.Add(loc);
                            }
                            else
                            {
                                otherLctnLst.Add(loc);
                            }
                        }
                        else //禁用的
                        {
                            spaceLctnLst.Add(loc);
                        }
                    }

                    #endregion
                }
                else
                {
                    spaceLctnLst.Add(loc);
                }
            }
            lctnLst.AddRange(spaceLctnLst);
            lctnLst.AddRange(occupyLctnLst);
            lctnLst.AddRange(otherLctnLst);
            #endregion

            #endregion

            #region 车位尺寸是大的
            List <Location> bigLctnLst = new List <Location>();

            #region
            #region 首先 分配与车厅同一个区域的,车位尺寸一致的, 4-2-1依次排列,
            var L42_locList_big = from loc in allLocLst
                                  where loc.Type == EnmLocationType.Normal &&
                                  loc.Status == EnmLocationStatus.Space &&
                                  compareSize(loc.LocSize, checkCode) == 3 &&
                                  loc.LocSide != 1 &&
                                  loc.Region == hall.Region
                                  orderby Math.Abs(loc.LocColumn - hallColmn) ascending,
                loc.LocSide descending
            select loc;

            //1边
            var L1_locList_big = from loc in allLocLst
                                 where loc.Type == EnmLocationType.Normal &&
                                 loc.Status == EnmLocationStatus.Space &&
                                 compareSize(loc.LocSize, checkCode) == 3 &&
                                 loc.LocSide == 1 &&
                                 loc.Region == hall.Region
                                 orderby Math.Abs(loc.LocColumn - hallColmn) ascending
                                 select loc;

            #endregion
            bigLctnLst.AddRange(L42_locList_big);
            bigLctnLst.AddRange(L1_locList_big);

            #region 再分配与车厅不是同一个区域的
            var L42_locList_big_dif = from loc in allLocLst
                                      where loc.Type == EnmLocationType.Normal &&
                                      loc.Status == EnmLocationStatus.Space &&
                                      compareSize(loc.LocSize, checkCode) == 3 &&
                                      loc.LocSide != 1 &&
                                      loc.Region != hall.Region
                                      orderby Math.Abs(loc.LocColumn - hallColmn) ascending,
                loc.LocSide descending
            select loc;

            //1边
            var L1_locList_big_dif = from loc in allLocLst
                                     where loc.Type == EnmLocationType.Normal &&
                                     loc.Status == EnmLocationStatus.Space &&
                                     compareSize(loc.LocSize, checkCode) == 3 &&
                                     loc.LocSide == 1 &&
                                     loc.Region != hall.Region
                                     orderby Math.Abs(loc.LocColumn - hallColmn) ascending
                                     select loc;

            #endregion
            bigLctnLst.AddRange(L42_locList_big_dif);
            bigLctnLst.AddRange(L1_locList_big_dif);

            #endregion

            #region 如果是重列车位,优先分配前面车位是空闲的,其次是占用的,最后才是执行中的
            List <Location> spaceLctnLst_big  = new List <Location>();
            List <Location> occupyLctnLst_big = new List <Location>();
            List <Location> otherLctnLst_big  = new List <Location>();
            foreach (Location loc in bigLctnLst)
            {
                if (loc.LocSide == 4)
                {
                    #region 判断前面车位状态
                    string   fwdAddrs = "2" + loc.Address.Substring(1);
                    Location forward  = cwlctn.FindLocation(l => l.Address == fwdAddrs);
                    if (forward != null)
                    {
                        if (forward.Type == EnmLocationType.Normal)
                        {
                            if (forward.Status == EnmLocationStatus.Space)
                            {
                                spaceLctnLst_big.Add(loc);
                            }
                            else if (forward.Status == EnmLocationStatus.Occupy)
                            {
                                occupyLctnLst_big.Add(loc);
                            }
                            else
                            {
                                otherLctnLst_big.Add(loc);
                            }
                        }
                    }
                    #endregion
                }
                else if (loc.LocSide == 2)
                {
                    #region 判断后面车位状态
                    string   bckAddrs = "4" + loc.Address.Substring(1);
                    Location back     = cwlctn.FindLocation(l => l.Address == bckAddrs);
                    if (back != null)
                    {
                        if (back.Type == EnmLocationType.Normal)
                        {
                            if (back.Status == EnmLocationStatus.Space)
                            {
                                spaceLctnLst_big.Add(loc);
                            }
                            else if (back.Status == EnmLocationStatus.Occupy)
                            {
                                occupyLctnLst_big.Add(loc);
                            }
                            else
                            {
                                otherLctnLst_big.Add(loc);
                            }
                        }
                        else //禁用的
                        {
                            spaceLctnLst_big.Add(loc);
                        }
                    }

                    #endregion
                }
                else
                {
                    spaceLctnLst_big.Add(loc);
                }
            }
            lctnLst.AddRange(spaceLctnLst_big);
            lctnLst.AddRange(occupyLctnLst_big);
            lctnLst.AddRange(otherLctnLst_big);
            #endregion

            #endregion
            #endregion
            if (reachHall.Count == 1)
            {
                CScope scope = workscope.GetEtvScope(reachHall[0]);
                //只要一个ETV可达车厅,
                //依作业范围,找出在TV范围内的车位
                foreach (Location loc in lctnLst)
                {
                    if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol)
                    {
                        smg = reachHall[0].DeviceCode;
                        return(loc);
                    }
                }
            }
            else if (reachHall.Count == 2)
            {
                //如果有两个空闲的
                List <Device> freeEtvs = reachHall.FindAll(ch => ch.TaskID == 0);
                if (freeEtvs.Count == 2)
                {
                    #region
                    freeEtvs = reachHall.OrderBy(h => Math.Abs(h.Region - hall.Region)).ToList();
                    foreach (Device dev in freeEtvs)
                    {
                        CScope scope = workscope.GetEtvScope(dev);
                        foreach (Location loc in lctnLst)
                        {
                            if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol)
                            {
                                smg = dev.DeviceCode;
                                return(loc);
                            }
                        }
                    }
                    #endregion
                }
                else if (freeEtvs.Count == 1)
                {
                    #region
                    Device dev = freeEtvs[0];
                    if (dev.Region == hall.Region)
                    {
                        #region
                        smg = dev.DeviceCode;
                        CScope scope = workscope.GetEtvScope(dev);
                        foreach (Location loc in lctnLst)
                        {
                            if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol)
                            {
                                return(loc);
                            }
                        }
                        #endregion
                    }
                    else
                    {
                        #region
                        //如果不是同一区域的
                        //判断另一个ETV在执行什么样的动作,
                        //另一台ETV要不要跨区作业
                        Device other = reachHall.Find(h => h.DeviceCode != dev.DeviceCode);
                        if (other.TaskID != 0)
                        {
                            ImplementTask task = cwtask.Find(other.TaskID);
                            if (task != null)
                            {
                                string toAddrs = "";
                                if (task.Status == EnmTaskStatus.TWaitforLoad ||
                                    task.Status == EnmTaskStatus.TWaitforMove)
                                {
                                    toAddrs = task.FromLctAddress;
                                }
                                else
                                {
                                    toAddrs = task.ToLctAddress;
                                }
                                int toCol = Convert.ToInt32(toAddrs.Substring(1, 2));
                                //正在作业TV
                                int currCol = Convert.ToInt32(other.Address.Substring(1, 2));
                                //空闲TV
                                int freeCol = Convert.ToInt32(dev.Address.Substring(1, 2));

                                //空闲TV在右侧,即2号ETV空闲
                                if (currCol < freeCol)
                                {
                                    #region TV2空闲
                                    if (hallColmn >= toCol + 3)
                                    {
                                        //1#车厅不在范围内,则允许2#ETV动作
                                        smg = dev.DeviceCode;
                                        CScope scope = workscope.GetEtvScope(dev);
                                        foreach (Location loc in lctnLst)
                                        {
                                            if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol)
                                            {
                                                return(loc);
                                            }
                                        }
                                    }
                                    #endregion
                                }
                                else
                                {
                                    #region 1#TV空闲
                                    if (hallColmn <= toCol - 3)
                                    {
                                        //2#车厅不在范围内,则允许1#ETV动作
                                        smg = dev.DeviceCode;
                                        CScope scope = workscope.GetEtvScope(dev);
                                        foreach (Location loc in lctnLst)
                                        {
                                            if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol)
                                            {
                                                return(loc);
                                            }
                                        }
                                    }
                                    #endregion
                                }
                            }
                        }
                        #endregion
                    }
                    #endregion
                }
                List <Device> orderbyEtvs = reachHall.OrderBy(dr => Math.Abs(dr.Region - hall.Region)).ToList();
                #region 两个都在忙或上述找不到时,则依车厅区域内的ETV优先,分配ETV
                foreach (Device devc in orderbyEtvs)
                {
                    CScope scope = workscope.GetEtvScope(devc);
                    foreach (Location loc in lctnLst)
                    {
                        if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol)
                        {
                            smg = devc.DeviceCode;
                            return(loc);
                        }
                    }
                }

                #endregion
            }
            #endregion
            return(null);
        }
Exemple #6
0
        /// <summary>
        /// 巷道堆垛式---要生成挪移作业时,挪移车位的查找
        /// </summary>
        /// <param name="nEtv"></param>
        /// <param name="frLct"></param>
        /// <returns></returns>
        public Location AllocateTvNeedTransfer(Device nEtv, Location frLct)
        {
            CWDevice   cwdevice = new CWDevice();
            CWLocation cwlctn   = new CWLocation();
            CWICCard   cwiccd   = new CWICCard();

            int           warehouse = nEtv.Warehouse;
            List <Device> nEtvList  = cwdevice.FindList(d => d.Type == EnmSMGType.ETV);
            WorkScope     workscope = new WorkScope(nEtvList);
            CScope        scope     = workscope.GetEtvScope(nEtv);

            List <Location> availLst      = new List <Location>();
            List <Location> backOccupyLst = new List <Location>();
            List <Location> lctnLst       = cwlctn.FindLocList();
            //先找出相同区域的,尺寸一致的,如果是2边车位,则后面的车位不能是作业的车位
            var query_same = from loc in lctnLst
                             where loc.Type == EnmLocationType.Normal &&
                             loc.Status == EnmLocationStatus.Space &&
                             loc.Region == frLct.Region &&
                             loc.LocSide != 4 &&
                             (compareSize(loc.LocSize, frLct.LocSize) == 1 ||
                              compareSize(loc.LocSize, frLct.LocSize) == 2) &&
                             cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null
                             orderby Math.Abs(frLct.LocColumn - loc.LocColumn), loc.LocSide ascending
            select loc;

            foreach (Location loc in query_same)
            {
                if (loc.LocSide == 2)
                {
                    string   backAddrs = string.Format((loc.LocSide + 2).ToString() + loc.Address.Substring(1));
                    Location back      = cwlctn.FindLocation(lc => lc.Address == backAddrs);
                    if (back != null)
                    {
                        if (back.Status == EnmLocationStatus.Space)
                        {
                            availLst.Add(loc);
                        }
                        else if (back.Status == EnmLocationStatus.Occupy)
                        {
                            backOccupyLst.Add(loc);
                        }
                    }
                }
                else
                {
                    availLst.Add(loc);
                }
            }
            availLst.AddRange(backOccupyLst);
            //再找缓存车位
            var query_temp = from loc in lctnLst
                             where loc.Type == EnmLocationType.Temporary &&
                             loc.Status == EnmLocationStatus.Space &&
                             compareSize(loc.LocSize, frLct.LocSize) > 0
                             orderby Math.Abs(loc.Region - frLct.Region)
                             select loc;

            availLst.AddRange(query_temp);
            //最后找不同区域的,尺寸一致的,如果是2边车位,则后面的车位不能是作业的车位
            var query_diff = from loc in lctnLst
                             where loc.Type == EnmLocationType.Normal &&
                             loc.Status == EnmLocationStatus.Space &&
                             loc.Region != frLct.Region &&
                             loc.LocSide != 4 &&
                             (compareSize(loc.LocSize, frLct.LocSize) == 1 ||
                              compareSize(loc.LocSize, frLct.LocSize) == 2) &&
                             cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null
                             orderby Math.Abs(frLct.LocColumn - loc.LocColumn), loc.LocSide ascending
            select loc;

            List <Location> backOccupyLst_Big = new List <Location>();

            foreach (Location loc in query_diff)
            {
                if (loc.LocSide == 2)
                {
                    string   backAddrs = string.Format((loc.LocSide + 2).ToString() + loc.Address.Substring(1));
                    Location back      = cwlctn.FindLocation(lc => lc.Address == backAddrs);
                    if (back != null)
                    {
                        if (back.Status == EnmLocationStatus.Space)
                        {
                            availLst.Add(loc);
                        }
                        else if (back.Status == EnmLocationStatus.Occupy)
                        {
                            backOccupyLst_Big.Add(loc);
                        }
                    }
                }
                else
                {
                    availLst.Add(loc);
                }
            }
            availLst.AddRange(backOccupyLst_Big);

            foreach (Location loc in availLst)
            {
                if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol)
                {
                    return(loc);
                }
            }
            return(null);
        }
Exemple #7
0
        /// <summary>
        /// 没有任何作业时,如果缓存位被占用,则强制回挪,
        /// TV分配,挪移车位分配
        /// </summary>
        /// <param name="frlct"></param>
        /// <param name="tolct"></param>
        /// <returns></returns>
        public Device AllocateTvOfTransport(Location frlct, out Location toLct)
        {
            toLct = null;
            CWDevice   cwdevice = new CWDevice();
            CWLocation cwlctn   = new CWLocation();
            CWICCard   cwiccd   = new CWICCard();

            List <Device> nEtvList  = cwdevice.FindList(d => d.Type == EnmSMGType.ETV);
            WorkScope     workscope = new WorkScope(nEtvList);
            int           locColmn  = frlct.LocColumn;

            List <Device> availableLst = new List <Device>();

            #region 可达车位、可用的ETV集合
            foreach (Device dev in nEtvList)
            {
                if (dev.IsAble == 1)
                {
                    CScope scope = workscope.GetEtvScope(dev);
                    if (scope.LeftCol <= locColmn && locColmn <= scope.RightCol)
                    {
                        availableLst.Add(dev);
                    }
                }
            }
            #endregion

            List <Location> allLocLst = cwlctn.FindLocList();
            var             query     = from loc in allLocLst
                                        where loc.Type == EnmLocationType.Normal &&
                                        loc.Status == EnmLocationStatus.Space &&
                                        cwiccd.FindFixLocationByAddress(loc.Warehouse, loc.Address) == null &&
                                        (loc.LocSide == 1 || loc.LocSide == 2) &&
                                        compareSize(loc.LocSize, frlct.LocSize) > 0
                                        orderby Math.Abs(frlct.LocColumn - loc.LocColumn),
                            loc.LocSide ascending
            select loc;

            List <Location> lctnLst = query.ToList();

            if (availableLst.Count == 0)
            {
                return(null);
            }
            if (availableLst.Count == 1)
            {
                CScope scope = workscope.GetEtvScope(availableLst[0]);
                foreach (Location loc in lctnLst)
                {
                    if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol)
                    {
                        toLct = loc;
                        return(availableLst[0]);
                    }
                }
            }
            else
            {
                List <Device> orderbyLst = availableLst.OrderBy(d => Math.Abs(d.Region - frlct.Region)).ToList();
                foreach (Device dev in orderbyLst)
                {
                    CScope scope = workscope.GetEtvScope(dev);
                    foreach (Location loc in lctnLst)
                    {
                        if (scope.LeftCol <= loc.LocColumn && loc.LocColumn <= scope.RightCol)
                        {
                            toLct = loc;
                            return(availableLst[0]);
                        }
                    }
                }
            }
            return(null);
        }