Fix: AgroFetcher Data Diff
This commit is contained in:
@@ -42,29 +42,50 @@ namespace Mercados.Infrastructure.DataFetchers
|
|||||||
}
|
}
|
||||||
|
|
||||||
var hoy = DateOnly.FromDateTime(DateTime.UtcNow);
|
var hoy = DateOnly.FromDateTime(DateTime.UtcNow);
|
||||||
// 1. Obtenemos los últimos datos guardados para el día de HOY.
|
|
||||||
var cotizacionesViejas = await _cotizacionRepository.ObtenerTandaPorFechaAsync(hoy);
|
var cotizacionesViejas = await _cotizacionRepository.ObtenerTandaPorFechaAsync(hoy);
|
||||||
|
|
||||||
// 2. Comparamos si hay alguna diferencia real.
|
// Si el número de registros es diferente, sabemos que hay cambios.
|
||||||
// Creamos un HashSet de los registros viejos para una comparación ultra rápida.
|
if (cotizacionesViejas.Count() != cotizacionesNuevas.Count)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
_logger.LogInformation("No se encontraron cambios en los datos de {SourceName}. No se requiere actualización.", SourceName);
|
_logger.LogInformation("El número de registros de {SourceName} ha cambiado. Actualizando...", SourceName);
|
||||||
return (true, "Datos sin cambios.");
|
}
|
||||||
|
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}. Reemplazando la tanda del día...", SourceName);
|
||||||
_logger.LogInformation("Se detectaron cambios en los datos de {SourceName}. Actualizando base de datos...", SourceName);
|
|
||||||
await _cotizacionRepository.ReemplazarTandaDelDiaAsync(hoy, cotizacionesNuevas);
|
await _cotizacionRepository.ReemplazarTandaDelDiaAsync(hoy, cotizacionesNuevas);
|
||||||
|
|
||||||
await UpdateSourceInfoAsync();
|
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.");
|
return (true, $"Proceso completado. Se actualizaron {cotizacionesNuevas.Count} registros.");
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
Reference in New Issue
Block a user