Feat Se Añade Sondeo Resultados Nivel 50
This commit is contained in:
@@ -88,18 +88,15 @@ public class ElectoralApiService : IElectoralApiService
|
|||||||
return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<List<AgrupacionDto>>() : null;
|
return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<List<AgrupacionDto>>() : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<ResultadosDto?> GetResultadosAsync(string authToken, string distritoId, string? seccionId, string? municipioId, int categoriaId)
|
public async Task<ResultadosDto?> GetResultadosAsync(string authToken, string distritoId, string? seccionId, string? municipioId, int categoriaId, string? circuitoId = null)
|
||||||
{
|
{
|
||||||
using RateLimitLease lease = await _rateLimiter.AcquireAsync(1);
|
using RateLimitLease lease = await _rateLimiter.AcquireAsync(1);
|
||||||
if (!lease.IsAcquired) return null;
|
if (!lease.IsAcquired) return null;
|
||||||
|
|
||||||
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
|
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
|
||||||
|
|
||||||
// Construimos la URL base únicamente con los parámetros obligatorios.
|
|
||||||
var requestUri = $"/api/resultados/getResultados?distritoId={distritoId}&categoriaId={categoriaId}";
|
var requestUri = $"/api/resultados/getResultados?distritoId={distritoId}&categoriaId={categoriaId}";
|
||||||
|
|
||||||
// Añadimos 'seccionId' a la URL SOLO si tiene un valor válido.
|
|
||||||
// Esto evita que se genere el problemático "&seccionId=" cuando es nulo o vacío.
|
|
||||||
if (!string.IsNullOrEmpty(seccionId))
|
if (!string.IsNullOrEmpty(seccionId))
|
||||||
{
|
{
|
||||||
requestUri += $"&seccionId={seccionId}";
|
requestUri += $"&seccionId={seccionId}";
|
||||||
@@ -108,6 +105,10 @@ public class ElectoralApiService : IElectoralApiService
|
|||||||
{
|
{
|
||||||
requestUri += $"&municipioId={municipioId}";
|
requestUri += $"&municipioId={municipioId}";
|
||||||
}
|
}
|
||||||
|
if (!string.IsNullOrEmpty(circuitoId))
|
||||||
|
{
|
||||||
|
requestUri += $"&circuitoId={circuitoId}";
|
||||||
|
}
|
||||||
|
|
||||||
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
|
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
|
||||||
request.Headers.Add("Authorization", $"Bearer {authToken}");
|
request.Headers.Add("Authorization", $"Bearer {authToken}");
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ public interface IElectoralApiService
|
|||||||
// Métodos para catálogos
|
// Métodos para catálogos
|
||||||
Task<CatalogoDto?> GetCatalogoAmbitosAsync(string authToken, int categoriaId);
|
Task<CatalogoDto?> GetCatalogoAmbitosAsync(string authToken, int categoriaId);
|
||||||
Task<List<AgrupacionDto>?> GetAgrupacionesAsync(string authToken, string? distritoId, int categoriaId);
|
Task<List<AgrupacionDto>?> GetAgrupacionesAsync(string authToken, string? distritoId, int categoriaId);
|
||||||
Task<ResultadosDto?> GetResultadosAsync(string authToken, string distritoId, string? seccionId, string? municipioId, int categoriaId);
|
Task<ResultadosDto?> GetResultadosAsync(string authToken, string distritoId, string? seccionId, string? municipioId, int categoriaId, string? circuitoId = null);
|
||||||
Task<RepartoBancasDto?> GetBancasAsync(string authToken, string distritoId, string? seccionProvincialId, int categoriaId);
|
Task<RepartoBancasDto?> GetBancasAsync(string authToken, string distritoId, string? seccionProvincialId, int categoriaId);
|
||||||
Task<List<string>?> GetTelegramasTotalizadosAsync(string authToken, string distritoId, string seccionId, int? categoriaId = null);
|
Task<List<string>?> GetTelegramasTotalizadosAsync(string authToken, string distritoId, string seccionId, int? categoriaId = null);
|
||||||
Task<TelegramaFileDto?> GetTelegramaFileAsync(string authToken, string mesaId);
|
Task<TelegramaFileDto?> GetTelegramaFileAsync(string authToken, string mesaId);
|
||||||
|
|||||||
@@ -76,7 +76,7 @@ public class CriticalDataWorker : BackgroundService
|
|||||||
|
|
||||||
var ambitosProvinciales = await dbContext.AmbitosGeograficos.AsNoTracking().Where(a => a.NivelId == 10 && a.DistritoId != null).ToListAsync(stoppingToken);
|
var ambitosProvinciales = await dbContext.AmbitosGeograficos.AsNoTracking().Where(a => a.NivelId == 10 && a.DistritoId != null).ToListAsync(stoppingToken);
|
||||||
var ambitoNacional = await dbContext.AmbitosGeograficos.AsNoTracking().FirstOrDefaultAsync(a => a.NivelId == 1 || a.NivelId == 0, stoppingToken);
|
var ambitoNacional = await dbContext.AmbitosGeograficos.AsNoTracking().FirstOrDefaultAsync(a => a.NivelId == 1 || a.NivelId == 0, stoppingToken);
|
||||||
var categorias = await dbContext.CategoriasElectorales.AsNoTracking().ToListAsync(stoppingToken);
|
var categorias = await dbContext.CategoriasElectorales.AsNoTracking().Where(c => c.Id == 2 || c.Id == 3).ToListAsync(stoppingToken); // <-- Filtrado para Senadores y Diputados
|
||||||
|
|
||||||
if (!ambitosProvinciales.Any() || !categorias.Any()) return;
|
if (!ambitosProvinciales.Any() || !categorias.Any()) return;
|
||||||
|
|
||||||
@@ -91,7 +91,6 @@ public class CriticalDataWorker : BackgroundService
|
|||||||
var resultadosDto = await _apiService.GetResultadosAsync(authToken, provincia.DistritoId!, null, null, categoria.Id);
|
var resultadosDto = await _apiService.GetResultadosAsync(authToken, provincia.DistritoId!, null, null, categoria.Id);
|
||||||
if (resultadosDto == null) continue;
|
if (resultadosDto == null) continue;
|
||||||
|
|
||||||
// --- Guardar los datos agregados inmediatamente ---
|
|
||||||
await GuardarDatosAgregadosAsync(dbContext, provincia.Id, categoria.Id, resultadosDto, stoppingToken);
|
await GuardarDatosAgregadosAsync(dbContext, provincia.Id, categoria.Id, resultadosDto, stoppingToken);
|
||||||
|
|
||||||
if (DateTime.TryParse(resultadosDto.FechaTotalizacion, out var fechaApi))
|
if (DateTime.TryParse(resultadosDto.FechaTotalizacion, out var fechaApi))
|
||||||
@@ -182,19 +181,46 @@ public class CriticalDataWorker : BackgroundService
|
|||||||
using var scope = _serviceProvider.CreateScope();
|
using var scope = _serviceProvider.CreateScope();
|
||||||
var dbContext = scope.ServiceProvider.GetRequiredService<EleccionesDbContext>();
|
var dbContext = scope.ServiceProvider.GetRequiredService<EleccionesDbContext>();
|
||||||
|
|
||||||
|
// 1. Obtenemos todos los municipios Y circuitos de la provincia en consultas eficientes.
|
||||||
var municipiosDeLaProvincia = await dbContext.AmbitosGeograficos
|
var municipiosDeLaProvincia = await dbContext.AmbitosGeograficos
|
||||||
.AsNoTracking()
|
.AsNoTracking()
|
||||||
.Where(a => a.NivelId == 30 && a.DistritoId == distritoId && a.SeccionId != null)
|
.Where(a => a.NivelId == 30 && a.DistritoId == distritoId && a.SeccionId != null)
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
|
||||||
_logger.LogInformation("Iniciando descarga detallada para {Count} municipios del distrito {DistritoId}...", municipiosDeLaProvincia.Count, distritoId);
|
var circuitosDeLaProvincia = await dbContext.AmbitosGeograficos
|
||||||
|
.AsNoTracking()
|
||||||
|
.Where(a => a.NivelId == 50 && a.DistritoId == distritoId && a.SeccionId != null && a.CircuitoId != null)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
// 2. Agrupamos los circuitos por el SeccionId (ID del municipio) para una búsqueda rápida.
|
||||||
|
var circuitosPorMunicipio = circuitosDeLaProvincia
|
||||||
|
.GroupBy(c => c.SeccionId)
|
||||||
|
.ToDictionary(g => g.Key!, g => g.ToList());
|
||||||
|
|
||||||
|
_logger.LogInformation("Iniciando descarga detallada para {Count} municipios y {CircuitCount} circuitos del distrito {DistritoId}...",
|
||||||
|
municipiosDeLaProvincia.Count, circuitosDeLaProvincia.Count, distritoId);
|
||||||
|
|
||||||
foreach (var municipio in municipiosDeLaProvincia)
|
foreach (var municipio in municipiosDeLaProvincia)
|
||||||
{
|
{
|
||||||
var resultados = await _apiService.GetResultadosAsync(authToken, municipio.DistritoId!, municipio.SeccionId!, null, categoriaId);
|
// 3. Descargamos y guardamos los resultados a nivel de municipio (como antes).
|
||||||
if (resultados != null)
|
var resultadosMunicipio = await _apiService.GetResultadosAsync(authToken, municipio.DistritoId!, municipio.SeccionId!, null, categoriaId);
|
||||||
|
if (resultadosMunicipio != null)
|
||||||
{
|
{
|
||||||
await GuardarResultadosDeAmbitoAsync(dbContext, municipio.Id, categoriaId, resultados, CancellationToken.None);
|
await GuardarResultadosDeAmbitoAsync(dbContext, municipio.Id, categoriaId, resultadosMunicipio, CancellationToken.None);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. Buscamos y recorremos los circuitos de este municipio.
|
||||||
|
if (circuitosPorMunicipio.TryGetValue(municipio.SeccionId!, out var circuitos))
|
||||||
|
{
|
||||||
|
foreach (var circuito in circuitos)
|
||||||
|
{
|
||||||
|
// 5. Llamamos a la API con el circuitoId y guardamos los resultados.
|
||||||
|
var resultadosCircuito = await _apiService.GetResultadosAsync(authToken, circuito.DistritoId!, circuito.SeccionId!, null, categoriaId, circuito.CircuitoId!);
|
||||||
|
if (resultadosCircuito != null)
|
||||||
|
{
|
||||||
|
await GuardarResultadosDeAmbitoAsync(dbContext, circuito.Id, categoriaId, resultadosCircuito, CancellationToken.None);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user