| | |
| | | <template v-if="archive"> |
| | | <div class="action-bar"> |
| | | <el-button @click="$router.go(-1)" icon="el-icon-back">返回</el-button> |
| | | <el-button :type="editing ? 'success' : 'primary'" :icon="editing ? 'el-icon-check' : 'el-icon-edit'" @click="toggleEdit">{{ editing ? '保存' : '编辑' }}</el-button> |
| | | <el-tag :type="subTypeTag(archive.subType)" style="margin-left:12px">{{ archive.subTypeLabel }}</el-tag> |
| | | <el-button :type="editing ? 'success' : 'primary'" :icon="editing ? 'el-icon-check' : 'el-icon-edit'" @click="toggleEdit"> |
| | | {{ editing ? '保存' : '编辑' }} |
| | | </el-button> |
| | | <el-button v-if="archive.closeStatus != 1" type="danger" plain icon="el-icon-circle-close" @click="handleCloseCase">结案</el-button> |
| | | <el-tag :type="archive.closeStatus == 1 ? 'info' : 'success'" style="margin-left:12px"> |
| | | {{ archive.closeStatus == 1 ? '已结案' : '未结案' }} |
| | | </el-tag> |
| | | <el-tag :type="subTypeTag(archive.subType)" style="margin-left:8px">{{ archive.subTypeLabel }}</el-tag> |
| | | </div> |
| | | |
| | | <el-tabs v-model="mainTab" type="border-card"> |
| | | <el-tab-pane label="档案详情" name="detail"> |
| | | |
| | | <!-- 患者基本信息 --> |
| | | <el-card class="info-card" shadow="never"> |
| | |
| | | <el-row :gutter="20" style="margin-top:10px"> |
| | | <el-col :span="6"><InfoField label="科室" :value="archive.deptname" /></el-col> |
| | | <el-col :span="6"><InfoField label="诊断" :value="archive.diagname" /></el-col> |
| | | <el-col :span="6"><InfoField label="主治医生" :value="archive.drname" /></el-col> |
| | | <el-col :span="6"><InfoField label="来源" :value="sourceLabel" /></el-col> |
| | | </el-row> |
| | | </el-card> |
| | |
| | | <!-- 家长信息 --> |
| | | <el-card class="info-card" shadow="never" style="margin-top:14px"> |
| | | <div slot="header" class="card-header"><span>家长/监护人信息</span></div> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="6"> |
| | | <InfoField label="家长姓名" :value="parentInfo.parentName" :editing="editing" v-model="parentInfo.parentName" /> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <InfoField label="与儿童关系" :value="relationLabel" :editing="editing" type="select" :options="relationOptions" @change="v => parentInfo.relation = v" /> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <InfoField label="联系电话" :value="parentInfo.parentPhone" :editing="editing" v-model="parentInfo.parentPhone" /> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <InfoField label="身份证号" :value="parentInfo.parentIdCard" :editing="editing" v-model="parentInfo.parentIdCard" /> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20" style="margin-top:10px"> |
| | | <el-col :span="12"> |
| | | <InfoField label="联系地址" :value="parentInfo.address" :editing="editing" v-model="parentInfo.address" /> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form :model="parentInfo" label-width="110px" size="small" :disabled="!editing"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="家长姓名"><el-input v-model="parentInfo.parentName" class="w-sm" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="与儿童关系"> |
| | | <el-select v-model="parentInfo.relation" class="w-sm"> |
| | | <el-option v-for="o in relationOptions" :key="o.value" :label="o.label" :value="o.value" /> |
| | | </el-select> |
| | | </el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="联系电话"><el-input v-model="parentInfo.parentPhone" class="w-sm" /></el-form-item></el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="身份证号"><el-input v-model="parentInfo.parentIdCard" class="w-md" /></el-form-item></el-col> |
| | | <el-col :span="16"><el-form-item label="联系地址"><el-input v-model="parentInfo.address" class="w-full" /></el-form-item></el-col> |
| | | </el-row> |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | <!-- 档案基本信息 --> |
| | | <!-- 档案信息(可编辑) --> |
| | | <el-card class="info-card" shadow="never" style="margin-top:14px"> |
| | | <div slot="header" class="card-header"> |
| | | <span>档案基本信息</span> |
| | | <span>档案信息</span> |
| | | <span class="header-sub">{{ archive.createTime ? archive.createTime.substring(0,10) : '-' }} 建档</span> |
| | | </div> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><InfoField label="建档类型" :value="archive.subTypeLabel" /></el-col> |
| | | <el-col :span="8"><InfoField label="建档医生" :value="archive.archiveForm.doctorName" :editing="editing" v-model="archive.archiveForm.doctorName" /></el-col> |
| | | <el-col :span="8"><InfoField label="建档时间" :value="archive.createTime" /></el-col> |
| | | </el-row> |
| | | <el-form :model="archive" label-width="110px" size="small" :disabled="!editing"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="身份证号"><el-input v-model="archive.idcardno" class="w-md" placeholder="输入合法身份证号后自动带出出生日期与年龄" /></el-form-item></el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="出生日期"><el-date-picker v-model="archive.birthday" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="出生体重"> |
| | | <el-input v-model="archive.birthWeight" class="w-xs"> |
| | | <template slot="append">kg</template> |
| | | </el-input> |
| | | </el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="出生孕周"> |
| | | <el-input v-model="archive.gestationalWeek" class="w-xs"> |
| | | <template slot="append">周</template> |
| | | </el-input> |
| | | </el-form-item></el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="诊断日期"><el-date-picker v-model="archive.diagnosisDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="主治医生"><el-input v-model="archive.attendingDoctor" class="w-sm" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="经管医生"><el-input v-model="archive.managingDoctor" class="w-sm" /></el-form-item></el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="登记人员"><el-input v-model="archive.registrant" class="w-sm" /></el-form-item></el-col> |
| | | </el-row> |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | <!-- 高危儿专案 → 可编辑表格 --> |
| | | <el-card v-if="archive.subType === 'highRisk'" class="info-card" shadow="never" style="margin-top:14px"> |
| | | <el-card v-if="archive.subType === 'highrisk'" class="info-card" shadow="never" style="margin-top:14px"> |
| | | <div slot="header" class="card-header"><span>高危儿专案管理</span></div> |
| | | <el-form :model="archive" label-width="110px" size="small" :disabled="!editing" inline> |
| | | <el-form-item label="高危儿分类"><el-input v-model="archive.highriskCategory" class="w-md" /></el-form-item> |
| | | <el-form-item label="高危儿名称"><el-input v-model="archive.highriskName" class="w-lg" /></el-form-item> |
| | | <el-form-item label="拟随访日期"><el-date-picker v-model="archive.followupDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item> |
| | | </el-form> |
| | | <el-tabs v-model="activeTab" type="border-card"> |
| | | <el-tab-pane label="生长发育监测" name="growth"> |
| | | <EditableTable :data.sync="growthData" :editing="editing" :columns="growthColumns" /> |
| | |
| | | <!-- 营养性疾病专案 → 可编辑表格 --> |
| | | <el-card v-if="archive.subType === 'nutrition'" class="info-card" shadow="never" style="margin-top:14px"> |
| | | <div slot="header" class="card-header"><span>营养性疾病专案管理</span></div> |
| | | <el-form :model="archive" label-width="130px" size="small" :disabled="!editing" inline> |
| | | <el-form-item label="营养性疾病名称"><el-input v-model="archive.nutritionName" class="w-lg" /></el-form-item> |
| | | </el-form> |
| | | <el-tabs v-model="activeTab" type="border-card"> |
| | | <el-tab-pane label="体格测量" name="measure"> |
| | | <EditableTable :data.sync="measureData" :editing="editing" :columns="measureColumns" /> |
| | |
| | | <!-- 学习困难专案 → 单一表单 --> |
| | | <el-card v-if="archive.subType === 'learning'" class="info-card" shadow="never" style="margin-top:14px"> |
| | | <div slot="header" class="card-header"><span>学习困难专案管理</span></div> |
| | | <el-form :model="archive" label-width="110px" size="small" :disabled="!editing" inline> |
| | | <el-form-item label="预约情况"><el-input v-model="archive.appointmentStatus" class="w-lg" /></el-form-item> |
| | | </el-form> |
| | | <el-form :model="form" label-width="130px" size="small" :disabled="!editing"> |
| | | <el-divider content-position="left">学习能力评估</el-divider> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="评估日期"><el-date-picker v-model="form.assessDate" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="测评工具"><el-input v-model="form.testName" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="评估日期"><el-date-picker v-model="form.assessDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="测评工具"><el-input v-model="form.testName" class="w-sm" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="智商(IQ)"><el-input-number v-model="form.iq" :min="40" :max="160" /></el-form-item></el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="阅读能力"><el-select v-model="form.reading" style="width:100%"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="书写能力"><el-select v-model="form.writing" style="width:100%"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="计算能力"><el-select v-model="form.math" style="width:100%"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="阅读能力"><el-select v-model="form.reading" class="w-sm"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="书写能力"><el-select v-model="form.writing" class="w-sm"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="计算能力"><el-select v-model="form.math" class="w-sm"><el-option v-for="o in gradeOptions" :key="o" :label="o" :value="o" /></el-select></el-form-item></el-col> |
| | | </el-row> |
| | | <el-form-item label="综合结论"><el-input v-model="form.result" type="textarea" :rows="2" /></el-form-item> |
| | | |
| | | <el-divider content-position="left">行为评估</el-divider> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="评估日期"><el-date-picker v-model="form.behaviorDate" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="评估日期"><el-date-picker v-model="form.behaviorDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col> |
| | | <el-col :span="4"><el-form-item label="注意力"><el-input-number v-model="form.attention" :min="0" :max="36" /></el-form-item></el-col> |
| | | <el-col :span="4"><el-form-item label="多动"><el-input-number v-model="form.hyperactivity" :min="0" :max="36" /></el-form-item></el-col> |
| | | <el-col :span="4"><el-form-item label="冲动"><el-input-number v-model="form.impulsivity" :min="0" :max="36" /></el-form-item></el-col> |
| | |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="总分"><el-input-number v-model="form.totalScore" disabled /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="评价"><el-select v-model="form.evaluation" style="width:100%"><el-option label="正常范围" value="正常范围" /><el-option label="轻度异常" value="轻度异常" /><el-option label="中度异常" value="中度异常" /></el-select></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="评价"><el-select v-model="form.evaluation" class="w-sm"><el-option label="正常范围" value="正常范围" /><el-option label="轻度异常" value="轻度异常" /><el-option label="中度异常" value="中度异常" /></el-select></el-form-item></el-col> |
| | | </el-row> |
| | | |
| | | <el-divider content-position="left">干预训练记录</el-divider> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="训练日期"><el-date-picker v-model="form.trainDate" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="训练类型"><el-input v-model="form.trainingType" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="训练日期"><el-date-picker v-model="form.trainDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="训练类型"><el-input v-model="form.trainingType" class="w-sm" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="时长(分钟)"><el-input-number v-model="form.duration" :min="10" :max="120" /></el-form-item></el-col> |
| | | </el-row> |
| | | <el-form-item label="训练内容"><el-input v-model="form.trainContent" type="textarea" :rows="2" /></el-form-item> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"><el-form-item label="训练师"><el-input v-model="form.trainer" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="进展"><el-select v-model="form.progress" style="width:100%"><el-option label="良好" value="良好" /><el-option label="一般" value="一般" /><el-option label="缓慢" value="缓慢" /></el-select></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="训练师"><el-input v-model="form.trainer" class="w-sm" /></el-form-item></el-col> |
| | | <el-col :span="8"><el-form-item label="进展"><el-select v-model="form.progress" class="w-sm"><el-option label="良好" value="良好" /><el-option label="一般" value="一般" /><el-option label="缓慢" value="缓慢" /></el-select></el-form-item></el-col> |
| | | </el-row> |
| | | </el-form> |
| | | </el-card> |
| | | |
| | | </el-tab-pane> |
| | | |
| | | <el-tab-pane label="服务记录" name="service"> |
| | | <ServiceRecords :patid="archive.patid" /> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </template> |
| | | <div v-else class="empty-wrap">档案不存在或已删除</div> |
| | | </div> |
| | |
| | | <script> |
| | | import EditableTable from "../components/EditableTable.vue"; |
| | | import InfoField from "./InfoField.vue"; |
| | | import ServiceRecords from "../components/ServiceRecords.vue"; |
| | | import { getArchive, saveArchive, closeArchive, calcAge } from "../apiAdapter"; |
| | | |
| | | export default { |
| | | name: "ChildHealthArchiveDetail", |
| | | components: { EditableTable, InfoField }, |
| | | components: { EditableTable, InfoField, ServiceRecords }, |
| | | data() { |
| | | return { |
| | | loading: false, archive: null, editing: false, activeTab: "growth", |
| | | loading: false, archive: null, editing: true, activeTab: "growth", mainTab: "detail", |
| | | relationOptions: [ |
| | | { label:"父亲", value:"father" },{ label:"母亲", value:"mother" },{ label:"祖父", value:"grandfather" },{ label:"祖母", value:"grandmother" },{ label:"其他", value:"other" }, |
| | | ], |
| | |
| | | growthData: [], neuroData: [], interventionData: [], |
| | | measureData: [], dietData: [], planData: [], |
| | | growthColumns: [ |
| | | { prop:"checkDate", label:"检查日期", width:120, type:"date" },{ prop:"monthAge", label:"月龄", width:80 }, |
| | | { prop:"checkDate", label:"检查日期", width:180, type:"date" },{ prop:"monthAge", label:"月龄", width:80 }, |
| | | { prop:"weight", label:"体重(kg)", width:100, type:"number" },{ prop:"height", label:"身高(cm)", width:100, type:"number" }, |
| | | { prop:"headCircum", label:"头围(cm)", width:100, type:"number" },{ prop:"weightPercentile", label:"体重百分位", width:110 }, |
| | | { prop:"heightPercentile", label:"身高百分位", width:110 },{ prop:"evaluation", label:"评估结果", type:"select", options:["正常","偏瘦","偏胖","发育迟缓"] }, |
| | | { prop:"doctor", label:"检查医生", width:100 }, |
| | | ], |
| | | neuroColumns: [ |
| | | { prop:"checkDate", label:"评估日期", width:120, type:"date" },{ prop:"monthAge", label:"月龄", width:70 }, |
| | | { prop:"checkDate", label:"评估日期", width:180, type:"date" },{ prop:"monthAge", label:"月龄", width:70 }, |
| | | { prop:"muscleTone", label:"肌张力", width:100 },{ prop:"reflex", label:"原始反射", width:100 }, |
| | | { prop:"gms", label:"GMs评估", width:120 },{ prop:"nbnaScore", label:"NBNA评分", width:100, type:"number" }, |
| | | { prop:"evaluation", label:"综合评估", type:"select", options:["正常","异常","可疑"] },{ prop:"doctor", label:"评估医生", width:100 }, |
| | | ], |
| | | interventionColumns: [ |
| | | { prop:"date", label:"日期", width:120, type:"date" },{ prop:"type", label:"干预类型", width:140 }, |
| | | { prop:"date", label:"日期", width:180, type:"date" },{ prop:"type", label:"干预类型", width:140 }, |
| | | { prop:"content", label:"干预内容", minWidth:200 },{ prop:"frequency", label:"频率", width:120 }, |
| | | { prop:"effect", label:"效果评价", width:100 },{ prop:"executor", label:"执行人", width:100 }, |
| | | ], |
| | | measureColumns: [ |
| | | { prop:"checkDate", label:"检查日期", width:120, type:"date" },{ prop:"weight", label:"体重(kg)", width:100, type:"number" }, |
| | | { prop:"checkDate", label:"检查日期", width:180, type:"date" },{ prop:"weight", label:"体重(kg)", width:100, type:"number" }, |
| | | { prop:"height", label:"身高(cm)", width:100, type:"number" },{ prop:"bmi", label:"BMI", width:80, type:"number" }, |
| | | { prop:"bmiPercentile", label:"BMI百分位", width:110 },{ prop:"waistHip", label:"腰围/臀围", width:120 }, |
| | | { prop:"evaluation", label:"营养评价", type:"select", options:["正常","超重","肥胖","营养不良"] }, |
| | | ], |
| | | dietColumns: [ |
| | | { prop:"date", label:"评估日期", width:120, type:"date" },{ prop:"energy", label:"能量(kcal/d)", width:120, type:"number" }, |
| | | { prop:"date", label:"评估日期", width:180, type:"date" },{ prop:"energy", label:"能量(kcal/d)", width:120, type:"number" }, |
| | | { prop:"protein", label:"蛋白质(g/d)", width:120, type:"number" },{ prop:"fat", label:"脂肪(g/d)", width:100, type:"number" }, |
| | | { prop:"carbs", label:"碳水(g/d)", width:100, type:"number" },{ prop:"dietScore", label:"膳食评分", width:100 }, |
| | | { prop:"problem", label:"存在问题", minWidth:160 }, |
| | | ], |
| | | planColumns: [ |
| | | { prop:"date", label:"制定日期", width:120, type:"date" },{ prop:"target", label:"干预目标", minWidth:200 }, |
| | | { prop:"date", label:"制定日期", width:180, type:"date" },{ prop:"target", label:"干预目标", minWidth:200 }, |
| | | { prop:"energyTarget", label:"能量目标(kcal)", width:130, type:"number" },{ prop:"foodGuide", label:"膳食指导", minWidth:200 }, |
| | | { prop:"exercise", label:"运动建议", minWidth:180 },{ prop:"reviewDate", label:"复查日期", width:120 }, |
| | | ], |
| | |
| | | const map = { standalone:"独立建档", outpatient:"门诊记录", inpatient:"在院记录" }; |
| | | return map[this.archive?.sourcePage] || this.archive?.sourcePage || "-"; |
| | | }, |
| | | relationLabel() { |
| | | const r = this.relationOptions.find(o => o.value === (this.archive?.parentInfo?.relation)); |
| | | return r ? r.label : "-"; |
| | | }, |
| | | }, |
| | | watch: { |
| | | // 身份证号填完整后,自动把出生日期与年龄补上(只补空字段) |
| | | "archive.idcardno"(val) { this.fillBirthdayFromIdcard(val); }, |
| | | }, |
| | | created() { |
| | | const id = this.$route.query.id; |
| | | if (id) this.loadArchive(id); |
| | | const typeKey = this.$route.query.type; |
| | | if (id) this.loadArchive(id, typeKey, this.$route.query.edit == 1, this.$route.query.detailId); |
| | | }, |
| | | methods: { |
| | | loadArchive(id) { |
| | | this.loading = true; |
| | | const all = JSON.parse(localStorage.getItem("patientArchives") || "[]"); |
| | | this.archive = all.find(item => item.id === id) || null; |
| | | if (this.archive) { |
| | | if (this.archive.subType === 'highRisk') { |
| | | this.activeTab = "growth"; |
| | | this.growthData = this.archive.growthData || getDefaultGrowthData(); |
| | | this.neuroData = this.archive.neuroData || getDefaultNeuroData(); |
| | | this.interventionData = this.archive.interventionData || getDefaultInterventionData(); |
| | | } else if (this.archive.subType === 'nutrition') { |
| | | this.activeTab = "measure"; |
| | | this.measureData = this.archive.measureData || getDefaultMeasureData(); |
| | | this.dietData = this.archive.dietData || getDefaultDietData(); |
| | | this.planData = this.archive.planData || getDefaultPlanData(); |
| | | } else if (this.archive.subType === 'learning' && this.archive.archiveForm?.learningData) { |
| | | Object.assign(this.form, this.archive.archiveForm.learningData); |
| | | } |
| | | /** |
| | | * 从身份证号解析出生日期 yyyy-MM-dd |
| | | * 18 位:第 7-14 位是 yyyyMMdd;15 位老身份证:第 7-12 位是 yyMMdd,前面补 19 |
| | | * 格式不对或日期不存在(如 20260231)返回空 |
| | | */ |
| | | parseIdcardBirth(id) { |
| | | if (!id) return ""; |
| | | const s = String(id).trim().toUpperCase(); |
| | | let y, m, d; |
| | | if (/^\d{17}[\dX]$/.test(s)) { |
| | | y = s.substring(6, 10); m = s.substring(10, 12); d = s.substring(12, 14); |
| | | } else if (/^\d{15}$/.test(s)) { |
| | | y = "19" + s.substring(6, 8); m = s.substring(8, 10); d = s.substring(10, 12); |
| | | } else { |
| | | return ""; |
| | | } |
| | | this.loading = false; |
| | | const pad = (n) => String(n).padStart(2, "0"); |
| | | const dt = new Date(Number(y), Number(m) - 1, Number(d)); |
| | | if (isNaN(dt.getTime())) return ""; |
| | | // 拒绝 2 月 31 日这类不存在的日期 |
| | | if (dt.getFullYear() !== Number(y) || pad(dt.getMonth() + 1) !== m || pad(dt.getDate()) !== d) return ""; |
| | | return y + "-" + m + "-" + d; |
| | | }, |
| | | /** 身份证合法时补齐出生日期与年龄,已经有值的字段不动 */ |
| | | fillBirthdayFromIdcard(id) { |
| | | if (!this.archive) return; |
| | | const birth = this.parseIdcardBirth(id); |
| | | if (!birth) return; |
| | | if (!this.archive.birthday) this.archive.birthday = birth; |
| | | if (!this.archive.age) this.archive.age = calcAge(birth); |
| | | }, |
| | | loadArchive(id, typeKey, autoEdit, detailId) { |
| | | this.loading = true; |
| | | getArchive(typeKey, id, detailId) |
| | | .then((archive) => { |
| | | this.archive = archive || null; |
| | | if (this.archive) { |
| | | if (!this.archive.parentInfo) this.archive.parentInfo = {}; |
| | | if (this.archive.subType === 'highrisk') { |
| | | this.activeTab = "growth"; |
| | | this.growthData = this.archive.growthData || getDefaultGrowthData(); |
| | | this.neuroData = this.archive.neuroData || getDefaultNeuroData(); |
| | | this.interventionData = this.archive.interventionData || getDefaultInterventionData(); |
| | | } else if (this.archive.subType === 'nutrition') { |
| | | this.activeTab = "measure"; |
| | | this.measureData = this.archive.measureData || getDefaultMeasureData(); |
| | | this.dietData = this.archive.dietData || getDefaultDietData(); |
| | | this.planData = this.archive.planData || getDefaultPlanData(); |
| | | } else if (this.archive.subType === 'learning' && this.archive.archiveForm && this.archive.archiveForm.learningData) { |
| | | Object.assign(this.form, this.archive.archiveForm.learningData); |
| | | } |
| | | } |
| | | if (autoEdit) this.editing = true; |
| | | }) |
| | | .catch(() => { this.archive = null; }) |
| | | .finally(() => { this.loading = false; }); |
| | | }, |
| | | toggleEdit() { |
| | | if (this.editing) { |
| | | // 先把页面表单回填到档案对象,再整体提交 |
| | | if (this.archive.subType === 'learning') { |
| | | if (!this.archive.archiveForm) this.archive.archiveForm = {}; |
| | | this.archive.archiveForm.learningData = JSON.parse(JSON.stringify(this.form)); |
| | | } |
| | | if (this.archive.subType === 'highRisk') { |
| | | if (this.archive.subType === 'highrisk') { |
| | | this.archive.growthData = JSON.parse(JSON.stringify(this.growthData)); |
| | | this.archive.neuroData = JSON.parse(JSON.stringify(this.neuroData)); |
| | | this.archive.interventionData = JSON.parse(JSON.stringify(this.interventionData)); |
| | |
| | | this.archive.dietData = JSON.parse(JSON.stringify(this.dietData)); |
| | | this.archive.planData = JSON.parse(JSON.stringify(this.planData)); |
| | | } |
| | | this.archive.updateTime = new Date().toISOString().replace("T"," ").substring(0,19); |
| | | const all = JSON.parse(localStorage.getItem("patientArchives") || "[]"); |
| | | const idx = all.findIndex(item => item.id === this.archive.id); |
| | | if (idx >= 0) all[idx] = JSON.parse(JSON.stringify(this.archive)); |
| | | localStorage.setItem("patientArchives", JSON.stringify(all)); |
| | | this.$message.success("保存成功"); |
| | | this.loading = true; |
| | | saveArchive(this.archive) |
| | | .then(() => { |
| | | this.$message.success("保存成功"); |
| | | this.editing = false; |
| | | }) |
| | | .catch(() => {}) |
| | | .finally(() => { this.loading = false; }); |
| | | return; |
| | | } |
| | | this.editing = !this.editing; |
| | | this.editing = true; |
| | | }, |
| | | subTypeTag(type) { const m={highRisk:"danger",nutrition:"warning",learning:"info"}; return m[type]||""; }, |
| | | handleCloseCase() { |
| | | this.$modal.confirm("确认将该档案结案?").then(() => { |
| | | this.loading = true; |
| | | return closeArchive(this.archive) |
| | | .then(() => { |
| | | this.archive.closeStatus = 1; |
| | | this.$message.success("已结案"); |
| | | }) |
| | | .catch(() => {}) |
| | | .finally(() => { this.loading = false; }); |
| | | }).catch(() => {}); |
| | | }, |
| | | subTypeTag(type) { const m={highrisk:"danger",nutrition:"warning",learning:"info"}; return m[type]||""; }, |
| | | }, |
| | | }; |
| | | |
| | |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | // 输入框宽度(按字段长短区分) |
| | | .w-xs { width: 120px; } |
| | | .w-sm { width: 150px; } |
| | | .w-md { width: 200px; } |
| | | .w-lg { width: 280px; } |
| | | .w-full { width: 100%; } |
| | | |
| | | .action-bar { margin-bottom: 16px; } |
| | | .info-card { margin-bottom: 0; } |
| | | .card-header { display: flex; justify-content: space-between; align-items: center; font-size: 16px; font-weight: 600; } |