Ejemplo n.º 1
0
        public async Task <DroneStatusDto> GetAvailiableDroneAsync(double distance, Pedido pedido)
        {
            var drones = (await _pedidoDroneRepository.RetornaPedidosEmAbertoAsync())
                         .Select(d => new
            {
                distance = _coordinateService.GetKmDistance(pedido.GetPoint(), pedido.GetPoint()),
                droneId  = d.DroneId
            }).OrderBy(p => p.distance);


            if (drones.FirstOrDefault() != null)
            {
                foreach (var drone in drones)
                {
                    var pedidosDrone = await _pedidoDroneRepository.RetornarPedidosPorDrone(drone.droneId);

                    var pesoAux = 0;

                    foreach (var pedDrone in pedidosDrone)
                    {
                        var pedidoTemp = await _pedidoRepository.FindByIdAsync(pedDrone.PedidoId);

                        pesoAux += pedidoTemp.Peso;
                    }

                    var resultado = _droneRepository.RetornaDroneStatus(drone.droneId);
                    resultado.SomaPeso = pesoAux;

                    if (ConsegueCarregar(resultado, drone.distance, distance, pedido))
                    {
                        return(resultado);
                    }
                    else
                    {
                        var distanciaPedido = resultado.SomaDistancia + distance + drone.distance;

                        await _pedidoDroneRepository.UpdatePedidoDroneAsync(resultado, distanciaPedido);
                    }
                }
                return(null);
            }
            else
            {
                await FinalizaPedidosAsync();

                var drone = _droneRepository.RetornaDrone();
                return(new DroneStatusDto(drone));
            }
        }
        public async Task <DroneDto> DroneAtendePedido(Pedido pedido)
        {
            var originPoint = new Point();

            var distance = _coordinateService.GetKmDistance(originPoint, pedido.GetPoint());

            var drone = await _droneService.GetAvailiableDroneAsync(distance, pedido);

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

            return(new DroneDto(drone, distance));
        }
        public async Task TestDroneAtendePedidoQuandoDroneExiste()
        {
            var droneService = new DroneService(_coordinateService,
                                                _pedidoDroneRepository,
                                                _droneRepository,
                                                _pedidoRepository);
            var pedidoService = new PedidoService(droneService, _coordinateService);

            _coordinateService.GetKmDistance(Arg.Any <Point>(), Arg.Any <Point>())
            .Returns(10);
            _pedidoDroneRepository.RetornaPedidosEmAbertoAsync().Returns(SetupTests.GetPedidoDrones(StatusEnvio.AGUARDANDO));
            _droneRepository.RetornaDroneStatus(Arg.Any <int>())
            .Returns(SetupTests.GetDroneStatusDto());
            var drone = await pedidoService.DroneAtendePedido(SetupTests.GetPedido());

            Assert.True(drone != null);
        }
        /// <summary>
        /// Retorna os drones que podem ser utilizados para a entrega
        /// </summary>
        /// <param name="distance">Distancia entre o ponto de entrega e o endereço adicionado</param>
        /// <param name="pedido"></param>
        /// <returns></returns>
        public async Task <DroneStatusDto> GetAvailiableDroneAsync(double distance, Pedido pedido)
        {
            var drones = (await _pedidoDroneRepository.RetornaPedidosEmAberto())
                         .Select(d => new
            {
                distance = _coordinateService.GetKmDistance(d.Pedido.GetPoint(), pedido.GetPoint()),
                droneId  = d.DroneId
            }).OrderBy(p => p.distance);



            if (drones != null)
            {
                foreach (var drone in drones)
                {
                    var resultado = await _droneRepository.RetornaDroneStatus(drone.droneId).ConfigureAwait(false);

                    if (ConsegueCarregar(resultado, drone.distance, distance, pedido))
                    {
                        return(resultado);
                    }
                    else
                    {
                        var distanciaPedido = resultado.SomaDistancia + distance + drone.distance;
                        await _pedidoDroneRepository.UpdatePedidoDrone(resultado, distanciaPedido)
                        .ConfigureAwait(false);
                    }
                }
                return(null);
            }
            else
            {
                await FinalizaPedidosAsync();

                var drone = _droneRepository.RetornaDrone();
                return(new DroneStatusDto(drone));
            }
        }