Пример #1
0
        /// <summary>
        /// 根据交易信息分配运输车
        /// 1.取货轨道是否有车
        /// 2.卸货轨道是否有车
        /// 3.摆渡车上是否有车
        /// 4.根据上下砖机轨道优先级逐轨道是否有车
        /// 5.对面储砖区域(上下砖机轨道对应的兄弟轨道是否有车)
        /// 6.对面区域摆渡车是否有车
        /// 7.对面砖机轨道是否有车
        /// </summary>
        /// <param name="trans"></param>
        /// <param name="carrierid"></param>
        /// <returns></returns>
        private bool GetTransInOutCarrier(StockTrans trans, DeviceTypeE ferrytype, out uint carrierid, out string result)
        {
            result    = "";
            carrierid = 0;
            if (trans.goods_id == 0)
            {
                return(false);
            }
            CarrierTypeE needtype = PubMaster.Goods.GetGoodsCarrierType(trans.goods_id);
            // 1.取货轨道是否有车[空闲,无货]
            CarrierTask carrier = DevList.Find(c => c.TrackId == trans.take_track_id && c.CarrierType == needtype);

            if (carrier == null && (trans.TransType == TransTypeE.出库 || trans.TransType == TransTypeE.手动出库))
            {
                uint brothertra = PubMaster.Track.GetBrotherTrackId(trans.take_track_id);
                carrier = DevList.Find(c => c.TrackId == brothertra &&
                                       c.CarrierType == needtype &&
                                       c.Task == DevCarrierTaskE.后退取砖);
            }

            if (carrier == null)
            {
                #region [2.卸货轨道是否有车[空闲,无货]]
                carrier = DevList.Find(c => c.TrackId == trans.give_track_id && c.CarrierType == needtype);
                #endregion

                #region [3.摆渡车上是否有车[空闲,无货]
                if (carrier == null)
                {
                    //3.1 获取能到达[取货/卸货]轨道的摆渡车的ID
                    List <uint> ferrytrackids = PubMaster.Area.GetFerryWithTrackInOut(ferrytype, trans.area_id, trans.take_track_id, trans.give_track_id, 0, true);

                    List <uint> loadcarferryids = new List <uint>();
                    foreach (uint fetraid in ferrytrackids)
                    {
                        uint ferryid = PubMaster.Device.GetFerryIdByFerryTrackId(fetraid);
                        if (PubTask.Ferry.IsLoad(ferryid))
                        {
                            loadcarferryids.Add(fetraid);
                        }
                    }

                    //3.2 获取在摆渡车上的车[空闲,无货]
                    List <CarrierTask> carriers = DevList.FindAll(c => !c.IsLogicAlert() && loadcarferryids.Contains(c.TrackId) && c.CarrierType == needtype);
                    if (carriers.Count > 0)
                    {
                        //如何判断哪个摆渡车最右
                        foreach (CarrierTask car in carriers)
                        {
                            //小车:没有任务绑定
                            if (!PubTask.Trans.HaveInCarrier(car.ID))
                            {
                                switch (trans.TransType)
                                {
                                case TransTypeE.入库:
                                    //空闲,没货,没任务
                                    if (CheckCarrierFreeNotLoad(car))
                                    {
                                        carrierid = car.ID;
                                        return(true);
                                    }
                                    break;

                                case TransTypeE.出库:
                                    //空闲,没任务
                                    if (CheckCarrierFreeNoTask(car))
                                    {
                                        carrierid = car.ID;
                                        return(true);
                                    }
                                    break;

                                case TransTypeE.倒库:
                                    break;

                                case TransTypeE.其他:
                                    break;

                                default:
                                    break;
                                }
                            }
                        }
                    }
                }
                #endregion
            }
            //前面找到车了,如果空闲则分配,否则等待



            if (carrier != null)
            {
                switch (trans.TransType)
                {
                case TransTypeE.入库:
                case TransTypeE.手动入库:
                    if (CheckCarrierFreeNotLoad(carrier))
                    {
                        carrierid = carrier.ID;
                        return(true);
                    }
                    break;

                case TransTypeE.出库:
                case TransTypeE.手动出库:
                    if (!carrier.IsWorking)
                    {
                        return(false);
                    }
                    if (carrier.ConnStatus == SocketConnectStatusE.通信正常 &&
                        carrier.OperateMode == DevOperateModeE.自动)
                    {
                        if (carrier.Status == DevCarrierStatusE.停止
                            //&& carrier.WorkMode == DevCarrierWorkModeE.生产模式
                            && (carrier.Task == carrier.FinishTask || carrier.Task == DevCarrierTaskE.无))
                        {
                            carrierid = carrier.ID;
                            return(true);
                        }

                        if (carrier.Task == DevCarrierTaskE.后退取砖 && carrier.FinishTask == DevCarrierTaskE.无)
                        {
                            carrierid = carrier.ID;
                            return(true);
                        }
                    }

                    if (CheckCarrierFreeNoTask(carrier))
                    {
                        carrierid = carrier.ID;
                        return(true);
                    }
                    break;

                case TransTypeE.倒库:
                    break;

                case TransTypeE.其他:
                    break;

                default:
                    break;
                }
            }
            #region [找其他轨道]
            else
            {
                List <uint> trackids = PubMaster.Area.GetTileTrackIds(trans);
                foreach (uint traid in trackids)
                {
                    if (!PubMaster.Track.IsStoreType(traid))
                    {
                        continue;
                    }
                    List <CarrierTask> tasks = DevList.FindAll(c => c.TrackId == traid);
                    if (tasks.Count > 0)
                    {
                        if (tasks.Count > 1)
                        {
                            continue;
                        }
                        if (CheckCarrierFreeNotLoad(tasks[0]) &&
                            tasks[0].CarrierType == needtype &&
                            !PubTask.Trans.HaveInCarrier(tasks[0].ID)
                            )
                        {
                            carrierid = tasks[0].ID;
                            return(true);
                        }
                    }
                }
            }
            #endregion

            return(false);
        }
