Fix: AgroFetcher Data Diff

This commit is contained in:
2025-07-18 16:18:58 -03:00
parent c778816efd
commit 9dbf8dbe7e

View File

@@ -42,29 +42,50 @@ namespace Mercados.Infrastructure.DataFetchers
}
var hoy = DateOnly.FromDateTime(DateTime.UtcNow);
// 1. Obtenemos los últimos datos guardados para el día de HOY.
var cotizacionesViejas = await _cotizacionRepository.ObtenerTandaPorFechaAsync(hoy);
// 2. Comparamos si hay alguna diferencia real.
// Creamos un HashSet de los registros viejos para una comparación ultra rápida.
var viejasSet = new HashSet<string>(cotizacionesViejas.Select(c => $"{c.Categoria}|{c.Especificaciones}|{c.Maximo}|{c.Minimo}|{c.Cabezas}"));
var nuevasList = cotizacionesNuevas.Select(c => $"{c.Categoria}|{c.Especificaciones}|{c.Maximo}|{c.Minimo}|{c.Cabezas}").ToList();
bool hayCambios = cotizacionesViejas.Count() != nuevasList.Count || nuevasList.Any(n => !viejasSet.Contains(n));
if (!hayCambios)
// Si el número de registros es diferente, sabemos que hay cambios.
if (cotizacionesViejas.Count() != cotizacionesNuevas.Count)
{
_logger.LogInformation("No se encontraron cambios en los datos de {SourceName}. No se requiere actualización.", SourceName);
return (true, "Datos sin cambios.");
_logger.LogInformation("El número de registros de {SourceName} ha cambiado. Actualizando...", SourceName);
}
else
{
// Si el número de registros es el mismo, comparamos el contenido.
// Convertimos los nuevos a un diccionario para una búsqueda rápida por clave.
var nuevasDict = cotizacionesNuevas.ToDictionary(c => $"{c.Categoria}|{c.Especificaciones}");
bool hayCambios = false;
foreach (var cotizacionVieja in cotizacionesViejas)
{
var clave = $"{cotizacionVieja.Categoria}|{cotizacionVieja.Especificaciones}";
// Buscamos si el registro viejo existe en los nuevos y comparamos los valores.
if (!nuevasDict.TryGetValue(clave, out var cotizacionNueva) ||
cotizacionVieja.Maximo != cotizacionNueva.Maximo ||
cotizacionVieja.Minimo != cotizacionNueva.Minimo ||
cotizacionVieja.Cabezas != cotizacionNueva.Cabezas ||
cotizacionVieja.KilosTotales != cotizacionNueva.KilosTotales)
{
hayCambios = true;
_logger.LogInformation("Se detectó un cambio en la categoría: {Categoria}", clave);
break; // Encontramos un cambio, no necesitamos seguir buscando.
}
}
if (!hayCambios)
{
_logger.LogInformation("No se encontraron cambios en los datos de {SourceName}. No se requiere actualización.", SourceName);
return (true, "Datos sin cambios.");
}
}
// 3. Si hay cambios, reemplazamos la tanda completa del día.
_logger.LogInformation("Se detectaron cambios en los datos de {SourceName}. Actualizando base de datos...", SourceName);
_logger.LogInformation("Se detectaron cambios en los datos de {SourceName}. Reemplazando la tanda del día...", SourceName);
await _cotizacionRepository.ReemplazarTandaDelDiaAsync(hoy, cotizacionesNuevas);
await UpdateSourceInfoAsync();
_logger.LogInformation("Fetch para {SourceName} completado exitosamente. Se actualizaron {Count} registros.", SourceName, cotizacionesNuevas.Count);
_logger.LogInformation("Fetch para {SourceName} completado. Se actualizaron {Count} registros.", SourceName, cotizacionesNuevas.Count);
return (true, $"Proceso completado. Se actualizaron {cotizacionesNuevas.Count} registros.");
}
catch (Exception ex)