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/maternalHealth/detail.vue |  492 ++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 324 insertions(+), 168 deletions(-)

diff --git a/src/views/patient/archives/maternalHealth/detail.vue b/src/views/patient/archives/maternalHealth/detail.vue
index 4d0d7db..c654b43 100644
--- a/src/views/patient/archives/maternalHealth/detail.vue
+++ b/src/views/patient/archives/maternalHealth/detail.vue
@@ -15,6 +15,7 @@
 
       <el-tabs v-model="mainTab" type="border-card">
         <el-tab-pane label="妗f璇︽儏" name="detail">
+          <div v-if="archive.subType === 'pregnancy'" class="page-title">瀛曞棣栬瘖淇℃伅鐧昏</div>
           <!-- 鎮h�呭熀鏈俊鎭� -->
           <el-card class="info-card" shadow="never">
             <div slot="header" class="card-header"><span>鎮h�呭熀鏈俊鎭�</span></div>
@@ -66,6 +67,9 @@
                   <el-col :span="8"><el-form-item label="璇婃柇鍚嶇О"><el-input v-model="pregForm.firstVisit.diagname" class="w-full" /></el-form-item></el-col>
                   <el-col :span="16"><el-form-item label="灞呬綇鍦板潃"><el-input v-model="pregForm.firstVisit.address" class="w-full" /></el-form-item></el-col>
                 </el-row>
+                <el-row :gutter="20">
+                  <el-col :span="8"><el-form-item label="鏈鏈堢粡"><el-date-picker v-model="pregForm.firstVisit.lmp" value-format="yyyy-MM-dd" class="w-md" @change="onLmpChange" /></el-form-item></el-col>
+                </el-row>
               </el-form>
             </div>
 
@@ -84,19 +88,18 @@
                   <el-col :span="8">
                     <div class="cascade-col">
                       <div class="cascade-label">鍏蜂綋鎯呭喌</div>
-                      <el-checkbox-group v-model="pregForm.pregnancy.details" :disabled="!pregForm.pregnancy.status">
-                        <el-checkbox v-for="d in pregnancySubOptions" :key="d" :label="d">{{ d }}</el-checkbox>
+                      <el-checkbox-group v-model="pregForm.pregnancy.details" @change="onDetailsChange">
+                        <el-checkbox v-for="d in PREGNANCY_DETAIL_OPTIONS" :key="d" :label="d">{{ d }}</el-checkbox>
                       </el-checkbox-group>
-                      <div v-if="!pregForm.pregnancy.status" class="cascade-empty">璇峰厛閫夋嫨濡婂鎯呭喌</div>
                     </div>
                   </el-col>
                   <el-col :span="8">
                     <div class="cascade-col">
                       <div class="cascade-label">澶勭悊寤鸿</div>
-                      <el-checkbox-group v-model="pregForm.pregnancy.hint" :disabled="!pregForm.pregnancy.status">
+                      <el-checkbox-group v-model="pregForm.pregnancy.hint" :disabled="!pregForm.pregnancy.details.length" @change="onHintChange">
                         <el-checkbox v-for="h in pregnancyHintOptions" :key="h" :label="h">{{ h }}</el-checkbox>
                       </el-checkbox-group>
-                      <div v-if="!pregForm.pregnancy.status" class="cascade-empty">璇峰厛閫夋嫨濡婂鎯呭喌</div>
+                      <div v-if="!pregForm.pregnancy.details.length" class="cascade-empty">璇峰厛閫夋嫨鍏蜂綋鎯呭喌</div>
                     </div>
                   </el-col>
                 </el-row>
@@ -117,8 +120,19 @@
                 <el-col :span="8"><el-form-item label="棰勪骇鏈�"><el-date-picker v-model="pregForm.registration.edd" 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="pregForm.registration.recorder" class="w-sm" /></el-form-item></el-col>
               </el-row>
-              <el-form-item v-if="pregForm.registration.isRegistered === '鍚�'" label="鏈缓妗e師鍥�">
-                <el-input v-model="pregForm.registration.unregisteredReason" type="textarea" :rows="2" class="w-lg" />
+              <el-form-item v-if="pregForm.registration.isRegistered === '鍚�'" label="鏈缓鍐屽師鍥�">
+                <el-checkbox-group v-model="pregForm.registration.unregisteredReasons">
+                  <el-checkbox v-for="r in UNREGISTERED_REASONS" :key="r" :label="r">{{ r }}</el-checkbox>
+                </el-checkbox-group>
+                <el-input
+                  v-if="pregForm.registration.unregisteredReasons.includes('鍏朵粬鐗规畩鍥犵礌')"
+                  v-model="pregForm.registration.unregisteredReasonOther"
+                  type="textarea"
+                  :rows="2"
+                  class="w-lg"
+                  style="margin-top:8px"
+                  placeholder="璇峰~鍐欏叾浠栫壒娈婂洜绱�"
+                />
               </el-form-item>
             </el-form>
           </el-card>
@@ -146,102 +160,16 @@
             </el-form>
           </el-card>
 
