fix: display global sonaba 3 veces con 3 escritorios de recepción
Cuando recepcion_desk_id es NULL, el mismo turno aparecía en los 3 escritorios de recepción con claves distintas (incluían el nombre del escritorio). Eso generaba 3 entradas nuevas en lastSeenKeys → 3 anuncios. Fix: añadir announcedCalls Set con clave id|llamado_at (sin destino). El sonido/anuncio solo se encola una vez por evento de llamada, independientemente de cuántos escritorios devuelvan el mismo turno. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
4058cfe929
commit
92adee6285
@@ -590,9 +590,10 @@ function showAnnouncement({ codigo, destino, paciente, color }) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* ── State ── */
|
/* ── State ── */
|
||||||
let lastSeenKeys = new Set();
|
let lastSeenKeys = new Set();
|
||||||
let llamados = [];
|
let announcedCalls = new Set(); // dedup por id+llamado_at, evita anunciar mismo turno desde varios escritorios
|
||||||
let _firstLoad = true;
|
let llamados = [];
|
||||||
|
let _firstLoad = true;
|
||||||
|
|
||||||
function renderSnapshot(snap) {
|
function renderSnapshot(snap) {
|
||||||
const codEl = document.getElementById('codigo-activo');
|
const codEl = document.getElementById('codigo-activo');
|
||||||
@@ -614,14 +615,15 @@ function renderSnapshot(snap) {
|
|||||||
const currentKeys = new Set();
|
const currentKeys = new Set();
|
||||||
let anuncioNuevo = false;
|
let anuncioNuevo = false;
|
||||||
allTurnos.forEach(t => {
|
allTurnos.forEach(t => {
|
||||||
const key = t.codigo + '|' + t.destino + '|' + (t.llamado_at || '');
|
const key = t.codigo + '|' + t.destino + '|' + (t.llamado_at || '');
|
||||||
|
// Clave única por evento de llamada (id+llamado_at), independiente del escritorio
|
||||||
|
const callKey = (t.id || t.codigo) + '|' + (t.llamado_at || '');
|
||||||
currentKeys.add(key);
|
currentKeys.add(key);
|
||||||
if (!lastSeenKeys.has(key)) {
|
if (!lastSeenKeys.has(key)) {
|
||||||
const c = t.prioridad_color || '<?= $_labColor ?>';
|
const c = t.prioridad_color || '<?= $_labColor ?>';
|
||||||
// Solo decir el nombre en voz si el paciente está registrado en lab_pacientes
|
|
||||||
const nomVoz = t.paciente_id ? t.paciente_nombre : null;
|
const nomVoz = t.paciente_id ? t.paciente_nombre : null;
|
||||||
// En primera carga silenciar todos; el más reciente se anuncia abajo
|
if (!_firstLoad && !announcedCalls.has(callKey)) {
|
||||||
if (!_firstLoad) {
|
announcedCalls.add(callKey);
|
||||||
queueAnnouncement({ _key: key, codigo: t.codigo, destino: t.destino, paciente: nomVoz, color: c });
|
queueAnnouncement({ _key: key, codigo: t.codigo, destino: t.destino, paciente: nomVoz, color: c });
|
||||||
}
|
}
|
||||||
llamados.unshift({ codigo: t.codigo, destino: t.destino, paciente: t.paciente_nombre, color: c });
|
llamados.unshift({ codigo: t.codigo, destino: t.destino, paciente: t.paciente_nombre, color: c });
|
||||||
@@ -635,10 +637,12 @@ function renderSnapshot(snap) {
|
|||||||
_firstLoad = false;
|
_firstLoad = false;
|
||||||
const sorted = allTurnos.slice().sort((a, b) => new Date(b.llamado_at || 0) - new Date(a.llamado_at || 0));
|
const sorted = allTurnos.slice().sort((a, b) => new Date(b.llamado_at || 0) - new Date(a.llamado_at || 0));
|
||||||
if (sorted.length > 0) {
|
if (sorted.length > 0) {
|
||||||
const t = sorted[0];
|
const t = sorted[0];
|
||||||
const c = t.prioridad_color || '<?= $_labColor ?>';
|
const c = t.prioridad_color || '<?= $_labColor ?>';
|
||||||
const key = t.codigo + '|' + t.destino + '|' + (t.llamado_at || '');
|
const key = t.codigo + '|' + t.destino + '|' + (t.llamado_at || '');
|
||||||
const nomVoz = t.paciente_id ? t.paciente_nombre : null;
|
const callKey = (t.id || t.codigo) + '|' + (t.llamado_at || '');
|
||||||
|
const nomVoz = t.paciente_id ? t.paciente_nombre : null;
|
||||||
|
announcedCalls.add(callKey);
|
||||||
queueAnnouncement({ _key: key, codigo: t.codigo, destino: t.destino, paciente: nomVoz, color: c });
|
queueAnnouncement({ _key: key, codigo: t.codigo, destino: t.destino, paciente: nomVoz, color: c });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user