Example #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);
        }
Example #2
0
 public void AddFaultRecord(List <Alarm> alarmLst)
 {
     for (int i = 0; i < alarmLst.Count; i++)
     {
         Alarm  ar  = alarmLst[i];
         Device smg = new CWDevice().Find(d => d.Warehouse == ar.Warehouse && d.DeviceCode == ar.DeviceCode);
         if (smg != null)
         {
             FaultLog log = new FaultLog
             {
                 Warehouse   = smg.Warehouse,
                 DeviceCode  = smg.DeviceCode,
                 RunStep     = smg.RunStep,
                 InStep      = smg.InStep,
                 OutStep     = smg.OutStep,
                 Description = ar.Description,
                 CreateDate  = DateTime.Now
             };
             manager.Add(log);
         }
     }
 }
Example #3
0
        /// <summary>
        /// 挪移时车位选择
        /// </summary>
        /// <param name="frlct"></param>
        /// <param name="tolct"></param>
        /// <returns></returns>
        public Device TransportToAllocateTV(Location frlct, Location tolct)
        {
            CWDevice      cwdevice  = new CWDevice();
            List <Device> nEtvList  = cwdevice.FindList(d => d.Type == EnmSMGType.ETV);
            WorkScope     workscope = new WorkScope(nEtvList);

            if (nEtvList.Count > 0)
            {
                List <Device> orderbyLst = nEtvList.OrderBy(d => Math.Abs(d.Region - frlct.Region)).ToList();
                foreach (Device dev in orderbyLst)
                {
                    CScope scope = workscope.GetEtvScope(dev);
                    if (scope.LeftCol <= frlct.LocColumn && frlct.LocColumn <= scope.RightCol)
                    {
                        if (scope.LeftCol <= tolct.LocColumn && tolct.LocColumn <= scope.RightCol)
                        {
                            return(dev);
                        }
                    }
                }
            }
            return(null);
        }
Example #4
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);
        }
Example #5
0
        /// <summary>
        /// 查询临时用户费用
        /// </summary>
        public Response GetTempUserInfo(string iccode, bool isPlate)
        {
            Log        log    = LogFactory.GetLogger("CWTariff.GetTempUserInfo");
            Response   resp   = new Response();
            CWICCard   cwiccd = new CWICCard();
            CWLocation cwlctn = new CWLocation();

            try
            {
                Location     loc  = null;
                TempUserInfo info = new TempUserInfo();
                #region 暂不用
                //if (!isPlate)
                //{
                //    #region
                //    ICCard iccd = cwiccd.Find(ic=>ic.UserCode==iccode);
                //    if (iccd == null)
                //    {
                //        resp.Message = "不是本系统卡!";
                //        return resp;
                //    }
                //    if (iccd.CustID != 0)
                //    {
                //        Customer cust = cwiccd.FindCust(iccd.CustID);
                //        if (cust != null)
                //        {
                //            if (cust.Type != EnmICCardType.Temp)
                //            {
                //                resp.Message = "该用户不是临时用户!";
                //                return resp;
                //            }
                //        }
                //    }
                //    loc = cwlctn.FindLocation(lc=>lc.ICCode==iccode);
                //    if (loc == null)
                //    {
                //        resp.Message = "当前卡号没有存车!";
                //        return resp;
                //    }
                //    #endregion
                //}
                //else
                //{
                //    #region
                //    loc = cwlctn.FindLocation(l=>l.PlateNum==iccode);
                //    if (loc == null)
                //    {
                //        resp.Message = "当前输入车牌没有存车!";
                //        return resp;
                //    }
                //    string proof = loc.ICCode;
                //    Customer cust = null;
                //    #region
                //    if (Convert.ToInt32(proof) >= 10000) //是指纹激活的
                //    {
                //        int sno = Convert.ToInt32(proof);
                //        FingerPrint print = new CWFingerPrint().Find(p => p.SN_Number == sno);
                //        if (print == null)
                //        {
                //            //上位控制系统故障
                //            resp.Message = "找不到注册指纹,系统异常!";
                //            return resp;
                //        }
                //        cust = new CWICCard().FindCust(print.CustID);
                //        if (cust == null)
                //        {
                //            //上位控制系统故障
                //            resp.Message = "指纹没有绑定用户,系统异常!";
                //            return resp;
                //        }
                //    }
                //    else
                //    {
                //        ICCard iccd = new CWICCard().Find(ic => ic.UserCode == proof);
                //        if (iccd == null)
                //        {
                //            //上位控制系统故障
                //            resp.Message = "上位控制系统异常,找不到卡号!";
                //            return resp;
                //        }
                //        if (iccd.CustID != 0)
                //        {
                //            cust = new CWICCard().FindCust(iccd.CustID);
                //        }
                //    }
                //    #endregion
                //    if (cust != null)
                //    {
                //        if (cust.Type != EnmICCardType.Temp)
                //        {
                //            resp.Message = "该用户不是临时用户!";
                //            return resp;
                //        }
                //    }
                //    #endregion
                //}
                #endregion
                if (isPlate)
                {
                    //是车牌
                    loc = cwlctn.FindLocation(l => l.PlateNum == iccode);
                }
                else
                {
                    loc = cwlctn.FindLocation(l => l.ICCode == iccode);
                }
                if (loc == null)
                {
                    resp.Message = "当前车牌没有存车!Proof - " + iccode;
                    return(resp);
                }
                int             sno   = Convert.ToInt32(loc.ICCode);
                SaveCertificate scert = new CWSaveProof().Find(s => s.SNO == sno);
                if (scert != null)
                {
                    Customer cust = new CWICCard().FindCust(scert.CustID);
                    if (cust != null)
                    {
                        if (cust.Type != EnmICCardType.Temp)
                        {
                            resp.Message = "该用户不是临时用户!";
                            return(resp);
                        }
                    }
                }

                CWTask        cwtask = new CWTask();
                ImplementTask itask  = cwtask.FindITask(tk => tk.ICCardCode == loc.ICCode && tk.IsComplete == 0);
                if (itask != null)
                {
                    resp.Message = "正在作业,无法查询!";
                    return(resp);
                }
                WorkTask queue = cwtask.FindQueue(q => q.ICCardCode == loc.ICCode);
                if (queue != null)
                {
                    resp.Message = "已经加入取车队列,无法查询!";
                    return(resp);
                }

                info.CCode   = iccode;
                info.InDate  = loc.InDate.ToString();
                info.OutDate = DateTime.Now.ToString();
                TimeSpan span = DateTime.Now - loc.InDate;
                info.SpanTime = (span.Days > 0 ? span.Days + "天" : " ") + (span.Hours > 0 ? span.Hours + "小时" : " ") +
                                (span.Minutes >= 0 ? span.Minutes + "分" : " ") + (span.Seconds >= 0 ? span.Seconds + "秒" : " ");
                float fee = 0;
                resp = this.CalculateTempFee(loc.InDate, DateTime.Now, out fee);
                if (resp.Code == 0)
                {
                    return(resp);
                }
                info.NeedFee   = fee.ToString();
                info.Warehouse = loc.Warehouse;

                int hallID = new CWDevice().AllocateHall(loc, false);
                info.HallID = hallID;

                resp.Code    = 1;
                resp.Message = "查询成功";
                resp.Data    = info;
            }
            catch (Exception ex)
            {
                log.Error(ex.ToString());
            }
            return(resp);
        }
