QRscan implementation
This commit is contained in:
No files matched your search
@@ -0,0 +1,203 @@
|
||||
import { ref, readonly } from 'vue'
|
||||
import type { CheckInResult } from '~/types/checkin'
|
||||
|
||||
export interface UseCheckInOptions {
|
||||
showSnackbar: (title: string, message: string, color: string, icon: string) => void
|
||||
saveToHistory: (item: {
|
||||
patientId: string
|
||||
queueNumber?: string
|
||||
status: string
|
||||
checkInTime: string
|
||||
checkInDate: string
|
||||
method: string
|
||||
}) => void
|
||||
saveSuccessfulScan: (qrData: string) => void
|
||||
onCheckInSuccess: (result: {
|
||||
success: boolean
|
||||
patientId: string
|
||||
status: string
|
||||
message: string
|
||||
action: 'checkin' | 'kembali'
|
||||
}) => void
|
||||
autoCloseDialog: () => void
|
||||
}
|
||||
|
||||
export const useCheckIn = (options: UseCheckInOptions) => {
|
||||
const { showSnackbar, saveToHistory, saveSuccessfulScan, onCheckInSuccess, autoCloseDialog } = options
|
||||
|
||||
// State
|
||||
const lastCheckInResult = ref<CheckInResult | null>(null)
|
||||
|
||||
// Perform check-in
|
||||
const performCheckIn = async (data: string, method: string = 'QR Scan'): Promise<boolean> => {
|
||||
await new Promise(resolve => setTimeout(resolve, 1000))
|
||||
const success = Math.random() < 0.8
|
||||
|
||||
// History akan disimpan di processQRCode setelah performCheckIn selesai
|
||||
// Jadi kita hanya perlu return hasil check-in
|
||||
return success
|
||||
}
|
||||
|
||||
// Process QR code (rename dari onDetect)
|
||||
const processQRCode = async (decodedText: string) => {
|
||||
const [patientId, status] = decodedText.split('|')
|
||||
|
||||
// Validasi format QR code
|
||||
if (!patientId || !status) {
|
||||
showSnackbar('Error', 'QR Code tidak valid. Format harus: ID_PASIEN|STATUS', 'error', 'mdi-close-circle')
|
||||
return
|
||||
}
|
||||
|
||||
// Cek apakah pasien diperbolehkan check-in
|
||||
const isAllowed = status === 'ALLOWED'
|
||||
|
||||
if (isAllowed) {
|
||||
// Jika diperbolehkan, langsung proses check-in
|
||||
const checkinSuccess = await performCheckIn(decodedText, 'QR Scan')
|
||||
|
||||
// Simpan hasil check-in
|
||||
lastCheckInResult.value = {
|
||||
success: checkinSuccess,
|
||||
patientId: patientId,
|
||||
status: status
|
||||
}
|
||||
|
||||
// Simpan ke history check-in dengan status hasil check-in
|
||||
saveToHistory({
|
||||
patientId: patientId || 'Unknown',
|
||||
status: checkinSuccess ? 'success' : 'failed',
|
||||
checkInTime: new Date().toISOString(),
|
||||
checkInDate: new Date().toISOString(),
|
||||
method: 'QR Scan'
|
||||
})
|
||||
|
||||
// Tampilkan dialog dengan hasil check-in
|
||||
if (checkinSuccess) {
|
||||
// Simpan QR code yang berhasil di-scan untuk mencegah scan ulang
|
||||
saveSuccessfulScan(decodedText)
|
||||
onCheckInSuccess({
|
||||
success: true,
|
||||
patientId: patientId,
|
||||
status: status,
|
||||
message: `✅ Check-in Berhasil!\n\nPasien ${patientId} berhasil melakukan check-in.`,
|
||||
action: 'checkin'
|
||||
})
|
||||
} else {
|
||||
onCheckInSuccess({
|
||||
success: false,
|
||||
patientId: patientId,
|
||||
status: status,
|
||||
message: `❌ Check-in Gagal!\n\nPasien ${patientId} diperbolehkan check-in, namun proses check-in gagal. Silakan coba lagi.`,
|
||||
action: 'checkin'
|
||||
})
|
||||
}
|
||||
|
||||
autoCloseDialog()
|
||||
} else {
|
||||
// Jika belum diperbolehkan, tampilkan pesan
|
||||
lastCheckInResult.value = {
|
||||
success: false,
|
||||
patientId: patientId,
|
||||
status: status
|
||||
}
|
||||
|
||||
// Simpan ke history check-in untuk NOT_ALLOWED
|
||||
saveToHistory({
|
||||
patientId: patientId || 'Unknown',
|
||||
status: 'NOT_ALLOWED',
|
||||
checkInTime: new Date().toISOString(),
|
||||
checkInDate: new Date().toISOString(),
|
||||
method: 'QR Scan'
|
||||
})
|
||||
|
||||
onCheckInSuccess({
|
||||
success: false,
|
||||
patientId: patientId,
|
||||
status: status,
|
||||
message: `⏳ Belum Diizinkan Check-in\n\nAntrean Pasien ${patientId} belum diperbolehkan check-in. Mohon menunggu hingga antrean Anda dipanggil.`,
|
||||
action: 'kembali'
|
||||
})
|
||||
|
||||
autoCloseDialog()
|
||||
}
|
||||
}
|
||||
|
||||
// Check-in manual
|
||||
const checkInManual = async (
|
||||
patientId: string,
|
||||
onSuccess: () => void,
|
||||
onError: () => void
|
||||
) => {
|
||||
try {
|
||||
if (!patientId || !patientId.trim()) {
|
||||
showSnackbar('Error', 'Mohon isi nomor antrean atau ID pasien', 'error', 'mdi-alert')
|
||||
onError()
|
||||
return
|
||||
}
|
||||
|
||||
const trimmedPatientId = patientId.trim()
|
||||
|
||||
// Simulasi check-in manual
|
||||
const success = await performCheckIn(`${trimmedPatientId}|ALLOWED`, 'Manual')
|
||||
|
||||
// Simpan hasil check-in
|
||||
lastCheckInResult.value = {
|
||||
success: success,
|
||||
patientId: trimmedPatientId,
|
||||
status: 'ALLOWED',
|
||||
}
|
||||
|
||||
// Simpan ke history check-in
|
||||
saveToHistory({
|
||||
patientId: trimmedPatientId,
|
||||
status: success ? 'success' : 'failed',
|
||||
checkInTime: new Date().toISOString(),
|
||||
checkInDate: new Date().toISOString(),
|
||||
method: 'Manual'
|
||||
})
|
||||
|
||||
if (success) {
|
||||
// Simpan QR code yang berhasil untuk mencegah double antrian (jika menggunakan format yang sama)
|
||||
saveSuccessfulScan(`${trimmedPatientId}|ALLOWED`)
|
||||
showSnackbar('Berhasil!', 'Check-in manual berhasil dilakukan.', 'success', 'mdi-check-circle')
|
||||
|
||||
// Update info dialog
|
||||
onCheckInSuccess({
|
||||
success: true,
|
||||
patientId: trimmedPatientId,
|
||||
status: 'ALLOWED',
|
||||
message: `✅ Check-in Berhasil!\n\nPasien ${trimmedPatientId} berhasil melakukan check-in secara manual.`,
|
||||
action: 'checkin'
|
||||
})
|
||||
|
||||
autoCloseDialog()
|
||||
onSuccess()
|
||||
} else {
|
||||
showSnackbar('Gagal!', 'Check-in manual gagal dilakukan. Silakan coba lagi!', 'error', 'mdi-close-circle')
|
||||
|
||||
// Update info dialog untuk gagal
|
||||
onCheckInSuccess({
|
||||
success: false,
|
||||
patientId: trimmedPatientId,
|
||||
status: 'ALLOWED',
|
||||
message: `❌ Check-in Gagal!\n\nPasien ${trimmedPatientId} gagal melakukan check-in secara manual. Silakan coba lagi.`,
|
||||
action: 'checkin'
|
||||
})
|
||||
|
||||
autoCloseDialog()
|
||||
onError()
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Error in checkInManual:', error)
|
||||
showSnackbar('Error', 'Terjadi kesalahan saat melakukan check-in. Silakan coba lagi.', 'error', 'mdi-alert')
|
||||
onError()
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
lastCheckInResult: readonly(lastCheckInResult),
|
||||
performCheckIn,
|
||||
processQRCode,
|
||||
checkInManual,
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user