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