Example #6
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;
        }
Example #7
0
        /// <summary>
        /// 固定车位时,ETV分配
        /// </summary>
        /// <param name="hall">存车车厅</param>
        /// <param name="loc">目的车位</param>
        /// <returns></returns>
        public Device PXDAllocateEtvOfFixLoc(Device hall, Location loc)
        {
            CWDevice cwdevice = new CWDevice();
            CWTask   cwtask   = new CWTask();

            List <Device> nEtvList  = cwdevice.FindList(d => d.Type == EnmSMGType.ETV);
            WorkScope     workscope = new WorkScope(nEtvList);
            int           hallColmn = Convert.ToInt32(hall.Address.Substring(1, 2));
            int           locColmn  = loc.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 <= hallColmn && hallColmn <= scope.RightCol)
                    {
                        if (scope.LeftCol <= locColmn && locColmn <= scope.RightCol)
                        {
                            availableLst.Add(dev);
                        }
                    }
                }
            }
            #endregion
            if (availableLst.Count == 1)
            {
                return(availableLst[0]);
            }
            else if (availableLst.Count == 2)
            {
                List <Device> freeLst = availableLst.FindAll(d => d.TaskID == 0);
                if (freeLst.Count == 1)
                {
                    Device dev = freeLst[0];
                    if (dev.Region == hall.Region)
                    {
                        return(dev);
                    }
                    Device other = availableLst.FirstOrDefault(d => d.TaskID != 0);
                    if (other != null)
                    {
                        #region 另一ETV在忙,判断当前闲的ETV,是否可达车厅来装载,如果可以,则允许下发
                        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动作
                                    return(dev);
                                }
                                #endregion
                            }
                            else
                            {
                                #region 1#TV 空闲
                                if (hallColmn <= toCol - 3)
                                {
                                    //2#车厅不在范围内,则允许1#ETV动作
                                    return(dev);
                                }
                                #endregion
                            }
                        }
                        #endregion
                    }
                }
                //有两个空闲或,两个忙时,都优先分配车厅所在区域的ETV
                List <Device> orderbyLst = availableLst.OrderBy(d => Math.Abs(d.Region - hall.Region)).ToList();
                return(orderbyLst[0]);
            }
            return(null);
        }
Example #8
0
        /// <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);
        }
Example #9
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);
        }
Example #10
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);
        }