-          <!-- ===== 瀛曞闅忚锛氭棭瀛曢殢璁胯〃 + 璇勫垎琛紙閫変腑銆岀粡鍜ㄨ鎸囧鍚庣户缁濞犲苟鍦ㄤ骇绉戝缓妗c�嶅悗鍑虹幇锛� ===== -->
-          <template v-if="archive.subType === 'pregnancy' && showFollowUp">
-            <el-card class="info-card" shadow="never" style="margin-top:14px">
-              <div slot="header" class="card-header"><span>鏃╁瓡闅忚琛�</span></div>
-              <el-form :model="pregForm.earlyFollow" label-width="140px" size="small" :disabled="!editing">
-                <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="濮撳悕"><el-input v-model="pregForm.earlyFollow.name" class="w-sm" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="骞撮緞"><el-input v-model="pregForm.earlyFollow.age" class="w-xs" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="灏辫瘖鍙�"><el-input v-model="pregForm.earlyFollow.visitNo" 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="pregForm.earlyFollow.wechat" class="w-sm" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="鎴风睄"><el-input v-model="pregForm.earlyFollow.household" class="w-sm" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="瀛曚骇鍙�"><el-input v-model="pregForm.earlyFollow.gravidaPara" placeholder="G_P_" class="w-xs" /></el-form-item></el-col>
-                </el-row>
-                <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="濠氬Щ鐘跺喌">
-                    <el-select v-model="pregForm.earlyFollow.maritalStatus" class="w-sm">
-                      <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-date-picker v-model="pregForm.earlyFollow.buildDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="棰勪骇鏈�"><el-date-picker v-model="pregForm.earlyFollow.edd" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
-                </el-row>
-                <el-form-item label="璁″垝娴佷骇涓昏鍘熷洜(鍙閫�)">
-                  <el-checkbox-group v-model="pregForm.earlyFollow.abortionReasons">
-                    <el-checkbox label="宸叉湁澶氬" /><el-checkbox label="缁忔祹鍥犵礌" /><el-checkbox label="鑽墿鏆撮湶" />
-                    <el-checkbox label="鏈揪缁撳骞撮緞" /><el-checkbox label="韬綋鍥犵礌" /><el-checkbox label="瀹跺涵鏀寔涓嶈冻" />
-                    <el-checkbox label="鑷韩涓嶆効鐢熻偛" /><el-checkbox label="鍏朵粬" />
-                  </el-checkbox-group>
-                  <el-input v-if="pregForm.earlyFollow.abortionReasons.includes('鍏朵粬')" v-model="pregForm.earlyFollow.otherReason" placeholder="鍏朵粬鍘熷洜" class="w-md" style="margin-top:8px" />
-                </el-form-item>
-                <el-form-item label="缁х画濡婂">
-                  <el-radio-group v-model="pregForm.earlyFollow.continuePregnancy">
-                    <el-radio label="鏄�">鏄�</el-radio><el-radio label="鍚�">鍚�</el-radio>
-                  </el-radio-group>
-                </el-form-item>
-                <el-row :gutter="20">
-                  <el-col :span="16"><el-form-item label="鏃╁瓡寤哄唽鍗曚綅"><el-input v-model="pregForm.earlyFollow.registrationUnit" class="w-full" /></el-form-item></el-col>
-                </el-row>
-              </el-form>
-
-              <div class="sub-section">
-                <div class="sub-title">杈呭鍐呭</div>
-                <el-table :data="pregForm.counseling" border size="small">
-                  <el-table-column label="杈呭娆℃暟" width="120" align="center">
-                    <template slot-scope="scope">{{ ['绗竴娆¤緟瀵�','绗簩娆¤緟瀵�','绗笁娆¤緟瀵�','绗洓娆¤緟瀵�'][scope.$index] }}</template>
-                  </el-table-column>
-                  <el-table-column label="杈呭鏃ユ湡" width="160" align="center">
-                    <template slot-scope="scope">
-                      <el-date-picker v-if="editing" v-model="scope.row.date" value-format="yyyy-MM-dd" size="small" style="width:100%" />
-                      <span v-else>{{ scope.row.date || '-' }}</span>
-                    </template>
-                  </el-table-column>
-                  <el-table-column label="杈呭鍐呭" align="center">
-                    <template slot-scope="scope">
-                      <el-input v-if="editing" v-model="scope.row.content" size="small" />
-                      <span v-else>{{ scope.row.content || '-' }}</span>
-                    </template>
-                  </el-table-column>
-                  <el-table-column label="杈呭浜哄憳" width="140" align="center">
-                    <template slot-scope="scope">
-                      <el-input v-if="editing" v-model="scope.row.person" size="small" />
-                      <span v-else>{{ scope.row.person || '-' }}</span>
-                    </template>
-                  </el-table-column>
-                </el-table>
-              </div>
-
-              <div class="sub-section">
-                <div class="sub-title">璇勫垎琛�</div>
-                <el-form :model="pregForm.score" label-width="140px" size="small" :disabled="!editing" inline>
-                  <el-form-item label="璇勫垎鎬诲垎"><el-input-number v-model="pregForm.score.total" :controls="false" style="width:140px" /></el-form-item>
-                  <el-form-item label="璇勪及缁撴灉"><el-input v-model="pregForm.score.result" class="w-lg" /></el-form-item>
-                </el-form>
-              </div>
-            </el-card>
-
-            <!-- 闅忚鍛ㄦ湡 -->
+          <!-- 闅忚鍛ㄦ湡锛堟棤璁烘槸鍚﹀缓绔嬫棭瀛曢殢璁胯〃鍧囨樉绀猴級 -->
+          <template v-if="archive.subType === 'pregnancy'">
             <el-card class="info-card" shadow="never" style="margin-top:14px">
               <div slot="header" class="card-header"><span>闅忚鍛ㄦ湡</span></div>
