feat: implement queue management store and administrative interface for patient flow control

This commit is contained in:
Fanrouver
2026-06-23 08:24:26 +07:00
parent 400bfcdcaf
commit e18ed186e1
5 changed files with 78 additions and 28 deletions
+49
View File
@@ -65,6 +65,55 @@ Format output:
---
## 2026-06-19 — Fitur Detail Akun Verifikasi
**Sprint/Phase:** Phase 6 — Verifikasi Akun
**Durasi:** ~4 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Penambahan halaman `DetailAkun.vue` (`400bfcd`)
- Update `VerifikasiAkun.vue` untuk integrasi dengan detail akun
- Modifikasi konfigurasi Vuetify di `plugins/vuetify.ts`
### Keputusan Teknis
> Pembuatan halaman detail akun terpisah untuk memberikan view lengkap informasi akun yang sedang diverifikasi, memperbaiki user experience admin saat memvalidasi data user.
---
## 2026-06-0809 — Voice Over Antrean & Manajemen Loket/Klinik
**Sprint/Phase:** Phase 5 — Stabilisasi & Kiosk Features
**Durasi:** ~12 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi sistem notifikasi suara (voice over) untuk antrean loket dan klinik (`8b9c472`)
- Update UI `AdminLoket/[id].vue` dan `Anjungan/AntrianLoket/[id].vue` untuk support voice announcement
- Modifikasi `queueStore.js` untuk integrasi status antrean
- Resolusi isu WebSocket dan CORS policy pada endpoint api antrean
### Keputusan Teknis
> Menggunakan voice synthesis/announcement otomatis untuk pendaftaran antrean agar pasien dengan keterbatasan visual dapat dipanggil secara otomatis dan jelas di area loket maupun klinik.
---
## 2026-06-0205 — Proxy Routes & Fitur Pindah Klinik
**Sprint/Phase:** Phase 5 — Integrasi API & Queue System
**Durasi:** ~16 jam
**Status:** ✅ Done
### Yang Dikerjakan
- Implementasi proxy routes untuk `klinik-api`, `stats-api`, `visit-api` menghindari CORS issues (`0928e78`)
- Fitur pindah klinik pada dashboard admin (`f81dd57`)
- Penambahan dialog konfirmasi (CheckIn, Unfinished Patient) di queue features
- Store lokalisasi menggunakan Pinia untuk loket, klinik, dan queue management (`047b390`)
- Pembaruan DEVLOG, DEVPLAN, PRD, QMD, dan EVLOG
### Keputusan Teknis
> Menggunakan proxy routes di sisi server (Nitro) untuk mem-bypass CORS ketika memanggil backend API. Hal ini memperkuat keamanan dan menstabilkan fetch data dari aplikasi Vue frontend ke service backend.
## 2026-05-25 — Perbaikan & Dokumentasi Project
**Sprint/Phase:** Phase 5 — Stabilisasi & Dokumentasi
+13 -4
View File
@@ -45,8 +45,8 @@ Format dalam tabel Markdown yang terstruktur.
## 1. Project Timeline
```
[Start]──Phase 0──Phase 1──Phase 2──Phase 3──Phase 4──Phase 5──[Launch]
Setup Fondasi Inti API Hak Akses Eksekutif Stabilisasi
[Start]──Phase 0──Phase 1──Phase 2──Phase 3──Phase 4──Phase 5──Phase 6──[Launch]
Setup Fondasi Inti API Hak Akses Eksekutif Stabilisasi Verifikasi
```
| Fase | Nama | Durasi | Target | Status |
@@ -56,7 +56,8 @@ Format dalam tabel Markdown yang terstruktur.
| Phase 2 | Fitur Inti (Anjungan, WS, API) | 3 Minggu | Feb 2026 | ✅ Done |
| Phase 3 | Hak Akses & Keycloak | 2 Minggu | Apr 2026 | ✅ Done |
| Phase 4 | Fitur Eksekutif & Docker | 1 Minggu | Pertengahan Mei | ✅ Done |
| Phase 5 | Stabilisasi & Dokumentasi | 2 Minggu | Akhir Mei 2026 | 🔄 In Progress |
| Phase 5 | Stabilisasi & Dokumentasi | 2 Minggu | Akhir Mei 2026 | ✅ Done |
| Phase 6 | Verifikasi Akun & Kiosk | 2 Minggu | Juni 2026 | 🔄 In Progress |
---
@@ -135,7 +136,15 @@ Format dalam tabel Markdown yang terstruktur.
| Isolasi state loket (`currentProcessingPatient`) | 6 jam | Phase 2 | ✅ Done |
| Blacklist handler untuk endpoint gagal 500 | 4 jam | Phase 2 | ✅ Done |
| Dokumentasi PRD, QMD, DEVLOG, EVLOG | 8 jam | — | ✅ Done |
| Setup Unit Testing & E2E framework | 4 jam | — | 🔄 In Prog |
| Setup Unit Testing & E2E framework | 4 jam | — | ✅ Done |
### Phase 6 — Verifikasi Akun & Kiosk
| Task | Estimasi | Dependencies | Status |
|------|----------|--------------|--------|
| Sistem notifikasi suara (voice over) loket & klinik | 12 jam | Phase 2 | ✅ Done |
| Fitur pindah klinik pada dashboard admin | 8 jam | Phase 2 | ✅ Done |
| Halaman Detail Akun Verifikasi | 4 jam | Phase 3 | ✅ Done |
| Implementasi Proxy Routes (CORS) | 8 jam | Phase 2 | ✅ Done |
---
+2
View File
@@ -127,6 +127,7 @@ Rumah Sakit RSSA menghadapi masalah antrean rawat jalan yang tidak terstruktur:
- **FR-10:** Setiap loket memiliki state antrean yang terisolasi (tidak interferensi antar loket)
- **FR-11:** Petugas dapat skip, recall, atau selesaikan pasien
- **FR-12:** Display nomor panggil sinkron via WebSocket ke layar display
- **FR-12b:** Pemanggilan antrean dilengkapi dengan notifikasi suara (voice over) otomatis
### 5.4 Modul: Klinik / Dokter
- **FR-13:** Admin klinik melihat daftar pasien berdasarkan klinik yang diampu
@@ -352,6 +353,7 @@ export interface ApiResponse<T> {
| Master Penunjang | `/setting/master-penunjang` | ✅ | Superadmin |
| Screen Settings | `/setting/screen` | ✅ | Superadmin |
| Verifikasi Akun | `/verifikasi-akun/verifikasi-akun` | ❌ | Public |
| Detail Akun Verifikasi | `/verifikasi-akun/detail-akun` | ✅ | Admin |
### 8.2 Breakpoints
-3
View File
@@ -54,9 +54,6 @@
<div class="room-title">
<v-icon color="warning-600" class="mr-2">mdi-door</v-icon>
<span>{{ ruang.namaRuang }}</span>
<v-chip size="small" class="ml-2" color="warning-600">
Kamar : R.{{ ruang.nomorRuang }}
</v-chip>
</div>
</v-card-title>
+14 -21
View File
@@ -606,7 +606,8 @@ export const useQueueStore = defineStore('queue', () => {
// String versions for robustness
"1": 'menunggu', "2": 'menunggu', "3": 'anjungan', "4": 'anjungan', "5": 'di-loket',
"6": 'di-loket', "14": 'pemeriksaan', "15": 'pemeriksaan', "28": 'pending', "29": 'terlambat'
"6": 'di-loket', "14": 'pemeriksaan', "15": 'pemeriksaan', "28": 'pending', "29": 'terlambat',
"30": 'pending', "31": 'terlambat', "32": 'pending', "33": 'terlambat'
};
/**
@@ -2046,17 +2047,14 @@ const fetchPatientsForLoket = async (loketId, force = false) => {
message = `Menandai pasien ${patientCode} sebagai terlambat...`;
const payload = {
barcode: patient.barcode || "",
statuspasien: "29",
statuspasien2: "29",
idklinikstatus: "2",
idklinikstatus2: "2"
visit_code: patient.barcode || patient.visitCode || patient.ticket || "",
visit_status_id: [29]
};
// POST to external API and WAIT for response
try {
const apiBase = config.public.verificationApiBaseUrl || 'http://10.10.123.140:8089/api/v1';
const response = await fetch(`${apiBase}/tiket/update`, {
const apiBase = config.public.externalApiBaseUrl || 'http://10.10.123.135:8084/api/v1';
const response = await fetch(`${apiBase}/visit/status`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
@@ -2109,17 +2107,14 @@ const fetchPatientsForLoket = async (loketId, force = false) => {
message = `Menandai pasien ${patientCode} sebagai pending...`;
const payload = {
barcode: patient.barcode || "",
statuspasien: "28",
statuspasien2: "28",
idklinikstatus: "2",
idklinikstatus2: "2"
visit_code: patient.barcode || patient.visitCode || patient.ticket || "",
visit_status_id: [28]
};
// POST to external API and WAIT for response
try {
const apiBase = config.public.verificationApiBaseUrl || 'http://10.10.123.140:8089/api/v1';
const response = await fetch(`${apiBase}/tiket/update`, {
const apiBase = config.public.externalApiBaseUrl || 'http://10.10.123.135:8084/api/v1';
const response = await fetch(`${apiBase}/visit/status`, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
@@ -2839,10 +2834,9 @@ const fetchPatientsForLoket = async (loketId, force = false) => {
// Send API call to update status to 33 (TR PEMERIKSAAN)
try {
const visitApiBase = config.public.externalApiBaseUrl || 'http://10.10.123.135:8084/api/v1';
const apiUrl = `${visitApiBase}/visit/status/finish`;
const apiUrl = `${visitApiBase}/visit/status`;
const requestBody = {
patient_visit_healthcare_service_id: patient.healthcareServiceId,
visit_code: patient.barcode || patient.visitCode,
visit_code: patient.barcode || patient.visitCode || patient.ticket || "",
visit_status_id: [33]
};
@@ -2864,10 +2858,9 @@ const fetchPatientsForLoket = async (loketId, force = false) => {
// Send API call to update status to 32 (PE PEMERIKSAAN)
try {
const visitApiBase = config.public.externalApiBaseUrl || 'http://10.10.123.135:8084/api/v1';
const apiUrl = `${visitApiBase}/visit/status/finish`;
const apiUrl = `${visitApiBase}/visit/status`;
const requestBody = {
patient_visit_healthcare_service_id: patient.healthcareServiceId,
visit_code: patient.barcode || patient.visitCode,
visit_code: patient.barcode || patient.visitCode || patient.ticket || "",
visit_status_id: [32]
};