From bbbc478129f72b26e2ec4a2e981ed8698a96880c Mon Sep 17 00:00:00 2001
From: liusheng <337615773@qq.com>
Date: 星期四, 22 十月 2026 00:28:18 +0800
Subject: [PATCH] 当service_type=6时,需要根据传入的入院还是离院病区(病区)去后端查询

---
 src/views/patient/archives/childHealth/detail.vue |  269 +++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 187 insertions(+), 82 deletions(-)

diff --git a/src/views/patient/archives/childHealth/detail.vue b/src/views/patient/archives/childHealth/detail.vue
index 9505e80..2c13ee6 100644
--- a/src/views/patient/archives/childHealth/detail.vue
+++ b/src/views/patient/archives/childHealth/detail.vue
@@ -3,9 +3,18 @@
     <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="妗f璇︽儏" name="detail">
 
       <!-- 鎮h�呭熀鏈俊鎭� -->
       <el-card class="info-card" shadow="never">
@@ -19,7 +28,6 @@
         <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>
@@ -27,43 +35,65 @@
       <!-- 瀹堕暱淇℃伅 -->
       <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>
 
-      <!-- 妗f鍩烘湰淇℃伅 -->
+      <!-- 妗f淇℃伅锛堝彲缂栬緫锛� -->
       <el-card class="info-card" shadow="never" style="margin-top:14px">
         <div slot="header" class="card-header">
-          <span>妗f鍩烘湰淇℃伅</span>
+          <span>妗f淇℃伅</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" />
@@ -80,6 +110,9 @@
       <!-- 钀ュ吇鎬х柧鐥呬笓妗� 鈫� 鍙紪杈戣〃鏍� -->
       <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" />
@@ -96,23 +129,26 @@
       <!-- 瀛︿範鍥伴毦涓撴 鈫� 鍗曚竴琛ㄥ崟 -->
       <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>
@@ -120,22 +156,29 @@
           </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="姝e父鑼冨洿" value="姝e父鑼冨洿" /><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="姝e父鑼冨洿" value="姝e父鑼冨洿" /><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">妗f涓嶅瓨鍦ㄦ垨宸插垹闄�</div>
   </div>
@@ -144,13 +187,15 @@
 <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" },
       ],
@@ -161,37 +206,37 @@
       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:["姝e父","鍋忕槮","鍋忚儢","鍙戣偛杩熺紦"] },
         { 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:["姝e父","寮傚父","鍙枒"] },{ 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:["姝e父","瓒呴噸","鑲ヨ儢","钀ュ吇涓嶈壇"] },
       ],
       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 },
       ],
@@ -203,44 +248,82 @@
       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));
@@ -250,16 +333,31 @@
           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("纭灏嗚妗f缁撴锛�").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]||""; },
   },
 };
 
@@ -297,6 +395,13 @@
 </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; }

--
Gitblit v1.9.3