-              <EditableTable :data.sync="pregForm.followupCycle" :editing="editing" :columns="followupColumns" />
-            </el-card>
-
-            <!-- 褰撳墠鎮h�呴殢璁胯褰曡〃 -->
-            <el-card class="info-card" shadow="never" style="margin-top:14px">
-              <div slot="header" class="card-header"><span>褰撳墠鎮h�呴殢璁胯褰曡〃</span></div>
-              <el-table :data="currentFollowRecords" border size="small">
-                <el-table-column type="index" label="搴忓彿" width="60" align="center" />
-                <el-table-column prop="planDate" label="鎷熼殢璁挎棩鏈�" width="130" align="center" />
-                <el-table-column prop="status" label="鐘跺喌" width="100" align="center" />
-                <el-table-column prop="method" label="闅忚鏂瑰紡" width="110" align="center" />
-                <el-table-column prop="situation" label="闅忚鎯呭喌" align="center" show-overflow-tooltip />
-                <el-table-column prop="followDate" label="闅忚鏃ユ湡" width="130" align="center" />
-                <el-table-column prop="staff" label="闅忚浜哄憳" width="110" align="center" />
-              </el-table>
+              <EditableTable
+                :data.sync="pregForm.followupCycle"
+                :editing="editing"
+                :columns="followupColumns"
+                auto-seq="seq"
+              />
             </el-card>
           </template>
 
@@ -328,28 +256,98 @@
                 </el-tab-pane>
 
                 <el-tab-pane label="鏀硅壇Kupperman璇勫垎鏍囧噯琛�" name="kupperman">
-                  <el-form :model="form.kupperman" label-width="160px" size="small" :disabled="!editing">
-                    <el-row :gutter="20"><el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.kupperman.date" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col></el-row>
-                    <KuppermanScoreTable v-model="form.kupperman" :editing="editing" />
-                  </el-form>
+                  <KuppermanScoreTable v-model="form.kupperman" :patient="patientInfo" :editing="editing" />
                 </el-tab-pane>
 
                 <el-tab-pane label="鏇村勾鏈熻瘎鍒嗛噺琛紙MRS锛�" name="mrs">
-                  <el-form :model="form.mrs" label-width="160px" size="small" :disabled="!editing">
-                    <el-row :gutter="20"><el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.mrs.date" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col></el-row>
-                    <MRSScoreTable v-model="form.mrs" :editing="editing" />
-                  </el-form>
+                  <MRSScoreTable v-model="form.mrs" :patient="patientInfo" :editing="editing" />
                 </el-tab-pane>
 
                 <el-tab-pane label="鍖瑰吂鍫$潯鐪犺川閲忚瘎鍒嗛噺琛紙PSQI锛�" name="psqi">
-                  <el-form :model="form.psqi" label-width="160px" size="small" :disabled="!editing">
-                    <el-row :gutter="20"><el-col :span="8"><el-form-item label="璇勪及鏃ユ湡"><el-date-picker v-model="form.psqi.date" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col></el-row>
-                    <PSQIScoreTable v-model="form.psqi" :editing="editing" />
-                  </el-form>
+                  <PSQIScoreTable v-model="form.psqi" :patient="patientInfo" :editing="editing" />
                 </el-tab-pane>
               </el-tabs>
             </el-card>
           </template>
