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)); }
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; } } } }