feat: Implementa lógica completa de sincronización de RAM
This commit is contained in:
@@ -381,12 +381,91 @@ namespace Inventario.API.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("{hostname}/ram")]
|
[HttpPost("{hostname}/ram")]
|
||||||
public async Task<IActionResult> AsociarRam(string hostname, [FromBody] List<MemoriaRamDetalle> memorias)
|
public async Task<IActionResult> AsociarRam(string hostname, [FromBody] List<MemoriaRamDetalle> memoriasDesdeCliente)
|
||||||
{
|
{
|
||||||
// Lógica compleja, pendiente de implementación.
|
var equipoQuery = "SELECT * FROM dbo.equipos WHERE Hostname = @Hostname;";
|
||||||
Console.WriteLine($"Recibida solicitud para asociar {memorias.Count} módulos de RAM al equipo {hostname}");
|
using var connection = _context.CreateConnection();
|
||||||
await Task.CompletedTask;
|
connection.Open();
|
||||||
return Ok(new { message = "Endpoint de asociación de RAM recibido, lógica pendiente." });
|
var equipo = await connection.QuerySingleOrDefaultAsync<Equipo>(equipoQuery, new { Hostname = hostname });
|
||||||
|
|
||||||
|
if (equipo == null)
|
||||||
|
{
|
||||||
|
return NotFound("Equipo no encontrado.");
|
||||||
|
}
|
||||||
|
|
||||||
|
using var transaction = connection.BeginTransaction();
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// 1. OBTENER ASOCIACIONES DE RAM ACTUALES
|
||||||
|
var ramActualQuery = @"
|
||||||
|
SELECT emr.Id as EquipoMemoriaRamId, emr.Slot, mr.Id, mr.part_number as PartNumber, mr.Fabricante, mr.Tamano, mr.Velocidad
|
||||||
|
FROM dbo.equipos_memorias_ram emr
|
||||||
|
JOIN dbo.memorias_ram mr ON emr.memoria_ram_id = mr.id
|
||||||
|
WHERE emr.equipo_id = @EquipoId;";
|
||||||
|
|
||||||
|
var ramEnDb = (await connection.QueryAsync<dynamic>(ramActualQuery, new { EquipoId = equipo.Id }, transaction)).ToList();
|
||||||
|
|
||||||
|
// 2. CREAR "HUELLAS DIGITALES" ÚNICAS PARA COMPARAR
|
||||||
|
// Una huella única para cada módulo en un slot. Ej: "DIMM0_Kingston_8_3200"
|
||||||
|
Func<dynamic, string> crearHuella = ram =>
|
||||||
|
$"{ram.Slot}_{ram.PartNumber ?? ""}_{ram.Tamano}_{ram.Velocidad ?? 0}";
|
||||||
|
|
||||||
|
var huellasCliente = new HashSet<string>(memoriasDesdeCliente.Select(crearHuella));
|
||||||
|
var huellasDb = new HashSet<string>(ramEnDb.Select(crearHuella));
|
||||||
|
|
||||||
|
// 3. CALCULAR Y EJECUTAR ELIMINACIONES
|
||||||
|
var asociacionesAEliminar = ramEnDb
|
||||||
|
.Where(ramDb => !huellasCliente.Contains(crearHuella(ramDb)))
|
||||||
|
.Select(ramDb => (int)ramDb.EquipoMemoriaRamId)
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
if (asociacionesAEliminar.Any())
|
||||||
|
{
|
||||||
|
await connection.ExecuteAsync("DELETE FROM dbo.equipos_memorias_ram WHERE Id IN @Ids;", new { Ids = asociacionesAEliminar }, transaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4. CALCULAR Y EJECUTAR INSERCIONES
|
||||||
|
var memoriasAInsertar = memoriasDesdeCliente.Where(ramCliente => !huellasDb.Contains(crearHuella(ramCliente))).ToList();
|
||||||
|
|
||||||
|
foreach (var memInfo in memoriasAInsertar)
|
||||||
|
{
|
||||||
|
// Buscar o crear el módulo de RAM en la tabla maestra 'memorias_ram'
|
||||||
|
var findRamQuery = @"SELECT * FROM dbo.memorias_ram WHERE
|
||||||
|
(part_number = @PartNumber OR (part_number IS NULL AND @PartNumber IS NULL)) AND
|
||||||
|
tamano = @Tamano AND (velocidad = @Velocidad OR (velocidad IS NULL AND @Velocidad IS NULL));";
|
||||||
|
|
||||||
|
var memoriaMaestra = await connection.QuerySingleOrDefaultAsync<MemoriaRam>(findRamQuery, memInfo, transaction);
|
||||||
|
|
||||||
|
int memoriaMaestraId;
|
||||||
|
if (memoriaMaestra == null)
|
||||||
|
{
|
||||||
|
var insertRamQuery = @"INSERT INTO dbo.memorias_ram (part_number, fabricante, tamano, velocidad)
|
||||||
|
VALUES (@PartNumber, @Fabricante, @Tamano, @Velocidad);
|
||||||
|
SELECT CAST(SCOPE_IDENTITY() as int);";
|
||||||
|
memoriaMaestraId = await connection.ExecuteScalarAsync<int>(insertRamQuery, memInfo, transaction);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
memoriaMaestraId = memoriaMaestra.Id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Crear la asociación en la tabla intermedia
|
||||||
|
var insertAsociacionQuery = "INSERT INTO dbo.equipos_memorias_ram (equipo_id, memoria_ram_id, slot) VALUES (@EquipoId, @MemoriaRamId, @Slot);";
|
||||||
|
await connection.ExecuteAsync(insertAsociacionQuery, new { EquipoId = equipo.Id, MemoriaRamId = memoriaMaestraId, memInfo.Slot }, transaction);
|
||||||
|
}
|
||||||
|
|
||||||
|
// (Opcional, pero recomendado) Registrar cambios en el historial.
|
||||||
|
// La lógica exacta para el historial de RAM puede ser compleja y la omitimos por ahora para centrarnos en la sincronización.
|
||||||
|
|
||||||
|
transaction.Commit();
|
||||||
|
return Ok(new { message = "Módulos de RAM sincronizados correctamente." });
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
transaction.Rollback();
|
||||||
|
Console.WriteLine($"Error al asociar RAM para {hostname}: {ex.Message}");
|
||||||
|
return StatusCode(500, "Ocurrió un error interno al procesar la solicitud de RAM.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("ping")]
|
[HttpPost("ping")]
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ using System.Reflection;
|
|||||||
[assembly: System.Reflection.AssemblyCompanyAttribute("Inventario.API")]
|
[assembly: System.Reflection.AssemblyCompanyAttribute("Inventario.API")]
|
||||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e14476ff8885fa0a5be99dba6f353b305f754677")]
|
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+3fbc9abf584ee687cb8cd7cea9ab20b716bdd897")]
|
||||||
[assembly: System.Reflection.AssemblyProductAttribute("Inventario.API")]
|
[assembly: System.Reflection.AssemblyProductAttribute("Inventario.API")]
|
||||||
[assembly: System.Reflection.AssemblyTitleAttribute("Inventario.API")]
|
[assembly: System.Reflection.AssemblyTitleAttribute("Inventario.API")]
|
||||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||||
|
|||||||
Reference in New Issue
Block a user