Пример #2
0
        /// <summary>
        /// 分配倒库小车
        /// </summary>
        /// <param name="trans"></param>
        /// <param name="carrierid"></param>
        /// <param name="result"></param>
        /// <returns></returns>
        private bool GetTransSortCarrier(StockTrans trans, out uint carrierid, out string result)
        {
            result    = "";
            carrierid = 0;
            if (trans.goods_id == 0)
            {
                return(false);
            }
            CarrierTypeE needtype = PubMaster.Goods.GetGoodsCarrierType(trans.goods_id);

            // 1.倒库空轨道是否有车[空闲,无货]
            CarrierTask carrier = DevList.Find(c => c.TrackId == trans.give_track_id && c.CarrierType == needtype);

            #region [2.摆渡车上是否有车[空闲,无货]
            if (carrier == null)
            {
                //3.1获取能到达[空轨道]轨道的上砖摆渡车的轨道ID
                List <uint> ferrytrackids = PubMaster.Area.GetFerryWithTrackInOut(DeviceTypeE.摆渡, trans.area_id, 0, trans.give_track_id, 0, true);
                //3.2获取在摆渡轨道上的车[空闲,无货]
                List <CarrierTask> carriers = DevList.FindAll(c => ferrytrackids.Contains(c.TrackId) && c.CarrierType == needtype);
                if (carriers.Count > 0)
                {
                    //如何判断哪个摆渡车最右
                    foreach (CarrierTask car in carriers)
                    {
                        //小车:没有任务绑定
                        if (!PubTask.Trans.HaveInCarrier(car.ID))
                        {
                            //空闲,没货,没任务
                            if (CheckCarrierFreeNotLoad(car))
                            {
                                carrierid = car.ID;
                                return(true);
                            }
                        }
                    }
                }
            }

            #region [2.满砖轨道是否有车[空闲,无货]]
            //if (carrier == null)
            //{
            //    carrier = DevList.Find(c => c.TrackId == trans.take_track_id);
            //}
            #endregion

            #endregion

            //前面找到车了,如果空闲则分配,否则等待
            if (carrier != null)
            {
                if (CheckCarrierFreeNotLoad(carrier))
                {
                    carrierid = carrier.ID;
                    return(true);
                }
            }
            #region [直接找车]
            else
            {
                if (trans.area_id != 0)
                {
                    List <AreaDevice> areatras = PubMaster.Area.GetAreaDevList(trans.area_id, DeviceTypeE.运输车);
                    foreach (AreaDevice areatra in areatras)
                    {
                        CarrierTask task = DevList.Find(c => c.ID == areatra.device_id && c.CarrierType == needtype);
                        if (task != null && CheckCarrierFreeNotLoad(task) &&
                            PubMaster.Track.IsTrackType(task.TrackId, TrackTypeE.储砖_出))
                        {
                            carrierid = task.ID;
                            return(true);
                        }
                    }
                }
            }
            #endregion

            return(false);
        }