Merge branch 'dev' into feat/consultation-82
This commit is contained in:
No files matched your search
@@ -1,35 +1,50 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import * as DE from '~/components/pub/my-ui/doc-entry';
|
import * as DE from '~/components/pub/my-ui/doc-entry';
|
||||||
|
import type { Encounter } from '~/models/encounter';
|
||||||
|
|
||||||
defineProps<{
|
const props = defineProps<{
|
||||||
data: any
|
data: Encounter
|
||||||
}>()
|
}>()
|
||||||
|
|
||||||
|
let address = ''
|
||||||
|
if (props.data.patient.person.addresses) {
|
||||||
|
address = props.data.patient.person.addresses.map(a => a.address).join(', ')
|
||||||
|
}
|
||||||
|
|
||||||
|
let dpjp = '';
|
||||||
|
if (props.data.responsible_doctor) {
|
||||||
|
const dp = props.data.responsible_doctor.employee.person
|
||||||
|
dpjp = `${dp.frontTitle} ${dp.name} ${dp.endTitle}`
|
||||||
|
} else if (props.data.appointment_doctor) {
|
||||||
|
dpjp = props.data.appointment_doctor.employee.person.name
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div class="w-full rounded-md border bg-white dark:bg-neutral-950 p-4 shadow-sm">
|
<div class="w-full rounded-md border bg-white dark:bg-neutral-950 p-4 shadow-sm">
|
||||||
<!-- Data Pasien -->
|
<!-- Data Pasien -->
|
||||||
<h2 class="mb-2 md:text-base 2xl:text-lg font-semibold">{{ 'data.patient.person.name' }} - {{ 'data.patient.number' }}</h2>
|
<h2 class="mb-2 md:text-base 2xl:text-lg font-semibold">{{ data.patient.person.name }} - {{ data.patient.number }}</h2>
|
||||||
|
|
||||||
<div class="grid grid-cols-3" >
|
<div class="grid grid-cols-3" >
|
||||||
<div>
|
<div>
|
||||||
<DE.Block mode="preview" labelSize="large">
|
<DE.Block mode="preview" labelSize="large">
|
||||||
<DE.Cell>
|
<DE.Cell>
|
||||||
<DE.Label>Tgl. Lahir</DE.Label>
|
<DE.Label class="font-semibold">No. RM</DE.Label>
|
||||||
<DE.Field>
|
<DE.Field>
|
||||||
{{ 'data.patient.person.birthDate' }}
|
{{ data.patient.person.birthDate?.substring(0, 10) }}
|
||||||
</DE.Field>
|
</DE.Field>
|
||||||
</DE.Cell>
|
</DE.Cell>
|
||||||
<DE.Cell>
|
<DE.Cell>
|
||||||
<DE.Label>Jenis Kelamin</DE.Label>
|
<DE.Label class="font-semibold">Jenis Kelamin</DE.Label>
|
||||||
<DE.Field>
|
<DE.Field>
|
||||||
{{ 'data.patient.person.gender_code' }}
|
{{ data.patient.person.gender_code }}
|
||||||
</DE.Field>
|
</DE.Field>
|
||||||
</DE.Cell>
|
</DE.Cell>
|
||||||
<DE.Cell>
|
<DE.Cell>
|
||||||
<DE.Label>Alamat</DE.Label>
|
<DE.Label class="font-semibold">Alamat</DE.Label>
|
||||||
<DE.Field>
|
<DE.Field>
|
||||||
<div v-html="'data.patient.person .addresses[0].address'"></div>
|
<div v-html="address"></div>
|
||||||
</DE.Field>
|
</DE.Field>
|
||||||
</DE.Cell>
|
</DE.Cell>
|
||||||
</DE.Block>
|
</DE.Block>
|
||||||
@@ -37,21 +52,21 @@ defineProps<{
|
|||||||
<div>
|
<div>
|
||||||
<DE.Block mode="preview" labelSize="large">
|
<DE.Block mode="preview" labelSize="large">
|
||||||
<DE.Cell>
|
<DE.Cell>
|
||||||
<DE.Label>Tgl. Kunjungan</DE.Label>
|
<DE.Label class="font-semibold">Tgl. Kunjungan</DE.Label>
|
||||||
<DE.Field>
|
<DE.Field>
|
||||||
{{ 'data.date' }}
|
{{ data.visitDate.substring(0, 10) }}
|
||||||
</DE.Field>
|
</DE.Field>
|
||||||
</DE.Cell>
|
</DE.Cell>
|
||||||
<DE.Cell>
|
<DE.Cell>
|
||||||
<DE.Label>Klinik</DE.Label>
|
<DE.Label class="font-semibold">Klinik</DE.Label>
|
||||||
<DE.Field>
|
<DE.Field>
|
||||||
{{ 'data.unit.name' }}
|
{{ data.unit?.name }}
|
||||||
</DE.Field>
|
</DE.Field>
|
||||||
</DE.Cell>
|
</DE.Cell>
|
||||||
<DE.Cell>
|
<DE.Cell>
|
||||||
<DE.Label>DPJP</DE.Label>
|
<DE.Label class="font-semibold">DPJP</DE.Label>
|
||||||
<DE.Field>
|
<DE.Field>
|
||||||
{{ 'data.doctor.name' }}
|
{{ dpjp }}
|
||||||
</DE.Field>
|
</DE.Field>
|
||||||
</DE.Cell>
|
</DE.Cell>
|
||||||
</DE.Block>
|
</DE.Block>
|
||||||
@@ -59,21 +74,10 @@ defineProps<{
|
|||||||
<div>
|
<div>
|
||||||
<DE.Block mode="preview" labelSize="large">
|
<DE.Block mode="preview" labelSize="large">
|
||||||
<DE.Cell>
|
<DE.Cell>
|
||||||
<DE.Label>Tgl. Kunjungan</DE.Label>
|
<DE.Label position="dynamic" class="!text-base 2xl:!text-lg font-semibold">Billing</DE.Label>
|
||||||
<DE.Field>
|
<DE.Field class="text-base 2xl:text-lg">
|
||||||
{{ 'data.date' }}
|
Rp. 000.000
|
||||||
</DE.Field>
|
<!-- {{ data }} -->
|
||||||
</DE.Cell>
|
|
||||||
<DE.Cell>
|
|
||||||
<DE.Label>Klinik</DE.Label>
|
|
||||||
<DE.Field>
|
|
||||||
{{ 'data.unit.name' }}
|
|
||||||
</DE.Field>
|
|
||||||
</DE.Cell>
|
|
||||||
<DE.Cell>
|
|
||||||
<DE.Label>DPJP</DE.Label>
|
|
||||||
<DE.Field>
|
|
||||||
{{ 'data.doctor.name' }}
|
|
||||||
</DE.Field>
|
</DE.Field>
|
||||||
</DE.Cell>
|
</DE.Cell>
|
||||||
</DE.Block>
|
</DE.Block>
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
<script setup lang="ts">
|
||||||
|
import type { FormErrors } from '~/types/error'
|
||||||
|
import { toTypedSchema } from '@vee-validate/zod'
|
||||||
|
import Block from '~/components/pub/my-ui/form/block.vue'
|
||||||
|
import Combobox from '~/components/pub/my-ui/combobox/combobox.vue'
|
||||||
|
import FieldGroup from '~/components/pub/my-ui/form/field-group.vue'
|
||||||
|
import Field from '~/components/pub/my-ui/form/field.vue'
|
||||||
|
import Label from '~/components/pub/my-ui/form/label.vue'
|
||||||
|
import { educationCodes, genderCodes, occupationCodes, religionCodes, relationshipCodes } from '~/lib/constants'
|
||||||
|
import { mapToComboboxOptList } from '~/lib/utils'
|
||||||
|
import { Form } from '~/components/pub/ui/form'
|
||||||
|
|
||||||
|
interface DivisionFormData {
|
||||||
|
name: string
|
||||||
|
code: string
|
||||||
|
parentId: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
division: {
|
||||||
|
msg: {
|
||||||
|
placeholder: string
|
||||||
|
search: string
|
||||||
|
empty: string
|
||||||
|
}
|
||||||
|
}
|
||||||
|
items: {
|
||||||
|
value: string
|
||||||
|
label: string
|
||||||
|
code: string
|
||||||
|
}[]
|
||||||
|
schema: any
|
||||||
|
initialValues?: Partial<DivisionFormData>
|
||||||
|
errors?: FormErrors
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const emit = defineEmits<{
|
||||||
|
submit: [values: DivisionFormData, resetForm: () => void]
|
||||||
|
cancel: [resetForm: () => void]
|
||||||
|
}>()
|
||||||
|
|
||||||
|
const relationshipOpts = mapToComboboxOptList(relationshipCodes)
|
||||||
|
const educationOpts = mapToComboboxOptList(educationCodes)
|
||||||
|
const occupationOpts = mapToComboboxOptList(occupationCodes)
|
||||||
|
const genderOpts = mapToComboboxOptList(genderCodes)
|
||||||
|
|
||||||
|
const formSchema = toTypedSchema(props.schema)
|
||||||
|
|
||||||
|
// Form submission handler
|
||||||
|
function onSubmitForm(values: any, { resetForm }: { resetForm: () => void }) {
|
||||||
|
const formData: DivisionFormData = {
|
||||||
|
name: values.name || '',
|
||||||
|
code: values.code || '',
|
||||||
|
parentId: values.parentId || '',
|
||||||
|
}
|
||||||
|
emit('submit', formData, resetForm)
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<Form
|
||||||
|
v-slot="{ handleSubmit, resetForm }"
|
||||||
|
as=""
|
||||||
|
keep-values
|
||||||
|
:validation-schema="formSchema"
|
||||||
|
:initial-values="initialValues"
|
||||||
|
>
|
||||||
|
<form id="entry-form" @submit="handleSubmit($event, (values) => onSubmitForm(values, { resetForm }))">
|
||||||
|
<div class="mb-5 border-b border-b-slate-300 pb-3 text-lg xl:text-xl">
|
||||||
|
<div class="flex flex-col justify-between">
|
||||||
|
<Block>
|
||||||
|
<!-- Specialist -->
|
||||||
|
<FieldGroup :column="2">
|
||||||
|
<Label label-for="specialist_id">Specialist</Label>
|
||||||
|
<Field id="specialist_id" :errors="errors">
|
||||||
|
<FormField v-slot="{ componentField }" name="specialist_id">
|
||||||
|
<FormItem>
|
||||||
|
<FormControl>
|
||||||
|
<Combobox id="specialist_id" v-bind="componentField" :items="genderOpts" />
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
</FormField>
|
||||||
|
</Field>
|
||||||
|
</FieldGroup>
|
||||||
|
|
||||||
|
<!-- Subpecialist -->
|
||||||
|
<FieldGroup :column="2">
|
||||||
|
<Label label-for="subspecialist_id">Subspecialist</Label>
|
||||||
|
<Field id="subspecialist_id" :errors="errors">
|
||||||
|
<FormField v-slot="{ componentField }" name="subspecialist_id">
|
||||||
|
<FormItem>
|
||||||
|
<FormControl>
|
||||||
|
<Combobox id="subspecialist_id" v-bind="componentField" :items="genderOpts" />
|
||||||
|
</FormControl>
|
||||||
|
<FormMessage />
|
||||||
|
</FormItem>
|
||||||
|
</FormField>
|
||||||
|
</Field>
|
||||||
|
</FieldGroup>
|
||||||
|
</Block>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</Form>
|
||||||
|
</template>
|
||||||
@@ -3,18 +3,19 @@
|
|||||||
import { computed } from 'vue'
|
import { computed } from 'vue'
|
||||||
import { useRoute, useRouter } from 'vue-router'
|
import { useRoute, useRouter } from 'vue-router'
|
||||||
|
|
||||||
|
import { getDetail } from '~/services/encounter.service'
|
||||||
|
|
||||||
|
import type { Encounter } from '~/models/encounter'
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
import CompTab from '~/components/pub/my-ui/comp-tab/comp-tab.vue'
|
import CompTab from '~/components/pub/my-ui/comp-tab/comp-tab.vue'
|
||||||
import type { TabItem } from '~/components/pub/my-ui/comp-tab/type'
|
import type { TabItem } from '~/components/pub/my-ui/comp-tab/type'
|
||||||
|
|
||||||
import { getDetail } from '~/services/encounter.service'
|
import Status from '~/components/app/encounter/status.vue'
|
||||||
|
|
||||||
import AssesmentFunctionList from '~/components/content/assesment-function/list.vue'
|
import AssesmentFunctionList from '~/components/content/assesment-function/list.vue'
|
||||||
import EarlyMedicalAssesmentList from '~/components/content/soapi/entry.vue'
|
import EarlyMedicalAssesmentList from '~/components/content/soapi/entry.vue'
|
||||||
import PrescriptionList from '~/components/content/prescription/list.vue'
|
|
||||||
import type { Encounter } from '~/models/encounter'
|
|
||||||
import Status from '~/components/app/encounter/status.vue'
|
|
||||||
// import AssesmentFunctionList from '~/components/content/assesment-function/list.vue'
|
// import AssesmentFunctionList from '~/components/content/assesment-function/list.vue'
|
||||||
|
import PrescriptionList from '~/components/content/prescription/list.vue'
|
||||||
import EarlyMedicalRehabList from '~/components/content/soapi/entry.vue'
|
import EarlyMedicalRehabList from '~/components/content/soapi/entry.vue'
|
||||||
import Consultation from '~/components/content/consultation/list.vue'
|
import Consultation from '~/components/content/consultation/list.vue'
|
||||||
|
|
||||||
@@ -30,25 +31,12 @@ const activeTab = computed({
|
|||||||
})
|
})
|
||||||
|
|
||||||
const id = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
|
const id = typeof route.params.id == 'string' ? parseInt(route.params.id) : 0
|
||||||
const encounterRes = await getDetail(id)
|
const dataRes = await getDetail(id, { includes: 'patient,patient-person,patient-person-addresses,unit,Appointment_Doctor,Appointment_Doctor-employee,Appointment_Doctor-employee-person'})
|
||||||
const encounterResBody = encounterRes.body ?? null
|
const dataResBody = dataRes.body ?? null
|
||||||
const encounter = encounterResBody?.data ?? null
|
const data = dataResBody?.data ?? null
|
||||||
|
|
||||||
const data = {
|
|
||||||
noRm: 'RM21123',
|
|
||||||
nama: 'Ahmad Sutanto',
|
|
||||||
alamat: 'Jl Jaksa Agung Suprapto No. 12, Jakarta',
|
|
||||||
tanggalKunjungan: '23 April 2024',
|
|
||||||
klinik: 'Bedah',
|
|
||||||
tanggalLahir: '23 April 1990 (25 Tahun)',
|
|
||||||
jenisKelamin: 'Laki-laki',
|
|
||||||
jenisPembayaran: 'JKN',
|
|
||||||
noBilling: '223332',
|
|
||||||
dpjp: 'dr. Syaifullah, Sp.OT(K)',
|
|
||||||
}
|
|
||||||
|
|
||||||
const tabs: TabItem[] = [
|
const tabs: TabItem[] = [
|
||||||
{ value: 'status', label: 'Status Masuk/Keluar', component: Status, props: { encounter } },
|
{ value: 'status', label: 'Status Masuk/Keluar', component: Status, props: { encounter: data } },
|
||||||
{ value: 'early-medical-assessment', label: 'Pengkajian Awal Medis', component: EarlyMedicalAssesmentList },
|
{ value: 'early-medical-assessment', label: 'Pengkajian Awal Medis', component: EarlyMedicalAssesmentList },
|
||||||
{
|
{
|
||||||
value: 'rehab-medical-assessment',
|
value: 'rehab-medical-assessment',
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export interface Encounter {
|
|||||||
specilist?: Specialist
|
specilist?: Specialist
|
||||||
subspecialist_id?: number
|
subspecialist_id?: number
|
||||||
subspecialist?: Subspecialist
|
subspecialist?: Subspecialist
|
||||||
visitdate: string
|
visitDate: string
|
||||||
adm_employee_id: number
|
adm_employee_id: number
|
||||||
adm_employee: Employee
|
adm_employee: Employee
|
||||||
appointment_doctor_id: number
|
appointment_doctor_id: number
|
||||||
@@ -43,7 +43,7 @@ export function genEncounter(): Encounter {
|
|||||||
class_code: '',
|
class_code: '',
|
||||||
unit_id: 0,
|
unit_id: 0,
|
||||||
unit: genUnit(),
|
unit: genUnit(),
|
||||||
visitdate: '',
|
visitDate: '',
|
||||||
adm_employee_id: 0,
|
adm_employee_id: 0,
|
||||||
adm_employee: genEmployee(),
|
adm_employee: genEmployee(),
|
||||||
appointment_doctor_id: 0,
|
appointment_doctor_id: 0,
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ export interface Person extends Base {
|
|||||||
// alias?: string
|
// alias?: string
|
||||||
frontTitle?: string
|
frontTitle?: string
|
||||||
endTitle?: string
|
endTitle?: string
|
||||||
birthDate?: Date | string
|
birthDate?: string
|
||||||
birthRegency_code?: string
|
birthRegency_code?: string
|
||||||
gender_code?: string
|
gender_code?: string
|
||||||
residentIdentityNumber?: string
|
residentIdentityNumber?: string
|
||||||
|
|||||||
@@ -15,8 +15,8 @@ export function getList(params: any = null) {
|
|||||||
return base.getList(path, params, name)
|
return base.getList(path, params, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getDetail(id: number | string) {
|
export function getDetail(id: number | string, params?: any) {
|
||||||
return base.getDetail(path, id, name)
|
return base.getDetail(path, id, name, params)
|
||||||
}
|
}
|
||||||
|
|
||||||
export function update(id: number | string, data: any) {
|
export function update(id: number | string, data: any) {
|
||||||
|
|||||||
Reference in New Issue
Block a user