fix: get control letter of doctor

This commit is contained in:
riefive
2025-11-18 12:40:58 +07:00
parent 411d83523e
commit a41df17d86
3 changed files with 73 additions and 121 deletions
+45 -58
View File
@@ -341,7 +341,7 @@ async function handleEvent(menu: string, value: any) {
if (menu === 'service-type') {
selectedServiceType.value = value
doctors.value = await getDoctorLabelList({
serviceType: selectedServiceType.value || 1,
serviceType: selectedServiceType.value || '2',
serviceDate: new Date().toISOString().substring(0, 10),
specialistCode: 0,
})
@@ -369,13 +369,33 @@ async function handleEvent(menu: string, value: any) {
}
if (menu === 'search-letter') {
isLetterReadonly.value = false
getLetterMappers(value.admissionType, value.search).then(() => {
getLetterMappers(value.admissionType, value.search).then(async () => {
if (letters.value.length > 0) {
const copyObjects = { ...selectedObjects.value }
const letter = letters.value[0]
selectedObjects.value = {}
selectedLetter.value = letter.letterNumber
selectedLetter.value = letter.letterNumber
isLetterReadonly.value = true
if (letter.information || letter.clinic) {
const poly = value.admissionType === '3' ? letter.clinic : letter.information?.poly
if (poly) {
const resultControl = await getControlLetterList({
mode: 'by-schedule',
controlDate: letter.plannedDate,
controlType: selectedServiceType.value,
polyCode: poly,
})
if (resultControl && resultControl.success && resultControl.body) {
const resultData = resultControl.body?.response?.list || []
const resultUnique = [...new Map(resultData.map((item: any) => [item.kode, item])).values()]
const controlLetters = resultUnique.map((item: any) => ({
value: item.kodeDokter ? String(item.kodeDokter) : '',
label: `${item.kodeDokter} - ${item.namaDokter} - ${item.jadwalPraktek} (${item.kapasitas})`,
}))
doctors.value = controlLetters
}
}
}
setTimeout(async () => {
selectedObjects.value = copyObjects
selectedObjects.value['letterDate'] = letter.plannedDate
@@ -420,7 +440,7 @@ async function handleEvent(menu: string, value: any) {
}
if (menu === 'save-sep') {
isSaveLoading.value = true
// Map letter data to form if admissionType !== '3' and letters.value has data
let mappedValues = value
if (selectedAdmissionType.value !== '3') {
@@ -456,7 +476,7 @@ async function handleEvent(menu: string, value: any) {
if (!value.clinicExcecutive) {
mappedValues.clinicExcecutive = 'no'
}
createSep(makeSepData(mappedValues))
.then((res) => {
const body = res?.body
@@ -492,13 +512,13 @@ async function handleFetch(params: any) {
if (menu === 'clinic-from') {
facilitiesFrom.value = await getHealthFacilityLabelList({
healthcare: value,
healthcareType: selectedServiceType.value || 1,
healthcareType: selectedServiceType.value || 2,
})
}
if (menu === 'clinic-to') {
facilitiesTo.value = await getHealthFacilityLabelList({
healthcare: value,
healthcareType: selectedServiceType.value || 1,
healthcareType: selectedServiceType.value || 2,
})
}
if (menu === 'province') {
@@ -523,6 +543,7 @@ async function handleFetchSpecialists() {
}
async function handleInit() {
selectedServiceType.value = '2'
const facilities = await getHealthFacilityLabelList({
healthcare: 'Puskesmas',
healthcareType: selectedLetter.value || 1,
@@ -531,7 +552,7 @@ async function handleInit() {
facilitiesFrom.value = facilities
facilitiesTo.value = facilities
doctors.value = await getDoctorLabelList({
serviceType: selectedServiceType.value || 1,
serviceType: selectedServiceType.value || '2',
serviceDate: new Date().toISOString().substring(0, 10),
specialistCode: 0,
})
@@ -616,44 +637,20 @@ onMounted(async () => {
<template>
<div class="mb-5 border-b border-b-slate-300 pb-3 text-lg xl:text-xl">
<Icon
name="i-lucide-panel-bottom"
class="me-2"
/>
<Icon name="i-lucide-panel-bottom" class="me-2" />
<span class="font-semibold">Tambah</span>
SEP
</div>
<AppSepEntryForm
:is-save-loading="isSaveLoading"
:is-service="isServiceHidden"
:doctors="doctors"
:diagnoses="diagnoses"
:facilities-from="facilitiesFrom"
:facilities-to="facilitiesTo"
:service-types="serviceTypesList"
:register-methods="registerMethodsList"
:accidents="accidentsList"
:purposes="purposeOfVisitsList"
:procedures="proceduresList"
:assessments="assessmentsList"
:support-codes="supportCodesList"
:provinces="provincesList"
:cities="citiesList"
:districts="districtsList"
:class-levels="classLevelsList"
:class-level-upgrades="classLevelUpgradesList"
:class-pay-sources="classPaySourcesList"
:specialists="specialistsTree"
:objects="selectedObjects"
@fetch="handleFetch"
@event="handleEvent"
/>
<AppViewPatient
v-model:open="openPatient"
v-model:selected="selectedPatient"
:patients="patients"
:pagination-meta="paginationMeta"
@fetch="
<AppSepEntryForm :is-save-loading="isSaveLoading" :is-service="isServiceHidden" :doctors="doctors"
:diagnoses="diagnoses" :facilities-from="facilitiesFrom" :facilities-to="facilitiesTo"
:service-types="serviceTypesList" :register-methods="registerMethodsList" :accidents="accidentsList"
:purposes="purposeOfVisitsList" :procedures="proceduresList" :assessments="assessmentsList"
:support-codes="supportCodesList" :provinces="provincesList" :cities="citiesList" :districts="districtsList"
:class-levels="classLevelsList" :class-level-upgrades="classLevelUpgradesList"
:class-pay-sources="classPaySourcesList" :specialists="specialistsTree" :objects="selectedObjects"
@fetch="handleFetch" @event="handleEvent" />
<AppViewPatient v-model:open="openPatient" 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.)
@@ -663,20 +660,10 @@ onMounted(async () => {
getPatientsList({ ...value, 'page-size': 10, includes: 'person' })
}
}
"
@save="handleSavePatient"
/>
<AppViewHistory
v-model:open="openHistory"
:histories="histories"
/>
<AppViewLetter
v-model:open="openLetter"
:letters="letters"
:menu="selectedAdmissionType !== '3' ? 'control' : 'reference'"
:selected="selectedLetter"
" @save="handleSavePatient" />
<AppViewHistory v-model:open="openHistory" :histories="histories" />
<AppViewLetter v-model:open="openLetter" :letters="letters"
:menu="selectedAdmissionType !== '3' ? 'control' : 'reference'" :selected="selectedLetter"
:pagination-meta="{ recordCount: 0, page: 1, pageSize: 10, totalPage: 0 } as any"
@fetch="(value) => getLetterMappers(value.admissionType, value.search)"
@save="handleSaveLetter"
/>
@fetch="(value) => getLetterMappers(value.admissionType, value.search)" @save="handleSaveLetter" />
</template>
+24 -60
View File
@@ -107,10 +107,7 @@ const headerPrep: HeaderPrep = {
},
}
async function getMonitoringVisitMappers() {
isLoading.dataListLoading = true
data.value = []
function getDateFilter() {
let dateFilter = '';
const isTimeLocal = true
const dateFirst = dateSelection.value && dateSelection.value.start ? dateSelection.value.start.toDate(getLocalTimeZone()) : new Date()
@@ -120,9 +117,15 @@ async function getMonitoringVisitMappers() {
} else {
dateFilter = dateFirst.toISOString().substring(0, 10)
}
return dateFilter
}
async function getMonitoringVisitMappers() {
isLoading.dataListLoading = true
data.value = []
const dateFilter = getDateFilter()
const result = await geMonitoringVisitList({
date: dateFilter,
date: dateFilter || '',
serviceType: serviceType.value,
})
@@ -241,35 +244,20 @@ provide('table_data_loader', isLoading)
<!-- Filter Bar -->
<div class="my-2 flex flex-wrap items-center gap-2">
<!-- Search -->
<Input
v-model="search"
placeholder="Cari No. SEP / No. Kartu BPJS..."
class="w-72"
/>
<Input v-model="search" placeholder="Cari No. SEP / No. Kartu BPJS..." class="w-72" />
<!-- Filter -->
<div class="w-72">
<Select
id="serviceType"
icon-name="i-lucide-chevron-down"
v-model="serviceType"
:items="serviceTypesList"
placeholder="Pilih Pelayanan"
/>
<Select id="serviceType" icon-name="i-lucide-chevron-down" v-model="serviceType" :items="serviceTypesList"
placeholder="Pilih Pelayanan" />
</div>
<!-- Date Range -->
<Popover>
<PopoverTrigger as-child>
<Button
variant="outline"
class="h-[40px] w-72 border-gray-400 bg-white text-right font-normal"
>
<Button variant="outline" class="h-[40px] w-72 border-gray-400 bg-white text-right font-normal">
{{ dateRange }}
<Icon
name="i-lucide-calendar"
class="h-5 w-5"
/>
<Icon name="i-lucide-calendar" class="h-5 w-5" />
</Button>
</PopoverTrigger>
<PopoverContent class="p-2">
@@ -280,14 +268,9 @@ provide('table_data_loader', isLoading)
<!-- Export -->
<DropdownMenu>
<DropdownMenuTrigger as-child>
<Button
variant="outline"
class="ml-auto h-[40px] w-[120px] rounded-md border-green-600 text-green-600 hover:bg-green-50"
>
<Icon
name="i-lucide-download"
class="h-5 w-5"
/>
<Button variant="outline"
class="ml-auto h-[40px] w-[120px] rounded-md border-green-600 text-green-600 hover:bg-green-50">
<Icon name="i-lucide-download" class="h-5 w-5" />
Ekspor
</Button>
</DropdownMenuTrigger>
@@ -299,54 +282,35 @@ provide('table_data_loader', isLoading)
</div>
<div class="mt-4">
<AppSepList
v-if="!isLoading.dataListLoading"
:data="data"
@update:modelValue="onRowSelected"
/>
<AppSepList v-if="!isLoading.dataListLoading" :data="data" @update:modelValue="onRowSelected" />
</div>
<!-- Pagination -->
<template v-if="paginationMeta">
<div v-if="paginationMeta.totalPage > 1">
<PubMyUiPagination
:pagination-meta="paginationMeta"
@page-change="handlePageChange"
/>
<PubMyUiPagination :pagination-meta="paginationMeta" @page-change="handlePageChange" />
</div>
</template>
<!-- Trigger button -->
<Dialog v-model:open="open">
<DialogTrigger as-child></DialogTrigger>
<DialogContent class="sm:max-w-md">
<DialogHeader>
<DialogTitle>Hapus SEP</DialogTitle>
</DialogHeader>
<DialogDescription class="text-gray-700">Apakah anda yakin ingin menghapus SEP dengan data:</DialogDescription>
<div class="mt-4 space-y-2 text-sm">
<p>No. SEP : {{ sepData.sepNumber }}</p>
<p>No. Kartu BPJS : {{ sepData.cardNumber }}</p>
<p>Nama Pasien : {{ sepData.patientName }}</p>
<p><strong>>No. SEP:</strong> {{ sepData.sepNumber }}</p>
<p><strong>No. Kartu BPJS:</strong> {{ sepData.cardNumber }}</p>
<p><strong>Nama Pasien:</strong> {{ sepData.patientName }}</p>
</div>
<DialogFooter class="mt-6 flex justify-end gap-3">
<Button
variant="outline"
class="border-green-600 text-green-600 hover:bg-green-50"
@click="handleRemove"
>
<Button variant="outline" class="border-green-600 text-green-600 hover:bg-green-50" @click="handleRemove">
<X class="mr-1 h-4 w-4" />
Tidak
</Button>
<Button
variant="destructive"
class="bg-red-600 hover:bg-red-700"
@click="handleRemove"
>
<Button variant="destructive" class="bg-red-600 hover:bg-red-700" @click="handleRemove">
<Check class="mr-1 h-4 w-4" />
Ya
</Button>
@@ -6,6 +6,7 @@ const name = 'rencana-kontrol'
export function getList(params: any = null) {
let url = path
console.log(params)
if (params?.letterNumber && params.mode === 'by-control') {
url += `/noSuratKontrol/${params.letterNumber}`
}
@@ -15,11 +16,11 @@ export function getList(params: any = null) {
if (params?.letterNumber && params.mode === 'by-sep') {
url += `/${params.letterNumber}`
}
if (params?.letterNumber && params.mode === 'by-schedule') {
url += `/jadwalDokter?jeniskontrol=${params.controlType}&kodepoli=${params.poliCode}&tanggalkontrol=${params.controlDate}`
if (params?.controlDate && params.mode === 'by-schedule') {
url += `/jadwalDokter?jeniskontrol=${params.controlType}&kodepoli=${params.polyCode}&tanggalkontrol=${params.controlDate}`
delete params.controlType
delete params.poliCode
delete params.controlDate
delete params.polyCode
}
if (params) {
delete params.letterNumber