From ddf15c484eb3208b76cdb25c2737cd4e960ea8df Mon Sep 17 00:00:00 2001 From: eight <641137800@qq.com> Date: 星期一, 14 十月 2024 14:49:15 +0800 Subject: [PATCH] 常规检查 --- src/views/ecg/doctor/components/RoutinePanel.vue | 281 +++++++++++++++++++++++++++++++ src/api/ecg/appointment/index.ts | 5 src/views/ecg/doctor/Routine.vue | 193 +++++++++++++++++++++ src/api/ecg/devrent/index.ts | 5 4 files changed, 484 insertions(+), 0 deletions(-) diff --git a/src/api/ecg/appointment/index.ts b/src/api/ecg/appointment/index.ts index 7c4327a..45283ba 100644 --- a/src/api/ecg/appointment/index.ts +++ b/src/api/ecg/appointment/index.ts @@ -36,6 +36,11 @@ return await request.get({ url: `/ecg/appointment/get?id=` + id }) }, + // 鏌ヨ棰勭害璇︽儏 + getAppointmentByPatId: async (patId: string) => { + return await request.get({ url: `/ecg/appointment/get-by-patient?patId=` + patId }) + }, + // 鏂板棰勭害 createAppointment: async (data: AppointmentVO) => { return await request.post({ url: `/ecg/appointment/create`, data }) diff --git a/src/api/ecg/devrent/index.ts b/src/api/ecg/devrent/index.ts index 7ee9f68..5b2d711 100644 --- a/src/api/ecg/devrent/index.ts +++ b/src/api/ecg/devrent/index.ts @@ -65,6 +65,11 @@ return await request.get({ url: `/ecg/dev-rent/get-dismantled-rent`, params }) }, + // 甯歌妫�鏌ュ畬鎴� + routineFinish: async (data: DevRentVO) => { + return await request.post({ url: `/ecg/dev-rent/routine-finish`, data }) + }, + // 璁惧鍑嗗 devReady: async (data: DevRentVO) => { return await request.post({ url: `/ecg/dev-rent/dev-ready`, data }) diff --git a/src/views/ecg/doctor/Routine.vue b/src/views/ecg/doctor/Routine.vue new file mode 100644 index 0000000..d6d7d3d --- /dev/null +++ b/src/views/ecg/doctor/Routine.vue @@ -0,0 +1,193 @@ +<script setup lang="ts"> +import TitlePanel from "@/views/ecg/doctor/components/TitlePanel.vue"; +import QueuePanel from "@/views/ecg/doctor/components/QueuePanel.vue"; +import {DoctorApi, PatientStatisticVO, RoomBedVO} from '@/api/ecg/doctor'; +import {useUserStore} from "@/store/modules/user"; +import {QueueVO} from "@/api/ecg/queue"; +import {ElNotification} from "element-plus"; +import DevReadyPanel from "@/views/ecg/doctor/components/DevReadyPanel.vue"; +import RoutinePanel from "@/views/ecg/doctor/components/RoutinePanel.vue"; + +const userStore = useUserStore(); + +const roomBedVO: RoomBedVO = { + roomId: null, + roomName: null, + bedNo: null +} + +const onStagePatient = ref<QueueVO>({ + bedNo: "", bookCheckType: 0, bookTimeslot: 0, expired: 0, id: 0, jumpFlag: 0, passed: 0, + patGender: 0, patId: "", patName: "", roomId: 0, roomName: "", seqNum: 0, status: 0 +}) + +const patientStat = ref<PatientStatisticVO>({ + finishedNum: 0, + readyNum: 0, + passedNum: 0, + queuingNum: 0 +}) + +const state = ref<boolean>() + +const patientList = ref<QueueVO[]>([]) + +let timerRunFlag : boolean = false +const bedControlFlag = ref<boolean>(true); +const finishFlag = ref<boolean>(true); +const passFlag = ref<boolean>(true); + +const finishNextPatient = async () => { + finishFlag.value = true + try { + patientList.value = await DoctorApi.finishNextPatient(roomBedVO) + patientStat.value = await DoctorApi.getPatientStatistic(roomBedVO) + getOnstagePatient() + } finally { + finishFlag.value = false + } +} + +const passNextPatient = async () => { + passFlag.value = true + try { + patientList.value = await DoctorApi.passNextPatient(roomBedVO) + patientStat.value = await DoctorApi.getPatientStatistic(roomBedVO) + getOnstagePatient() + } finally { + passFlag.value = false + } +} + +const callAgain = async () => { + await DoctorApi.callAgainPatient(roomBedVO) +} + +const getOnstagePatient = () => { + const tempPatient : QueueVO | undefined = patientList.value.find(item => item.status === 30) + if (undefined === tempPatient) { + setOnStagePatient(undefined) + } else if (tempPatient.patId !== onStagePatient.value.patId) { + onStagePatient.value= tempPatient + setOnStagePatient(tempPatient) + } +} + +const initLoad = async () => { + if (roomBedVO.roomId == null) { + ElNotification.error({ + message: '璇烽噸鏂板氨搴�!', + type: 'info', + duration: 3000 // 鑷姩鍏抽棴鏃堕棿锛岄粯璁や负3000ms + }) + return + } + + patientList.value = await DoctorApi.getPatientList(roomBedVO) + getOnstagePatient() + patientStat.value = await DoctorApi.getPatientStatistic(roomBedVO) + const queueVO2 = await DoctorApi.bedDoctorGet(roomBedVO) + if (queueVO2.status === 20) + state.value = true + else if (queueVO2.status === 30) + state.value = false +} + +const bedControl = async () => { + bedControlFlag.value = true + try { + if (state.value) { + await DoctorApi.bedDoctorPause(roomBedVO) + state.value = false + } else { + await DoctorApi.bedDoctorResume(roomBedVO) + state.value = true + } + } finally { + bedControlFlag.value = false + } +} + +const doctorTimer = () => { + console.log('doctorTimer ...') + initLoad() + if (timerRunFlag) + setTimeout(doctorTimer, 5000) // five seconds +} + +/** 鍒濆鍖� **/ +onMounted(() => { + timerRunFlag = false + bedControlFlag.value = true + finishFlag.value = true + passFlag.value = true + + if (userStore.isSetRoom) { + roomBedVO.roomId = userStore.room!.roomId + roomBedVO.roomName = userStore.room!.roomName + roomBedVO.bedNo = userStore.room!.bedNo + + timerRunFlag = true + doctorTimer() + } else { + roomBedVO.roomId = null + roomBedVO.bedNo = null + } + + bedControlFlag.value = false + finishFlag.value = false + passFlag.value = false +}) + +onUnmounted( () =>{ + timerRunFlag = false +}) + +const onEventRoutine = () => { + //console.info("onDevRentPanelEvent...") +} + +const onEventRecallFinish = () => { + initLoad() +} + +/** 鎮h�呭彉鏇存搷浣� */ +const devReadyPanelRef = ref() +const setOnStagePatient = (tempPatient: QueueVO | undefined) => { + devReadyPanelRef.value.setPatient(tempPatient) +} + +</script> + +<template> + <el-container> + <el-header style="background-color: var(--el-color-primary-light-7); font-size: 24px"> + <TitlePanel :room="roomBedVO" :patientStatistic="patientStat" /> + </el-header> + <el-container style="height: 100%;"> + <el-main style="border: solid var(--el-color-primary-light-7)"> + <RoutinePanel :room="roomBedVO" ref="devReadyPanelRef" @event_routine="onEventRoutine"/> + </el-main> + <el-aside width="400px" style="border: solid var(--el-color-primary-light-7)"> + <QueuePanel :queue="patientList" @event_RecallFinish="onEventRecallFinish"/> + </el-aside> + </el-container> + <el-container class="right-bottom"> + <el-button :disabled="finishFlag" type="primary" @click="finishNextPatient">鍙彿</el-button> + <el-button :disabled="passFlag" type="primary" @click="passNextPatient">杩囧彿</el-button> + <el-button type="primary" @click="callAgain">閲嶅彨</el-button> + <el-button :disabled="bedControlFlag" type="primary" @click="bedControl">{{state?'鏆傚仠':'鎭㈠'}}</el-button> + </el-container> + </el-container> +</template> + +<style scoped lang="scss"> +.right-bottom { + position: absolute; + bottom: 50px; + right: 100px; + //background-color: #f00; + //color: #fff; + //padding: 10px; +} +</style> diff --git a/src/views/ecg/doctor/components/RoutinePanel.vue b/src/views/ecg/doctor/components/RoutinePanel.vue new file mode 100644 index 0000000..a25b38d --- /dev/null +++ b/src/views/ecg/doctor/components/RoutinePanel.vue @@ -0,0 +1,281 @@ +<!-- 甯歌妫�鏌� 鍖荤敓鐣岄潰--> +<template> + <el-form + ref="formRef" + :model="formData" + :rules="formRules" + label-width="100px" + v-loading="formLoading" + > + <el-row :gutter="20"> + <el-col :span="12"> + <el-form-item label="鎮h�呯紪鍙�" prop="patId"> + <el-input v-model="formData.patId" placeholder="璇疯緭鍏ユ偅鑰呯紪鍙�" @input="getAppointmentInfoByPatId" /> + </el-form-item> + <el-form-item label="鎮h�呭悕绉�" prop="patName"> + <el-input v-model="formData.patName" placeholder="璇疯緭鍏ユ偅鑰呭悕绉�" /> + </el-form-item> + <el-form-item label="鎮h�呮弿杩�" prop="patDeptDesc"> + 绉戝: {{formData.patDeptDesc}} 鐥呭尯: {{formData.patWardDesc}} 搴婁綅: {{formData.patBedNo}} + </el-form-item> + <el-form-item label="妫�鏌ユ椂闂�" prop="rentTime"> + <el-date-picker + v-model="formData.rentTime" + type="date" + value-format="x" + placeholder="閫夋嫨瑁呮満鏃堕棿" + /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="澶囨敞" prop="remark"> + <el-input v-model="formData.remark" placeholder="璇疯緭鍏ュ娉�" /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <el-button @click="submitForm" type="primary" :disabled="formLoading">妫�鏌ュ畬鎴�</el-button> + <el-button @click="resetForm()">閲� 缃�</el-button> + <el-button @click="cancelInstall" :disabled="formLoading">鏀惧純瑁呮満</el-button> + + <!-- 鍖荤敓瑁呮満鍒楄〃 --> + <ContentWrap> + <el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" @row-click="onRowClick" > + <el-table-column label="id" align="center" prop="id" /> + <el-table-column label="瑁呮満鎯呭喌" align="center" prop="lost" > + <template #default="scope"> + <span v-if="scope.row.jobType === 10">"宸茶鏈�"</span> + <span v-if="scope.row.jobType === 35">"宸叉斁寮�"</span> + </template> + </el-table-column> +<!-- <el-table-column label="浣滀笟绫诲瀷" align="center" prop="jobType" />--> +<!-- <el-table-column label="鍖荤敓缂栧彿" align="center" prop="docId" />--> + <el-table-column label="鍖荤敓鍚嶇О" align="center" prop="docName" /> + <el-table-column label="璁惧缂栧彿" align="center" prop="devId" /> + <el-table-column label="鎮h�呯紪鍙�" align="center" prop="patId" /> + <el-table-column label="鎮h�呭悕绉�" align="center" prop="patName" /> + <el-table-column + label="浣滀笟鏃堕棿" + align="center" + prop="jobTime" + :formatter="dateFormatter" + width="180px" + /> + <el-table-column label="浣滀笟姒傝" align="center" prop="summary" /> + <el-table-column label="澶囨敞" align="center" prop="remark" /> + <el-table-column + label="鍒涘缓鏃堕棿" + align="center" + prop="createTime" + :formatter="dateFormatter" + width="180px" + /> + <el-table-column label="鎿嶄綔" align="center" min-width="120px"> + <template #default="scope"> + <el-button + link + type="primary" + @click="openForm('update', scope.row.id)" + v-hasPermi="['ecg:job-record:update']" + > + 缂栬緫 + </el-button> + <el-button + link + type="danger" + @click="handleDelete(scope.row.id)" + v-hasPermi="['ecg:job-record:delete']" + > + 鍒犻櫎 + </el-button> + </template> + </el-table-column> + </el-table> + <!-- 鍒嗛〉 --> + <Pagination + :total="total" + v-model:page="queryParams.pageNo" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + </ContentWrap> + +</template> + +<script setup lang="ts"> +import { DevRentApi, DevRentVO } from '@/api/ecg/devrent' +import {dateFormatter} from "@/utils/formatTime"; +import {JobRecordApi, JobRecordVO} from "@/api/ecg/jobrecord"; +import {isStringEmpty} from "@/utils/stringUtil"; +import {curDayEnd, curDayStart} from "@/utils/dateUtil"; +import {DeviceApi} from "@/api/ecg/devmanage"; +import {QueueVO} from "@/api/ecg/queue"; +import {RoomBedVO} from "@/api/ecg/doctor"; +import {AppointmentApi} from "@/api/ecg/appointment"; + +/** 璁惧瑁呮満 琛ㄥ崟 */ +defineComponent({ name: 'RoutinePanel' }) + +const props = defineProps({ + room: { + type: Object as PropType<RoomBedVO>, + required: true + } +}) + +const emit = defineEmits(['event_routine']) // 瀹氫箟 success 浜嬩欢锛岀敤浜庢搷浣滄垚鍔熷悗鐨勫洖璋� + +const setPatient = (queueVO: QueueVO | undefined) => { + formData.value.patId = queueVO?.patId + getAppointmentInfoByPatId() +} +defineExpose({ setPatient }) // 鎻愪緵 setPatient 鏂规硶锛岀敤浜庤缃偅鑰� + +const { t } = useI18n() // 鍥介檯鍖� +const message = useMessage() // 娑堟伅寮圭獥 + +const dialogVisible = ref(false) // 寮圭獥鐨勬槸鍚﹀睍绀� + +const formLoading = ref(false) // 琛ㄥ崟鐨勫姞杞戒腑锛�1锛変慨鏀规椂鐨勬暟鎹姞杞斤紱2锛夋彁浜ょ殑鎸夐挳绂佺敤 + +const formData = ref({}) + +const formRules = reactive({ + // devId: [{ required: true, message: '璁惧缂栧彿涓嶈兘涓虹┖', trigger: 'blur' }], + rentTime: [{ required: true, message: '璇烽�夋嫨瑁呮満鏃ユ湡', trigger: 'blur' }], +}) +const formRef = ref() // 琛ㄥ崟 Ref + +/** 鎻愪氦琛ㄥ崟 */ +const submitForm = async () => { + // 鏍¢獙琛ㄥ崟 + await formRef.value.validate() + // 鎻愪氦璇锋眰 + formLoading.value = true + try { + formData.value.roomId = props.room.roomId + formData.value.bedNo = props.room.bedNo + const data = formData.value as unknown as DevRentVO + await DevRentApi.routineFinish(data) + message.success(t('鎿嶄綔鎴愬姛')) + dialogVisible.value = false + // 鍙戦�佹搷浣滄垚鍔熺殑浜嬩欢 + emit('event_routine') + resetForm() + getList() + } finally { + formLoading.value = false + } +} + +/** 閲嶇疆琛ㄥ崟 */ +const resetForm = () => { + formData.value = { + id: undefined, + devId: undefined, + patId: undefined, + patName: undefined, + patDeptCode: undefined, + patDeptDesc: undefined, + patWardCode: undefined, + patWardDesc: undefined, + patBedNo: undefined, + rentTime: new Date().getTime(), + returnTime: undefined, + interference: undefined, + baseline: undefined, + detachment: undefined, + remark: undefined, + category: '', + brand: '', + model: '', + } + formRef.value?.resetFields() +} + +const getAppointmentInfoByPatId = () => { + const tempPatId = formData.value.patId; + resetForm() + if (isStringEmpty(tempPatId)) + return + + formData.value.patId = tempPatId; + getAppointmentInfo() +} + +const getAppointmentInfo = async () => { + const appointmentData = await AppointmentApi.getAppointmentByPatId(formData.value.patId) + if (null === appointmentData) + return + + // formDate 瀵瑰簲 DevRent + formData.value.patName = appointmentData.patName + formData.value.patDeptDesc = appointmentData.patDeptDesc + formData.value.patWardDesc = appointmentData.patWardDesc + formData.value.patBedNo = appointmentData.patBedNo +} + + +const loading = ref(true) // 鍒楄〃鐨勫姞杞戒腑 +const list = ref<JobRecordVO[]>([]) // 鍒楄〃鐨勬暟鎹� +const total = ref(0) // 鍒楄〃鐨勬�婚〉鏁� +const queryParams = reactive({ + pageNo: 1, + pageSize: 10, + jobType: [50, 60], + docId: undefined, + docName: undefined, + devId: undefined, + patId: undefined, + patName: undefined, + jobTime: [curDayStart(), curDayEnd()], + summary: undefined, + remark: undefined, + createTime: [] +}) +/** 鏌ヨ鍒楄〃 */ +const getList = async () => { + loading.value = true + try { + const data = await JobRecordApi.getJobRecordDoctorPage(queryParams) + list.value = data.list + total.value = data.total + } finally { + loading.value = false + } +} + +const onRowClick = (cur) => { + if (cur !== null) + getSelectedRent( cur.rentId ) +} + +const getSelectedRent = async (rentId) => { + formData.value = await DevRentApi.getDevRent(rentId) +} + +const cancelInstall = async () => { + formData.value.roomId = props.room.roomId + formData.value.bedNo = props.room.bedNo + const data = formData.value as unknown as DevRentVO + if (formData.value.id === null || formData.value.id === undefined) { + const result = await DevRentApi.devInstallCancel(data) + formData.value.id = result + message.success(t('鎿嶄綔鎴愬姛')) + } else { + await DevRentApi.devInstallCancel(data) + message.success(t('鎿嶄綔鎴愬姛')) + } + // 鍙戦�佹搷浣滄垚鍔熺殑浜嬩欢 + emit('event_routine') + resetForm() + getList() +} + +/** 鍒濆鍖� **/ +onMounted(() => { + resetForm() + getList() +}) + +</script> -- Gitblit v1.9.3