From eed8d2f06529a6f1a34224b4da9a75e0dadd7563 Mon Sep 17 00:00:00 2001 From: dmolinari Date: Sun, 17 Aug 2025 20:31:25 -0300 Subject: [PATCH] Fix TimeOut Api --- .../src/Elecciones.Worker/Worker.cs | 61 ++++++++++--------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/Elecciones-Web/src/Elecciones.Worker/Worker.cs b/Elecciones-Web/src/Elecciones.Worker/Worker.cs index caa6297..be5a5b6 100644 --- a/Elecciones-Web/src/Elecciones.Worker/Worker.cs +++ b/Elecciones-Web/src/Elecciones.Worker/Worker.cs @@ -34,15 +34,12 @@ public class Worker : BackgroundService { _logger.LogInformation("Elecciones Worker iniciado a las: {time}", DateTimeOffset.Now); - // 1. SINCRONIZACIÓN INICIAL: Se ejecuta una vez al iniciar el worker para - // asegurar que la base de datos local tenga todos los catálogos maestros. await SincronizarCatalogosMaestrosAsync(stoppingToken); _logger.LogInformation("-------------------------------------------------"); _logger.LogInformation("Iniciando sondeo periódico de resultados..."); _logger.LogInformation("-------------------------------------------------"); - // 2. BUCLE DE SONDEO: Se ejecuta continuamente hasta que se detenga la aplicación. while (!stoppingToken.IsCancellationRequested) { var authToken = await _apiService.GetAuthTokenAsync(); @@ -53,13 +50,23 @@ public class Worker : BackgroundService continue; } - await Task.WhenAll( - SondearResultadosMunicipalesAsync(authToken, stoppingToken), - SondearProyeccionBancasAsync(authToken, stoppingToken), - SondearNuevosTelegramasAsync(authToken, stoppingToken), - SondearResumenProvincialAsync(authToken, stoppingToken), - SondearEstadoRecuentoGeneralAsync(authToken, stoppingToken) - ); + // --- CAMBIO CLAVE: DE PARALELO A SECUENCIAL --- + // Se elimina Task.WhenAll y se ejecutan las tareas una después de la otra. + // Esto previene los errores de Gateway Timeout (504). + _logger.LogInformation("--- Iniciando sondeo de Resultados Municipales ---"); + await SondearResultadosMunicipalesAsync(authToken, stoppingToken); + + _logger.LogInformation("--- Iniciando sondeo de Proyección de Bancas ---"); + await SondearProyeccionBancasAsync(authToken, stoppingToken); + + _logger.LogInformation("--- Iniciando sondeo de Nuevos Telegramas ---"); + await SondearNuevosTelegramasAsync(authToken, stoppingToken); + + _logger.LogInformation("--- Iniciando sondeo de Resumen Provincial ---"); + await SondearResumenProvincialAsync(authToken, stoppingToken); + + _logger.LogInformation("--- Iniciando sondeo de Estado de Recuento General ---"); + await SondearEstadoRecuentoGeneralAsync(authToken, stoppingToken); try { @@ -117,13 +124,18 @@ public class Worker : BackgroundService // --- 2. SINCRONIZAR ÁMBITOS Y AGRUPACIONES POR CADA CATEGORÍA --- - // CORRECCIÓN: La siguiente línea faltaba por completo, causando el error CS0103. - // Carga todos los ámbitos existentes en un diccionario para una verificación rápida. - var ambitosEnDb = await dbContext.AmbitosGeograficos.ToDictionaryAsync( - a => (a.DistritoId, a.SeccionId, a.MunicipioId, a.CircuitoId, a.EstablecimientoId), - a => a, - stoppingToken - ); + var ambitosEnDb = new Dictionary(); + var todosLosAmbitos = await dbContext.AmbitosGeograficos.ToListAsync(stoppingToken); + + foreach (var ambito in todosLosAmbitos) + { + // Creamos una clave única que SIEMPRE funciona, incluso con nulos. + string clave = $"{ambito.NivelId}|{ambito.DistritoId}|{ambito.SeccionProvincialId}|{ambito.SeccionId}|{ambito.MunicipioId}|{ambito.CircuitoId}|{ambito.EstablecimientoId}|{ambito.MesaId}"; + if (!ambitosEnDb.ContainsKey(clave)) + { + ambitosEnDb.Add(clave, ambito); + } + } var agrupacionesEnDb = await dbContext.AgrupacionesPoliticas.ToDictionaryAsync(a => a.Id, a => a, stoppingToken); @@ -135,18 +147,11 @@ public class Worker : BackgroundService var catalogoDto = await _apiService.GetCatalogoAmbitosAsync(authToken, categoria.CategoriaId); if (catalogoDto != null) { - // SINCRONIZAR ÁMBITOS foreach (var ambitoDto in catalogoDto.Ambitos) { - var claveUnica = ( - ambitoDto.CodigoAmbitos.DistritoId, - ambitoDto.CodigoAmbitos.SeccionId, - ambitoDto.CodigoAmbitos.MunicipioId, - ambitoDto.CodigoAmbitos.CircuitoId, - ambitoDto.CodigoAmbitos.EstablecimientoId - ); + // Volvemos a generar la misma clave única para la comparación + string claveUnica = $"{ambitoDto.NivelId}|{ambitoDto.CodigoAmbitos.DistritoId}|{ambitoDto.CodigoAmbitos.SeccionProvincialId}|{ambitoDto.CodigoAmbitos.SeccionId}|{ambitoDto.CodigoAmbitos.MunicipioId}|{ambitoDto.CodigoAmbitos.CircuitoId}|{ambitoDto.CodigoAmbitos.EstablecimientoId}|{ambitoDto.CodigoAmbitos.MesaId}"; - // Aquí se usaba 'ambitosEnDb' sin haberlo declarado. Ahora funciona. if (!ambitosEnDb.ContainsKey(claveUnica)) { var nuevoAmbito = new AmbitoGeografico @@ -154,14 +159,14 @@ public class Worker : BackgroundService Nombre = ambitoDto.Nombre, NivelId = ambitoDto.NivelId, DistritoId = ambitoDto.CodigoAmbitos.DistritoId, + SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId, SeccionId = ambitoDto.CodigoAmbitos.SeccionId, MunicipioId = ambitoDto.CodigoAmbitos.MunicipioId, CircuitoId = ambitoDto.CodigoAmbitos.CircuitoId, EstablecimientoId = ambitoDto.CodigoAmbitos.EstablecimientoId, - SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId + MesaId = ambitoDto.CodigoAmbitos.MesaId, }; dbContext.AmbitosGeograficos.Add(nuevoAmbito); - // Se añade al diccionario en memoria para evitar duplicados en el mismo ciclo. ambitosEnDb.Add(claveUnica, nuevoAmbito); } }