public async Task <Drone> DroneDisponivel(Pedido pedido, IEnumerable <Drone> drones) { // temos que procurar drones disponiveis Drone droneDisponivel = null; Intinerario intinerario = null; foreach (var drone in drones) { var droneTemAutonomia = pedido.ValidarDistanciaEntrega(Utility.Utils.LATITUDE_INICIAL, Utility.Utils.LONGITUDE_INICIAL, drone.Velocidade, drone.Autonomia); var droneAceitaPeso = drone.VerificarDroneAceitaOPesoPedido(pedido.Peso); if (!droneTemAutonomia || !droneAceitaPeso) { continue; } intinerario = await _unitOfWork.Intinerarios.ObterAsync(drone.Id); if (drone.Status == DroneStatus.Livre) { droneDisponivel = drone; break; } if ((drone.Status == DroneStatus.EmAguardandoNovo) && pedido.RestantePeso(intinerario.PesoAtual) && drone.TraceRotaDrone(new Localizacao(pedido.Latitude, pedido.Longitude), new Localizacao(intinerario.Latitude, intinerario.Longitude), intinerario.AutonomiaAtual) && intinerario != null ) { droneDisponivel = drone; break; } } return(droneDisponivel); }
public static bool ValidadePesoTraceRota(Pedido pedido, Drone drone, Intinerario intinerario) { if ((drone.Status == DroneStatus.EmAguardandoNovo) && pedido.RestantePeso(intinerario.PesoAtual) && drone.TraceRotaDrone(new Localizacao(pedido.Latitude, pedido.Longitude), new Localizacao(intinerario.Latitude, intinerario.Longitude), intinerario.AutonomiaAtual) && intinerario != null ) { return(true); } return(false); }
public async Task GerenciarIntinerario(Drone drone, Intinerario intinerario, Pedido pedido, double autonomia) { if ((drone.Status == DroneStatus.EmAguardandoNovo || drone.Status == DroneStatus.EmCheckout) && intinerario != null) { intinerario.AutonomiaAtual += autonomia; intinerario.IdDrone = drone.Id; intinerario.PesoAtual += pedido.Peso; intinerario.Latitude = pedido.Latitude; intinerario.Longitude = pedido.Longitude; await _unitOfWork.Intinerarios.AtualizarAsync(intinerario); } else { await _unitOfWork.Intinerarios.AdicionarAsync(new Intinerario(drone.Id, pedido.Peso, autonomia, pedido.Latitude, pedido.Longitude)); } }
public async Task <bool> AdicionarAsync(PedidoModel pedidoModel) { var pedido = _mapper.Map <PedidoModel, Pedido>(pedidoModel); if (!pedido.ValidarPesoPedido(Utility.Utils.CARGA_MAXIMA)) { return(false); } // temos que procurar drones disponiveis Drone droneDisponivel = null; Intinerario intinerario = null; double RestanteAutonomia = 0; var drones = await _unitOfWork.Drones.ObterAsync(); ///-------------------------------Get drone------------------------------//// droneDisponivel = await application_Helpers.DroneDisponivel(pedido, drones); intinerario = await application_Helpers.GetIntinerarioAsync(pedido, drones); RestanteAutonomia = Application_Helpers.AutonomiaRestanteDrone(pedido, drones); if (droneDisponivel == null) { pedido.AtualizarStatusPedido(PedidoStatus.AguardandoEntrega); } else { pedido.Drone = droneDisponivel; pedido.AtualizarStatusPedido(PedidoStatus.EmEntrega); droneDisponivel.AtualizarStatusDrone(droneDisponivel.Status == DroneStatus.Livre ? DroneStatus.EmAguardandoNovo: DroneStatus.EmCheckout); await application_Helpers.GerenciarIntinerario(droneDisponivel, intinerario, pedido, RestanteAutonomia); } await _unitOfWork.Pedidos.AdicionarAsync(pedido); await _unitOfWork.SaveAsync(); return(true); }
public async Task <Intinerario> GetIntinerarioAsync(Pedido pedido, IEnumerable <Drone> drones) { Intinerario intinerario = null; foreach (var drone in drones) { intinerario = await _unitOfWork.Intinerarios.ObterAsync(drone.Id); if (drone.Status == DroneStatus.Livre) { break; } if ((drone.Status == DroneStatus.EmAguardandoNovo) && pedido.RestantePeso(intinerario.PesoAtual) && drone.TraceRotaDrone(new Localizacao(pedido.Latitude, pedido.Longitude), new Localizacao(intinerario.Latitude, intinerario.Longitude), intinerario.AutonomiaAtual) && intinerario != null ) { break; } } return(intinerario); }
public async Task AtualizarAsync(Intinerario intinerario) { _context.Entry(intinerario).State = EntityState.Modified; await _context.SaveChangesAsync(); }
public async Task AdicionarAsync(Intinerario intinerario) { await _context.Intinerarios.AddAsync(intinerario); await _context.SaveChangesAsync(); }