From 0c4019c67d5214ed1d1116023798d0a7e8987cbc Mon Sep 17 00:00:00 2001 From: Fanrouver Date: Thu, 19 Feb 2026 08:28:00 +0700 Subject: [PATCH] feat: Implement Anjungan (Kiosk) module including clinic room selection, various queue pages, patient check-in, and associated admin interfaces. --- nuxt.config.ts | 2 +- pages/AdminKlinikRuang/[kodeKlinik].vue | 12 ++++----- pages/AdminLoket/[id].vue | 12 ++++----- pages/Anjungan/AdminAnjungan.vue | 2 +- pages/Anjungan/Anjungan/[id].vue | 3 +-- pages/Anjungan/Anjungan/index.vue | 2 +- pages/Anjungan/AntreanMasuk/[id].vue | 5 ++-- pages/Anjungan/AntreanMasuk/index.vue | 2 +- pages/Anjungan/AntrianKlinik/[id].vue | 2 +- .../AntrianKlinikRuang/[kodeKlinik].vue | 7 +++--- pages/Anjungan/AntrianKlinikRuang/index.vue | 2 +- pages/Anjungan/AntrianLoket/[id].vue | 5 ++-- pages/Anjungan/AntrianLoket/index.vue | 2 +- pages/Anjungan/AntrianPenunjang.vue | 2 +- pages/CheckInPasien/checkIn.vue | 3 +-- public/RSSA logo 1.png | Bin 2630075 -> 2327652 bytes stores/queueStore.js | 23 ++++++++++-------- 17 files changed, 42 insertions(+), 44 deletions(-) diff --git a/nuxt.config.ts b/nuxt.config.ts index 9aaf281..89a2cdf 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -80,7 +80,7 @@ export default defineNuxtConfig({ authUrl: process.env.AUTH_ORIGIN, // authUrl: process.env.AUTH_ORIGIN || "http://10.10.150.175:3001", // authUrl: process.env.AUTH_ORIGIN || "http://localhost:3001", - wsBaseUrl: process.env.WS_BASE_URL || 'ws://10.10.123.135:8084/api/v1/ws', + wsBaseUrl: process.env.WS_BASE_URL || 'ws://10.10.150.100:8084/api/v1/ws', ekstrakExpertiseUrl: process.env.EKSTRAK_EXPERTISE_URL || 'http://10.10.123.218/ekstrakexpertise', verificationApiBaseUrl: process.env.VERIFICATION_API_BASE_URL || 'http://10.10.123.140:8089/api/v1', }, diff --git a/pages/AdminKlinikRuang/[kodeKlinik].vue b/pages/AdminKlinikRuang/[kodeKlinik].vue index 844db15..f05077e 100644 --- a/pages/AdminKlinikRuang/[kodeKlinik].vue +++ b/pages/AdminKlinikRuang/[kodeKlinik].vue @@ -801,7 +801,6 @@ import { useRuangStore } from '@/stores/ruangStore'; import PageHeader from '@/components/common/PageHeader.vue'; import PatientCard from '@/components/features/queue/PatientCard.vue'; import AppSnackbar from '@/components/common/AppSnackbar.vue'; -import { useWebSocket } from '@/composables/useWebSocket'; import { useThermalPrint } from '@/composables/useThermalPrint'; const route = useRoute(); @@ -1506,21 +1505,22 @@ const handleCallPatientFromList = async (ruang, patient, tipeLayanan) => { console.log('📦 Nomor antrian:', nomorAntrian); console.log('📦 Tipe layanan:', tipeLayanan); - // Send to all relevant clients - for (const clientId of anjunganClientIds) { - // Kirim nomor antrian + tipe layanan agar Anjungan tahu harus tampilkan di kolom mana + // Send to all relevant clients in parallel for speed + await Promise.all(anjunganClientIds.map(async (clientId) => { const message = { to_client: clientId, data: { noantrian: nomorAntrian, - tipeLayanan: tipeLayanan // "Pemeriksaan Awal" atau "Tindakan" + klinikId: klinikData.value?.kodeKlinik, + tipeLayanan: tipeLayanan, + triggerRefresh: true }, }; console.log(`📨 Sending to ${clientId}:`, message); const result = await sendViaPost(message); console.log(`✅ Response from ${clientId}:`, result); - } + })); console.log('✅ All WebSocket messages sent successfully'); } catch (error) { diff --git a/pages/AdminLoket/[id].vue b/pages/AdminLoket/[id].vue index c3d49f5..d074c69 100644 --- a/pages/AdminLoket/[id].vue +++ b/pages/AdminLoket/[id].vue @@ -312,7 +312,6 @@ import { useMasterStore } from "@/stores/masterStore"; import { useLoketStore } from "@/stores/loketStore"; import { useClinicStore } from "@/stores/clinicStore"; import { useRuangStore } from "@/stores/ruangStore"; -import { useWebSocket } from "@/composables/useWebSocket"; import PageHeader from "@/components/common/PageHeader.vue"; import CurrentPatientCard from "@/components/features/queue/CurrentPatientCard.vue"; import QueueActionsCard from "@/components/features/queue/QueueActionsCard.vue"; @@ -942,7 +941,7 @@ const handleConfirmReplace = () => { pendingReplaceAction.value = null; }; -const { sendViaPost } = useWebSocket(); +const { sendViaPost } = queueStore; const broadcastUpdate = async (callData = null) => { try { @@ -971,12 +970,13 @@ const broadcastUpdate = async (callData = null) => { }; } - for (const clientId of displayClientIds) { - await sendViaPost({ + // Send all broadcasts in parallel for speed + await Promise.all(displayClientIds.map(clientId => + sendViaPost({ to_client: clientId, data: payload - }); - } + }) + )); } catch (error) { console.error('❌ [AdminLoket] Error broadcasting update:', error); } diff --git a/pages/Anjungan/AdminAnjungan.vue b/pages/Anjungan/AdminAnjungan.vue index 12f6f9d..39ef381 100644 --- a/pages/Anjungan/AdminAnjungan.vue +++ b/pages/Anjungan/AdminAnjungan.vue @@ -5,7 +5,7 @@
{ if (!screenId.value) return '' - return `anjungan-masuk-${screenId.value}-${uniqueSessionSuffix.value}` + return `anjungan-masuk-${screenId.value}` }) // let wsInstance = null diff --git a/pages/Anjungan/AntreanMasuk/index.vue b/pages/Anjungan/AntreanMasuk/index.vue index e326b13..b17a2a3 100644 --- a/pages/Anjungan/AntreanMasuk/index.vue +++ b/pages/Anjungan/AntreanMasuk/index.vue @@ -4,7 +4,7 @@