Пример #1
0
        public async Task <Pedido> GetById(Guid id)
        {
            var pedido = await _repositoryPedido.GetById(id);

            if (pedido.DroneId.GetValueOrDefault() > 0)
            {
                pedido.Drone = await _droneRepository.GetById(pedido.DroneId.GetValueOrDefault());
            }

            return(pedido);
        }
Пример #2
0
        public async Task <ActionResult <Drone> > GetDrone(int id)
        {
            var drone = await _droneRepository.GetById(id);

            if (drone == null)
            {
                return(NotFound());
            }

            return(drone);
        }
Пример #3
0
 void AddDrone()
 {
     foreach (var drone in droneData)
     {
         var d = _droneRepository.GetById(drone.Id).Result;
         if (d == null)
         {
             _droneRepository.AddDrone(drone).Wait();
         }
     }
 }
        public void TestaAtualizaDrone(int id, int capacidade, int velocidade, int autonomia, int carga, StatusDrone status)
        {
            var drone = _droneRepository.GetById(id).Result;

            drone.Capacidade  = capacidade;
            drone.Velocidade  = velocidade;
            drone.Autonomia   = autonomia;
            drone.Carga       = carga;
            drone.StatusDrone = status;
            _droneRepository.UpdateDrone(drone).Wait();
        }
Пример #5
0
        private async Task distribuirPedidos()
        {
            // pedidos mais antigos vao primeiro
            var pedidos = await _repositoryPedido.GetPedidosEmAberto();

            if (!pedidos.Any())
            {
                return;
            }

            var droneItinerarios = _droneItinerarioRepository.GetAll().Result
                                   .Where(d => d.StatusDrone == EnumStatusDrone.Disponivel)
                                   .ToList();

            foreach (var droneItinerario in droneItinerarios)
            {
                droneItinerario.Drone = await _droneRepository.GetById(droneItinerario.DroneId);
            }

            var dronesDisponiveis = droneItinerarios.Select(d => d.Drone).OrderByDescending(d => d.Capacidade).ToList();

            if (!dronesDisponiveis.Any())
            {
                return;
            }

            IDictionary <Drone, IList <Pedido> > pedidosPorDrone = new Dictionary <Drone, IList <Pedido> >();
            IList <Pedido> pedidosEntregar      = new List <Pedido>();
            IList <Pedido> pedidosDistribuidos  = new List <Pedido>();
            double         distanciaTrajeto     = 0;
            double         distanciaRetorno     = 0;
            double         distanciaPercorrida  = 0;
            double         distanciaTotal       = 0;
            double         latitudeOrigem       = 0;
            double         longitudeOrigem      = 0;
            int            tempoTrajetoCompleto = 0;

            foreach (var drone in dronesDisponiveis)
            {
                pedidosEntregar.Clear();

                distanciaTrajeto     = 0;
                distanciaRetorno     = 0;
                distanciaPercorrida  = 0;
                distanciaTotal       = 0;
                latitudeOrigem       = 0;
                longitudeOrigem      = 0;
                tempoTrajetoCompleto = 0;

                int capacidadeDisponivel = drone.Capacidade;
                int autonomiaDisponivel  = drone.AutonomiaRestante;

                foreach (var pedido in pedidos)
                {
                    if (pedidosDistribuidos.Contains(pedido))
                    {
                        continue;
                    }

                    if (pedido.Peso <= capacidadeDisponivel)
                    {
                        if (pedidosEntregar.Any())
                        {
                            latitudeOrigem  = (double)pedidosEntregar.Last().Cliente.Latitude;
                            longitudeOrigem = (double)pedidosEntregar.Last().Cliente.Longitude;
                        }
                        else
                        {
                            latitudeOrigem  = _latitudeLoja;
                            longitudeOrigem = _longitudeLoja;
                        }

                        distanciaTrajeto = calcularDistanciaEmKilometros(latitudeOrigem, longitudeOrigem, (double)pedido.Cliente.Latitude, (double)pedido.Cliente.Longitude);
                        distanciaRetorno = calcularDistanciaEmKilometros((double)pedido.Cliente.Latitude, (double)pedido.Cliente.Longitude, _latitudeLoja, _longitudeLoja);

                        distanciaTotal = distanciaPercorrida + distanciaTrajeto + distanciaRetorno;

                        tempoTrajetoCompleto = calcularTempoTrajetoEmMinutos(distanciaTotal, drone.Velocidade);

                        if (tempoTrajetoCompleto <= drone.AutonomiaRestante)
                        {
                            pedidosEntregar.Add(pedido);

                            distanciaPercorrida += distanciaTrajeto;

                            capacidadeDisponivel -= pedido.Peso;
                            autonomiaDisponivel   = drone.AutonomiaRestante - tempoTrajetoCompleto;
                        }
                    }
                    else
                    {
                        continue;
                    }

                    // se não cabe mais, nao precisa verificar os demais pedidos
                    if (capacidadeDisponivel <= 0 || tempoTrajetoCompleto >= drone.AutonomiaRestante)
                    {
                        break;
                    }
                }

                if (pedidosEntregar.Any())
                {
                    drone.AutonomiaRestante = autonomiaDisponivel;

                    if (!pedidosPorDrone.ContainsKey(drone))
                    {
                        pedidosPorDrone.Add(drone, new List <Pedido>());
                    }

                    foreach (var pedido in pedidosEntregar)
                    {
                        pedidosPorDrone[drone].Add(pedido);
                    }

                    pedidosDistribuidos = pedidosDistribuidos.Concat(pedidosEntregar).ToList();
                }
            }

            if (pedidosPorDrone.Count > 0)
            {
                foreach (var item in pedidosPorDrone)
                {
                    Drone drone = item.Key;

                    DroneItinerario droneItinerario = droneItinerarios.Where(d => d.DroneId == drone.Id).FirstOrDefault();
                    droneItinerario.DataHora    = DateTime.Now;
                    droneItinerario.Drone       = drone;
                    droneItinerario.DroneId     = drone.Id;
                    droneItinerario.StatusDrone = EnumStatusDrone.EmTransito;

                    await _droneRepository.Update(drone);

                    await _droneItinerarioRepository.Update(droneItinerario);

                    foreach (var pedido in item.Value)
                    {
                        pedido.Drone  = drone;
                        pedido.Status = EnumStatusPedido.EmTransito;

                        await _repositoryPedido.Update(pedido);
                    }
                }
            }
        }
 public async Task <Drone> GetById(int id)
 {
     return(await _droneRepository.GetById(id));
 }