public void AddPedidoDrone()
        {
            List <Pedido> pedidos = _pedidoRepository.GetPedidos(StatusPedido.aguardandoEntrega).Result;
            List <Drone>  drones  = _droneRepository.GetDronesDisponiveis().Result;

            Drone  d = drones[0];
            Pedido p = pedidos[0];

            _pedidoRepository.AddPedidoDrone(new PedidoDrone
            {
                DroneId  = d.Id,
                PedidoId = p.Id
            }).Wait();

            List <Pedido> ps = _pedidoRepository.GetPedidos(StatusPedido.aguardandoEntrega).Result;

            Assert.True(ps.Any(p => p.PedidosDrones.Count > 0));
        }
예제 #2
0
        public async Task DistribuirPedido()
        {
            //Encontrar os Drones disponíveis
            var dronesDisponiveis = await _droneRepository.GetDronesDisponiveis();

            //Para cada Drone, verificar quais pedidos se encaixam na autonomia (Distância que pode percorrer) e peso
            foreach (var drone in dronesDisponiveis)
            {
                //Os pedidos precisam estar em uma distância em que o Drone possa ir e voltar, ou seja
                //Automomia do Drone dividido por 2
                var droneAutonomia = drone.AutonomiaEmKM / 2;
                var dronePeso      = drone.Capacidade;
                var pedidos        = await _pedidoRepository.GetPedidos(StatusPedido.aguardandoEntrega, droneAutonomia, dronePeso);

                //Varre os pedidos, e atribui ao Drone.
                //a cada atribuição, subtra-se a autonomia e peso do Drone, para ver se é possível
                //continuar atribuindo aos pedidos
                foreach (var pedido in pedidos)
                {
                    if (droneAutonomia >= pedido.DistanciaParaOrigem && dronePeso >= pedido.Peso)
                    {
                        //Vincula Pedido ao Drone, e atualiza status Drone e Pedido
                        drone.StatusDrone   = StatusDrone.emTrajeto;
                        pedido.StatusPedido = StatusPedido.despachado;
                        await _pedidoRepository.AddPedidoDrone(new PedidoDrone { Drone = drone, Pedido = pedido });

                        await _pedidoRepository.UpdatePedido(pedido);

                        await _droneRepository.UpdateDrone(drone);

                        //Subtrai a autonomia e peso, para ver se cabe outro pedido
                        droneAutonomia -= pedido.DistanciaParaOrigem;
                        dronePeso      -= pedido.Peso;
                    }
                }
            }
        }