Files
his/openhis-ui-vue3/src/components/Auto/PfPatientCardB/PfPatientCard.vue
2025-09-03 15:54:55 +08:00

360 lines
8.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div
class="pf_card"
:style="{
outlineWidth:active?'2px':'0',
outlineColor:active?getBedBackColor(data.triageLevel):'#9aa6b5',
backgroundColor:data.bedOperationalStatus==='U'?'#EDFFFD':'',
borderColor: getBedBackColor(data.triageLevel)
}"
@click="clickAct"
>
<div v-if="data.bedOperationalStatus==='U'">
<img :src="emptyBed" class="pf_card_emptyBed_img">
<div class="pf_card_emptyBed_text">{{ data.bedName }}</div>
</div>
<div v-else>
<div v-if="data.isDischarge" class="pf_card_discharge">
<span style="margin-left: 6px"></span>
</div>
<div class="pf_card_card">
<CardSign :color="getBedBackColor(data.triageLevel)" :title="data.bedName" :tail="getDisplay(data.triageLevel)" />
</div>
<div class="pf_card_nameSexAndAge">
<span class="pf_card_name">{{ data.patientName }}</span>
<span class="pf_card_sexAndAge">{{ data.gender.display }}/{{ data.age }}</span>
</div>
<div class="pf_card_rescueTime">
<span style="margin-right: 16px">入室时间</span>
{{ moment(data.checkInWardTime).format('YYYY-MM-DD HH:mm') }}
</div>
<div class="pf_card_noCode">{{ data.hisId }}</div>
<div class="pf_card_rescueTimeText">{{ rescueTimeText() }}</div>
<div v-if="data.diag!==''" class="pf_card_diagnosis">
<div class="card-rectangle-text">{{ data.diag }}</div>
<span style="margin-left: 4px">(诊断)</span>
</div>
<div v-if="isNewSign()" class="card-rectangle"></div>
<div v-if="is72HourSign()" class="card-rectangle2">超72H</div>
<hr class="pf_card_line">
<div class="pf_card_nursingMeasuresString">{{ getStringByCode(data.nursingMeasures, nursingMeasures) }}</div>
<div class="pf_card_specialArrangementString">{{ getStringByCode(data.specialArrangement, specialArrangementList) }}</div>
<div v-if="false" class="pf_card_btn" @click="moreClick">更多</div>
</div>
</div>
</template>
<script>
// 1、Ⅱ2、Ⅲ3、Ⅳ4、5、Ⅵ6、Ⅶ7、Ⅷ8、Ⅸ9
import emptyBed from '@/assets/png/emptyBed.png'
export default {
name: 'PfPatientCard',
inject: ['PfPatientCards'],
props: {
data: {
type: Object,
default() {
return {}
}
},
bedConfig: {
type: Object,
default() {
return {}
}
}
},
data() {
return {
colors: [],
emptyBed,
bedStations: [],
nursingMeasures: [],
specialArrangementList: []
}
},
computed: {
active() {
return this.PfPatientCards.activePatient.bedId === this.data.bedId
}
},
created() {
this.colors = this.config.echartsColor.color
this.nursingMeasures = this.bedConfig.nursingMeasures
this.specialArrangementList = this.bedConfig.specialArrangementList
this.bedStations = this.config.bedStation.options
},
mounted() {
const setIntervalId = setInterval(() => {
this.$forceUpdate()
}, 60000)
this.$once('hook:beforeDestroy', () => {
clearInterval(setIntervalId)
})
},
methods: {
clickAct() {
if (!this.data.isBedNull) {
this.PfPatientCards.activePatient = this.$props.data
}
this.$emit('click', this.$props.data)
},
moreClick() {
this.$emit('moreClick', this.$props.data)
},
getStringByCode(codeList, itemList) {
const arr = itemList.filter((item) => {
return codeList.includes(item.code)
})
const rearr = arr.map((item) => {
return item.display
})
return rearr.join('、')
},
isNewSign() {
const ytime = this.data.checkInWardTime
const hour = this.moment().diff(ytime, 'hours')
return hour < 24
},
is72HourSign() {
const ytime = this.data.checkInWardTime
const hour = this.moment().diff(ytime, 'hours')
return hour > 72
},
rescueTimeText() {
const ytime = this.data.checkInWardTime
const days = this.moment().diff(ytime, 'days')
const hour = this.moment().diff(ytime, 'hours')
const minutes = this.moment().diff(ytime, 'minutes')
if (hour >= 24) {
return days + '天' + hour % 24 + '时' + minutes % 60 + '分'
} else
if (hour < 24) {
return hour + '时' + minutes % 60 + '分'
} else
if (minutes < 60) {
return minutes + '分'
}
},
getDisplay(triageLevel) {
return triageLevel?.display ?? ''
},
getBedBackColor(triageLevel) {
const Level = triageLevel?.display ?? '0级'
let backColor = '#808080'
switch (Level) {
case '一级':
backColor = this.colors[0]
break
case '二级':
backColor = this.colors[1]
break
case '三级':
backColor = this.colors[2]
break
case '四级':
backColor = this.colors[3]
break
default:
backColor = '#C4C4C4'
}
return backColor
}
}
}
</script>
<style scoped lang="less">
.pf_card {
outline-style: solid;
position: relative;
border-radius: 5px;
background-color: #FFFFFF;
box-shadow: 1px 1px 4px #888888;
border: 1px solid #e2dfdf;
width: 265px;
height: 194px;
user-select: none;
font-family: Microsoft YaHei;
&:hover {
box-shadow: 4px 4px 16px #888888;
}
.pf_card_card {
position: absolute;
top: 0;
left: 7px;
}
.pf_card_nameSexAndAge {
position: absolute;
top: 16px;
left: 74px;
width: 192px;
line-height: 18px;
.pf_card_name {
font-size: 18px;
font-weight: bold;
}
.pf_card_sexAndAge {
position: absolute;
font-size: 12px;
color: #9AA6B5;
margin-left: 8px;
}
}
.pf_card_rescueTime {
position: absolute;
left: 74px;
top: 45px;
font-size: 13px;
color: #4C5E75;
}
.pf_card_noCode {
position: absolute;
left: 74px;
top: 68px;
font-size: 13px;
color: #4C5E75;
}
.pf_card_rescueTimeText {
position: absolute;
right: 8px;
top: 68px;
font-size: 13px;
color: #4C5E75;
}
.pf_card_diagnosis {
position: absolute;
display: flex;
left: 8px;
top: 100px;
font-size: 14px;
color: #111111;
.card-rectangle-text {
width: 100px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
}
.card-rectangle {
position: absolute;
width: 20px;
height: 20px;
left: 178px;
top: 100px;
font-size: 14px;
color: #FFFFFF;
background-color: #FF3939;
border-radius: 2px;
line-height: 20px;
text-align: center;
}
.card-rectangle2 {
position: absolute;
width: 54px;
height: 20px;
right: 8px;
top: 100px;
font-size: 14px;
color: #FFFFFF;
background-color: #FDC13F;
border-radius: 2px;
line-height: 20px;
text-align: center;
}
.pf_card_line {
position: absolute;
left: 8px;
top: 127px;
border: none;
width: 250px;
height: 1px;
background-color: #DCDFE6;
}
.pf_card_nursingMeasuresString {
position: absolute;
width: 240px;
left: 8px;
top: 140px;
color: #0EB396;
font-size: 12px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.pf_card_specialArrangementString{
position: absolute;
width: 200px;
left: 8px;
top: 164px;
color: #FF9F3B;
font-size: 12px;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.pf_card_btn{
position: absolute;
width: 46px;
height: 20px;
right: 8px;
top: 164px;
color: #0EB396;
text-align: center;
line-height: 20px;
font-size: 12px;
border-radius: 4px;
background-color:#9CF6E6;
cursor: pointer;
}
.pf_card_discharge {
position: absolute;
width: 24px;
height: 20px;
top: 10px;
left: 242px;
font-size: 14px;
text-align: center;
line-height: 20px;
color: white;
border-top-left-radius: 50%;
border-bottom-left-radius: 50%;
background-color: #0EB396;
}
.pf_card_emptyBed_img {
position: absolute;
left: 72px;
top: 16px
}
.pf_card_emptyBed_text {
position: absolute;
width: 100%;
font-size: 18px;
font-weight: bold;
color: #0EB396;
text-align: center;
top: 152px;
}
}
</style>