Normalize OPD queue display per doctor day

This commit is contained in:
DevSoftTech Server 2026-04-10 03:44:32 +05:30
parent 5a6ca034cd
commit c534a83ad2
2 changed files with 64 additions and 2 deletions

View File

@ -927,6 +927,37 @@ class Opd extends BaseController
$query = $this->db->query($sql);
$allRows = $query->getResult();
// Doctor-day display queue should be contiguous (1..N), even when stored queue_no
// has gaps due to legacy/global sequencing from other doctors.
$queueRows = array_values(array_filter($allRows, static function ($row): bool {
return (int) ($row->queue_no ?? 0) > 0;
}));
usort($queueRows, static function ($left, $right): int {
$leftQueue = (int) ($left->queue_no ?? 0);
$rightQueue = (int) ($right->queue_no ?? 0);
if ($leftQueue !== $rightQueue) {
return $leftQueue <=> $rightQueue;
}
return ((int) ($left->opd_id ?? 0)) <=> ((int) ($right->opd_id ?? 0));
});
$displayQueueByOpdId = [];
$displayQueue = 1;
foreach ($queueRows as $queueRow) {
$queueOpdId = (int) ($queueRow->opd_id ?? 0);
if ($queueOpdId <= 0 || array_key_exists($queueOpdId, $displayQueueByOpdId)) {
continue;
}
$displayQueueByOpdId[$queueOpdId] = $displayQueue;
$displayQueue++;
}
foreach ($allRows as $row) {
$row->display_queue_no = (int) ($displayQueueByOpdId[(int) ($row->opd_id ?? 0)] ?? 0);
}
$opdList0 = [];
$opdList1 = [];
$opdList2 = [];
@ -1192,6 +1223,37 @@ class Opd extends BaseController
}
}
// Normalize queue display numbers to contiguous doctor-day sequence.
$queueRows = array_values(array_filter($normalized, static function (array $row): bool {
return (int) ($row['queue_no'] ?? 0) > 0;
}));
usort($queueRows, static function (array $left, array $right): int {
$leftQueue = (int) ($left['queue_no'] ?? 0);
$rightQueue = (int) ($right['queue_no'] ?? 0);
if ($leftQueue !== $rightQueue) {
return $leftQueue <=> $rightQueue;
}
return ((int) ($left['opd_id'] ?? 0)) <=> ((int) ($right['opd_id'] ?? 0));
});
$displayQueueByOpdId = [];
$displayQueue = 1;
foreach ($queueRows as $row) {
$queueOpdId = (int) ($row['opd_id'] ?? 0);
if ($queueOpdId <= 0 || array_key_exists($queueOpdId, $displayQueueByOpdId)) {
continue;
}
$displayQueueByOpdId[$queueOpdId] = $displayQueue;
$displayQueue++;
}
foreach ($normalized as &$row) {
$row['display_queue_no'] = (int) ($displayQueueByOpdId[(int) ($row['opd_id'] ?? 0)] ?? 0);
}
unset($row);
usort($normalized, static function ($left, $right): int {
return ((int) ($left['opd_id'] ?? 0)) <=> ((int) ($right['opd_id'] ?? 0));
});

View File

@ -89,7 +89,7 @@ $mergedGroups = [
$hasVitals = (int) ($row->has_vitals ?? 0) === 1;
$hasPrescription = (int) ($row->has_prescription ?? 0) === 1;
$isConfirmedForQueue= (int) ($row->is_confirmed_for_queue ?? 0) === 1;
$queueNo = (int) ($row->queue_no ?? 0);
$queueNo = (int) (($row->display_queue_no ?? 0) ?: ($row->queue_no ?? 0));
$hasQueueNo = $queueNo > 0;
$showFullActions = $hasPrescription || $isConfirmedForQueue;
$opdId = (int) ($row->opd_id ?? 0);
@ -567,7 +567,7 @@ $mergedGroups = [
$row.attr('data-has-vitals', parseInt(live.has_vitals || 0, 10) === 1 ? '1' : '0');
applyStatusVisual($row, status);
updateQueueCell($row, parseInt(live.queue_no || 0, 10));
updateQueueCell($row, parseInt(live.display_queue_no || live.queue_no || 0, 10));
updateVitalsButtonState($row, parseInt(live.has_prescription || 0, 10), parseInt(live.has_vitals || 0, 10));
if (status === 'waiting') {