diff --git a/app/components/app/material-package-item/quick-list.cfg.ts b/app/components/app/material-package-item/quick-list.cfg.ts
new file mode 100644
index 00000000..90caf510
--- /dev/null
+++ b/app/components/app/material-package-item/quick-list.cfg.ts
@@ -0,0 +1,23 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+
+type SmallDetailDto = any
+
+export const config: Config = {
+ cols: [ { width: 150 }, {}, { width: 150 }],
+
+ headers: [
+ [
+ { label: 'No' },
+ { label: 'Name' },
+ { label: 'Jumlah' },
+ ],
+ ],
+
+ keys: ['number', 'material.name', 'count'],
+
+ parses: {
+ number: (rec: unknown): unknown => {
+ return (rec as SmallDetailDto).medicineGroup?.name || '-'
+ },
+ },
+}
diff --git a/app/components/app/material-package-item/quick-list.vue b/app/components/app/material-package-item/quick-list.vue
new file mode 100644
index 00000000..2ff50a73
--- /dev/null
+++ b/app/components/app/material-package-item/quick-list.vue
@@ -0,0 +1,23 @@
+
+
+
+
+
+ Daftar Item BMHP
+
+
+
+
diff --git a/app/components/app/material-package/switcher.vue b/app/components/app/material-package/switcher.vue
new file mode 100644
index 00000000..2709ff5e
--- /dev/null
+++ b/app/components/app/material-package/switcher.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
diff --git a/app/components/app/procedure-room-order-item/list-detail.cfg.ts b/app/components/app/procedure-room-order-item/list-detail.cfg.ts
new file mode 100644
index 00000000..cf0f6dab
--- /dev/null
+++ b/app/components/app/procedure-room-order-item/list-detail.cfg.ts
@@ -0,0 +1,16 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+export const config: Config = {
+ cols: [{}, {}, { classVal: '!p-0.5' }],
+
+ headers: [
+ [
+ { label: 'Kode' },
+ { label: 'Nama' },
+ { label: 'Catatan' },
+ ],
+ ],
+
+ keys: ['procedureRoom.code', 'procedureRoom.infra.name', 'note'],
+}
diff --git a/app/components/app/procedure-room-order-item/list-detail.vue b/app/components/app/procedure-room-order-item/list-detail.vue
new file mode 100644
index 00000000..75727a72
--- /dev/null
+++ b/app/components/app/procedure-room-order-item/list-detail.vue
@@ -0,0 +1,22 @@
+
+
+
+
+
+ Daftar Order Ruang
+
+
+
+
diff --git a/app/components/app/procedure-room-order-item/list-entry.cfg.ts b/app/components/app/procedure-room-order-item/list-entry.cfg.ts
new file mode 100644
index 00000000..2afcd855
--- /dev/null
+++ b/app/components/app/procedure-room-order-item/list-entry.cfg.ts
@@ -0,0 +1,43 @@
+import type { Config } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dud.vue'))
+const input = defineAsyncComponent(() => import('~/components/pub/ui/input/Input.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, { classVal: '!p-0.5' }, { width: 50 }],
+
+ headers: [
+ [
+ { label: 'Kode' },
+ { label: 'Nama' },
+ { label: 'Catatan' },
+ { label: '' },
+ ],
+ ],
+
+ keys: ['procedureRoom.code', 'procedureRoom.infra.name', 'note'],
+
+ delKeyNames: [
+ { key: 'mcuSrc.name', label: 'Nama' },
+ ],
+
+ components: {
+ note(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: input,
+ }
+ },
+ action(rec, idx) {
+ return {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/procedure-room-order-item/list-entry.vue b/app/components/app/procedure-room-order-item/list-entry.vue
new file mode 100644
index 00000000..f86a0b8e
--- /dev/null
+++ b/app/components/app/procedure-room-order-item/list-entry.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+ Daftar Order Ruang
+
+
+
+
+
+
+
diff --git a/app/components/app/procedure-room-order/detail.vue b/app/components/app/procedure-room-order/detail.vue
new file mode 100644
index 00000000..23d0dc75
--- /dev/null
+++ b/app/components/app/procedure-room-order/detail.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+ Detail Order
+
+
+
+ No. Order
+
+ ORT-{{ data.id }}
+
+
+ Tgl. Order
+
+ {{ data.createdAt?.substring(0, 10) }}
+
+
+
+
diff --git a/app/components/app/procedure-room-order/form.vue b/app/components/app/procedure-room-order/form.vue
new file mode 100644
index 00000000..ff6c3835
--- /dev/null
+++ b/app/components/app/procedure-room-order/form.vue
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/app/components/app/procedure-room-order/list.cfg.ts b/app/components/app/procedure-room-order/list.cfg.ts
new file mode 100644
index 00000000..e415e26f
--- /dev/null
+++ b/app/components/app/procedure-room-order/list.cfg.ts
@@ -0,0 +1,61 @@
+import type { Config, RecComponent } from '~/components/pub/my-ui/data-table'
+import { defineAsyncComponent } from 'vue'
+import type { ProcedureRoomOrder } from '~/models/procedure-room-order'
+
+const action = defineAsyncComponent(() => import('~/components/pub/my-ui/data/dropdown-action-dsd.vue'))
+
+export const config: Config = {
+ cols: [{}, {}, {}, {}, {}, { width: 50 }],
+
+ headers: [[
+ { label: 'Tgl. Order' },
+ { label: 'No. Order' },
+ { label: 'Ruangan' },
+ { label: 'Status' },
+ { label: 'Resume' },
+ { label: '' },
+ ]],
+
+ keys: ['date', 'number', 'room', 'status_code', 'resume', 'action'],
+
+ delKeyNames: [
+ { key: 'createdAt', label: 'Tgl. Order' },
+ { key: 'id', label: 'No. Order' },
+ ],
+
+ parses: {
+ date: (rec: any) => {
+ const recX = rec as ProcedureRoomOrder
+ return recX.createdAt ? recX.createdAt.substring(0, 10) : ''
+
+ },
+ number: (rec: any) => {
+ const recX = rec as ProcedureRoomOrder
+ return `ORT-${recX.id}`
+ },
+ room: (rec: any) => {
+ const recX = rec as ProcedureRoomOrder
+ let result = ''
+ if (recX.items && recX.items.length > 0) {
+ recX.items.forEach((item, idx) => {
+ result += item.infra?.name ? `
${item.infra.name}
` : ''
+ })
+ }
+ // recX.ite
+ return ''
+ },
+ },
+
+ components: {
+ action(rec, idx) {
+ const res: RecComponent = {
+ idx,
+ rec: rec as object,
+ component: action,
+ }
+ return res
+ },
+ },
+
+ htmls: {},
+}
diff --git a/app/components/app/procedure-room-order/list.vue b/app/components/app/procedure-room-order/list.vue
new file mode 100644
index 00000000..bdbfe1be
--- /dev/null
+++ b/app/components/app/procedure-room-order/list.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
+
diff --git a/app/components/app/procedure-room/multi-opt-picker.vue b/app/components/app/procedure-room/multi-opt-picker.vue
new file mode 100644
index 00000000..ecdd945a
--- /dev/null
+++ b/app/components/app/procedure-room/multi-opt-picker.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+ Daftar Pilihan Ruang Tindakan
+
+
+
+
+
+
+
+
Tidak ada data ruang tindakan.
+
+
+
+
diff --git a/app/components/app/procedure-room/picker.vue b/app/components/app/procedure-room/picker.vue
new file mode 100644
index 00000000..3660e0cb
--- /dev/null
+++ b/app/components/app/procedure-room/picker.vue
@@ -0,0 +1,42 @@
+
+
+
+
+
+ Daftar Pilihan Ruang Tindakan
+
+
+
+
+
+
+
+
Tidak ada data ruang tindakan.
+
+
+
+
diff --git a/app/components/app/procedure-room/single-opt-picker.vue b/app/components/app/procedure-room/single-opt-picker.vue
new file mode 100644
index 00000000..ecdd945a
--- /dev/null
+++ b/app/components/app/procedure-room/single-opt-picker.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+ Daftar Pilihan Ruang Tindakan
+
+
+
+
+
+
+
+
Tidak ada data ruang tindakan.
+
+
+
+
diff --git a/app/components/app/procedure-room/switcher.vue b/app/components/app/procedure-room/switcher.vue
new file mode 100644
index 00000000..fdd80e7d
--- /dev/null
+++ b/app/components/app/procedure-room/switcher.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+ Jenis Ruang Tindakan
+
+
+
+
+
+
diff --git a/app/components/content/procedure-room-order/entry.vue b/app/components/content/procedure-room-order/entry.vue
new file mode 100644
index 00000000..ad780e5b
--- /dev/null
+++ b/app/components/content/procedure-room-order/entry.vue
@@ -0,0 +1,173 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/components/content/procedure-room-order/list.vue b/app/components/content/procedure-room-order/list.vue
new file mode 100644
index 00000000..d742941c
--- /dev/null
+++ b/app/components/content/procedure-room-order/list.vue
@@ -0,0 +1,191 @@
+
+
+
+
+
+
+
+ handleActionRemove(recId, getMyList, toast)"
+ @cancel=""
+ >
+
+
Tanggal
+
:
+
{{ recItem.createdAt?.substring(0, 10) }}
+
+
+
DPJP
+
:
+
{{ recItem.doctor?.employee?.person?.name }}
+
+
+
+ handleActionSubmit(recId, getMyList, toast)"
+ @cancel=""
+ >
+
+
Tanggal
+
:
+
{{ recItem.createdAt.substring(0, 10) }}
+
+
+
DPJP
+
:
+
{{ recItem.doctor?.employee?.person?.name }}
+
+
+
diff --git a/app/components/content/procedure-room-order/main.vue b/app/components/content/procedure-room-order/main.vue
new file mode 100644
index 00000000..61250fe1
--- /dev/null
+++ b/app/components/content/procedure-room-order/main.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+ {{ crudQueryParams.mode }}
+
diff --git a/app/const/key-val/clinical.ts b/app/const/key-val/clinical.ts
index d6a37b43..0c33a59c 100644
--- a/app/const/key-val/clinical.ts
+++ b/app/const/key-val/clinical.ts
@@ -18,6 +18,7 @@ export type MedObstacleCode = 'hearing' | 'sight' | 'physical' | 'emotional' | '
export type LearnMethodCode = 'demo' | 'discuss-leaflet'
export type LangClassCode = 'ind' | 'region' | 'foreign'
export type TranslatorSrcCode = 'team' | 'family'
+export type ProcedureRoomTypeCode = 'procedure' | 'operation'
export const subjectCodes: Record = {
detail: 'Detail',
@@ -224,3 +225,8 @@ export const translatorSrcCodes: Record = {
team: 'Tim Penerjemah',
family: 'Keluarga',
}
+
+export const procedureRoomTypeCodes: Record = {
+ procedure: 'Ruang Tindakan',
+ operation: 'Ruang Operasi',
+}
diff --git a/app/handlers/encounter-init.handler.ts b/app/handlers/encounter-init.handler.ts
index d25cfab1..e198a89a 100644
--- a/app/handlers/encounter-init.handler.ts
+++ b/app/handlers/encounter-init.handler.ts
@@ -40,6 +40,7 @@ const ChemoMedicineProtocolListAsync = defineAsyncComponent(
const DeviceOrderAsync = defineAsyncComponent(() => import('~/components/content/device-order/main.vue'))
const PrescriptionAsync = defineAsyncComponent(() => import('~/components/content/prescription/main.vue'))
const CpLabOrderAsync = defineAsyncComponent(() => import('~/components/content/cp-lab-order/main.vue'))
+const ProcedureRoomOrderAsync = defineAsyncComponent(() => import('~/components/content/procedure-room-order/main.vue'))
const MicroLabOrderAsync = defineAsyncComponent(() => import('~/components/content/micro-lab-order/main.vue'))
const CprjAsync = defineAsyncComponent(() => import('~/components/content/cprj/entry.vue'))
const RadiologyAsync = defineAsyncComponent(() => import('~/components/content/radiology-order/main.vue'))
@@ -164,8 +165,8 @@ const defaultKeys: Record = {
classCode: ['ambulatory', 'emergency', 'inpatient'],
unit: 'all',
},
- actionRoomOrder: {
- id: 'action-room-order',
+ procedureRoomOrder: {
+ id: 'procedure-room-order',
title: 'Order Ruang Tindakan',
classCode: ['ambulatory', 'emergency', 'inpatient'],
unit: 'all',
@@ -376,10 +377,9 @@ export function injectComponents(id: string | number, data: EncounterListData, m
currentKeys.paLabOrder['component'] = null
currentKeys.paLabOrder['props'] = { encounter_id: id }
}
- if (currentKeys?.actionRoomOrder) {
- // TODO: add component for actionRoomOrder
- currentKeys.actionRoomOrder['component'] = null
- currentKeys.actionRoomOrder['props'] = { encounter_id: id }
+ if (currentKeys?.procedureRoomOrder) {
+ currentKeys.procedureRoomOrder['component'] = ProcedureRoomOrderAsync
+ currentKeys.procedureRoomOrder['props'] = { encounter_id: id }
}
if (currentKeys?.mcuResult) {
// TODO: add component for mcuResult
diff --git a/app/handlers/procedure-room-order.handler.ts b/app/handlers/procedure-room-order.handler.ts
new file mode 100644
index 00000000..d2535274
--- /dev/null
+++ b/app/handlers/procedure-room-order.handler.ts
@@ -0,0 +1,17 @@
+import { genCrudHandler } from '~/handlers/_handler'
+import { create, update, remove } from '~/services/procedure-room-order.service'
+
+export const {
+ recId,
+ recAction,
+ recItem,
+ isReadonly,
+ isProcessing,
+ isFormEntryDialogOpen,
+ isRecordConfirmationOpen,
+ onResetState,
+ handleActionSave,
+ handleActionEdit,
+ handleActionRemove,
+ handleCancelForm,
+} = genCrudHandler({ create, update, remove})
diff --git a/app/handlers/procedure-room.handler.ts b/app/handlers/procedure-room.handler.ts
new file mode 100644
index 00000000..49ee40ec
--- /dev/null
+++ b/app/handlers/procedure-room.handler.ts
@@ -0,0 +1,17 @@
+import { genCrudHandler } from '~/handlers/_handler'
+import { create, update, remove } from '~/services/procedure-room.service'
+
+export const {
+ recId,
+ recAction,
+ recItem,
+ isReadonly,
+ isProcessing,
+ isFormEntryDialogOpen,
+ isRecordConfirmationOpen,
+ onResetState,
+ handleActionSave,
+ handleActionEdit,
+ handleActionRemove,
+ handleCancelForm,
+} = genCrudHandler({ create, update, remove})
diff --git a/app/models/infra.ts b/app/models/infra.ts
index 80119748..e7ebe681 100644
--- a/app/models/infra.ts
+++ b/app/models/infra.ts
@@ -1,10 +1,27 @@
-export interface Infra {
- id?: number
+import { type Base, genBase } from "./_base";
+import { genProcedureRoom, type ProcedureRoom } from "./procedure-room";
+
+export interface Infra extends Base {
code: string
name: string
infraGroup_code: string
parent_id?: number | string | null
+ unit_id?: number | string | null
specialist_id?: number | string | null
subspecialist_id?: number | string | null
- unit_id?: number | string | null
+ procedureRoom?: ProcedureRoom
+}
+
+export function genInfra(): Infra {
+ return {
+ ...genBase(),
+ code: '',
+ name: '',
+ infraGroup_code: '',
+ parent_id: null,
+ unit_id: null,
+ specialist_id: null,
+ subspecialist_id: null,
+ procedureRoom: genProcedureRoom(),
+ }
}
diff --git a/app/models/material-package-item.ts b/app/models/material-package-item.ts
new file mode 100644
index 00000000..9ccde8d1
--- /dev/null
+++ b/app/models/material-package-item.ts
@@ -0,0 +1,14 @@
+import { type Base, genBase } from "./_base"
+
+export interface MaterialPackageItem extends Base {
+ materialPackage_code: string
+ material_code: string
+}
+
+export function genMaterialPackage(): MaterialPackageItem {
+ return {
+ ...genBase(),
+ materialPackage_code: '',
+ material_code: '',
+ }
+}
diff --git a/app/models/material-package.ts b/app/models/material-package.ts
new file mode 100644
index 00000000..df3f01d1
--- /dev/null
+++ b/app/models/material-package.ts
@@ -0,0 +1,14 @@
+import { type Base, genBase } from "./_base"
+
+export interface MaterialPackage extends Base {
+ code: string
+ name: string
+}
+
+export function genMaterialPackage(): MaterialPackage {
+ return {
+ ...genBase(),
+ code: '',
+ name: '',
+ }
+}
diff --git a/app/models/procedure-room-order-item.ts b/app/models/procedure-room-order-item.ts
new file mode 100644
index 00000000..5fa84763
--- /dev/null
+++ b/app/models/procedure-room-order-item.ts
@@ -0,0 +1,27 @@
+import { type Base, genBase } from "./_base";
+import { genMaterialPackage, type MaterialPackage } from "./material-package";
+import { genProcedureRoom, type ProcedureRoom } from "./procedure-room";
+
+export interface ProcedureRoomOrderItem extends Base {
+ procedureRoomOrder_id: number
+ procedureRoom_code: string
+ procedureRoom: ProcedureRoom
+}
+
+export interface CreateDto {
+ procedureRoomOrder_id: number
+ procedureRoom_code: string
+}
+
+export interface UpdateDto extends CreateDto {
+ note?: string
+}
+
+export function genProcedureRoomOrderItem(): ProcedureRoomOrderItem {
+ return {
+ ...genBase(),
+ procedureRoomOrder_id: 0,
+ procedureRoom_code: '',
+ procedureRoom: genProcedureRoom(),
+ }
+}
diff --git a/app/models/procedure-room-order.ts b/app/models/procedure-room-order.ts
new file mode 100644
index 00000000..4d1bb8c5
--- /dev/null
+++ b/app/models/procedure-room-order.ts
@@ -0,0 +1,23 @@
+import { type Base, genBase } from "./_base";
+import { genMaterialPackage, type MaterialPackage } from "./material-package";
+import { genProcedureRoom, type ProcedureRoom } from "./procedure-room";
+
+export interface ProcedureRoomOrder extends Base {
+ encounter_id: number
+ materialPackage_code?: string
+ materialPackage: MaterialPackage
+ items?: ProcedureRoom[]
+}
+
+export interface CreateDto {
+ encounter_id: number
+}
+
+export function genProcedureRoomOrder(): ProcedureRoomOrder {
+ return {
+ ...genBase(),
+ encounter_id: 0,
+ materialPackage_code: '',
+ materialPackage: genMaterialPackage(),
+ }
+}
diff --git a/app/models/procedure-room.ts b/app/models/procedure-room.ts
new file mode 100644
index 00000000..b34bba13
--- /dev/null
+++ b/app/models/procedure-room.ts
@@ -0,0 +1,24 @@
+import { type Base, genBase } from "./_base";
+import type { Infra } from "./infra";
+
+export interface ProcedureRoom extends Base {
+ code: string
+ infra_code: string
+ infra?: Infra
+ type_code: string
+ unit_code: string
+ specialist_code?: string | null
+ subspecialist_code?: string | null
+}
+
+export function genProcedureRoom(): ProcedureRoom {
+ return {
+ ...genBase(),
+ code: '',
+ infra_code: '',
+ type_code: '',
+ unit_code: '',
+ specialist_code: null,
+ subspecialist_code: null,
+ }
+}
diff --git a/app/schemas/material-package-item.schema.ts b/app/schemas/material-package-item.schema.ts
new file mode 100644
index 00000000..e893aa5b
--- /dev/null
+++ b/app/schemas/material-package-item.schema.ts
@@ -0,0 +1,12 @@
+import { z } from 'zod'
+import type { MaterialPackageItem } from '~/models/material-package-item'
+
+const MaterialSchema = z.object({
+ materialPackage_code: z.string({ required_error: 'Kode harus diisi' }).min(1, 'Kode minimum 1 karakter'),
+ material_code: z.string({ required_error: 'Nama harus diisi' }).min(1, 'Nama minimum 1 karakter'),
+})
+
+type MaterialFormData = z.infer & Partial
+
+export { MaterialSchema }
+export type { MaterialFormData }
diff --git a/app/schemas/material-package.schema.ts b/app/schemas/material-package.schema.ts
new file mode 100644
index 00000000..38220f7b
--- /dev/null
+++ b/app/schemas/material-package.schema.ts
@@ -0,0 +1,12 @@
+import { z } from 'zod'
+import type { MaterialPackage } from '~/models/material-package'
+
+const MaterialSchema = z.object({
+ code: z.string({ required_error: 'Kode harus diisi' }).min(1, 'Kode minimum 1 karakter'),
+ name: z.string({ required_error: 'Nama harus diisi' }).min(1, 'Nama minimum 1 karakter'),
+})
+
+type MaterialFormData = z.infer & Partial
+
+export { MaterialSchema }
+export type { MaterialFormData }
diff --git a/app/services/infra.service.ts b/app/services/infra.service.ts
index 9147421d..aa9b94e8 100644
--- a/app/services/infra.service.ts
+++ b/app/services/infra.service.ts
@@ -1,14 +1,11 @@
-// Base
import * as base from './_crud-base'
-
-// Types
import type { Infra } from '~/models/infra'
-const path = '/api/v1/infra'
const name = 'infra'
+const path = `/api/v1/${name}`
-export function create(data: any) {
+export function create(data: Infra) {
return base.create(path, data, name)
}
@@ -20,7 +17,7 @@ export function getDetail(id: number | string) {
return base.getDetail(path, id, name)
}
-export function update(id: number | string, data: any) {
+export function update(id: number | string, data: Infra) {
return base.update(path, id, data, name)
}
@@ -28,15 +25,26 @@ export function remove(id: number | string) {
return base.remove(path, id, name)
}
-export async function getValueLabelList(params: any = null): Promise<{ value: string; label: string }[]> {
+export async function getValueLabelList(params: any = null, useId = false): Promise<{ value: string; label: string }[]> {
let data: { value: string; label: string }[] = []
const result = await getList(params)
if (result.success) {
const resultData = result.body?.data || []
- data = resultData.map((item: Infra) => ({
- value: item.id ? Number(item.id) : item.code,
- label: item.name,
- }))
+ data = !useId ?
+ resultData.map((item: Infra) => ({ value: item.code, label: item.name })) :
+ resultData.map((item: Infra) => ({ value: item.id, label: item.name }))
}
return data
}
+
+// export async function getProcedureRoomValueLabelList(params: any = null, useId = false): Promise<{ value: string; label: string }[]> {
+// let data: { value: string; label: string }[] = []
+// const result = await getList({ 'infraGroup_code': 'procedure-room' ,...params})
+// if (result.success) {
+// const resultData = result.body?.data || []
+// data = !useId ?
+// resultData.map((item: Infra) => ({ value: item.code, label: item.name })) :
+// resultData.map((item: Infra) => ({ value: item.id, label: item.name }))
+// }
+// return data
+// }
diff --git a/app/services/material-package-item.service.ts b/app/services/material-package-item.service.ts
new file mode 100644
index 00000000..00059356
--- /dev/null
+++ b/app/services/material-package-item.service.ts
@@ -0,0 +1,25 @@
+// Base
+import * as base from './_crud-base'
+
+const name = 'material-package-item'
+const path = `/api/v1/${name}`
+
+export function create(data: any) {
+ return base.create(path, data, name)
+}
+
+export function getList(params: any = null) {
+ return base.getList(path, params, name)
+}
+
+export function getDetail(id: number | string) {
+ return base.getDetail(path, id, name)
+}
+
+export function update(id: number | string, data: any) {
+ return base.update(path, id, data, name)
+}
+
+export function remove(id: number | string) {
+ return base.remove(path, id, name)
+}
diff --git a/app/services/material-package.service.ts b/app/services/material-package.service.ts
new file mode 100644
index 00000000..36822045
--- /dev/null
+++ b/app/services/material-package.service.ts
@@ -0,0 +1,38 @@
+// Base
+import type { MaterialPackage } from '~/models/material-package'
+import * as base from './_crud-base'
+
+const name = 'material-package'
+const path = `/api/v1/${name}`
+
+export function create(data: any) {
+ return base.create(path, data, name)
+}
+
+export function getList(params: any = null) {
+ return base.getList(path, params, name)
+}
+
+export function getDetail(id: number | string) {
+ return base.getDetail(path, id, name)
+}
+
+export function update(id: number | string, data: any) {
+ return base.update(path, id, data, name)
+}
+
+export function remove(id: number | string) {
+ return base.remove(path, id, name)
+}
+
+export async function getValueLabelList(params: any = null, useId = false): Promise<{ value: string; label: string }[]> {
+ let data: { value: string; label: string }[] = []
+ const result = await getList(params)
+ if (result.success) {
+ const resultData = result.body?.data || []
+ data = !useId ?
+ resultData.map((item: MaterialPackage) => ({ value: item.code, label: item.name })) :
+ resultData.map((item: MaterialPackage) => ({ value: item.id, label: item.name }))
+ }
+ return data
+}
diff --git a/app/services/procedure-room-order-item.service.ts b/app/services/procedure-room-order-item.service.ts
new file mode 100644
index 00000000..8e6d08b8
--- /dev/null
+++ b/app/services/procedure-room-order-item.service.ts
@@ -0,0 +1,26 @@
+// Base
+import type { CreateDto, UpdateDto } from '~/models/procedure-room-order-item'
+import * as base from './_crud-base'
+
+const name = 'procedure-room-order-item'
+const path = `/api/v1/${name}`
+
+export function create(data: CreateDto) {
+ return base.create(path, data, name)
+}
+
+export function getList(params: any = null) {
+ return base.getList(path, params, name)
+}
+
+export function getDetail(id: number | string) {
+ return base.getDetail(path, id, name)
+}
+
+export function update(id: number | string, data: UpdateDto) {
+ return base.update(path, id, data, name)
+}
+
+export function remove(id: number | string) {
+ return base.remove(path, id, name)
+}
diff --git a/app/services/procedure-room-order.service.ts b/app/services/procedure-room-order.service.ts
new file mode 100644
index 00000000..b5c354c3
--- /dev/null
+++ b/app/services/procedure-room-order.service.ts
@@ -0,0 +1,42 @@
+// Base
+import type { ProcedureRoomOrder, CreateDto } from '~/models/procedure-room-order'
+import * as base from './_crud-base'
+
+const name = 'procedure-room-order'
+const path = `/api/v1/${name}`
+
+export function create(data: CreateDto) {
+ return base.create(path, data, name)
+}
+
+export function getList(params: any = null) {
+ return base.getList(path, params, name)
+}
+
+export function getDetail(id: number | string, params: any = null) {
+ return base.getDetail(path, id, name, params)
+}
+
+export function update(id: number | string, data: ProcedureRoomOrder) {
+ return base.update(path, id, data, name)
+}
+
+export function remove(id: number | string) {
+ return base.remove(path, id, name)
+}
+
+
+export async function submit(id: number) {
+ try {
+ const resp = await xfetch(`${path}/${id}/submit`, 'PATCH')
+ const result: any = {}
+ if (resp.success) {
+ result.success = resp.success
+ result.body = (resp.body as Record) || {}
+ return result
+ }
+ } catch (error) {
+ console.error(`Error submitting ${name}:`, error)
+ throw new Error(`Failed to submit ${name}`)
+ }
+}
diff --git a/app/services/procedure-room.service.ts b/app/services/procedure-room.service.ts
new file mode 100644
index 00000000..c799de75
--- /dev/null
+++ b/app/services/procedure-room.service.ts
@@ -0,0 +1,26 @@
+// Base
+import type { ProcedureRoom } from '~/models/procedure-room'
+import * as base from './_crud-base'
+
+const name = 'procedure-room'
+const path = `/api/v1/${name}`
+
+export function create(data: ProcedureRoom) {
+ return base.create(path, data, name)
+}
+
+export function getList(params: any = null) {
+ return base.getList(path, params, name)
+}
+
+export function getDetail(id: number | string) {
+ return base.getDetail(path, id, name)
+}
+
+export function update(id: number | string, data: ProcedureRoom) {
+ return base.update(path, id, data, name)
+}
+
+export function remove(id: number | string) {
+ return base.remove(path, id, name)
+}