update klinik ruang

This commit is contained in:
bagus-arie05
2026-01-08 12:53:41 +07:00
parent ed43c69a1d
commit ca5913c4e6
3 changed files with 39 additions and 92 deletions
+10 -57
View File
@@ -545,14 +545,9 @@ const getCurrentProcessingForRoom = (ruang) => {
const key = `klinik-ruang-${klinikData.value.kodeKlinik}-${ruang.nomorRuang}`;
const current = queueStore.currentProcessingPatient[key];
if (!current) return null;
// Check both tipeLayanan
const pemeriksaanAwal = current['Pemeriksaan Awal'];
const tindakan = current['Tindakan'];
// Return the one that exists, or null
return pemeriksaanAwal || tindakan || null;
// Return pasien yang sedang diproses (tidak dipisah per tipe layanan)
return current || null;
};
@@ -686,28 +681,22 @@ const handleCallPatientByTipe = (ruang, tipeLayanan) => {
const current = getCurrentProcessingForRoom(ruang);
if (!current) return;
// Update tipeLayanan pasien jika berbeda
if (current.tipeLayanan !== tipeLayanan) {
handleSetTipeLayanan(ruang, tipeLayanan);
}
// Call patient dengan tipeLayanan tertentu
// Update tipeLayanan pasien untuk tracking panggilan terakhir
const patientIndex = queueStore.allPatients.findIndex(p => p.no === current.no);
if (patientIndex !== -1) {
// Update status to di-loket untuk ditampilkan di anjungan
// Simpan tipeLayanan yang dipanggil untuk display di anjungan
queueStore.allPatients[patientIndex] = {
...queueStore.allPatients[patientIndex],
status: 'di-loket',
tipeLayanan: tipeLayanan,
lastCalledAt: new Date().toISOString()
tipeLayanan: tipeLayanan, // Update tipeLayanan untuk display di anjungan
lastCalledAt: new Date().toISOString(),
lastCalledTipeLayanan: tipeLayanan // Track tipe layanan terakhir yang dipanggil
};
// Update current processing
// Update current processing (tetap 1 pasien, tidak dipisah per tipe)
const key = `klinik-ruang-${klinikData.value.kodeKlinik}-${ruang.nomorRuang}`;
if (!queueStore.currentProcessingPatient[key]) {
queueStore.currentProcessingPatient[key] = {};
}
queueStore.currentProcessingPatient[key][tipeLayanan] = queueStore.allPatients[patientIndex];
queueStore.currentProcessingPatient[key] = queueStore.allPatients[patientIndex];
}
showSnackbar(`Memanggil pasien ${current.noAntrian.split(" |")[0]} untuk ${tipeLayanan}`, 'success');
@@ -762,12 +751,7 @@ const handlePatientAction = (ruang, action) => {
// Clear current processing
const key = `klinik-ruang-${klinikData.value.kodeKlinik}-${ruang.nomorRuang}`;
if (queueStore.currentProcessingPatient[key]) {
const currentTipe = current.tipeLayanan;
if (currentTipe) {
queueStore.currentProcessingPatient[key][currentTipe] = null;
}
}
queueStore.currentProcessingPatient[key] = null;
}
}
@@ -807,37 +791,6 @@ const paginatedPendingPatients = (ruang) => {
return allPending.slice(startIndex, endIndex);
};
const handleSetTipeLayanan = (ruang, tipeLayanan) => {
const current = getCurrentProcessingForRoom(ruang);
if (!current) return;
const patientIndex = queueStore.allPatients.findIndex(p => p.no === current.no);
if (patientIndex !== -1) {
// Update patient tipeLayanan
const updatedPatient = {
...queueStore.allPatients[patientIndex],
tipeLayanan: tipeLayanan
};
queueStore.allPatients[patientIndex] = updatedPatient;
// Update current processing
const key = `klinik-ruang-${klinikData.value.kodeKlinik}-${ruang.nomorRuang}`;
if (!queueStore.currentProcessingPatient[key]) {
queueStore.currentProcessingPatient[key] = {};
}
// Set new tipeLayanan
queueStore.currentProcessingPatient[key][tipeLayanan] = updatedPatient;
// Remove old tipeLayanan from current processing
const oldTipe = current.tipeLayanan;
if (oldTipe && oldTipe !== tipeLayanan) {
queueStore.currentProcessingPatient[key][oldTipe] = null;
}
showSnackbar(`Tipe layanan diubah menjadi ${tipeLayanan}`, 'success');
}
};
onMounted(() => {
@@ -285,8 +285,20 @@ const displayedRuang = computed(() => {
const tindakanQueues = allQueues.filter(q => q.tipeLayanan === 'Tindakan')
// Get current and next queues for each tipeLayanan
const getCurrentAndNext = (queues) => {
const current = queues.find(q => q.status === 'di-loket') || null
// Current queue is the one with status 'di-loket' and matching tipeLayanan
const getCurrentAndNext = (queues, tipeLayanan) => {
// Find current: pasien dengan status 'di-loket' dan tipeLayanan yang sesuai
// Sort by lastCalledAt untuk mendapatkan yang terakhir dipanggil
const currentCandidates = queues.filter(q =>
q.status === 'di-loket' && q.tipeLayanan === tipeLayanan
).sort((a, b) => {
const timeA = a.lastCalledAt ? new Date(a.lastCalledAt) : new Date(a.createdAt || 0)
const timeB = b.lastCalledAt ? new Date(b.lastCalledAt) : new Date(b.createdAt || 0)
return timeB - timeA
})
const current = currentCandidates.length > 0 ? currentCandidates[0] : null
// Next queues: exclude current patient
const next = queues.filter(q =>
q.no !== current?.no &&
(q.status === 'waiting' || q.status === 'di-loket')
@@ -294,8 +306,8 @@ const displayedRuang = computed(() => {
return { current, next }
}
const pemeriksaanAwal = getCurrentAndNext(pemeriksaanAwalQueues)
const tindakan = getCurrentAndNext(tindakanQueues)
const pemeriksaanAwal = getCurrentAndNext(pemeriksaanAwalQueues, 'Pemeriksaan Awal')
const tindakan = getCurrentAndNext(tindakanQueues, 'Tindakan')
return {
kodeKlinik: ruang.kodeKlinik,
@@ -322,9 +334,14 @@ const currentCalledQueue = computed(() => {
if (!kodeKlinik.value || !klinikData.value) return null
// Get most recently called patient (status di-loket)
// Sort by lastCalledAt if available, otherwise by createdAt
const calledQueues = klinikPatients.value
.filter(p => p.status === 'di-loket')
.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt))
.sort((a, b) => {
const timeA = a.lastCalledAt ? new Date(a.lastCalledAt) : new Date(a.createdAt || 0)
const timeB = b.lastCalledAt ? new Date(b.lastCalledAt) : new Date(b.createdAt || 0)
return timeB - timeA
})
if (calledQueues.length > 0) {
const patient = calledQueues[0]
+7 -30
View File
@@ -741,18 +741,10 @@ export const useQueueStore = defineStore('queue', () => {
switch (action) {
case "proses":
// Set as current processing for this room
if (!currentProcessingPatient.value[key]) {
// Use Vue's reactive assignment
currentProcessingPatient.value = {
...currentProcessingPatient.value,
[key]: {}
};
}
// Update nested property reactively
currentProcessingPatient.value[key] = {
...currentProcessingPatient.value[key],
[patient.tipeLayanan]: allPatients.value[patientIndex]
// Set as current processing for this room (1 pasien, tidak dipisah per tipe layanan)
currentProcessingPatient.value = {
...currentProcessingPatient.value,
[key]: allPatients.value[patientIndex]
};
message = `Memproses pasien ${patientCode}`;
break;
@@ -763,12 +755,7 @@ export const useQueueStore = defineStore('queue', () => {
status: "processed"
};
// Clear current processing
if (currentProcessingPatient.value[key]) {
currentProcessingPatient.value[key] = {
...currentProcessingPatient.value[key],
[patient.tipeLayanan]: null
};
}
currentProcessingPatient.value[key] = null;
message = `Pasien ${patientCode} selesai diproses`;
break;
@@ -777,12 +764,7 @@ export const useQueueStore = defineStore('queue', () => {
...allPatients.value[patientIndex],
status: "terlambat"
};
if (currentProcessingPatient.value[key]) {
currentProcessingPatient.value[key] = {
...currentProcessingPatient.value[key],
[patient.tipeLayanan]: null
};
}
currentProcessingPatient.value[key] = null;
message = `Pasien ${patientCode} ditandai terlambat`;
break;
@@ -791,12 +773,7 @@ export const useQueueStore = defineStore('queue', () => {
...allPatients.value[patientIndex],
status: "pending"
};
if (currentProcessingPatient.value[key]) {
currentProcessingPatient.value[key] = {
...currentProcessingPatient.value[key],
[patient.tipeLayanan]: null
};
}
currentProcessingPatient.value[key] = null;
message = `Pasien ${patientCode} di-pending`;
break;
}