示例#1
0
        private void AsignarVehiculos()
        {
            foreach (PlanillaHorariaBE planilla in _planillasGeneradas)
            {
                // Busco un vehiculo (no asignado a otra planilla) que haya terminado su recorrido el día anterior
                // en la terminal de origen del primer viaje del día
                VehiculoBE vehiculo =
                    _vehiculos.Where(v => Vehiculo.ObtenerUltimoEstacionamiento(v).Id == planilla.Viajes[0].TerminalOrigen.Id &&
                                     !_planillasGeneradas.Any(p => p.Vehiculo != null && p.Vehiculo.Id == v.Id)).FirstOrDefault();

                if (vehiculo != null)
                {
                    planilla.Vehiculo = vehiculo;
                }
            }

            // A las planillas que todavía quedaron sin vehículo, les busco alguno en las terminales cercanas
            List <PlanillaHorariaBE> planillasSinVehiculo = _planillasGeneradas.Where(p => p.Vehiculo == null).ToList();
            int indiceCercania = -1;

            while (planillasSinVehiculo.Count > 0)
            {
                indiceCercania++;
                bool hayTerminales = true;
                foreach (PlanillaHorariaBE planilla in planillasSinVehiculo)
                {
                    TerminalBE terminalCercana = Terminal.ObtenerTerminalCercana(planilla.Viajes[0].TerminalOrigen, indiceCercania);
                    if (terminalCercana != null)
                    {
                        VehiculoBE vehiculo =
                            _vehiculos.Where(v => Vehiculo.ObtenerUltimoEstacionamiento(v).Id == terminalCercana.Id &&
                                             !_planillasGeneradas.Any(p => p.Vehiculo != null && p.Vehiculo.Id == v.Id)).FirstOrDefault();

                        if (vehiculo != null)
                        {
                            planilla.Vehiculo = vehiculo;
                        }
                    }
                    else
                    {
                        // Ya no hay más terminales por verificar (no debería suceder nunca)
                        hayTerminales = false;
                        break;
                    }
                }

                if (!hayTerminales)
                {
                    break;
                }

                planillasSinVehiculo = _planillasGeneradas.Where(p => p.Vehiculo == null).ToList();
            }
        }
示例#2
0
        public static TerminalBE ObtenerTerminalCercana(TerminalBE terminalReferencia, int indiceCercania)
        {
            if (terminales == null)
            {
                terminales = TerminalDAL.ListarTodas();
            }

            if (indiceCercania >= terminales.Count - 1)
            {
                return(null);
            }

            GeoCoordinate ubicacion = new GeoCoordinate(terminalReferencia.Latitud, terminalReferencia.Longitud);

            // Las ordeno por distancia
            List <TerminalBE> terminalesOrdenadas = terminales.Where(t => t.Id != terminalReferencia.Id).Select(t => new
            {
                Distancia = ubicacion.GetDistanceTo(new GeoCoordinate(t.Latitud, t.Longitud)),
                Terminal  = t
            }).OrderBy(x => x.Distancia).Select(x => x.Terminal).ToList();

            return(terminalesOrdenadas[indiceCercania]);
        }