Fix TimeOut Api
This commit is contained in:
		| @@ -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); | ||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user