Files
his/openhis-ui-vue3/src/template/ProgressNoteform.vue

394 lines
9.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.

<script lang="ts" setup>
import {ref} from 'vue';
// 1. 基础信息(复用已有变量,补充一致性格式)
const patientInfo = ref({
name: '',
department: '',
bed: '',
inpatientNo: '',
});
defineOptions({
name: 'ProgressNoteform',
});
// 2. 首次病程记录(复用已有变量,补充文本格式)
const firstRecordTime = ref('');
const firstRecordIntro = ref(
''
);
const caseFeatures =
ref('');
const chinaDiscussion = ref('');
const westDiscussion = ref('');
const preliminaryDiagnosis = ref('');
const treatmentPlan = ref(''); // 添加缺失的变量
// 3. 后续查房/会诊记录新增还原PDF所有章节
const roundRecords = ref([
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '主治医师签名:' }, // 区分普通医师和主治医师签名
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '副主任医师签名:' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
{
title: '',
time: '',
content: '',
signature: { doctor: '', physician: '' },
},
]);
// 4. 签名变量(支持所有记录的签名输入)
interface Signatures {
firstDoctor: string;
[key: string]: string;
}
const signatures = ref<Signatures>({
firstDoctor: '', // 首次病程记录医师签名
...roundRecords.value.reduce((acc, record, index) => {
acc[`round${index}Doctor`] = '';
acc[`round${index}Physician`] = '';
return acc;
}, {} as Record<string, string>),
});
// 5. 打印功能:控制打印范围+样式
const handlePrint = () => {
// 1. 触发浏览器打印
window.print();
};
// 暴露接口
defineExpose({ patientInfo, firstRecordTime, firstRecordIntro, caseFeatures, chinaDiscussion, westDiscussion, preliminaryDiagnosis, treatmentPlan, roundRecords, signatures });
</script>
<template>
<div class="medical-record-container">
<!-- 打印按钮固定在顶部非打印内容 -->
<div class="print-btn-container no-print">
<el-button type="primary" @click="handlePrint">打印病历</el-button>
</div>
<!-- 病历主体打印核心内容 -->
<div class="medical-record">
<!-- 1. 医院头部每一页PDF均包含复用已有样式 -->
<div class="hospital-header">
<img src="./imgs/logo.png" alt="长春市朝阳区中医院Logo" class="header-logo" />
<h1 class="hospital-name">长春市朝阳区中医院</h1>
</div>
<!-- 2. 患者信息栏每一页PDF均包含下划线样式 -->
<div class="patient-info">
<span class="info-item">姓名:{{ patientInfo.name }}</span>
<span class="info-item">科室:{{ patientInfo.department }}</span>
<span class="info-item">床号:{{ patientInfo.bed }}</span>
<span class="info-item">住院号:{{ patientInfo.inpatientNo }}</span>
</div>
<!-- 3. 首次病程记录 -->
<div class="record-section">
<h2 class="section-main-title"> </h2>
<div class="record-time">{{ firstRecordTime }}</div>
<el-input v-model="firstRecordIntro" autosize type="textarea" class="clean-textarea" />
<!-- 病例特点 -->
<h3 class="section-sub-title">病例特点</h3>
<el-input v-model="caseFeatures" autosize type="textarea" class="clean-textarea" />
<!-- 拟诊讨论 -->
<h3 class="section-sub-title">拟诊讨论</h3>
<el-input v-model="chinaDiscussion" autosize type="textarea" class="clean-textarea" />
<el-input v-model="westDiscussion" autosize type="textarea" class="clean-textarea" />
<!-- 初步诊断 -->
<el-input v-model="preliminaryDiagnosis" autosize type="textarea" class="clean-textarea" />
<!-- 诊疗计划 -->
<el-input v-model="treatmentPlan" autosize type="textarea" class="clean-textarea" />
<!-- 首次病程记录签名 -->
<div class="signature-group">
<span class="signature-label">医师签名:</span>
<el-input v-model="signatures.firstDoctor" autosize type="textarea" class="clean-textarea signature-input"
:rows="1" />
</div>
</div>
<!-- 4. 分页分隔线模拟PDF分页打印时自动分页 -->
<div class="page-break"></div>
<!-- 5. 后续查房/会诊记录按时间顺序 -->
<div v-for="(record, index) in roundRecords" :key="index" class="record-section">
<!-- 重复患者信息与PDF一致 -->
<div class="patient-info page-repeated-info">
<span class="info-item">姓名:{{ patientInfo.name }}</span>
<span class="info-item">科室:{{ patientInfo.department }}</span>
<span class="info-item">床号:{{ patientInfo.bed }}</span>
<span class="info-item">住院号:{{ patientInfo.inpatientNo }}</span>
</div>
<!-- 查房标题+时间 -->
<h2 class="section-main-title">{{ record.title }}</h2>
<div class="record-time">{{ record.time }}</div>
<!-- 查房内容 -->
<el-input v-model="record.content" autosize type="textarea" class="clean-textarea" />
<!-- 查房签名区分普通医师/上级医师 -->
<div class="signature-group">
<span class="signature-label">医师签名:</span>
<el-input v-model="signatures[`round${index}Doctor`]" autosize type="textarea"
class="clean-textarea signature-input" :rows="1" />
<span v-if="record.signature.physician" class="signature-label ml-20">
{{ record.signature.physician }}
</span>
<el-input v-if="record.signature.physician" v-model="signatures[`round${index}Physician`]" autosize
type="textarea" class="clean-textarea signature-input" :rows="1" />
</div>
<!-- 分页分隔线最后一条记录无需分页 -->
<div v-if="index !== roundRecords.length - 1" class="page-break"></div>
</div>
</div>
</div>
</template>
<style scoped>
/* 1. 容器基础样式 */
.medical-record-container {
padding: 20px;
background-color: #f9f9f9;
}
.print-btn-container {
margin-bottom: 20px;
text-align: right;
}
/* 2. 病历主体样式模拟A4纸 */
.medical-record {
max-width: 210mm;
/* A4宽度 */
min-height: 297mm;
/* A4高度 */
margin: 0 auto;
padding: 20mm;
/* A4页边距 */
background-color: #fff;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
font-family: 'SimSun', '宋体', serif;
/* 病历标准字体 */
}
/* 3. 医院头部样式 */
.hospital-header {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 15px;
}
.header-logo {
width: 60px;
height: 60px;
margin-right: 15px;
}
.hospital-name {
font-size: 24px;
font-weight: bold;
color: #000;
margin: 0;
}
/* 4. 患者信息样式 */
.patient-info {
border-bottom: 1px solid #000;
padding: 5px 0;
margin-bottom: 15px;
font-size: 16px;
line-height: 1.5;
}
.info-item {
margin-right: 30px;
white-space: nowrap;
}
/* 5. 记录章节样式 */
.record-section {
margin-bottom: 30px;
}
.section-main-title {
text-align: center;
font-size: 22px;
font-weight: bold;
margin: 15px 0;
}
.section-sub-title {
font-size: 18px;
font-weight: bold;
margin: 10px 0;
}
.record-time {
font-size: 14px;
margin-bottom: 15px;
color: #666;
}
/* 6. 签名区域样式 */
.signature-group {
display: flex;
align-items: center;
justify-content: flex-end;
margin-top: 20px;
gap: 10px;
flex-wrap: wrap;
width: 100%;
}
.signature-label {
font-size: 16px;
font-weight: bold;
white-space: nowrap;
}
.signature-input {
width: 200px;
flex-shrink: 0;
}
.ml-20 {
margin-left: 20px;
}
/* 7. 分页分隔线模拟PDF分页 */
.page-break {
height: 1px;
background-color: #eee;
margin: 30px 0;
page-break-after: always;
/* 打印时强制分页 */
}
/* 8. 重复信息样式(后续页面的患者信息) */
.page-repeated-info {
margin-top: 20px;
}
/* 9. 清洁输入框样式(复用已有,确保无边框) */
:deep(.clean-textarea .el-textarea__wrapper) {
background-color: transparent;
padding: 0;
border: none;
}
:deep(.clean-textarea .el-textarea__inner) {
border: none;
background-color: transparent;
padding: 0;
resize: none;
word-break: break-word;
white-space: pre-wrap;
overflow-wrap: break-word;
font-family: inherit;
font-size: 16px;
line-height: 1.8;
/* 病历标准行高 */
color: #000;
}
:deep(.clean-textarea .el-textarea__inner:focus) {
outline: none;
box-shadow: none;
}
/* 10. 打印专属样式:控制打印效果 */
@media print {
/* 隐藏非打印内容(如打印按钮) */
.no-print {
display: none !important;
}
/* 强制A4尺寸+无边距 */
@page {
size: A4;
margin: 15mm;
/* 打印页边距匹配PDF */
}
/* 确保背景色打印(部分浏览器默认不打印背景) */
body {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
background-color: #fff;
}
/* 病历主体无边框阴影,仅打印内容 */
.medical-record {
box-shadow: none;
padding: 0;
margin: 0;
}
/* 文本不换行优化 */
.info-item {
margin-right: 20px;
}
/* 确保输入框内容正常打印 */
:deep(.el-textarea__inner) {
border: none !important;
}
}
</style>