Fix TimeOut Api

This commit is contained in:
2025-08-17 20:31:25 -03:00
parent 258add9305
commit eed8d2f065

View File

@@ -34,15 +34,12 @@ public class Worker : BackgroundService
{ {
_logger.LogInformation("Elecciones Worker iniciado a las: {time}", DateTimeOffset.Now); _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); await SincronizarCatalogosMaestrosAsync(stoppingToken);
_logger.LogInformation("-------------------------------------------------"); _logger.LogInformation("-------------------------------------------------");
_logger.LogInformation("Iniciando sondeo periódico de resultados..."); _logger.LogInformation("Iniciando sondeo periódico de resultados...");
_logger.LogInformation("-------------------------------------------------"); _logger.LogInformation("-------------------------------------------------");
// 2. BUCLE DE SONDEO: Se ejecuta continuamente hasta que se detenga la aplicación.
while (!stoppingToken.IsCancellationRequested) while (!stoppingToken.IsCancellationRequested)
{ {
var authToken = await _apiService.GetAuthTokenAsync(); var authToken = await _apiService.GetAuthTokenAsync();
@@ -53,13 +50,23 @@ public class Worker : BackgroundService
continue; continue;
} }
await Task.WhenAll( // --- CAMBIO CLAVE: DE PARALELO A SECUENCIAL ---
SondearResultadosMunicipalesAsync(authToken, stoppingToken), // Se elimina Task.WhenAll y se ejecutan las tareas una después de la otra.
SondearProyeccionBancasAsync(authToken, stoppingToken), // Esto previene los errores de Gateway Timeout (504).
SondearNuevosTelegramasAsync(authToken, stoppingToken), _logger.LogInformation("--- Iniciando sondeo de Resultados Municipales ---");
SondearResumenProvincialAsync(authToken, stoppingToken), await SondearResultadosMunicipalesAsync(authToken, stoppingToken);
SondearEstadoRecuentoGeneralAsync(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 try
{ {
@@ -117,13 +124,18 @@ public class Worker : BackgroundService
// --- 2. SINCRONIZAR ÁMBITOS Y AGRUPACIONES POR CADA CATEGORÍA --- // --- 2. SINCRONIZAR ÁMBITOS Y AGRUPACIONES POR CADA CATEGORÍA ---
// CORRECCIÓN: La siguiente línea faltaba por completo, causando el error CS0103. var ambitosEnDb = new Dictionary<string, AmbitoGeografico>();
// Carga todos los ámbitos existentes en un diccionario para una verificación rápida. var todosLosAmbitos = await dbContext.AmbitosGeograficos.ToListAsync(stoppingToken);
var ambitosEnDb = await dbContext.AmbitosGeograficos.ToDictionaryAsync(
a => (a.DistritoId, a.SeccionId, a.MunicipioId, a.CircuitoId, a.EstablecimientoId), foreach (var ambito in todosLosAmbitos)
a => a, {
stoppingToken // 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); 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); var catalogoDto = await _apiService.GetCatalogoAmbitosAsync(authToken, categoria.CategoriaId);
if (catalogoDto != null) if (catalogoDto != null)
{ {
// SINCRONIZAR ÁMBITOS
foreach (var ambitoDto in catalogoDto.Ambitos) foreach (var ambitoDto in catalogoDto.Ambitos)
{ {
var claveUnica = ( // Volvemos a generar la misma clave única para la comparación
ambitoDto.CodigoAmbitos.DistritoId, 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}";
ambitoDto.CodigoAmbitos.SeccionId,
ambitoDto.CodigoAmbitos.MunicipioId,
ambitoDto.CodigoAmbitos.CircuitoId,
ambitoDto.CodigoAmbitos.EstablecimientoId
);
// Aquí se usaba 'ambitosEnDb' sin haberlo declarado. Ahora funciona.
if (!ambitosEnDb.ContainsKey(claveUnica)) if (!ambitosEnDb.ContainsKey(claveUnica))
{ {
var nuevoAmbito = new AmbitoGeografico var nuevoAmbito = new AmbitoGeografico
@@ -154,14 +159,14 @@ public class Worker : BackgroundService
Nombre = ambitoDto.Nombre, Nombre = ambitoDto.Nombre,
NivelId = ambitoDto.NivelId, NivelId = ambitoDto.NivelId,
DistritoId = ambitoDto.CodigoAmbitos.DistritoId, DistritoId = ambitoDto.CodigoAmbitos.DistritoId,
SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId,
SeccionId = ambitoDto.CodigoAmbitos.SeccionId, SeccionId = ambitoDto.CodigoAmbitos.SeccionId,
MunicipioId = ambitoDto.CodigoAmbitos.MunicipioId, MunicipioId = ambitoDto.CodigoAmbitos.MunicipioId,
CircuitoId = ambitoDto.CodigoAmbitos.CircuitoId, CircuitoId = ambitoDto.CodigoAmbitos.CircuitoId,
EstablecimientoId = ambitoDto.CodigoAmbitos.EstablecimientoId, EstablecimientoId = ambitoDto.CodigoAmbitos.EstablecimientoId,
SeccionProvincialId = ambitoDto.CodigoAmbitos.SeccionProvincialId MesaId = ambitoDto.CodigoAmbitos.MesaId,
}; };
dbContext.AmbitosGeograficos.Add(nuevoAmbito); dbContext.AmbitosGeograficos.Add(nuevoAmbito);
// Se añade al diccionario en memoria para evitar duplicados en el mismo ciclo.
ambitosEnDb.Add(claveUnica, nuevoAmbito); ambitosEnDb.Add(claveUnica, nuevoAmbito);
} }
} }