| | |
| | | <template> |
| | | <div class="bedside-auxiliary-screen-container"> |
| | | <Header :type="0" device-no="03" /> |
| | | <div class="bedside-auxiliary-screen-content"></div> |
| | | <div |
| | | class="bedside-auxiliary-screen-container" |
| | | :style="{ backgroundColor: backgroundColor }" |
| | | > |
| | | <Header /> |
| | | <div class="bedside-auxiliary-screen-content"> |
| | | <div class="content-position"></div> |
| | | <transition name="fade" mode="out-in"> |
| | | <component |
| | | v-if="cotentHeight > 0" |
| | | :is="currentComponent" |
| | | :height="cotentHeight" |
| | | /> |
| | | </transition> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | |
| | | <script lang="ts" setup> |
| | | import { defineAsyncComponent } from 'vue'; |
| | | import { |
| | | ref, |
| | | watch, |
| | | computed, |
| | | onMounted, |
| | | defineAsyncComponent, |
| | | onBeforeUnmount, |
| | | } from "vue"; |
| | | // @ts-ignore |
| | | import Header from './components/Header.vue'; |
| | | import Header from "./components/Header.vue"; |
| | | import { useBedsideAuxiliaryScreenStore } from "@/store/bedsideAuxiliaryScreen"; |
| | | import { EPageType } from "@/store/type/bedsideAuxiliaryScreen.type"; |
| | | import { getAvailableHeightByClass, delay } from "@/utils/utils"; |
| | | import { useWindowSize } from "@/composables/useWindowSize"; |
| | | import { getServiceVersionApi } from "@/utils/httpApi"; |
| | | import { ElMessage } from "element-plus"; |
| | | // 未排班时的组件 |
| | | const UnplannedSchedule = defineAsyncComponent( |
| | | () => import("./pages/UnplannedSchedule.vue") |
| | | ); |
| | | // 未签到时的组件 |
| | | const NotSignedIn = defineAsyncComponent( |
| | | () => import("./pages/NotSignedIn.vue") |
| | | ); |
| | | // 已签到时的组件 |
| | | const SignedIn = defineAsyncComponent(() => import("./pages/SignedIn.vue")); |
| | | // 治疗中的组件 |
| | | const UnderTreatment = defineAsyncComponent( |
| | | () => import("./pages/UnderTreatment.vue") |
| | | ); |
| | | // 血压计的组件 |
| | | const Sphygmomanometer = defineAsyncComponent( |
| | | () => import("./pages/Sphygmomanometer.vue") |
| | | ); |
| | | |
| | | const bedsideAuxiliaryScreenStore = useBedsideAuxiliaryScreenStore(); |
| | | const cotentHeight = ref(0); |
| | | const { width, height } = useWindowSize(); |
| | | |
| | | const versionTimer = 1000 * 60 * 5; // 五分钟请求一次 getServiceVersionApi 接口,防止副屏关屏的时候收不到推送的消息 |
| | | let timer: ReturnType<typeof setInterval> | null = null; |
| | | |
| | | const backgroundColor = computed(() => { |
| | | let color = "#DAE5EC"; |
| | | // 如果是未排班、加载中或未签到页面,背景色为白色 |
| | | if ( |
| | | [ |
| | | EPageType.NOT_INIT, |
| | | EPageType.LOADING, |
| | | EPageType.UNPLANNED_SCHEDULE, |
| | | ].includes(bedsideAuxiliaryScreenStore.deviceData.pageType) |
| | | ) { |
| | | color = "#fff"; |
| | | } |
| | | return color; |
| | | }); |
| | | |
| | | const currentComponent = computed(() => { |
| | | let name: any = UnplannedSchedule; |
| | | |
| | | // 血压计 |
| | | if ( |
| | | bedsideAuxiliaryScreenStore.deviceData.pageType === |
| | | EPageType.SPHYGMOMANOMETER |
| | | ) { |
| | | name = Sphygmomanometer; |
| | | } else if ( |
| | | [ |
| | | EPageType.NOT_INIT, |
| | | EPageType.LOADING, |
| | | EPageType.UNPLANNED_SCHEDULE, |
| | | ].includes(bedsideAuxiliaryScreenStore.deviceData.pageType) |
| | | ) { |
| | | name = UnplannedSchedule; |
| | | } |
| | | // 未签到 |
| | | else if ( |
| | | bedsideAuxiliaryScreenStore.deviceData.pageType === EPageType.NOT_SIGNED_IN |
| | | ) { |
| | | name = NotSignedIn; |
| | | } |
| | | // 已签到 |
| | | else if ( |
| | | bedsideAuxiliaryScreenStore.deviceData.pageType === EPageType.SIGNED_IN |
| | | ) { |
| | | name = SignedIn; |
| | | } |
| | | // 透析中 |
| | | else { |
| | | name = UnderTreatment; |
| | | } |
| | | return name; |
| | | }); |
| | | |
| | | watch([width, height], () => { |
| | | cotentHeight.value = getAvailableHeightByClass("content-position"); |
| | | }); |
| | | |
| | | // 版本更新/手动刷新场景 |
| | | // watch( |
| | | // [ |
| | | // bedsideAuxiliaryScreenStore.version, |
| | | // bedsideAuxiliaryScreenStore.deviceData.isRefresh, |
| | | // ], |
| | | // ([newVersion, newIsRefresh], [oldVersion, oldIsRefresh]) => { |
| | | // // 如果远程版本号存在更新/设备列表页面进行了手动刷新 |
| | | // console.log('bedsideAuxiliaryScreenStore.version :', bedsideAuxiliaryScreenStore.version) |
| | | // if ( |
| | | // newVersion !== oldVersion|| |
| | | // newIsRefresh === 1 |
| | | // ) { |
| | | // refreshFun(); |
| | | // } |
| | | // } |
| | | // ); |
| | | |
| | | const getServiceVersionFun = async () => { |
| | | try { |
| | | const { data } = await getServiceVersionApi(bedsideAuxiliaryScreenStore.version); |
| | | if (data?.version && data?.version !== bedsideAuxiliaryScreenStore.version) { |
| | | bedsideAuxiliaryScreenStore.refreshVersion(data.version); |
| | | } else if (!data?.version) { |
| | | ElMessage.error("获取版本号失败,请联系管理员!"); |
| | | } |
| | | } catch (error) { |
| | | ElMessage.error("获取版本号失败,请联系管理员!"); |
| | | } |
| | | }; |
| | | |
| | | |
| | | onMounted(() => { |
| | | if (bedsideAuxiliaryScreenStore.deviceCode) { |
| | | bedsideAuxiliaryScreenStore.connect( |
| | | `${import.meta.env.VITE_SSE_BASE_URL}${ |
| | | bedsideAuxiliaryScreenStore.deviceCode |
| | | }` |
| | | ); |
| | | } |
| | | // 先立即执行一次 |
| | | getServiceVersionFun(); |
| | | |
| | | // 再每 5 分钟执行一次 |
| | | timer = setInterval(() => { |
| | | getServiceVersionFun(); |
| | | }, versionTimer); |
| | | cotentHeight.value = getAvailableHeightByClass("content-position"); |
| | | }); |
| | | |
| | | onBeforeUnmount(() => { |
| | | // 把定时器清除掉 |
| | | if (timer) { |
| | | clearInterval(timer); |
| | | } |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="less" scoped> |
| | | *{ |
| | | margin: 0; |
| | | padding: 0; |
| | | box-sizing: border-box; |
| | | * { |
| | | margin: 0; |
| | | padding: 0; |
| | | box-sizing: border-box; |
| | | } |
| | | .bedside-auxiliary-screen-container { |
| | | .bedside-auxiliary-screen-content { |
| | | padding: 6px 12px 0; |
| | | } |
| | | background-color: #409eff; |
| | | .bedside-auxiliary-screen-content { |
| | | padding: 6px 12px 0; |
| | | } |
| | | } |
| | | </style> |
| | | <style scoped> |
| | | .fade-enter-active, |
| | | .fade-leave-active { |
| | | transition: opacity 0.3s ease; |
| | | } |
| | | .fade-enter-from, |
| | | .fade-leave-to { |
| | | opacity: 0; |
| | | } |
| | | </style> |