Files
his/openhis-ui-vue3/src/views/doctorstation/components/emr/emr.vue
2025-10-31 16:23:12 +08:00

353 lines
12 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 style="margin-bottom: 15px">
<el-button type="primary" @click="addEmr()">保存</el-button>
<el-button type="primary" plain @click="handleEmrTemplate()" style="margin-left: 20px">
模板
</el-button>
<el-button type="primary" plain @click="handleSaveTemplate()" style="margin-left: 20px">
另存模板
</el-button>
<el-button type="primary" plain @click="handleEmrHistory()" style="margin-left: 20px">
历史病历
</el-button>
<!-- <el-button type="primary" plain @click="handleReceive()" style="margin-left: 20px">
打印病历
</el-button> -->
</div>
<div style="max-height: 650px; overflow-y: auto; overflow-x: hidden">
<div style="text-align: center; font-size: 18px; font-weight: bold; margin-bottom: 10px;">
{{ visitType === 'FIRST' ? '门诊初诊病历' : '门诊复诊病历' }}
</div>
<el-form ref="emrRef" :model="form" :rules="rules" label-width="80px">
<el-row :gutter="4">
<el-col :span="4">
<el-form-item label="就诊卡号" prop="patientId" style="width: 100%">
<el-input placeholder="" v-model="patientInfo.patientId" class="input-with-bottom-border"/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="姓名" prop="patientName" style="width: 100%">
<el-input placeholder="" v-model="patientInfo.patientName" class="input-with-bottom-border"/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="性别" prop="genderEnum_enumText" style="width: 100%">
<el-input placeholder="" v-model="patientInfo.genderEnum_enumText" class="input-with-bottom-border"/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="年龄" prop="age" style="width: 100%">
<el-input placeholder="" v-model="patientInfo.age" class="input-with-bottom-border"/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="就诊日期" prop="currentVisitDate" style="width: 100%">
<el-input placeholder="" v-model="currentVisitDate" class="input-with-bottom-border"/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="就诊科室" prop="organizationName" style="width: 100%">
<el-input placeholder="" v-model="patientInfo.organizationName" class="input-with-bottom-border"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="6">
<el-form-item label="身高" prop="height" style="width: 100%">
<el-input placeholder="" v-model="form.height" class="input-with-bottom-border">
<template #suffix>cm</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="体重" prop="weight" style="width: 100%">
<el-input placeholder="" v-model="form.weight" class="input-with-bottom-border">
<template #suffix>kg</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="体温" prop="temperature" style="width: 100%">
<el-input placeholder="" v-model="form.temperature" class="input-with-bottom-border">
<template #suffix></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="脉搏" prop="pulse" style="width: 100%">
<el-input placeholder="" v-model="form.pulse" class="input-with-bottom-border">
<template #suffix>/</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<!-- <el-col :span="6">
<el-form-item
label="血糖"
prop="chiefComplaint"
style="width: 100%"
>
<el-input placeholder="" class="input-with-bottom-border">
<template #suffix></template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item
label="血糖"
prop="chiefComplaint"
style="width: 100%"
>
<el-input placeholder="" class="input-with-bottom-border">
<template #suffix>mmol/L</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item
label="收缩压"
prop="chiefComplaint"
style="width: 100%"
>
<el-input placeholder="" class="input-with-bottom-border">
<template #suffix>mmHg</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item
label="舒张压"
prop="chiefComplaint"
style="width: 100%"
>
<el-input placeholder="" class="input-with-bottom-border">
<template #suffix>mmHg</template>
</el-input>
</el-form-item>
</el-col> -->
</el-row>
<el-row :gutter="24">
<el-col :span="18">
<el-form-item label="主诉" prop="chiefComplaint">
<el-input v-model="form.chiefComplaint" type="textarea" :rows="1" placeholder="" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="发病日期" prop="onsetDate">
<el-date-picker
v-model="form.onsetDate"
type="date"
size="default"
style="width: 100% !important"
placement="bottom"
/>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="现病史" prop="currentIllnessHistory">
<el-input v-model="form.currentIllnessHistory" type="textarea" :rows="2" placeholder="" />
</el-form-item>
<el-form-item label="既往史" prop="pastMedicalHistory">
<el-input v-model="form.pastMedicalHistory" type="textarea" :rows="2" placeholder="" />
</el-form-item>
<el-form-item label="个人史" prop="menstrualHistory">
<el-input v-model="form.menstrualHistory" type="textarea" :rows="2" placeholder="" />
</el-form-item>
<el-form-item label="过敏史" prop="allergyHistory">
<el-input v-model="form.allergyHistory" type="textarea" :rows="2" placeholder="" />
</el-form-item>
<el-form-item label="查体" prop="physicalExamination">
<el-input v-model="form.physicalExamination" type="textarea" :rows="2" placeholder="" />
</el-form-item>
<el-form-item label="处理" prop="treatment">
<el-input v-model="form.treatment" type="textarea" :rows="2" placeholder="" />
</el-form-item>
<el-form-item label="辅助检查" prop="auxiliaryExamination">
<el-input v-model="form.auxiliaryExamination" type="textarea" :rows="2" placeholder="" />
</el-form-item>
</el-form>
<el-dialog
:title="emrTitle"
v-model="openEmrTemplate"
:width="showDialog == 'emrHistory'?'800px':'600px'"
append-to-body
destroy-on-close
>
<emrTemplate v-if="showDialog == 'emrTemplate'" @selectRow="templateSelect" />
<emrhistory v-if="showDialog == 'emrHistory'" @selectRow="emrHistorySelect" />
<div v-if="showDialog == 'saveTemplate'">
<span> 模板名称 </span>
<el-input
v-model="templateName"
style="width: 260px; margin-top: 10px; margin-right: 20px"
/>
<el-radio-group v-model="radio">
<el-radio-button :label="1">个人</el-radio-button>
<el-radio-button :label="2">科室</el-radio-button>
<el-radio-button :label="3">全院</el-radio-button>
</el-radio-group>
</div>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submit"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { saveEmr, getEmrDetail, saveEmrTemplate } from '../api';
import emrTemplate from '../emr/emrtemplate.vue';
import emrhistory from '../emr/emrhistory.vue';
import { ref, computed, watch, getCurrentInstance } from 'vue';
import { formatDate } from '@/utils/index';
// 2. 当前就诊日期(默认为当前时间;复诊为初诊日期)
const props = defineProps({
patientInfo: {
type: Object,
required: true,
},
visitType: { // 接收父组件传来的值
type: String,
default: '',
},
firstVisitDate: { // 父组件计算的初诊日期(若有历史病历)
type: String,
default: '',
},
});
const currentVisitDate = computed(() => {
// 复诊优先展示初诊日期
if (props.visitType === 'FOLLOW_UP' && props.firstVisitDate) {
return props.firstVisitDate;
}
// 初诊或未获取初诊日期时,展示挂号时间或当前时间
return formatDate(props.patientInfo?.registerTime || new Date());
});
const form = ref({});
const emrTitle = ref('');
const radio = ref(1);
const rules = ref({
chiefComplaint: [{ required: true, message: '请输入主诉', trigger: 'blur' }],
});
const emits = defineEmits(['save']);
const { proxy } = getCurrentInstance();
const showDialog = ref('');
const openEmrTemplate = ref(false);
const templateName = ref('');
watch(
() => form.value,
() => {
// 如果表单数据有变化,通知父组件保存
emits('save', false);
},
{ deep: true }
);
/**
* 保存病历
*/
function addEmr() {
proxy.$refs['emrRef'].validate((valid) => {
if (valid) {
saveEmr({
patientId: props.patientInfo.patientId,
encounterId: props.patientInfo.encounterId,
contextJson: form.value,
}).then((res) => {
if (res.code == 200) {
proxy.$modal.msgSuccess('病历已保存');
emits('save', true);
}
});
}
});
}
/**
* 病历模板
*/
function handleEmrTemplate() {
emrTitle.value = '病历模板';
showDialog.value = 'emrTemplate';
openEmrTemplate.value = true;
}
/**
* 选择病历模板
*/
function templateSelect(row) {
form.value = row;
}
function emrHistorySelect(row) {
form.value = row;
openEmrTemplate.value = false;
}
/**
* 历史病历
*/
function handleEmrHistory() {
emrTitle.value = '历史病历';
showDialog.value = 'emrHistory';
openEmrTemplate.value = true;
sessionStorage.setItem('patientId', props.patientInfo.patientId);
}
function getDetail(encounterId) {
getEmrDetail(encounterId).then((res) => {
if (res.data) {
form.value = JSON.parse(res.data.contextJson);
// 提交父组件刷新保存装填
emits('save', true);
} else {
form.value = {};
}
});
}
/**
* 保存病历模板
*/
function handleSaveTemplate() {
emrTitle.value = '保存模板';
showDialog.value = 'saveTemplate';
openEmrTemplate.value = true;
}
/**
* 弹窗确认操作,包括保存病历模板/选择病历模板/选择历史病历
*/
function submit() {
switch (showDialog.value) {
case 'saveTemplate':
saveEmrTemplate({
templateName: templateName.value,
useScopeCode: radio.value,
contextJson: form.value,
}).then((res) => {
if (res.code == 200) {
openEmrTemplate.value = false;
proxy.$modal.msgSuccess('保存成功');
}
});
break;
case 'emrTemplate':
openEmrTemplate.value = false;
break;
case 'emrHistory':
break;
}
}
function cancel() {
openEmrTemplate.value = false;
// openDiagnosis.value = false;
}
defineExpose({ getDetail, addEmr });
</script>