public async Task <Pedido> RealizarPedido(PedidoDTO pedidoDto) { //var longlat = $"POINT({pedidoDto.Latitude} {pedidoDto.Longitude})".Replace(",", "."); try { var pedido = new Pedido(); pedido.Id = Guid.NewGuid(); pedido.DataHora = DateTime.Now; //pedido.LatLong = DbGeography.FromText(longlat); pedido.Latitude = pedidoDto.Latitude; pedido.Longitude = pedidoDto.Longitude; pedido.Peso = pedidoDto.Peso; pedido.StatusPedido = StatusPedido.aguardandoAprovacao; //using (var trans = new TransactionScope()) //{ //Verificar a distância entre Origem e Destindo (Pedido) var distance = new Coordinates(latitude, longitude) .DistanceTo( new Coordinates(pedido.Latitude, pedido.Longitude), UnitOfLength.Kilometers ); var drones = await _droneRepository.GetDisponiveis(); //Verificar drones, que possuem autonomia de ida e volta //Qual automomia atual do drone = (Autonomia * Carga) / 100 //Temos que pegar os Drones com AA >= Distancia do Pedido * 2 var dronesDispAutonomia = drones?.Where(x => (((x.Autonomia * x.Carga) / 100) * x.Velocidade) >= (distance * 2))?.ToList(); //Dos Drones com autonomia, quais podem carregar o peso do pedido var dronesComCapacidade = dronesDispAutonomia?.Where(x => x.Capacidade >= pedido.Peso)?.ToList(); //Caso dronesComCapacidade não seja nulo e contenha objetos (drone), pode ser responsável pela entrega if (dronesComCapacidade != null && dronesComCapacidade.Count() > 0) { var drone = dronesComCapacidade.FirstOrDefault(); pedido.Drone = drone; pedido.StatusPedido = StatusPedido.despachado; drone.StatusDrone = StatusDrone.emTrajeto; await _pedidoRepository.AddPedido(pedido); await _droneRepository.UpdateDrone(drone); } else { pedido.StatusPedido = StatusPedido.reprovado; await _pedidoRepository.AddPedido(pedido); } //trans.Complete(); return(pedido); //} } catch (Exception ex) { throw; } }
public async Task EnviarPedidos() { try { List <Pedido> listaPedidos = await _pedidoRepository.ListarPedidos(); List <Drone> drones = await _droneRepository.GetDisponiveis(); foreach (Drone drone in drones) { double droneAutonomia = drone.Autonomia; int droneCapacidade = drone.Capacidade; foreach (Pedido pedido in listaPedidos) { if (droneAutonomia >= pedido.DistanciaParaDestino && droneCapacidade >= pedido.Peso) { 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); droneAutonomia -= pedido.DistanciaParaDestino; droneCapacidade -= pedido.Peso; } } } } catch (Exception ex) { throw ex; } }