Feat Prototipos Widgets y Fix Worker Telegramas
This commit is contained in:
@@ -237,8 +237,6 @@ public class LowPriorityDataWorker : BackgroundService
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Sondea la proyección de bancas a nivel Provincial y por Sección Electoral.
|
||||
/// Esta versión es completamente robusta: maneja respuestas de API vacías o con fechas mal formadas,
|
||||
@@ -410,21 +408,16 @@ public class LowPriorityDataWorker : BackgroundService
|
||||
|
||||
if (!partidos.Any() || !categorias.Any()) return;
|
||||
|
||||
// --- LÓGICA DE GOTEO LENTO ---
|
||||
// Procesamos una combinación (partido/categoría) a la vez.
|
||||
foreach (var partido in partidos)
|
||||
{
|
||||
foreach (var categoria in categorias)
|
||||
{
|
||||
// Si la aplicación se apaga, salimos inmediatamente.
|
||||
if (stoppingToken.IsCancellationRequested) return;
|
||||
|
||||
// Obtenemos la lista de IDs.
|
||||
var listaTelegramasApi = await _apiService.GetTelegramasTotalizadosAsync(authToken, partido.DistritoId!, partido.SeccionId!, categoria.Id);
|
||||
|
||||
if (listaTelegramasApi is { Count: > 0 })
|
||||
{
|
||||
// Usamos un DbContext propio para este bloque para asegurar que los cambios se guarden.
|
||||
using var innerScope = _serviceProvider.CreateScope();
|
||||
var innerDbContext = innerScope.ServiceProvider.GetRequiredService<EleccionesDbContext>();
|
||||
|
||||
@@ -439,7 +432,6 @@ public class LowPriorityDataWorker : BackgroundService
|
||||
{
|
||||
_logger.LogInformation("Se encontraron {count} telegramas nuevos en '{partido}' para '{cat}'. Descargando...", nuevosTelegramasIds.Count, partido.Nombre, categoria.Nombre);
|
||||
|
||||
// Descargamos los archivos de uno en uno, con una pausa entre cada uno.
|
||||
foreach (var mesaId in nuevosTelegramasIds)
|
||||
{
|
||||
if (stoppingToken.IsCancellationRequested) return;
|
||||
@@ -447,24 +439,37 @@ public class LowPriorityDataWorker : BackgroundService
|
||||
var telegramaFile = await _apiService.GetTelegramaFileAsync(authToken, mesaId);
|
||||
if (telegramaFile != null)
|
||||
{
|
||||
var nuevoTelegrama = new Telegrama
|
||||
// --- INICIO DE LA CORRECCIÓN ---
|
||||
// 1. Buscamos el AmbitoGeografico específico de la MESA que estamos procesando.
|
||||
var ambitoMesa = await innerDbContext.AmbitosGeograficos
|
||||
.AsNoTracking()
|
||||
.FirstOrDefaultAsync(a => a.MesaId == mesaId, stoppingToken);
|
||||
|
||||
// 2. Solo guardamos el telegrama si encontramos su ámbito de mesa correspondiente.
|
||||
if (ambitoMesa != null)
|
||||
{
|
||||
Id = telegramaFile.NombreArchivo,
|
||||
AmbitoGeograficoId = partido.Id,
|
||||
ContenidoBase64 = telegramaFile.Imagen,
|
||||
FechaEscaneo = DateTime.Parse(telegramaFile.FechaEscaneo).ToUniversalTime(),
|
||||
FechaTotalizacion = DateTime.Parse(telegramaFile.FechaTotalizacion).ToUniversalTime()
|
||||
};
|
||||
await innerDbContext.Telegramas.AddAsync(nuevoTelegrama, stoppingToken);
|
||||
var nuevoTelegrama = new Telegrama
|
||||
{
|
||||
Id = telegramaFile.NombreArchivo,
|
||||
// 3. Usamos el ID del ÁMBITO DE LA MESA, no el del municipio.
|
||||
AmbitoGeograficoId = ambitoMesa.Id,
|
||||
ContenidoBase64 = telegramaFile.Imagen,
|
||||
FechaEscaneo = DateTime.Parse(telegramaFile.FechaEscaneo).ToUniversalTime(),
|
||||
FechaTotalizacion = DateTime.Parse(telegramaFile.FechaTotalizacion).ToUniversalTime()
|
||||
};
|
||||
await innerDbContext.Telegramas.AddAsync(nuevoTelegrama, stoppingToken);
|
||||
}
|
||||
else
|
||||
{
|
||||
_logger.LogWarning("No se encontró un ámbito geográfico para la mesa con MesaId {MesaId}. El telegrama no será guardado.", mesaId);
|
||||
}
|
||||
// --- FIN DE LA CORRECCIÓN ---
|
||||
}
|
||||
// PAUSA DELIBERADA: Esperamos un poco para no parecer un bot.
|
||||
await Task.Delay(250, stoppingToken); // 250ms de espera = 4 peticiones/segundo máximo.
|
||||
await Task.Delay(250, stoppingToken);
|
||||
}
|
||||
await innerDbContext.SaveChangesAsync(stoppingToken);
|
||||
}
|
||||
}
|
||||
|
||||
// PAUSA DELIBERADA: Esperamos un poco entre cada consulta de lista de telegramas.
|
||||
await Task.Delay(100, stoppingToken);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user