public Guid IniciarRequisicao(Guid clienteID, double clienteLatitude, double clienteLongitude, MetodoBuscaTaxi metodo, out TimeSpan processTime) { Cliente cliente = new ClienteRepository().Obter(clienteID); if (cliente != null) { Requisicao atendimento = new Requisicao(); atendimento.ID = Guid.NewGuid(); atendimento.Cliente = cliente; atendimento.Cliente.PosicaoAtual = new Localizacao(); atendimento.Cliente.PosicaoAtual.Latitude = clienteLatitude; atendimento.Cliente.PosicaoAtual.Longitude = clienteLongitude; atendimento.Cliente.PosicaoAtual.Data = DateTime.Now; atendimento.DataRequisicao = DateTime.Now; return(this.DefinirAtendimento(atendimento, metodo, out processTime)); } else { throw new ClienteNaoEncontradoException(); } }
private Guid DefinirAtendimento(Requisicao atendimento, MetodoBuscaTaxi metodo) { TimeSpan time = new TimeSpan(); return(DefinirAtendimento(atendimento, metodo, out time)); }
private Guid DefinirAtendimento(Requisicao atendimento, MetodoBuscaTaxi metodo, out TimeSpan processTime) { processTime = new TimeSpan(); DateTime beginTime; Taxista taxista = null; switch (metodo) { case MetodoBuscaTaxi.GPS: beginTime = DateTime.Now; taxista = this.ObterTaxiLivreMaisProximo(atendimento.Cliente.PosicaoAtual); processTime = DateTime.Now.Subtract(beginTime); break; case MetodoBuscaTaxi.BROADCASTING: beginTime = DateTime.Now; taxista = this.ObterTaxiLivrePeloMetodoBroadcasting(atendimento.Cliente.PosicaoAtual); processTime = DateTime.Now.Subtract(beginTime); break; case MetodoBuscaTaxi.DISTANCIA_EUCLIDIANA: beginTime = DateTime.Now; taxista = this.ObterTaxiLivrePorDistanciaEuclidiana(atendimento.Cliente.PosicaoAtual); processTime = DateTime.Now.Subtract(beginTime); break; case MetodoBuscaTaxi.OTIMIZACAO: break; default: taxista = this.ObterTaxiLivreMaisProximo(atendimento.Cliente.PosicaoAtual); break; } if (taxista != null && _filaEspera.Count <= 0) { taxista.Status = StatusTaxista.EmAtendimento; atendimento.Status = StatusRequisicao.RequisicaoRealizada; //libera o taxista anterior (caso onde o taxista escolhido anteriormente recusou) if (atendimento.Taxista != null) { atendimento.Taxista.Status = StatusTaxista.TaxiLivre; } atendimento.Taxista = taxista; //adiciona a lista de atendimentos _requisicoes.Add(atendimento); } else { //se não houver taxistas, a requisição aguarda na fila atendimento.Status = StatusRequisicao.EmProcessamento; //libera o taxista anterior e define remove taxista da responsabilidade if (atendimento.Taxista != null) { atendimento.Taxista.Status = StatusTaxista.TaxiLivre; atendimento.Taxista = null; } _filaEspera.Add(atendimento); //adiciona a fila de espera throw new NenhumTaxiParaAtenderRequisicaoException(); } return(atendimento.ID); }
public DirectionsPoco RequisitarTaxi(Guid codigoCliente, double latitude, double longitude, MetodoBuscaTaxi metodo) { try { TimeSpan processTime = new TimeSpan(); OFMS ofms = OFMS.GetInstance(); ofms.IniciarRequisicao(codigoCliente, latitude, longitude, metodo, out processTime); DirectionsPoco poco = ofms.ObterPrevisaoAtendimento(codigoCliente); ofms.CancelarRequisicao(codigoCliente); if (poco != null) { poco.ProcessTime = processTime; } return(poco); } catch (GoogleMapsApiException gmaex) { return(new DirectionsPoco() { STATUS_CODE = gmaex.Message }); } }