This commit is contained in:
Your Name
2026-03-18 14:53:09 +08:00
parent 338b104d50
commit 7832514f28
315 changed files with 7071 additions and 1136 deletions
+132 -28
View File
@@ -79,19 +79,7 @@
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="诊断日期" prop="diagnosis_date">
<el-date-picker
v-model="formData.diagnosis_date"
type="date"
placeholder="请选择诊断日期"
value-format="YYYY-MM-DD"
class="w-full"
:popper-options="{ strategy: 'fixed' }"
popper-class="high-z-index"
/>
</el-form-item>
</el-col>
</el-row>
@@ -257,6 +245,19 @@
<el-divider content-position="left">主诉</el-divider>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="线下诊断日期" prop="diagnosis_date">
<el-date-picker
v-model="formData.diagnosis_date"
type="date"
placeholder="请选择诊断日期"
value-format="YYYY-MM-DD"
class="w-full"
:popper-options="{ strategy: 'fixed' }"
popper-class="high-z-index"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="发现糖尿病就患病史" prop="diabetes_discovery_year">
<el-input-number
@@ -289,15 +290,13 @@
<el-divider content-position="left">现病史</el-divider>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="口腔感觉" class="compact-form-item">
<el-radio-group v-model="formData.appetite">
<el-radio-button v-for="item in appetiteOptions" :key="item.value" :label="item.value">
{{ item.name }}
</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-form-item label="口腔感觉" class="checkbox-form-item">
<el-checkbox-group v-model="formData.appetite">
<el-checkbox-button v-for="item in appetiteOptions" :key="item.value" :label="item.value">
{{ item.name }}
</el-checkbox-button>
</el-checkbox-group>
</el-form-item>
</el-row>
<el-row :gutter="20">
@@ -413,7 +412,7 @@
</el-checkbox-button>
</el-checkbox-group>
</el-form-item>
<el-form-item label="病逝补充" prop="symptoms">
<el-form-item label="其他补充" prop="symptoms">
<el-input
v-model="formData.symptoms"
type="textarea"
@@ -508,7 +507,7 @@
</el-form-item>
<el-row :gutter="20">
<!-- <el-row :gutter="20">
<el-col :span="12">
<el-form-item label="舌苔" prop="tongue_coating">
<el-input
@@ -552,7 +551,7 @@
:rows="3"
placeholder="请输入医嘱"
/>
</el-form-item>
</el-form-item> -->
<el-form-item label="备注" prop="remark">
<el-input
@@ -574,7 +573,56 @@
/>
<el-empty v-else description="请先保存诊单后再添加血糖血压记录" />
</el-tab-pane>
<!-- 病例记录标签页开方后自动显示 -->
<el-tab-pane label="病例" name="bingli" :disabled="!formData.id">
<div v-if="formData.id" class="bingli-tab-content">
<!-- 诊断信息舌苔照片检查报告 -->
<div class="bingli-diagnosis-section">
<el-divider content-position="left">诊断信息</el-divider>
<el-row :gutter="24">
<el-col :span="12">
<div class="bingli-label">舌苔照片</div>
<div v-if="formData.tongue_images?.length" class="bingli-images">
<el-image
v-for="(img, idx) in formData.tongue_images"
:key="idx"
:src="getImageUrl(img)"
:preview-src-list="(formData.tongue_images || []).map((u: string) => getImageUrl(u))"
class="bingli-img"
fit="cover"
/>
</div>
<span v-else class="bingli-empty">暂无</span>
</el-col>
<el-col :span="12">
<div class="bingli-label">检查报告</div>
<div v-if="formData.report_files?.length" class="bingli-images">
<el-image
v-for="(file, idx) in formData.report_files"
:key="idx"
:src="getImageUrl(file)"
:preview-src-list="(formData.report_files || []).map((u: string) => getImageUrl(u))"
class="bingli-img"
fit="cover"
/>
</div>
<span v-else class="bingli-empty">暂无</span>
</el-col>
</el-row>
</div>
<!-- 病例记录列表 -->
<case-record-list
ref="caseRecordListRef"
:diagnosis-id="Number(formData.id)"
@view="handleViewCase"
/>
</div>
<el-empty v-else description="请先保存诊单开方后病例将在此显示" />
</el-tab-pane>
</el-tabs>
<!-- 处方详情(查看病例) -->
<tcm-prescription ref="prescriptionRef" @success="caseRecordListRef?.refresh?.()" />
<template #footer>
<div class="flex justify-end gap-3 px-4 pb-4">
@@ -599,11 +647,18 @@ import { tcmDiagnosisAdd, tcmDiagnosisEdit, tcmDiagnosisDetail, checkPhone, chec
import { getDictData } from '@/api/app'
import feedback from '@/utils/feedback'
import useUserStore from '@/stores/modules/user'
import useAppStore from '@/stores/modules/app'
import { ElMessage } from 'element-plus'
import { QuestionFilled } from '@element-plus/icons-vue'
import BloodRecordList from './components/BloodRecordList.vue'
import CaseRecordList from './components/CaseRecordList.vue'
import TcmPrescription from '@/components/tcm-prescription/index.vue'
const emit = defineEmits(['success'])
const appStore = useAppStore()
const getImageUrl = (url: string) => (url?.indexOf?.('http') === 0 ? url : appStore.getImageUrl(url || ''))
const caseRecordListRef = ref()
const prescriptionRef = ref()
const visible = ref(false)
const formRef = ref()
@@ -634,7 +689,7 @@ const formData = ref({
systolic_pressure: undefined as number | undefined,
diastolic_pressure: undefined as number | undefined,
fasting_blood_sugar: undefined as number | undefined,
appetite: '',
appetite: [] as string[],
water_intake: '',
diet_condition: [],
weight_change: '',
@@ -811,6 +866,18 @@ const handleIdCardBlur = async () => {
if (!formData.value.id_card || !/^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/.test(formData.value.id_card)) {
return
}
// 从身份证提取出生日期计算年龄
const id = formData.value.id_card
const birthYear = parseInt(id.substring(6, 10))
const birthMonth = parseInt(id.substring(10, 12))
const birthDay = parseInt(id.substring(12, 14))
const today = new Date()
let age = today.getFullYear() - birthYear
if (today.getMonth() + 1 < birthMonth || (today.getMonth() + 1 === birthMonth && today.getDate() < birthDay)) {
age--
}
formData.value.age = age
try {
const result = await checkIdCard({
@@ -876,6 +943,10 @@ const handleSubmit = async () => {
}
}
const handleViewCase = (row: any) => {
prescriptionRef.value?.openById(row.id)
}
const handleClose = () => {
formRef.value?.resetFields()
formData.value = {
@@ -896,7 +967,7 @@ const handleClose = () => {
diabetes_discovery_year: undefined as number | undefined,
local_hospital_diagnosis: [],
local_hospital_name: '',
appetite: '',
appetite: [] as string[],
water_intake: '',
diet_condition: [],
weight_change: '',
@@ -932,7 +1003,8 @@ const handleClose = () => {
}
defineExpose({
open
open,
refreshCaseList: () => caseRecordListRef.value?.refresh?.()
})
</script>
@@ -1042,6 +1114,38 @@ defineExpose({
line-height: 1.5;
}
/* 病例 tab 诊断信息 */
.bingli-tab-content {
padding: 0 4px;
}
.bingli-diagnosis-section {
margin-bottom: 24px;
padding: 16px;
background: #f5f7fa;
border-radius: 6px;
}
.bingli-label {
font-size: 13px;
font-weight: 500;
color: #606266;
margin-bottom: 10px;
}
.bingli-images {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.bingli-img {
width: 80px;
height: 80px;
border-radius: 4px;
cursor: pointer;
}
.bingli-empty {
font-size: 13px;
color: #909399;
}
// 输入框样式优化
:deep(.el-input__inner),
:deep(.el-textarea__inner) {