Пример #1
0
        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();
            }
        }
Пример #2
0
        private Guid DefinirAtendimento(Requisicao atendimento, MetodoBuscaTaxi metodo)
        {
            TimeSpan time = new TimeSpan();

            return(DefinirAtendimento(atendimento, metodo, out time));
        }
Пример #3
0
        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);
        }
Пример #4
0
        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
                });
            }
        }