From aeaefb94788a6af745236f4247fda1ca9f6f0ac6 Mon Sep 17 00:00:00 2001 From: riefive Date: Tue, 28 Oct 2025 14:01:09 +0700 Subject: [PATCH] feat(sep): refactor table letter --- app/components/app/sep/entry-form.vue | 4 +- app/components/app/sep/list-cfg.letter.ts | 53 +++++++ app/components/app/sep/list-letter.vue | 39 ++++++ .../app/sep/table-search-letter.vue | 104 -------------- app/components/app/sep/view-letter.vue | 126 +++++++++++++++++ app/components/content/sep/entry.vue | 129 ++++++++++++------ app/services/vclaim-control-letter.service.ts | 10 +- 7 files changed, 316 insertions(+), 149 deletions(-) create mode 100644 app/components/app/sep/list-cfg.letter.ts create mode 100644 app/components/app/sep/list-letter.vue delete mode 100644 app/components/app/sep/table-search-letter.vue create mode 100644 app/components/app/sep/view-letter.vue diff --git a/app/components/app/sep/entry-form.vue b/app/components/app/sep/entry-form.vue index e25b00cf..93cf02fb 100644 --- a/app/components/app/sep/entry-form.vue +++ b/app/components/app/sep/entry-form.vue @@ -332,7 +332,9 @@ onMounted(() => { variant="outline" type="button" class="h-[40px] rounded-md border-orange-400 text-orange-400 hover:bg-green-50" - @click="emit('event', 'search-letter')" + @click=" + emit('event', 'search-letter', { admissionType, serviceType, search: referralLetterNumber || '' }) + " > import('~/components/pub/my-ui/data/select-radio.vue')) + +export interface LetterData { + letterNumber: string + plannedDate: string + sepNumber: string + patientName: string + bpjsCardNo: string + clinic: string + doctor: string +} + +export const config: Config = { + cols: [{ width: 50 }, { width: 150 }, { width: 120 }, { width: 120 }, { width: 120 }, { width: 120 }, { width: 150 }, { width: 200 }], + + headers: [ + [ + { label: '' }, + { label: 'CONTROL LETTER NO.' }, + { label: 'PLANNED DATE' }, + { label: 'SEP NO.' }, + { label: 'PATIENT NAME' }, + { label: 'BPJS CARD NO.' }, + { label: 'CLINIC' }, + { label: 'DOCTOR' }, + ], + ], + + keys: ['check', 'letterNumber', 'plannedDate', 'sepNumber', 'patientName', 'bpjsCardNo', 'clinic', 'doctor'], + + delKeyNames: [ + { key: 'code', label: 'Code' }, + { key: 'name', label: 'Name' }, + ], + + parses: {}, + + components: { + check(rec, idx) { + return { + idx, + rec: { ...rec as object, menu: 'letter' }, + component: SelectedRadio, + } + }, + }, + + htmls: {}, +} + diff --git a/app/components/app/sep/list-letter.vue b/app/components/app/sep/list-letter.vue new file mode 100644 index 00000000..ba39babf --- /dev/null +++ b/app/components/app/sep/list-letter.vue @@ -0,0 +1,39 @@ + + + + diff --git a/app/components/app/sep/table-search-letter.vue b/app/components/app/sep/table-search-letter.vue deleted file mode 100644 index 64e65ff6..00000000 --- a/app/components/app/sep/table-search-letter.vue +++ /dev/null @@ -1,104 +0,0 @@ - - - diff --git a/app/components/app/sep/view-letter.vue b/app/components/app/sep/view-letter.vue new file mode 100644 index 00000000..b2c75976 --- /dev/null +++ b/app/components/app/sep/view-letter.vue @@ -0,0 +1,126 @@ + + + diff --git a/app/components/content/sep/entry.vue b/app/components/content/sep/entry.vue index 36283282..dd863794 100644 --- a/app/components/content/sep/entry.vue +++ b/app/components/content/sep/entry.vue @@ -6,6 +6,7 @@ import { useRoute } from 'vue-router' import AppSepEntryForm from '~/components/app/sep/entry-form.vue' import AppViewPatient from '~/components/app/patient/view-patient.vue' import AppViewHistory from '~/components/app/sep/view-history.vue' +import AppViewLetter from '~/components/app/sep/view-letter.vue' import { toast } from '~/components/pub/ui/toast' // Types @@ -33,17 +34,19 @@ import { getValueLabelList as getDistrictList } from '~/services/vclaim-region-d import { getValueLabelList as getDoctorLabelList } from '~/services/vclaim-doctor.service' import { getValueLabelList as getHealthFacilityLabelList } from '~/services/vclaim-healthcare.service' import { getValueLabelList as getDiagnoseLabelList } from '~/services/vclaim-diagnose.service' +import { getList as getHospitalLetterList } from '~/services/vclaim-reference-hospital-letter.service' +import { getList as getControlLetterList } from '~/services/vclaim-control-letter.service' import { getList as geMonitoringVisitList } from '~/services/vclaim-monitoring-visit.service' import { getList as getMonitoringHistoryList } from '~/services/vclaim-monitoring-history.service' import { create as createSep, makeSepData } from '~/services/vclaim-sep.service' // Handlers -import { - patients, - selectedPatient, - selectedPatientObject, - paginationMeta, - getPatientsList, +import { + patients, + selectedPatient, + selectedPatientObject, + paginationMeta, + getPatientsList, getPatientCurrent, getPatientByIdentifierSearch, } from '~/handlers/patient.handler' @@ -57,6 +60,7 @@ const selectedObjects = ref({}) const selectedServiceType = ref('') const histories = ref>([]) const visits = ref>([]) +const letters = ref>([]) const doctors = ref>([]) const diagnoses = ref>([]) const facilitiesFrom = ref>([]) @@ -144,28 +148,68 @@ async function getMonitoringVisitMappers() { } } -const letters = [ - { - noSurat: 'SK22334442', - tglRencana: '12 Agustus 2025', - noSep: 'SEP3232332', - namaPasien: 'Ahmad Baidowi', - noBpjs: '33442331214', - klinik: 'Penyakit Dalam', - dokter: 'dr. Andi Prasetyo, Sp.PD-KHOM', - }, - { - noSurat: 'SK99120039', - tglRencana: '12 Agustus 2025', - noSep: 'SEP4443232', - namaPasien: 'Bian Maulana', - noBpjs: '33442367656', - klinik: 'Gigi', - dokter: 'dr. Achmad Suparjo', - }, -] +async function getLetterMappers(admissionType: string, search: string) { + letters.value = [] + let result = null + if (admissionType !== '3') { + result = await getHospitalLetterList({ + letterNumber: search, + }) + } else { + result = await getControlLetterList({ + letterNumber: search, + mode: 'by-control', + }) + if (result && result.success && result.body) { + const lettersRaw = result.body?.response || null + if (!lettersRaw) { + result = await getControlLetterList({ + letterNumber: search, + mode: 'by-card', + }) + } + } + if (result && result.success && result.body) { + const lettersRaw = result.body?.response || null + if (!lettersRaw) { + result = await getControlLetterList({ + letterNumber: search, + mode: 'by-sep', + }) + } + } + } + if (result && result.success && result.body) { + const lettersRaw = result.body?.response || null + console.log(lettersRaw) + // { + // noSurat: 'SK22334442', + // tglRencana: '12 Agustus 2025', + // noSep: 'SEP3232332', + // namaPasien: 'Ahmad Baidowi', + // noBpjs: '33442331214', + // klinik: 'Penyakit Dalam', + // dokter: 'dr. Andi Prasetyo, Sp.PD-KHOM', + // }, -function handleSavePatient() { + // { + // noSurat: 'SK99120039', + // tglRencana: '12 Agustus 2025', + // noSep: 'SEP4443232', + // namaPasien: 'Bian Maulana', + // noBpjs: '33442367656', + // klinik: 'Gigi', + // dokter: 'dr. Achmad Suparjo', + // }, + + if (!lettersRaw) return + lettersRaw.forEach((result: any) => { + // letters.value.push({}) + }) + } +} + +function handleSavePatient() { selectedPatientObject.value = null setTimeout(() => { getPatientCurrent(selectedPatient.value) @@ -196,10 +240,7 @@ async function handleEvent(menu: string, value: any) { return } if (menu === 'search-letter') { - getMonitoringVisitMappers().then(() => { - openLetter.value = true - }) - return + openLetter.value = true } if (menu === 'history-sep') { getMonitoringHistoryMappers().then(() => { @@ -401,15 +442,17 @@ onMounted(async () => { v-model:selected="selectedPatient" :patients="patients" :pagination-meta="paginationMeta" - @fetch="(value) => { - if (value.search && value.search.length >= 3) { - // Use identifier search for specific searches (NIK, RM, etc.) - getPatientByIdentifierSearch(value.search) - } else { - // Use regular search for general searches - getPatientsList({ ...value, 'page-size': 10, includes: 'person' }) + @fetch=" + (value) => { + if (value.search && value.search.length >= 3) { + // Use identifier search for specific searches (NIK, RM, etc.) + getPatientByIdentifierSearch(value.search) + } else { + // Use regular search for general searches + getPatientsList({ ...value, 'page-size': 10, includes: 'person' }) + } } - }" + " @save="handleSavePatient" /> { v-model:open="openHistory" :histories="histories" /> + diff --git a/app/services/vclaim-control-letter.service.ts b/app/services/vclaim-control-letter.service.ts index 2040f7f5..007e91c5 100644 --- a/app/services/vclaim-control-letter.service.ts +++ b/app/services/vclaim-control-letter.service.ts @@ -6,16 +6,16 @@ const name = 'rencana-kontrol' export function getList(params: any = null) { let url = path - if (params?.letterNumber && params.letterMode === 'by-control') { + if (params?.letterNumber && params.mode === 'by-control') { url += `/noSuratKontrol/${params.letterNumber}` } - if (params?.letterNumber && params.letterMode === 'by-card') { + if (params?.letterNumber && params.mode === 'by-card') { url += `/noka/${params.letterNumber}` } - if (params?.letterNumber && params.letterMode === 'by-sep') { + if (params?.letterNumber && params.mode === 'by-sep') { url += `/${params.letterNumber}` } - if (params?.letterNumber && params.letterMode === 'by-schedule') { + if (params?.letterNumber && params.mode === 'by-schedule') { url += `/jadwalDokter?jeniskontrol=${params.controlType}&kodepoli=${params.poliCode}&tanggalkontrol=${params.controlDate}` delete params.controlType delete params.poliCode @@ -23,7 +23,7 @@ export function getList(params: any = null) { } if (params) { delete params.letterNumber - delete params.letterMode + delete params.mode } return base.getList(url, params, name) } \ No newline at end of file