예제 #1
0
        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);
        }
예제 #3
0
 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));
     }
 }
예제 #4
0
        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);
        }
예제 #5
0
        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();
        }