Fix: AgroFetcher Data Diff
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user