| | |
| | | <script lang="ts" setup> |
| | | import { RoomVO } from '@/api/ecg/room' |
| | | import { PropType } from "vue"; |
| | | import { useCheckTypeStore } from "@/store/modules/checkType"; |
| | | import { UserVO } from "@/store/modules/user"; |
| | | import { getCheckTypeName } from "../../../utils/checkTypeFormatter"; |
| | | // 动态 :src 不会被 Vite 自动处理,需要显式 import |
| | | import openImg from '@/assets/room/open.jpg' |
| | | import doctorImg from '@/assets/room/desk-doctor.jpg' |
| | | |
| | | const emit = defineEmits(['event-haveseat', 'event-leaveseat', 'event-setcurseat']) |
| | | |
| | |
| | | }) |
| | | |
| | | const props = defineProps({ |
| | | // defineProps({ |
| | | title: { |
| | | type: Number, |
| | | required: true |
| | | }, |
| | | bedList: { |
| | | type: Array as PropType<RoomVO[]>, |
| | | // 一个床位一张卡片 |
| | | bed: { |
| | | type: Object as PropType<RoomVO>, |
| | | required: true |
| | | }, |
| | | curBed: { |
| | |
| | | } |
| | | }) |
| | | |
| | | const checkTypeStore = useCheckTypeStore(); |
| | | // 该床位是否已由当前医生入座 |
| | | const isMine = computed(() => props.bed.docId != null && props.bed.docId === props.curUser.id) |
| | | // 该床位是否就是当前会话使用中的工位 |
| | | const isCurSeat = computed( |
| | | () => props.bed.roomId === props.curBed.roomId && props.bed.bedNo === props.curBed.bedNo |
| | | ) |
| | | |
| | | const onHaveSeatclick = (newItem: RoomVO) => { |
| | | emit('event-haveseat', newItem) |
| | | const onHaveSeatclick = (bed: RoomVO) => { |
| | | emit('event-haveseat', bed) |
| | | } |
| | | const onLeaveSeatclick = (curItem: RoomVO) => { |
| | | emit('event-leaveseat', curItem) |
| | | const onLeaveSeatclick = (bed: RoomVO) => { |
| | | emit('event-leaveseat', bed) |
| | | } |
| | | const onSetCurSeatclick = (curItem: RoomVO) => { |
| | | emit('event-setcurseat', curItem) |
| | | const onSetCurSeatclick = (bed: RoomVO) => { |
| | | emit('event-setcurseat', bed) |
| | | } |
| | | |
| | | /** 初始化 **/ |
| | | onMounted(() => { |
| | | console.info(props.bedList) |
| | | }) |
| | | |
| | | </script> |
| | | |
| | | <template> |
| | | <el-card style="width: 200px" shadow="hover"> |
| | | <template #header>{{ bedList[0].roomName }}</template> |
| | | <div v-for="(bedItem, index) in bedList" :key="index"> |
| | | <div class="deskwarp"> |
| | | <el-card class="bed-card" shadow="hover" :body-style="{ padding: '10px' }"> |
| | | <template #header> |
| | | <div class="bed-card__title">{{ bed.roomName }}</div> |
| | | </template> |
| | | |
| | | <div v-for="(checkType, subIndex) in bedItem.checkTypes" :key="subIndex"> |
| | | {{ getCheckTypeName(checkType) }} |
| | | </div> |
| | | <div> |
| | | {{ bedItem.opType === 1 ? "领用" : "" }} |
| | | {{ bedItem.opType === 2 ? "安装" : "" }} |
| | | </div> |
| | | <img |
| | | class="bed-card__img" |
| | | :src="bed.docId === null ? openImg : doctorImg" |
| | | :alt="bed.docId === null ? '无医生' : '有医生'" |
| | | /> |
| | | |
| | | <img v-if="bedItem.docId === null" src="@/assets/room/open.jpg" style="width: 100%" alt="无医生" /> |
| | | <img v-else src="@/assets/room/desk-doctor.jpg" style="width: 100%" alt="有医生" /> |
| | | <div>{{ bedItem.bedNo }} {{ bedItem.docName }} {{ bedItem.status === 30 ? "-暂停" : "" }}</div> |
| | | <el-button v-if="bedItem.docId == null || bedItem.docId != curUser.id" @click="onHaveSeatclick(bedItem)"> |
| | | 入座 |
| | | </el-button> |
| | | <div v-if="bedItem.docId === curUser.id"> |
| | | <el-button @click=onLeaveSeatclick(bedItem)> |
| | | 离座 |
| | | </el-button> |
| | | <span v-if="bedItem.roomId === curBed.roomId && bedItem.bedNo === curBed.bedNo"> |
| | | 当前 |
| | | </span> |
| | | <el-button v-else @click=onSetCurSeatclick(bedItem)> |
| | | 设为当前 |
| | | </el-button> |
| | | </div> |
| | | <el-divider /> |
| | | </div> |
| | | <div class="bed-card__label"> |
| | | {{ bed.bedNo }} {{ bed.docName }} {{ bed.status === 30 ? "-暂停" : "" }} |
| | | </div> |
| | | |
| | | <div class="bed-card__meta"> |
| | | <span v-for="(checkType, subIndex) in bed.checkTypes" :key="subIndex"> |
| | | {{ getCheckTypeName(checkType) }} |
| | | </span> |
| | | <span v-if="bed.opType === 1">领用</span> |
| | | <span v-if="bed.opType === 2">安装</span> |
| | | </div> |
| | | |
| | | <div class="bed-card__actions"> |
| | | <el-button v-if="!isMine" @click="onHaveSeatclick(bed)"> 入座 </el-button> |
| | | <template v-else> |
| | | <el-button @click="onLeaveSeatclick(bed)"> 离座 </el-button> |
| | | <span v-if="isCurSeat" class="bed-card__current">当前</span> |
| | | <el-button v-else @click="onSetCurSeatclick(bed)"> 设为当前 </el-button> |
| | | </template> |
| | | </div> |
| | | </el-card> |
| | | </template> |
| | | |
| | | <style scoped lang="scss"> |
| | | .card-title { |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | |
| | | &::before { |
| | | position: relative; |
| | | top: 8px; |
| | | left: -5px; |
| | | display: inline-block; |
| | | width: 3px; |
| | | height: 14px; |
| | | //background-color: #105cfb; |
| | | background: var(--el-color-primary); |
| | | border-radius: 5px; |
| | | content: ''; |
| | | transform: translateY(-50%); |
| | | } |
| | | } |
| | | |
| | | .deskwarp { |
| | | .bed-card { |
| | | display: flex; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | /*height: 260px;*/ |
| | | height: 100%; |
| | | overflow: hidden; |
| | | |
| | | // 卡片头(诊室名)紧凑化 |
| | | :deep(.el-card__header) { |
| | | flex: none; |
| | | padding: 6px 10px; |
| | | text-align: center; |
| | | } |
| | | |
| | | // 卡片体:纵向排列、水平居中 |
| | | :deep(.el-card__body) { |
| | | display: flex; |
| | | flex: 1; |
| | | flex-direction: column; |
| | | align-items: center; |
| | | gap: 4px; |
| | | } |
| | | |
| | | &__title { |
| | | font-size: 16px; |
| | | font-weight: 600; |
| | | line-height: 1.2; |
| | | } |
| | | |
| | | // 图片固定小尺寸,不再随卡片宽度放大 |
| | | &__img { |
| | | flex: none; |
| | | width: 80px; |
| | | height: 64px; |
| | | object-fit: contain; |
| | | } |
| | | |
| | | &__label { |
| | | font-size: 15px; |
| | | font-weight: 600; |
| | | line-height: 1.3; |
| | | // 列宽固定,允许换行避免溢出卡片 |
| | | text-align: center; |
| | | } |
| | | |
| | | &__meta { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 0 5px; |
| | | justify-content: center; |
| | | font-size: 14px; |
| | | line-height: 1.3; |
| | | color: var(--el-text-color-secondary); |
| | | text-align: center; |
| | | } |
| | | |
| | | &__actions { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 5px; |
| | | align-items: center; |
| | | justify-content: center; |
| | | margin-top: 3px; |
| | | } |
| | | |
| | | &__current { |
| | | font-size: 15px; |
| | | font-weight: 600; |
| | | color: var(--el-color-primary); |
| | | } |
| | | } |
| | | </style> |