Fix: actualiza estado de cama en tabla camas al cambiar internacion
- Agrega endpoint PUT /api/camas/:id en servidor - Corrige nombre de tabla SQL de cama a camas - Actualiza estado de camas en memoria al cambiar internacion - Agrega retry logic para evitar SQLITE_BUSY - Mejora delay entre actualizaciones de cama
This commit is contained in:
@@ -154,6 +154,29 @@ export async function getAllCamas() {
|
|||||||
return rows;
|
return rows;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function updateCama(id, updates) {
|
||||||
|
const db = await openDb();
|
||||||
|
const fields = [];
|
||||||
|
const values = [];
|
||||||
|
if (updates.estado !== undefined) {
|
||||||
|
fields.push('estado = ?');
|
||||||
|
values.push(updates.estado);
|
||||||
|
}
|
||||||
|
if (updates.pacienteId !== undefined) {
|
||||||
|
fields.push('pacienteId = ?');
|
||||||
|
values.push(updates.pacienteId);
|
||||||
|
}
|
||||||
|
if (updates.internacionId !== undefined) {
|
||||||
|
fields.push('internacionId = ?');
|
||||||
|
values.push(updates.internacionId);
|
||||||
|
}
|
||||||
|
if (fields.length > 0) {
|
||||||
|
values.push(id);
|
||||||
|
await db.run(`UPDATE camas SET ${fields.join(', ')} WHERE id = ?`, values);
|
||||||
|
}
|
||||||
|
await db.close();
|
||||||
|
}
|
||||||
|
|
||||||
export async function getAllInternaciones() {
|
export async function getAllInternaciones() {
|
||||||
const db = await openDb();
|
const db = await openDb();
|
||||||
const rows = await db.all('SELECT * FROM internaciones');
|
const rows = await db.all('SELECT * FROM internaciones');
|
||||||
|
|||||||
@@ -342,6 +342,27 @@ app.delete('/api/usuarios/:id', async (req, res) => {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.put('/api/camas/:id', async (req, res) => {
|
||||||
|
let retries = 3;
|
||||||
|
while (retries > 0) {
|
||||||
|
try {
|
||||||
|
const { id } = req.params;
|
||||||
|
const { estado } = req.body;
|
||||||
|
const db = await openDb();
|
||||||
|
await db.run('UPDATE camaS SET estado = ? WHERE id = ?', [estado, id]);
|
||||||
|
await db.close();
|
||||||
|
return res.json({ ok: true });
|
||||||
|
} catch (err) {
|
||||||
|
console.error('Error updating cama (retry', retries, '):', err.message);
|
||||||
|
retries--;
|
||||||
|
if (retries === 0) {
|
||||||
|
return res.status(500).json({ error: err.message });
|
||||||
|
}
|
||||||
|
await new Promise(r => setTimeout(r, 200));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Helper para actualizar por DNI
|
// Helper para actualizar por DNI
|
||||||
async function updateUsuarioByDni(dni, datos) {
|
async function updateUsuarioByDni(dni, datos) {
|
||||||
const { getUsuarioByDni, updateUsuario } = await import('./db.js');
|
const { getUsuarioByDni, updateUsuario } = await import('./db.js');
|
||||||
|
|||||||
+6
-4
@@ -41,8 +41,7 @@ db.exec(`
|
|||||||
grupoSanguineo TEXT
|
grupoSanguineo TEXT
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS areas (
|
CREATE TABLE IF NOT EXISTS areas (
|
||||||
id TEXT PRIMARY KEY,
|
|
||||||
nombre TEXT NOT NULL UNIQUE
|
nombre TEXT NOT NULL UNIQUE
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -51,7 +50,9 @@ db.exec(`
|
|||||||
numero TEXT NOT NULL,
|
numero TEXT NOT NULL,
|
||||||
areaId TEXT,
|
areaId TEXT,
|
||||||
tipo TEXT DEFAULT 'Estándar',
|
tipo TEXT DEFAULT 'Estándar',
|
||||||
estado TEXT DEFAULT 'Disponible'
|
estado TEXT DEFAULT 'Disponible',
|
||||||
|
pacienteId TEXT,
|
||||||
|
internacionId TEXT
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE IF NOT EXISTS internaciones (
|
CREATE TABLE IF NOT EXISTS internaciones (
|
||||||
@@ -384,12 +385,13 @@ app.put('/api/state', (req, res) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state.camas?.length) {
|
if (state.camas?.length) {
|
||||||
const stmt = db.prepare('INSERT OR IGNORE INTO camas (id, numero, areaId, tipo, estado) VALUES (?, ?, ?, ?, ?)');
|
const stmt = db.prepare('INSERT OR IGNORE INTO camas (id, numero, areaId, tipo, estado) VALUES (?, ?, ?, ?, ?)');
|
||||||
for (const c of state.camas) {
|
for (const c of state.camas) {
|
||||||
stmt.run(c.id, c.numero, c.areaId, c.tipo, c.estado);
|
stmt.run(c.id, c.numero, c.areaId, c.tipo, c.estado);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (state.internaciones?.length) {
|
if (state.internaciones?.length) {
|
||||||
const stmt = db.prepare('INSERT OR IGNORE INTO internaciones (id, pacienteId, camaId, areaId, fechaIngresoHospital, fechaIngresoClinica, fechaEgreso, diagnosticoIngreso, motivoConsulta, enfermedadActual, antecedentesEnfermedadActual, diagnosticoEgreso, medicoIngresante, motivoEgreso, activa, apache, derivacion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
|
const stmt = db.prepare('INSERT OR IGNORE INTO internaciones (id, pacienteId, camaId, areaId, fechaIngresoHospital, fechaIngresoClinica, fechaEgreso, diagnosticoIngreso, motivoConsulta, enfermedadActual, antecedentesEnfermedadActual, diagnosticoEgreso, medicoIngresante, motivoEgreso, activa, apache, derivacion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)');
|
||||||
|
|||||||
@@ -275,26 +275,46 @@ const finalizarInternacion = useCallback((internacionId: string, datos: {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const oldCamaId = internacion.camaId;
|
const oldCamaId = internacion.camaId;
|
||||||
const newCamaId = datos.camaId;
|
const newCamaId = datos.camaId;
|
||||||
const pacienteId = datos.pacienteId || internacion.pacienteId;
|
const pacienteId = datos.pacienteId || internacion.pacienteId;
|
||||||
|
|
||||||
setState(prev => ({
|
setState(prev => {
|
||||||
|
const result = {
|
||||||
...prev,
|
...prev,
|
||||||
internaciones: prev.internaciones.map(i =>
|
internaciones: prev.internaciones.map(i =>
|
||||||
i.id === internacionId
|
i.id === internacionId
|
||||||
? { ...i, ...datos }
|
? { ...i, ...datos }
|
||||||
: i
|
: i
|
||||||
),
|
),
|
||||||
cams: prev.camas.map(c => {
|
camas: prev.camas.map(c => {
|
||||||
if (c.id === newCamaId && newCamaId !== oldCamaId) {
|
if (c.id === newCamaId && newCamaId !== oldCamaId) {
|
||||||
return { ...c, estado: 'Ocupada', pacienteId, internacionId };
|
return { ...c, estado: 'Ocupada' as const, pacienteId, internacionId };
|
||||||
}
|
}
|
||||||
if (c.id === oldCamaId && oldCamaId !== newCamaId) {
|
if (c.id === oldCamaId && oldCamaId !== newCamaId) {
|
||||||
return { ...c, estado: 'Disponible', pacienteId: undefined, internacionId: undefined };
|
return { ...c, estado: 'Disponible' as const, pacienteId: undefined, internacionId: undefined };
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
}),
|
}),
|
||||||
}));
|
};
|
||||||
|
return result;
|
||||||
|
});
|
||||||
|
|
||||||
|
if (oldCamaId !== newCamaId && newCamaId && oldCamaId) {
|
||||||
|
setTimeout(() => {
|
||||||
|
fetch(`${API_BASE}/camas/${newCamaId}`, {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ estado: 'Ocupada' }),
|
||||||
|
}).catch(() => {});
|
||||||
|
}, 500);
|
||||||
|
setTimeout(() => {
|
||||||
|
fetch(`${API_BASE}/camas/${oldCamaId}`, {
|
||||||
|
method: 'PUT',
|
||||||
|
headers: { 'Content-Type': 'application/json' },
|
||||||
|
body: JSON.stringify({ estado: 'Disponible' }),
|
||||||
|
}).catch(() => {});
|
||||||
|
}, 1000);
|
||||||
|
}
|
||||||
}, [state.internaciones, state.currentUser]);
|
}, [state.internaciones, state.currentUser]);
|
||||||
|
|
||||||
// Acciones de evoluciones
|
// Acciones de evoluciones
|
||||||
|
|||||||
Reference in New Issue
Block a user