/// <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); }
/// <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); }