+        </el-tab-pane>
+
+        <!-- ===== 鏃╁瓡闅忚琛紙鐙珛 tab锛岄�変腑銆岀户缁濞犲苟鍦ㄤ骇绉戝缓妗c�嶅苟纭鍚庢樉绀猴級 ===== -->
+        <el-tab-pane v-if="archive.subType === 'pregnancy' && showFollowUp" label="鏃╁瓡闅忚琛�" name="followup">
+          <el-card class="info-card" shadow="never" style="margin-top:14px">
+            <div slot="header" class="card-header"><span>鏃╁瓡闅忚琛�</span></div>
+            <el-form :model="pregForm.earlyFollow" label-width="140px" size="small" :disabled="!editing">
+              <el-row :gutter="20">
+                <el-col :span="8"><el-form-item label="濮撳悕"><el-input v-model="pregForm.earlyFollow.name" class="w-sm" /></el-form-item></el-col>
+                <el-col :span="8"><el-form-item label="骞撮緞"><el-input v-model="pregForm.earlyFollow.age" class="w-xs" /></el-form-item></el-col>
+                <el-col :span="8"><el-form-item label="灏辫瘖鍙�"><el-input v-model="pregForm.earlyFollow.visitNo" 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="pregForm.earlyFollow.wechat" class="w-sm" /></el-form-item></el-col>
+                <el-col :span="8"><el-form-item label="鎴风睄"><el-input v-model="pregForm.earlyFollow.household" class="w-sm" /></el-form-item></el-col>
+                <el-col :span="8"><el-form-item label="瀛曚骇鍙�"><el-input v-model="pregForm.earlyFollow.gravidaPara" placeholder="G_P_" class="w-xs" /></el-form-item></el-col>
+              </el-row>
+              <el-row :gutter="20">
+                <el-col :span="8"><el-form-item label="濠氬Щ鐘跺喌">
+                  <el-select v-model="pregForm.earlyFollow.maritalStatus" class="w-sm">
+                    <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-date-picker v-model="pregForm.earlyFollow.buildDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+                <el-col :span="8"><el-form-item label="棰勪骇鏈�"><el-date-picker v-model="pregForm.earlyFollow.edd" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+              </el-row>
+              <el-form-item label="璁″垝娴佷骇涓昏鍘熷洜(鍙閫�)">
+                <el-checkbox-group v-model="pregForm.earlyFollow.abortionReasons">
+                  <el-checkbox label="宸叉湁澶氬" /><el-checkbox label="缁忔祹鍥犵礌" /><el-checkbox label="鑽墿鏆撮湶" />
+                  <el-checkbox label="鏈揪缁撳骞撮緞" /><el-checkbox label="韬綋鍥犵礌" /><el-checkbox label="瀹跺涵鏀寔涓嶈冻" />
+                  <el-checkbox label="鑷韩涓嶆効鐢熻偛" /><el-checkbox label="鍏朵粬" />
+                </el-checkbox-group>
+                <el-input v-if="pregForm.earlyFollow.abortionReasons.includes('鍏朵粬')" v-model="pregForm.earlyFollow.otherReason" placeholder="鍏朵粬鍘熷洜" class="w-md" style="margin-top:8px" />
+              </el-form-item>
+              <el-form-item label="缁х画濡婂">
+                <el-radio-group v-model="pregForm.earlyFollow.continuePregnancy">
+                  <el-radio label="鏄�">鏄�</el-radio><el-radio label="鍚�">鍚�</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-row :gutter="20">
+                <el-col :span="16"><el-form-item label="鏃╁瓡寤哄唽鍗曚綅"><el-input v-model="pregForm.earlyFollow.registrationUnit" class="w-full" /></el-form-item></el-col>
+              </el-row>
+            </el-form>
+
+            <div class="sub-section">
+              <div class="sub-title">杈呭鍐呭</div>
+              <el-table :data="pregForm.counseling" border size="small">
+                <el-table-column label="杈呭娆℃暟" width="120" align="center">
+                  <template slot-scope="scope">{{ ['绗竴娆¤緟瀵�','绗簩娆¤緟瀵�','绗笁娆¤緟瀵�','绗洓娆¤緟瀵�'][scope.$index] }}</template>
+                </el-table-column>
+                <el-table-column label="杈呭鏃ユ湡" width="160" align="center">
+                  <template slot-scope="scope">
+                    <el-date-picker v-if="editing" v-model="scope.row.date" value-format="yyyy-MM-dd" size="small" style="width:100%" />
+                    <span v-else>{{ scope.row.date || '-' }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="杈呭鍐呭" align="center">
+                  <template slot-scope="scope">
+                    <el-input v-if="editing" v-model="scope.row.content" size="small" />
+                    <span v-else>{{ scope.row.content || '-' }}</span>
+                  </template>
+                </el-table-column>
+                <el-table-column label="杈呭浜哄憳" width="140" align="center">
+                  <template slot-scope="scope">
+                    <el-input v-if="editing" v-model="scope.row.person" size="small" />
+                    <span v-else>{{ scope.row.person || '-' }}</span>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+
+            <div class="sub-section">
+              <div class="sub-title">璇勫垎琛�</div>
+              <el-form :model="pregForm.score" label-width="140px" size="small" :disabled="!editing" inline>
+                <el-form-item label="璇勫垎鎬诲垎"><el-input-number v-model="pregForm.score.total" :controls="false" style="width:140px" /></el-form-item>
+                <el-form-item label="璇勪及缁撴灉"><el-input v-model="pregForm.score.result" class="w-lg" /></el-form-item>
+              </el-form>
+            </div>
+          </el-card>
         </el-tab-pane>
 
         <el-tab-pane label="鏈嶅姟璁板綍" name="service">
@@ -368,7 +366,7 @@
 import KuppermanScoreTable from "./KuppermanScoreTable.vue";
 import MRSScoreTable from "./MRSScoreTable.vue";
 import PSQIScoreTable from "./PSQIScoreTable.vue";
-import { loadArchives, saveArchives } from "../types";
+import { getArchive, saveArchive, closeArchive, calcAge } from "../apiAdapter";
 
 const PREGNANCY_OPTIONS = {
   planBirth: { label: "棣栬瘖鎷熺敓鑲�", details: ["鍏堝厗娴佷骇"], hints: ["鍖诲澶勭疆鍚庣户缁濞犲苟鍦ㄤ骇绉戝缓妗�"] },
@@ -376,24 +374,48 @@
   planAbortion: { label: "棣栬瘖鎷熶汉宸ユ祦浜�", details: ["鑽墿娴佷骇", "鎵嬫湳娴佷骇"], hints: ["缁忓挩璇㈡寚瀵煎悗缁х画濡婂骞跺湪浜х寤烘。"] },
 };
 
+// 濡婂鎯呭喌-鍏蜂綋鎯呭喌鍏ㄩ噺閫夐」锛堜笉鍐嶉殢濡婂鎯呭喌鍙樺寲锛�
+const PREGNANCY_DETAIL_OPTIONS = ["鍏堝厗娴佷骇", "鑷劧娴佷骇", "鑳氳儙鍋滆偛", "鑽墿娴佷骇", "鎵嬫湳娴佷骇"];
+
+// 鍏蜂綋鎯呭喌 鈫� 澶勭悊寤鸿 鏄犲皠锛堝鐞嗗缓璁彲閫夐」闅忔墍閫夊叿浣撴儏鍐靛彉鍔級
+const PREGNANCY_DETAIL_HINTS = {
+  "鍏堝厗娴佷骇": ["鍖诲澶勭疆鍚庣户缁濞犲苟鍦ㄤ骇绉戝缓妗�"],
+  "鑷劧娴佷骇": ["涓哄コ鎬у啀娆″濞犳彁渚涘瀛曟寚瀵�"],
+  "鑳氳儙鍋滆偛": ["涓哄コ鎬у啀娆″濞犳彁渚涘瀛曟寚瀵�"],
+  "鑽墿娴佷骇": ["缁忓挩璇㈡寚瀵煎悗缁х画濡婂骞跺湪浜х寤烘。"],
+  "鎵嬫湳娴佷骇": ["缁忓挩璇㈡寚瀵煎悗缁х画濡婂骞跺湪浜х寤烘。"],
+};
+
+// 鏄惁寤哄唽=鍚� 鏃剁殑鏈缓鍐屽師鍥狅紙鍙閫夛紝鏈�鍚庝竴椤光�滃叾浠栫壒娈婂洜绱犫�濆彲琛ュ厖杈撳叆锛�
+const UNREGISTERED_REASONS = [
+  "鎷熺粓姝㈠濞狅紝涓嶅缓鍐�",
+  "濡婂寮傚父锛氳儦鑳庡仠鑲层�佸紓浣嶅濞犮�侀毦鍏嶆祦浜с�佽嚜鐒舵祦浜�",
+  "鍏堝厗娴佷骇锛岀梾鎯呬笉绋冲畾锛屾殏缂撳缓鍐�",
+  "鍚堝苟鍐呭绉戝熀纭�鐤剧梾锛岃瘎浼版殏涓嶅疁缁х画濡婂",
+  "鎮h�呬釜浜哄強瀹跺涵鍥犵礌锛屾殏涓嶅缓鍐�",
+  "妗f涓庡氨璇婃祦杞洜绱狅細宸插湪澶栭櫌寤哄唽鎴栬姹傚洖灞炲湴绠¤緰鍦板缓鍐�",
+  "鍏朵粬鐗规畩鍥犵礌",
+];
+
 export default {
   name: "MaternalHealthArchiveDetail",
   components: { InfoField, EditableTable, ServiceRecords, KuppermanScoreTable, MRSScoreTable, PSQIScoreTable },
   data() {
     return {
-      PREGNANCY_OPTIONS,
+      PREGNANCY_OPTIONS, PREGNANCY_DETAIL_OPTIONS, PREGNANCY_DETAIL_HINTS, UNREGISTERED_REASONS,
       loading: false, archive: null, editing: true, activeTab: "sysQ", mainTab: "detail",
       followupColumns: [
         { prop: "seq", label: "搴忓彿", width: 60 },
-        { prop: "planDate", label: "鎷熼殢璁挎棩鏈�", width: 130, type: "date" },
-        { prop: "status", label: "鐘跺喌", width: 100, type: "select", options: ["宸插畬鎴�", "鏈畬鎴�"] },
+        { prop: "planDate", label: "鎷熼殢璁挎棩鏈�", width: 180, type: "date" },
+        // 鏂板涓�琛屾椂鐘跺喌榛樿銆屾湭瀹屾垚銆嶏紝搴忓彿鐢� EditableTable 鐨� auto-seq 鑷姩濉厖
+        { prop: "status", label: "鐘跺喌", width: 130, type: "select", options: ["宸插畬鎴�", "鏈畬鎴�"], default: "鏈畬鎴�" },
         { prop: "method", label: "闅忚鏂瑰紡", width: 110 },
         { prop: "situation", label: "闅忚鎯呭喌", minWidth: 160 },
         { prop: "followDate", label: "闅忚鏃ユ湡", width: 130, type: "date" },
         { prop: "staff", label: "闅忚浜哄憳", width: 110 },
       ],
       pregForm: {
-        firstVisit: { visitNo: "", selfPhone: "", wardName: "", contactPhone: "", idcardno: "", address: "", diagname: "", firstDoctor: "" },
+        firstVisit: { visitNo: "", selfPhone: "", wardName: "", contactPhone: "", idcardno: "", address: "", diagname: "", firstDoctor: "", lmp: "" },
         pregnancy: { status: "", details: [], hint: [] },
         earlyFollow: { name: "", age: "", visitNo: "", wechat: "", household: "", gravidaPara: "", maritalStatus: "", buildDate: "", abortionReasons: [], otherReason: "", continuePregnancy: "", edd: "", registrationUnit: "" },
         counseling: [
@@ -401,91 +423,217 @@
           { date: "", content: "", person: "" }, { date: "", content: "", person: "" },
         ],
         score: { total: null, result: "" },
-        registration: { isRegistered: "", unregisteredReason: "", edd: "", recorder: "" },
+        registration: { isRegistered: "", unregisteredReasons: [], unregisteredReasonOther: "", edd: "", recorder: "" },
         followupCycle: [],
+        showFollowUp: false,
       },
       form: {
         menoSysQ: { date:"", age:null, menstruation:"", lmp:"", menopauseAge:null, hotFlash:0, insomnia:0, mood:0, fatigue:0, jointPain:0, palpitation:0, dryness:0, libido:0, otherSymptoms:"", advice:"", doctor:"" },
         mhtFirst: { date:"", chiefComplaint:"", menopauseYears:null, height:null, weight:null, bmi:null, bloodPressure:"", glucose:null, lipid:"", pastHistory:"", gynExam:"", breastExam:"", auxExam:"", mhtPlan:"", doctor:"" },
         mhtFollow: { date:"", compliance:"鑹ソ", symptomImprove:"閮ㄥ垎", sideEffect:"", bleeding:"鏃�", weight:null, bloodPressure:"", reExamResult:"", planAdjust:"", nextVisit:"", doctor:"" },
-        kupperman: { date:"", 娼儹鍑烘睏:0,鎰熻寮傚父:0,澶辩湢:0,鎯呯华娉㈠姩:0,鎶戦儊:0,鐪╂檿:0,鐤蹭箯:0,鍏宠妭鐥�:0,澶寸棝:0,蹇冩偢:0,鐨偆铓佽蛋鎰�:0,鎬х敓娲�:0,娉屽翱绯绘劅鏌�:0 },
-        mrs: { date:"" },
-        psqi: { date:"" },
+        kupperman: { date:"", evaluator:"", kup_0:0,kup_1:0,kup_2:0,kup_3:0,kup_4:0,kup_5:0,kup_6:0,kup_7:0,kup_8:0,kup_9:0,kup_10:0,kup_11:0,kup_12:0 },
+        mrs: { date:"", evaluator:"", mrs_0:0,mrs_1:0,mrs_2:0,mrs_3:0,mrs_4:0,mrs_5:0,mrs_6:0,mrs_7:0,mrs_8:0,mrs_9:0,mrs_10:0 },
+        psqi: { date:"", evaluator:"", q1BedTime:"", q2Latency:0, q3WakeTime:"", q4Hours:null, q5a:0,q5b:0,q5c:0,q5d:0,q5e:0,q5f:0,q5g:0,q5h:0,q5i:0,q5j:0, q6Quality:0, q7Medication:0, q8Sleepy:0, q9Energy:0 },
       },
     };
   },
   computed: {
     sourceLabel() { const m={standalone:"鐙珛寤烘。",outpatient:"闂ㄨ瘖璁板綍",inpatient:"鍦ㄩ櫌璁板綍"}; return m[this.archive?.sourcePage]||this.archive?.sourcePage||"-"; },
-    pregnancySubOptions() {
-      const opt = PREGNANCY_OPTIONS[this.pregForm.pregnancy.status];
-      return opt ? opt.details : [];
+    // 閲忚〃绾歌川琛ㄨ〃澶存墍鐢ㄧ殑鎮h�呭熀鏈俊鎭�
+    patientInfo() {
+      const a = this.archive || {};
+      return {
+        name: a.patname || "",
+        // 涓庨」鐩粺涓�绾﹀畾涓�鑷达細sex == 1 涓虹敺锛屽叾浣欎负濂�
+        sex: a.sex === undefined || a.sex === null || a.sex === "" ? "" : a.sex == 1 ? "鐢�" : "濂�",
+        age: a.age || "",
+        dept: a.deptname || "",
+        diagnosis: a.diagname || "",
+      };
     },
     pregnancyHintOptions() {
-      const opt = PREGNANCY_OPTIONS[this.pregForm.pregnancy.status];
-      return opt ? opt.hints : [];
+      // 澶勭悊寤鸿鍙�夐」闅忔墍閫夈�屽叿浣撴儏鍐点�嶅彉鍔�
+      const set = {};
+      (this.pregForm.pregnancy.details || []).forEach((d) => {
+        (PREGNANCY_DETAIL_HINTS[d] || []).forEach((h) => { set[h] = true; });
+      });
+      return Object.keys(set);
     },
     showFollowUp() {
-      return this.pregForm.pregnancy.status === "planAbortion" &&
-        this.pregForm.pregnancy.hint.includes("缁忓挩璇㈡寚瀵煎悗缁х画濡婂骞跺湪浜х寤烘。");
+      return !!this.pregForm.showFollowUp;
     },
-    currentFollowRecords() {
-      return (this.pregForm.followupCycle || []).filter((r) => r.status === "宸插畬鎴�");
-    },
+  },
+  watch: {
+    // 韬唤璇佸彿濉畬鏁村悗锛岃嚜鍔ㄦ妸鍑虹敓鏃ユ湡涓庡勾榫勮ˉ涓婏紙鍙ˉ绌哄瓧娈碉級
+    "archive.idcardno"(val) { this.fillBirthdayFromIdcard(val); },
+    "pregForm.firstVisit.idcardno"(val) { this.fillBirthdayFromIdcard(val); },
   },
   created() {
     const id = this.$route.query.id;
-    if (id) this.loadArchive(id, this.$route.query.edit == 1);
+    const typeKey = this.$route.query.type;
+    // detailId锛氳鎯呰〃涓婚敭銆傚悗绔垪琛ㄦ帴鍙f殏鏈繑鍥烇紝鍏堟寜璺敱鍙傛暟閫忎紶锛屾湭鏉ュ彲鐩存帴鎷间笂
+    if (id) this.loadArchive(id, typeKey, this.$route.query.edit == 1, this.$route.query.detailId);
   },
   methods: {
-    loadArchive(id, autoEdit) {
-      this.loading = true;
-      this.archive = loadArchives().find((item) => item.id === id) || null;
-      if (this.archive) {
-        if (this.archive.subType === "pregnancy") {
-          if (this.archive.pregFormData) {
-            const saved = JSON.parse(JSON.stringify(this.archive.pregFormData));
-            this.pregForm = Object.assign({}, this.pregForm, saved);
-            if (!this.pregForm.pregnancy) this.pregForm.pregnancy = { status: "", details: [], hint: [] };
-          }
-        } else if (this.archive.subType === "menopause") {
-          if (this.archive.formData) {
-            Object.keys(this.form).forEach((k) => {
-              if (this.archive.formData[k]) Object.assign(this.form[k], this.archive.formData[k]);
-            });
-          }
-        }
+    /**
+     * 浠庤韩浠借瘉鍙疯В鏋愬嚭鐢熸棩鏈� 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 "";
       }
-      if (autoEdit) this.editing = true;
-      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.subType === "pregnancy") {
+              if (this.archive.pregFormData) {
+                const saved = JSON.parse(JSON.stringify(this.archive.pregFormData));
+                this.pregForm = Object.assign({}, this.pregForm, saved);
+                if (!this.pregForm.pregnancy) this.pregForm.pregnancy = { status: "", details: [], hint: [] };
+                if (!this.pregForm.registration) this.pregForm.registration = { isRegistered: "", unregisteredReasons: [], unregisteredReasonOther: "", edd: "", recorder: "" };
+                if (!Array.isArray(this.pregForm.registration.unregisteredReasons)) this.pregForm.registration.unregisteredReasons = [];
+                // 鏈鏈堢粡锛氫粠鐥呭巻/妗f鑷姩鎶撳彇锛屽苟鑷姩璁$畻棰勪骇鏈�
+                if (!this.pregForm.firstVisit.lmp && this.archive.lmp) {
+                  this.pregForm.firstVisit.lmp = this.archive.lmp;
+                  if (!this.pregForm.registration.edd) this.pregForm.registration.edd = this.calcEdd(this.archive.lmp);
+                }
+                if (!saved.hasOwnProperty("showFollowUp")) {
+                  // 鍏煎鏃ф暟鎹細宸叉湁鏃╁瓡闅忚琛ㄥ唴瀹瑰垯榛樿鏄剧ず
+                  const ef = saved.earlyFollow || {};
+                  this.pregForm.showFollowUp = !!(ef.name || ef.visitNo || ef.buildDate || ef.edd);
+                }
+              }
+            } else if (this.archive.subType === "menopause") {
+              if (this.archive.formData) {
+                Object.keys(this.form).forEach((k) => {
+                  if (this.archive.formData[k]) Object.assign(this.form[k], this.archive.formData[k]);
+                });
+              }
+            }
+          }
+          if (autoEdit) this.editing = true;
+        })
+        .catch(() => { this.archive = null; })
+        .finally(() => { this.loading = false; });
     },
     onPregnancyStatusChange() {
-      this.pregForm.pregnancy.details = [];
-      this.pregForm.pregnancy.hint = [];
       const opt = PREGNANCY_OPTIONS[this.pregForm.pregnancy.status];
       if (this.archive) this.archive.pregnancyStatus = opt ? opt.label : "";
     },
+    onDetailsChange() {
+      // 澶勭悊寤鸿闅忓叿浣撴儏鍐靛彉鍔紝鍓旈櫎宸蹭笉鍐嶉�傜敤鐨勫凡閫夐」
+      const valid = this.pregnancyHintOptions;
+      this.pregForm.pregnancy.hint = (this.pregForm.pregnancy.hint || []).filter((h) => valid.includes(h));
+    },
+    calcEdd(lmp) {
+      if (!lmp) return "";
+      const d = new Date(String(lmp).replace(/-/g, "/"));
+      if (isNaN(d.getTime())) return "";
+      const m = d.getMonth() + 1; // 1-12
+      let y = d.getFullYear();
+      // 鏈鏈堢粡锛氭湀浠�>3 鍑�3锛堣法骞达級锛屸墹3 鍔�9锛涙棩鏈�+7
+      const eddMonth = m > 3 ? m - 3 : m + 9;
+      if (m > 3) y += 1;
+      const edd = new Date(y, eddMonth - 1, d.getDate() + 7);
+      const pad = (n) => String(n).padStart(2, "0");
+      return edd.getFullYear() + "-" + pad(edd.getMonth() + 1) + "-" + pad(edd.getDate());
+    },
+    onLmpChange(val) {
+      this.pregForm.registration.edd = this.calcEdd(val);
+    },
+    hasFollowupHint(hints) {
+      return (hints || []).some((h) => h && h.indexOf("缁х画濡婂骞跺湪浜х寤烘。") > -1);
+    },
+    onHintChange(val) {
+      if (this.hasFollowupHint(val) && !this.pregForm.showFollowUp) {
+        this.$modal.confirm("鏄惁鍒涘缓鏃╁瓡闅忚琛紵").then(() => {
+          this.pregForm.showFollowUp = true;
+          // 鏂板缓闅忚琛ㄦ椂鎶婃。妗堥噷宸叉湁鐨勫熀纭�淇℃伅甯﹁繃鏉ワ紝閬垮厤閲嶅褰曞叆
+          this.fillEarlyFollowDefaults();
+          this.$message.success("宸插垱寤烘棭瀛曢殢璁胯〃");
+        }).catch(() => {});
+      }
+    },
+    /**
+     * 鐢ㄦ。妗堜俊鎭濉棭瀛曢殢璁胯〃鐨勫熀纭�瀛楁
+     * 鍙~绌哄瓧娈碉紝涓嶈鐩栫敤鎴峰凡缁忓~杩囩殑鍐呭
+     */
+    fillEarlyFollowDefaults() {
+      const a = this.archive || {};
+      if (!this.pregForm.earlyFollow) {
+        this.pregForm.earlyFollow = { name: "", age: "", visitNo: "", wechat: "", household: "", gravidaPara: "", maritalStatus: "", buildDate: "", abortionReasons: [], otherReason: "", continuePregnancy: "", edd: "", registrationUnit: "" };
+      }
+      const ef = this.pregForm.earlyFollow;
+      const put = (key, val) => {
+        if (val === undefined || val === null || val === "") return;
+        if (ef[key] === undefined || ef[key] === null || ef[key] === "") ef[key] = val;
+      };
+      put("name", a.patname);                                     // 濮撳悕
+      put("age", a.age);                                          // 骞撮緞锛堢敱鍑虹敓鏃ユ湡鎺ㄧ畻锛�
+      put("visitNo", a.outhospno || a.serialnum);                 // 灏辫瘖鍙凤紙闂ㄨ瘖鍙� / 娴佹按鍙凤級
+      put("edd", this.pregForm.registration && this.pregForm.registration.edd); // 棰勪骇鏈燂紙妗f閲屽凡鎸夋湯娆℃湀缁忕畻濂斤級
+      put("buildDate", this.todayStr());                          // 寤鸿〃鏃ユ湡榛樿浠婂ぉ
+    },
+    /** 浠婂ぉ yyyy-MM-dd */
+    todayStr() {
+      const d = new Date();
+      const pad = (n) => String(n).padStart(2, "0");
+      return d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate());
+    },
     toggleEdit() {
       if (this.editing) {
+        // 鍏堟妸椤甸潰琛ㄥ崟鍥炲~鍒版。妗堝璞★紝鍐嶆暣浣撴彁浜�
         if (this.archive.subType === "pregnancy") this.archive.pregFormData = JSON.parse(JSON.stringify(this.pregForm));
         if (this.archive.subType === "menopause") this.archive.formData = JSON.parse(JSON.stringify(this.form));
-        this.archive.updateTime = new Date().toISOString().replace("T", " ").substring(0, 19);
-        const all = loadArchives();
-        const idx = all.findIndex((item) => item.id === this.archive.id);
-        if (idx >= 0) all[idx] = JSON.parse(JSON.stringify(this.archive));
-        saveArchives(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;
     },
     handleCloseCase() {
       this.$modal.confirm("纭灏嗚妗f缁撴锛熺粨妗堝悗鍙湪鍒楄〃椤垫煡鐪嬬粨妗堢姸鎬併��").then(() => {
-        this.archive.closeStatus = 1;
-        this.archive.updateTime = new Date().toISOString().replace("T", " ").substring(0, 19);
-        const all = loadArchives();
-        const idx = all.findIndex((item) => item.id === this.archive.id);
-        if (idx >= 0) all[idx] = JSON.parse(JSON.stringify(this.archive));
-        saveArchives(all);
-        this.$message.success("宸茬粨妗�");
+        this.loading = true;
+        return closeArchive(this.archive)
+          .then(() => {
+            this.archive.closeStatus = 1;
+            this.$message.success("宸茬粨妗�");
+          })
+          .catch(() => {})
+          .finally(() => { this.loading = false; });
       }).catch(() => {});
     },
   },
@@ -506,6 +654,14 @@
 .info-card { margin-bottom: 0; }
 .card-header { display: flex; justify-content: space-between; align-items: center; font-size: 16px; font-weight: 600; }
 .header-sub { font-size: 13px; color: #909399; font-weight: normal; }
+.page-title {
+  margin: 0 0 14px;
+  padding-left: 12px;
+  font-size: 17px;
+  font-weight: 600;
+  color: #303133;
+  border-left: 4px solid $primary;
+}
 .empty-wrap { text-align: center; padding: 100px 0; color: #c0c4cc; font-size: 16px; }
 
 // 钃濊壊鍒嗗壊绾� + 灏忔爣棰�

--
Gitblit v1.9.3