From a9d2b856e0f6be6475319c2dc36bf405c2f908fc Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期二, 22 九月 2026 14:04:52 +0800
Subject: [PATCH] 测试完成

---
 src/views/patient/archives/nutrition/index.vue                            |   12 
 vue.config.js                                                             |    4 
 src/views/Satisfaction/sfstatistics/components/DataOverview.vue           | 1170 ++++++++--
 src/views/followvisit/zbAgain/index.vue                                   |   35 
 src/views/patient/archives/components/ArchiveDialog.vue                   |  276 --
 src/views/patient/archives/menopause/index.vue                            |   12 
 src/api/AiCentre/satisfaction.js                                          |   42 
 src/views/followvisit/zysatisfaction/index.vue                            |   19 
 src/views/sfstatistics/percentage/components/ChartDialog.vue              |   93 
 src/views/patient/archives/childHealth/detail.vue                         |  153 +
 src/views/Satisfaction/sfstatistics/components/SatisfactionStatistics.vue |   44 
 src/views/followvisit/mzsatisfaction/index.vue                            |   25 
 src/views/patient/archives/highRisk/index.vue                             |   12 
 src/views/followvisit/record/detailpage/index.vue                         |  104 
 src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue     |   36 
 src/views/patient/archives/maternalHealth/detail.vue                      |  726 ++++--
 src/views/patient/patient/behospitalized.vue                              |    4 
 src/views/followvisit/discharge/outpatientService.vue                     |   29 
 src/views/patient/archives/learning/index.vue                             |   12 
 src/views/followvisit/complaint/index.vue                                 |   25 
 src/views/patient/archives/components/ServiceRecords.vue                  |  344 +++
 src/views/followvisit/technology/index.vue                                |   15 
 src/views/sfstatistics/percentage/components/SecondFollowUp.vue           |  287 ++
 src/views/followvisit/again/index.vue                                     |    4 
 src/views/patient/archives/types.js                                       |  187 +
 随访通用9.22.zip                                                              |    0 
 src/views/followvisit/operation/index.vue                                 |   27 
 src/views/followvisit/Tracking/index.vue                                  |   37 
 src/views/followvisit/beHospitalized/followUp.vue                         |   33 
 src/views/sfstatistics/percentage/components/FirstFollowUp.vue            |  296 ++
 src/views/followvisit/record/index.vue                                    |   21 
 src/views/followvisit/Continue/index.vue                                  |   21 
 src/views/loginSSO.vue                                                    |   16 
 src/views/followvisit/OutpatientAgain/index.vue                           |   34 
 /dev/null                                                                 |    0 
 src/views/Satisfaction/sfstatistics/components/ChartsPanel.vue            |  620 ++++-
 src/views/login.vue                                                       |   12 
 src/views/followvisit/HistoricalFollow/index.vue                          |   21 
 src/views/patient/archives/pregnancy/index.vue                            |   12 
 src/views/sfstatistics/percentage/index.vue                               |   15 
 src/views/patient/archives/components/ArchiveList.vue                     |  148 +
 src/views/patient/patient/profile/index.vue                               |  723 +++---
 src/views/patient/archives/components/OutpatientPicker.vue                |  145 +
 src/views/repositoryai/intention/index.vue                                |   19 
 src/views/followvisit/discharge/index.vue                                 |   34 
 src/views/sfstatistics/percentage/components/CombinedFollowUp.vue         |   22 
 46 files changed, 4,341 insertions(+), 1,585 deletions(-)

diff --git a/src/api/AiCentre/satisfaction.js b/src/api/AiCentre/satisfaction.js
index 1d72c6e..09d6faf 100644
--- a/src/api/AiCentre/satisfaction.js
+++ b/src/api/AiCentre/satisfaction.js
@@ -8,8 +8,46 @@
     data: data
   });
 }
-
-
+// 鍚勯」鏈嶅姟婊℃剰搴︽暟鎹粺璁�
+export function sltdMydTotalByScore(data) {
+  return request({
+    url: "/smartor/serviceSubtaskDetail/sltdMydTotalByScore",
+    method: "post",
+    data: data
+  });
+}
+// 鍚勯」鏈嶅姟婊℃剰搴︽暟鎹粺璁�
+export function mzMydScoreRank(data) {
+  return request({
+    url: "/smartor/serviceSubtaskDetail/mzMydScoreRank",
+    method: "post",
+    data: data
+  });
+}
+// 鍚勭瀹�/鐥呭尯婊℃剰搴﹁瘎鍒嗗姣�
+export function statQuestionOptionByKsOrBq(data) {
+  return request({
+    url: "/smartor/serviceSubtaskDetail/statQuestionOptionByKsOrBq",
+    method: "post",
+    data: data
+  });
+}
+// 璇勫垎瓒嬪娍
+export function mydTrend(data) {
+  return request({
+    url: "/smartor/serviceSubtaskDetail/mydTrend",
+    method: "post",
+    data: data
+  });
+}
+// 鐪佺珛鍚屽痉鎮h�呮弧鎰忓害缁存姢锛堟寜缁村害/闄㈠尯缁熻锛�
+export function sltdMydTotalByDimension(data) {
+  return request({
+    url: "/smartor/serviceSubtaskDetail/sltdMydTotalByDimension",
+    method: "post",
+    data: data
+  });
+}
 
 // 缂撳瓨闂嵎
 export function saveMYDQuestionAnswer(data) {
diff --git a/src/views/Satisfaction/sfstatistics/components/ChartsPanel.vue b/src/views/Satisfaction/sfstatistics/components/ChartsPanel.vue
index e0ce533..cc1be67 100644
--- a/src/views/Satisfaction/sfstatistics/components/ChartsPanel.vue
+++ b/src/views/Satisfaction/sfstatistics/components/ChartsPanel.vue
@@ -17,8 +17,14 @@
         <span class="filter-label">鍖洪棿绫诲瀷锛�</span>
         <el-radio-group v-model="queryParams.interval" size="small" @change="refreshAll">
           <el-radio-button label="day">鎸夊ぉ</el-radio-button>
+          <el-radio-button label="week">鎸夊懆</el-radio-button>
           <el-radio-button label="month">鎸夋湀</el-radio-button>
           <el-radio-button label="year">鎸夊勾</el-radio-button>
+        </el-radio-group>
+        <span class="filter-label">缁熻缁村害锛�</span>
+        <el-radio-group v-model="queryParams.dimension" size="small" @change="onDimensionChange">
+          <el-radio-button label="ward">鎸夌梾鍖虹粺璁�</el-radio-button>
+          <el-radio-button label="dept">鎸夌瀹ょ粺璁�</el-radio-button>
         </el-radio-group>
         <el-button type="primary" size="small" icon="el-icon-search" @click="refreshAll">鏌ヨ</el-button>
         <el-button size="small" icon="el-icon-refresh" @click="handleReset">閲嶇疆</el-button>
@@ -31,10 +37,13 @@
       <el-col :span="12">
         <el-card shadow="never" class="chart-card">
           <div slot="header" class="card-header">
-            <span>鏃堕棿缁村害 路 闂ㄨ瘖鎮h�呮弧鎰忓害瓒嬪娍</span>
+            <span>鎮h�呮弧鎰忓害缁煎悎寰楀垎瓒嬪娍</span>
             <el-tag type="success" size="small">鐜瘮 {{ trendMoM }}</el-tag>
           </div>
-          <div ref="chart1" class="chart-box"></div>
+          <div class="chart-wrap" v-loading="trendLoading" element-loading-text="瓒嬪娍鍔犺浇涓�...">
+            <div ref="chart1" class="chart-box"></div>
+            <div v-if="!trendLoading && !trend.buckets.length" class="chart-empty">鏆傛棤瓒嬪娍鏁版嵁</div>
+          </div>
         </el-card>
       </el-col>
 
@@ -44,7 +53,10 @@
           <div slot="header" class="card-header">
             <span>鍒嗙被缁村害 路 鍚勬寚鏍噞{ intervalLabel }}瀵规瘮</span>
           </div>
-          <div ref="chart2" class="chart-box"></div>
+          <div class="chart-wrap" v-loading="categoryLoading" element-loading-text="鍒嗙被缁村害鍔犺浇涓�...">
+            <div ref="chart2" class="chart-box"></div>
+            <div v-if="!categoryLoading && !categoryCompare.categories.length" class="chart-empty">鏆傛棤鍒嗙被缁村害鏁版嵁</div>
+          </div>
         </el-card>
       </el-col>
     </el-row>
@@ -56,25 +68,26 @@
           <div slot="header" class="card-header">
             <span>鍗曢 路 閫夐」缁熻</span>
             <div class="header-right">
-              <el-select v-model="singleQuestionId" size="small" class="sel sel-lg" @change="refreshAll">
-                <el-option v-for="q in questionOptions" :key="q.id" :label="q.title" :value="q.id" />
+              <el-select v-model="singleQuestionId" size="small" class="sel sel-lg" filterable remote clearable
+                :remote-method="searchQuestions" :loading="questionLoading" placeholder="璇疯緭鍏ラ棶棰樺唴瀹规悳绱�" @change="onSingleQuestionChange">
+                <el-option v-for="q in questionOptions" :key="q.id" :label="q.scriptContent || q.title" :value="q.id" />
               </el-select>
-              <el-select v-model="singleDeptWards" multiple collapse-tags size="small" class="sel" clearable filterable placeholder="鍏ㄩ儴绉戝/鐥呭尯" @change="refreshAll">
-                <el-option-group label="绉戝">
+              <el-select v-model="singleDeptWards" multiple collapse-tags size="small" class="sel" clearable filterable :placeholder="queryParams.dimension === 'dept' ? '鍏ㄩ儴绉戝' : '鍏ㄩ儴鐥呭尯'" @change="refreshAll">
+                <template v-if="queryParams.dimension === 'dept'">
                   <el-option v-for="d in deptOptions" :key="'dept:' + d" :label="d" :value="'dept:' + d" />
-                </el-option-group>
-                <el-option-group label="鐥呭尯">
+                </template>
+                <template v-else>
                   <el-option v-for="w in wardOptions" :key="'ward:' + w" :label="w" :value="'ward:' + w" />
-                </el-option-group>
+                </template>
               </el-select>
             </div>
           </div>
-          <el-table :data="singleQuestionData" border size="small">
+          <el-table :data="singleQuestionData" border size="small" v-loading="singleLoading" element-loading-text="閫夐」缁熻鍔犺浇涓�...">
             <el-table-column prop="option" label="閫夐」" />
             <el-table-column prop="count" label="鍚堣鏁伴噺" width="120" align="center" />
             <el-table-column prop="rate" label="鍗犳瘮姣斾緥" width="120" align="center" />
           </el-table>
-          <div class="table-footer">鏈鏈夋晥濉啓浜烘锛�<b>{{ singleQuestionMeta.total }}</b>銆�缁煎悎婊℃剰搴︼細<b>{{ singleQuestionMeta.score }}</b></div>
+          <div class="table-footer">鏈鏈夋晥濉啓浜烘锛�<b>{{ singleQuestionMeta.total }}</b>銆�缁煎悎寰楀垎锛�<b>{{ singleQuestionMeta.score }}</b></div>
         </el-card>
       </el-col>
 
@@ -84,7 +97,10 @@
           <div slot="header" class="card-header">
             <span>闄㈠尯缁村害 路 鍚勯櫌鍖簕{ intervalLabel }}瀵规瘮</span>
           </div>
-          <div ref="chart4" class="chart-box"></div>
+          <div class="chart-wrap" v-loading="hospitalLoading" element-loading-text="闄㈠尯缁村害鍔犺浇涓�...">
+            <div ref="chart4" class="chart-box"></div>
+            <div v-if="!hospitalLoading && !hospitalCompare.hospitals.length" class="chart-empty">鏆傛棤闄㈠尯缁村害鏁版嵁</div>
+          </div>
         </el-card>
       </el-col>
     </el-row>
@@ -105,10 +121,11 @@
               </el-select>
             </div>
           </div>
-          <el-table :data="rankRows" border size="small" max-height="400">
-            <el-table-column type="index" label="鎺掑悕" width="60" align="center" />
+          <el-table :data="rankRows" border size="small" max-height="400" v-loading="rankLoading" element-loading-text="鎺掑悕鍔犺浇涓�...">
+            <el-table-column prop="rank" label="鎺掑悕" width="60" align="center" />
             <el-table-column prop="name" :label="rankDimLabel" />
             <el-table-column prop="score" label="缁煎悎寰楀垎" width="120" align="center" />
+            <el-table-column prop="itemCount" label="椤规暟" width="100" align="center" />
           </el-table>
         </el-card>
       </el-col>
@@ -128,10 +145,11 @@
               </el-select>
             </div>
           </div>
-          <el-table :data="crossRows" border size="small" max-height="400">
-            <el-table-column type="index" label="鎺掑悕" width="60" align="center" />
+          <el-table :data="crossRows" border size="small" max-height="400" v-loading="crossLoading" element-loading-text="鎺掑悕鍔犺浇涓�...">
+            <el-table-column prop="rank" label="鎺掑悕" width="60" align="center" />
             <el-table-column prop="name" :label="crossDimLabel" />
             <el-table-column prop="score" label="缁煎悎寰楀垎" width="120" align="center" />
+            <el-table-column prop="itemCount" label="椤规暟" width="100" align="center" />
           </el-table>
         </el-card>
       </el-col>
@@ -141,54 +159,29 @@
 
 <script>
 import * as echarts from 'echarts';
+import { mydTrend, sltdMydTotalByDimension, sltdMydTotalByScore ,mzMydScoreRank} from "@/api/AiCentre/satisfaction";
+import { getissuelist } from "@/api/AiCentre/questionnaire";
 
-// 鍗曢閫夐」
-const QUESTION_OPTIONS = ['闈炲父婊℃剰', '婊℃剰', '涓�鑸�', '涓嶆弧鎰�'];
-// 鍙�夐鐩�
-const QUESTIONS = [
-  { id: 22, title: '绗�22棰橈細鎶辨�ㄥ拰涓嶆弧鑳藉惁鍙婃椂寰楀埌鍥炲簲锛�' },
-  { id: 1, title: '绗�1棰橈細鎮ㄥ鎴戦櫌宸ヤ綔浜哄憳鐨勬湇鍔¤川閲忔弧鎰忎笉婊℃剰锛�' },
-  { id: 5, title: '绗�5棰橈細鎮ㄥ鍖婚櫌鏈嶅姟璁炬柦鐨勬�讳綋鍗拌薄濡備綍锛�' },
-  { id: 8, title: '绗�8棰橈細鍖荤敓瀵规偍鏄惁灏婇噸锛�' },
-  { id: 12, title: '绗�12棰橈細鎶ゅ+瀵规偍鏄惁灏婇噸锛�' },
-  { id: 15, title: '绗�15棰橈細鎮ㄥ棰勭害鎸傚彿鏄惁婊℃剰锛�' },
-];
 const DEPTS = ['淇濆仴绉�', '浠嬪叆娌荤枟绉�', '涓撶鎶ゅ+闂ㄨ瘖', '搴峰鍖诲绉�', '鐨偆绉�', '鍐呭垎娉岀', '娑堝寲鍐呯', '鑲惧唴绉�', '鍛煎惛鍐呯', '蹇冭绠″唴绉�', '绁炵粡鍐呯', '琛�娑茬', '椋庢箍鍏嶇柅绉�', '鑲跨槫鍐呯', '鎰熸煋绉�', '鑰佸勾绉�', '鏅绉�', '楠ㄧ', '娉屽翱澶栫', '濡囦骇绉�'];
 const WARDS = ['涓�鐥呭尯', '浜岀梾鍖�', '涓夌梾鍖�', '鍥涚梾鍖�', '浜旂梾鍖�', '鍏梾鍖�', '涓冪梾鍖�', '鍏梾鍖�'];
 
-// 纭畾鎬т吉闅忔満
-function hashString(str) {
-  let h = 2166136261;
-  for (let i = 0; i < str.length; i++) {
-    h ^= str.charCodeAt(i);
-    h = Math.imul(h, 16777619);
-  }
-  return h >>> 0;
-}
-function mulberry32(a) {
-  return function () {
-    a |= 0;
-    a = (a + 0x6d2b79f5) | 0;
-    let t = Math.imul(a ^ (a >>> 15), 1 | a);
-    t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
-    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
-  };
-}
-
 export default {
   name: 'ChartsPanel',
+  dicts: ['dimensionality_type'],
   data() {
     return {
       queryParams: {
         dateRange: [],
         interval: 'month',
+        dimension: 'ward', // 缁熻缁村害锛歸ard=鎸夌梾鍖虹粺璁� dept=鎸夌瀹ょ粺璁�
       },
       deptOptions: DEPTS,
       wardOptions: WARDS,
-      questionOptions: QUESTIONS,
+      questionOptions: [],
 
       // 鍗曢绛涢��
-      singleQuestionId: 22,
+      singleQuestionId: null,
+      singleQuestionContent: '',
       singleDeptWards: [],
 
       // 鎺掑悕缁村害绛涢��
@@ -198,22 +191,44 @@
       crossDeptWards: [],
 
       // 鍥捐〃鏁版嵁
+      trendLoading: false,
+      categoryLoading: false,
+      hospitalLoading: false,
       trend: { buckets: [], data: [], seriesName: '闂ㄨ瘖鎮h�呮弧鎰忓害' },
       categoryCompare: { categories: [], seriesNames: [], series1: [], series2: [] },
       hospitalCompare: { hospitals: [], seriesNames: [], series1: [], series2: [] },
 
+      // 鍗曢 / 鎺掑悕 / 浜ゅ弶琛ㄥ姞杞界姸鎬�
+      singleLoading: false,
+      questionLoading: false,
+      rankLoading: false,
+      crossLoading: false,
+
       // 琛ㄦ牸鏁版嵁
       singleQuestionData: [],
-      singleQuestionMeta: { total: '0', score: '0.00%' },
-      deptRankData: [],
-      wardRankData: [],
-      crossDeptData: [],
-      crossWardData: [],
+      singleQuestionMeta: { total: '0', score: '0.00' },
+      rankData: [],
+      crossData: [],
     };
   },
   computed: {
+    // 绉戝/鐥呭尯缂栫爜锛氫紭鍏堝彇褰撳墠鐢ㄦ埛鎵�灞烇紝鏃犲垯鍏滃簳鍚嶇О鏈韩浣滀负缂栫爜
+    deptCodeList() {
+      const list = this.$store.getters.belongDepts || [];
+      return list.length ? list : DEPTS.map((d) => ({ deptName: d, deptCode: d }));
+    },
+    wardCodeList() {
+      const list = this.$store.getters.belongWards || [];
+      return list.length ? list : WARDS.map((w) => ({ districtName: w, districtCode: w }));
+    },
+    defaultDeptCodes() {
+      return Array.from(new Set(this.deptCodeList.map((d) => d.deptCode)));
+    },
+    defaultWardCodes() {
+      return Array.from(new Set(this.wardCodeList.map((w) => w.districtCode)));
+    },
     intervalLabel() {
-      return { day: '鎸夊ぉ', month: '鎸夋湀', year: '鎸夊勾' }[this.queryParams.interval] || '鎸夋湀';
+      return { day: '鎸夊ぉ', week: '鎸夊懆', month: '鎸夋湀', year: '鎸夊勾' }[this.queryParams.interval] || '鎸夋湀';
     },
     trendMoM() {
       const d = this.trend.data;
@@ -237,14 +252,10 @@
       return this.crossDimension === 'dept' ? this.deptOptions : this.wardOptions;
     },
     rankRows() {
-      const list = this.rankDimension === 'dept' ? this.deptRankData : this.wardRankData;
-      if (!this.rankDeptWards.length) return list;
-      return list.filter((r) => this.rankDeptWards.includes(r.name));
+      return this.rankData;
     },
     crossRows() {
-      const list = this.crossDimension === 'dept' ? this.crossDeptData : this.crossWardData;
-      if (!this.crossDeptWards.length) return list;
-      return list.filter((r) => this.crossDeptWards.includes(r.name));
+      return this.crossData;
     },
   },
   mounted() {
@@ -253,7 +264,26 @@
         this.queryParams.dateRange = this.defaultRange();
       }
       this.initCharts();
+      // 鍒濆鍖栧嵆鏄剧ず鍚勬暟鎹潡鐨勫姞杞界姸鎬侊紝閬垮厤鍏堥棯鐜扳�滄殏鏃犳暟鎹��
+      this.trendLoading = true;
+      this.categoryLoading = true;
+      this.hospitalLoading = true;
+      this.singleLoading = true;
+      this.rankLoading = true;
+      this.crossLoading = true;
+      // 鏁版嵁鍧椾笌棰樼洰鍒楄〃骞惰鍔犺浇锛氭暟鎹潡涓嶄緷璧栭鐩垪琛紝鏃犻渶涓茶绛夊緟
       this.refreshAll();
+      this.loadQuestions('').then(() => {
+        if (this.singleQuestionContent) {
+          // 鍗曢閫夐」缁熻 / 鍗曢浜ゅ弶鎺掑悕渚濊禆闂鏂囨湰锛岄鐩姞杞藉畬鎴愬悗琛ユ媺涓�娆�
+          this.fetchSingleQuestion();
+          this.fetchCross();
+        } else {
+          // 棰樼洰鍒楄〃涓虹┖鎴栧姞杞藉け璐ワ紝缁撴潫鍗曢鐩稿叧鍔犺浇鐘舵��
+          this.singleLoading = false;
+          this.crossLoading = false;
+        }
+      });
     });
   },
   methods: {
@@ -269,9 +299,163 @@
         if (c) c.resize();
       });
     },
+    // 缁村害缂栫爜 鈫� 瀛楀吀鍚嶇О锛坉imensionality_type锛�
+    getDimensionLabel(code) {
+      const dict = this.dict && this.dict.type && this.dict.type.dimensionality_type;
+      if (dict) {
+        const hit = dict.find((item) => String(item.value) === String(code));
+        if (hit) return hit.label;
+      }
+      return code == null ? '' : String(code);
+    },
+    // 鍙�夐鐩細杩滅▼妯$硦鎼滅储锛堟寜闂鍐呭 scriptContent锛�
+    searchQuestions(keyword) {
+      this.loadQuestions(keyword || '');
+    },
+    // 鍔犺浇鍙�夐鐩紙鍙傝�冮棶棰樺垪琛ㄩ〉 getissuelist锛�
+    async loadQuestions(keyword) {
+      this.questionLoading = true;
+      try {
+        const res = await getissuelist({
+          pageNum: 1,
+          pageSize: 50,
+          isavailable: '',
+          scriptContent: keyword || '',
+        });
+        const rows = (res && res.rows) || [];
+        this.questionOptions = rows.map((q) => ({
+          id: q.id,
+          scriptContent: q.scriptContent || q.title || '',
+        }));
+        // 鏃犲叧閿瓧鏃堕粯璁ら�変腑绗竴棰�
+        if (!keyword && this.questionOptions.length && !this.singleQuestionContent) {
+          const first = this.questionOptions[0];
+          this.singleQuestionId = first.id;
+          this.singleQuestionContent = first.scriptContent;
+        }
+      } catch (e) {
+        this.questionOptions = [];
+      } finally {
+        this.questionLoading = false;
+      }
+    },
+    onSingleQuestionChange(val) {
+      const q = this.questionOptions.find((o) => String(o.id) === String(val));
+      this.singleQuestionContent = q ? q.scriptContent : '';
+      this.refreshAll();
+    },
+    // 绉戝/鐥呭尯鍚嶇О 鈫� 缂栫爜
+    mapDeptNames(names) {
+      return names.map((n) => {
+        const hit = this.deptCodeList.find((d) => d.deptName === n);
+        return hit ? hit.deptCode : n;
+      });
+    },
+    mapWardNames(names) {
+      return names.map((n) => {
+        const hit = this.wardCodeList.find((w) => w.districtName === n);
+        return hit ? hit.districtCode : n;
+      });
+    },
+    // 缁煎悎寰楀垎锛堢湡瀹炲彛寰勶級锛毼�(閫夐」鍒嗗�� 脳 濉姤閲�) / 危(濉姤閲�)
+    scoreOfOptions(options) {
+      let num = 0;
+      let den = 0;
+      (options || []).forEach((o) => {
+        const c = Number(o && o.count) || 0;
+        const s = Number(o && o.score);
+        if (isNaN(s)) return;
+        num += s * c;
+        den += c;
+      });
+      if (!den) return '0.00';
+      return (num / den).toFixed(2);
+    },
+    // 瑙f瀽姣斾緥瀛楃涓诧細"14.29%"銆�"0"銆�"0.5" 鈫� 鏁板�硷紙鐧惧垎姣旓級锛涙棤鏁堣繑鍥� null
+    parsePercent(value) {
+      if (value == null || value === '') return null;
+      const n = Number(String(value).replace(/%/g, '').trim());
+      return isNaN(n) ? null : n;
+    },
+    // 鍗曢杩斿洖 List<QuestionResultDTO> 鈫� { options, total }
+    normalizeSingleQuestion(list) {
+      const arr = Array.isArray(list) ? list : (list && (list.list || list.rows)) || [];
+      const options = [];
+      let total = 0;
+      arr.forEach((item) => {
+        const details = Array.isArray(item && item.subtaskDetailRatioExportList)
+          ? item.subtaskDetailRatioExportList
+          : [];
+        details.forEach((d) => {
+          const option = (d && (d.optionresult || d.targetvalue || d.optioncontent || d.questiontext)) || '';
+          const count = Number(d && d.count) || 0;
+          const rawScore = Number(d && d.score);
+          const ratio = this.parsePercent(d && d.ratio);
+          options.push({ option, count, score: isNaN(rawScore) ? null : rawScore, ratio });
+          total += count;
+        });
+      });
+      return { options, total };
+    },
+    // 鍗曢閫夐」缁熻锛堢湡瀹炴帴鍙� /smartor/serviceSubtaskDetail/sltdMydTotalByScore锛�
+    async fetchSingleQuestion() {
+      const range = this.queryParams.dateRange || [];
+      if (range.length !== 2 || !range[0] || !range[1] || !this.singleQuestionContent) {
+        this.singleQuestionData = [];
+        this.singleQuestionMeta = { total: '0', score: '0.00' };
+        return;
+      }
+      this.singleLoading = true;
+      try {
+        const payload = {
+          deptOrDistrict: '1',
+          serviceTypeList: ['6', '14'],
+          startFinishTime: range[0],
+          endFinishTime: range[1],
+          questionContent: this.singleQuestionContent,
+        };
+        const sel = this.singleDeptWards || [];
+        if (this.queryParams.dimension === 'dept') {
+          const names = sel.map((s) => String(s).replace(/^dept:/, ''));
+          payload.leaveldeptcodes = names.length ? this.mapDeptNames(names) : this.defaultDeptCodes;
+        } else {
+          const names = sel.map((s) => String(s).replace(/^ward:/, ''));
+          payload.leavehospitaldistrictcodes = names.length ? this.mapWardNames(names) : this.defaultWardCodes;
+        }
+        const res = await sltdMydTotalByScore(payload);
+        console.log('[sltdMydTotalByScore 鍗曢] code=', res && res.code, 'data=', JSON.stringify(res && res.data).slice(0, 1500));
+        const list = res && res.code === 200 ? res.data : [];
+        const { options, total } = this.normalizeSingleQuestion(list);
+        this.singleQuestionData = options.map((o) => ({
+          option: o.option,
+          count: o.count,
+          rate: o.ratio != null
+            ? o.ratio.toFixed(2) + '%'
+            : (total ? ((o.count / total) * 100).toFixed(2) + '%' : '0.00%'),
+        }));
+        this.singleQuestionMeta = {
+          total: total.toLocaleString(),
+          score: this.scoreOfOptions(options),
+        };
+        if (!options.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犺棰樼殑閫夐」缁熻鏁版嵁', 'warning');
+      } catch (e) {
+        this.singleQuestionData = [];
+        this.singleQuestionMeta = { total: '0', score: '0.00' };
+        this.notify('鍗曢閫夐」缁熻鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+      } finally {
+        this.singleLoading = false;
+      }
+    },
     handleReset() {
       this.queryParams.dateRange = this.defaultRange();
       this.queryParams.interval = 'month';
+      this.queryParams.dimension = 'ward';
+      this.singleDeptWards = [];
+      this.refreshAll();
+    },
+    // 鍒囨崲鍏ㄥ眬缁熻缁村害鏃舵竻绌哄崟棰樼瓫閫夛紝淇濊瘉绉戝/鐥呭尯浜掓枼
+    onDimensionChange() {
+      this.singleDeptWards = [];
       this.refreshAll();
     },
     onRankDimensionChange() {
@@ -285,7 +469,7 @@
     defaultRange() {
       const end = new Date();
       const start = new Date();
-      start.setDate(start.getDate() - 29);
+      start.setDate(start.getDate() - 91);
       const f = (d) => {
         const y = d.getFullYear();
         const m = String(d.getMonth() + 1).padStart(2, '0');
@@ -298,6 +482,7 @@
     intervalConfig() {
       const buckets = this.genBuckets(this.queryParams.interval);
       if (this.queryParams.interval === 'day') return { buckets, seriesNames: ['鏄ㄦ棩', '浠婃棩'] };
+      if (this.queryParams.interval === 'week') return { buckets, seriesNames: ['涓婂懆', '鏈懆'] };
       if (this.queryParams.interval === 'year') return { buckets, seriesNames: ['鍘诲勾', '浠婂勾'] };
       return { buckets, seriesNames: ['涓婃湀', '鏈湀'] };
     },
@@ -312,6 +497,12 @@
           d.setDate(end.getDate() - i);
           buckets.push(`${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`);
         }
+      } else if (type === 'week') {
+        for (let i = 5; i >= 0; i--) {
+          const d = new Date(end);
+          d.setDate(end.getDate() - i * 7);
+          buckets.push(`${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')} 鍛╜);
+        }
       } else if (type === 'year') {
         for (let i = 3; i >= 0; i--) buckets.push(String(end.getFullYear() - i));
       } else {
@@ -322,83 +513,208 @@
       }
       return buckets;
     },
-    // 鍒锋柊鍏ㄩ儴鏁版嵁锛堟ā鎷燂紝鎺ュ彛灏辩华鍚庢浛鎹负鐪熷疄璇锋眰锛�
-    refreshAll() {
-      const baseChart = JSON.stringify(this.queryParams);
-      const baseTime = JSON.stringify({ dateRange: this.queryParams.dateRange });
-
-      // 鍥捐〃锛氬尯闂寸被鍨� + 鏃堕棿鑼冨洿
-      this.genChartData(mulberry32(hashString(baseChart + 'charts')));
-      // 鍗曢琛細鏃堕棿鑼冨洿 + 棰樼洰 + 绉戝/鐥呭尯
-      this.genSingleData(mulberry32(hashString(baseTime + JSON.stringify({ sq: this.singleQuestionId, sdw: this.singleDeptWards }))));
-      // 绉戝/鐥呭尯鎺掑悕锛氭椂闂磋寖鍥� + 缁村害 + 閫夋嫨
-      this.genRankData(mulberry32(hashString(baseTime + JSON.stringify({ rd: this.rankDimension, rdw: this.rankDeptWards }))));
-      // 鍗曢脳绉戝/鐥呭尯鎺掑悕锛氭椂闂磋寖鍥� + 缁村害 + 閫夋嫨 + 棰樼洰
-      this.genCrossData(mulberry32(hashString(baseTime + JSON.stringify({ cd: this.crossDimension, cdw: this.crossDeptWards, sq: this.singleQuestionId }))));
+    // 鍒锋柊鍏ㄩ儴鏁版嵁锛堣秼鍔裤�佸垎绫荤淮搴︺�侀櫌鍖虹淮搴︺�佸崟棰樸�佹帓鍚嶃�佷氦鍙夊潎涓虹湡瀹炴帴鍙o級
+    async refreshAll() {
+      // 鍏釜鏁版嵁鍧楀苟琛屾媺鍙栵紝鍚勫尯鍧楀悓鏃舵樉绀哄悇鑷殑鍔犺浇鐘舵��
+      await Promise.all([
+        this.fetchTrend(),
+        this.fetchCategoryCompare(),
+        this.fetchHospitalCompare(),
+        this.fetchSingleQuestion(),
+        this.fetchRank(),
+        this.fetchCross(),
+      ]);
 
       this.renderCharts();
     },
-    genChartData(rnd) {
-      const jitter = (lo, hi) => lo + rnd() * (hi - lo);
-      const cfg = this.intervalConfig();
-      const buckets = cfg.buckets;
+    // 婊℃剰搴﹁秼鍔匡紙鐪熷疄鎺ュ彛锛夛細data = [{ period, totalScore }]
+    async fetchTrend() {
+      const range = this.queryParams.dateRange || [];
+      if (range.length !== 2 || !range[0] || !range[1]) {
+        this.trend = { buckets: [], data: [], seriesName: '闂ㄨ瘖鎮h�呮弧鎰忓害' };
+        return;
+      }
 
-      this.trend = {
-        buckets,
-        seriesName: '闂ㄨ瘖鎮h�呮弧鎰忓害',
-        data: buckets.map(() => Math.round(jitter(86, 90) * 100) / 100),
-      };
-
-      const categories = ['闅愮淇濇姢', '鐜涓庢爣璇�', '鍖诲姟浜哄憳鍥炲簲', '鍖荤敓娌熼��', '鎸傚彿浣撻獙', '鎶ゅ+娌熼��'];
-      this.categoryCompare = {
-        categories,
-        seriesNames: cfg.seriesNames,
-        series1: categories.map(() => Math.round(jitter(82, 88) * 100) / 100),
-        series2: categories.map(() => Math.round(jitter(83, 89) * 100) / 100),
-      };
-
-      const hospitals = ['闄㈠尯涓�', '闄㈠尯浜�', '闄㈠尯涓�'];
-      this.hospitalCompare = {
-        hospitals,
-        seriesNames: cfg.seriesNames,
-        series1: hospitals.map(() => Math.round(jitter(85, 89) * 100) / 100),
-        series2: hospitals.map(() => Math.round(jitter(86, 90) * 100) / 100),
+      this.trendLoading = true;
+      try {
+        const res = await mydTrend({
+          startFinishTime: range[0],
+          endFinishTime: range[1],
+          type: this.queryParams.interval, // day / week / month / year
+        });
+        const list = res && res.code === 200 && Array.isArray(res.data) ? res.data : [];
+        this.trend = {
+          seriesName: '闂ㄨ瘖鎮h�呮弧鎰忓害',
+          buckets: list.map((i) => String((i && i.period) || '')),
+          data: list.map((i) => {
+            const n = Number(i && i.totalScore);
+            return isNaN(n) ? 0 : Math.round(n * 100) / 100;
+          }),
+        };
+        if (!list.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犺秼鍔挎暟鎹�', 'warning');
+      } catch (e) {
+        this.trend = { buckets: [], data: [], seriesName: '闂ㄨ瘖鎮h�呮弧鎰忓害' };
+        this.notify('瓒嬪娍鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+      } finally {
+        this.trendLoading = false;
+      }
+    },
+    notify(msg, type) {
+      const fn = { warning: 'warning', error: 'error', success: 'success' }[type] || 'info';
+      if (this.$message && this.$message[fn]) this.$message[fn](msg);
+    },
+    // 鍒嗙被缁村害瀵规瘮锛堢湡瀹炴帴鍙o級锛歞imensionType=1锛宒ata = [{ period, dimension, totalScore }]
+    async fetchCategoryCompare() {
+      const range = this.queryParams.dateRange || [];
+      if (range.length !== 2 || !range[0] || !range[1]) {
+        this.categoryCompare = { categories: [], seriesNames: [], series1: [], series2: [] };
+        return;
+      }
+      this.categoryLoading = true;
+      try {
+        const res = await sltdMydTotalByDimension({
+          startFinishTime: range[0],
+          endFinishTime: range[1],
+          type: this.queryParams.interval, // day / week / month / year
+          dimensionType: "1", // 1=鎸夋弧鎰忓害缁村害缁熻
+        });
+        // 鎺掓煡鐢細鎵撳嵃鎺ュ彛鍘熷杩斿洖锛屼究浜庢牳瀵瑰瓧娈靛悕锛堢‘璁ゆ棤璇悗鍙垹闄わ級
+        console.log("[sltdMydTotalByDimension dimensionType=1] code=", res && res.code, "data=", JSON.stringify(res && res.data).slice(0, 2000));
+        const list = res && res.code === 200 && Array.isArray(res.data) ? res.data : [];
+        // 缁村害缂栫爜 鈫� 瀛楀吀鍚嶇О锛屽苟杩囨护涓ゆ湡鍧囨棤鏁版嵁鐨勭淮搴�
+        const d = this.buildCompareData(list, (code) => this.getDimensionLabel(code));
+        this.categoryCompare = { categories: d.labels, seriesNames: d.seriesNames, series1: d.series1, series2: d.series2 };
+        if (!list.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犲垎绫荤淮搴︽暟鎹�', 'warning');
+      } catch (e) {
+        this.categoryCompare = { categories: [], seriesNames: [], series1: [], series2: [] };
+        this.notify('鍒嗙被缁村害鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+      } finally {
+        this.categoryLoading = false;
+      }
+    },
+    // 闄㈠尯缁村害瀵规瘮锛堢湡瀹炴帴鍙o級锛歞imensionType=2锛宒ata = [{ period, dimension(闄㈠尯鍚�), totalScore }]
+    async fetchHospitalCompare() {
+      const range = this.queryParams.dateRange || [];
+      if (range.length !== 2 || !range[0] || !range[1]) {
+        this.hospitalCompare = { hospitals: [], seriesNames: [], series1: [], series2: [] };
+        return;
+      }
+      this.hospitalLoading = true;
+      try {
+        const res = await sltdMydTotalByDimension({
+          startFinishTime: range[0],
+          endFinishTime: range[1],
+          type: this.queryParams.interval, // day / week / month / year
+          dimensionType: "2", // 2=鎸夐櫌鍖虹粺璁�
+        });
+        // 鎺掓煡鐢細鎵撳嵃鎺ュ彛鍘熷杩斿洖锛屼究浜庢牳瀵瑰瓧娈靛悕锛堢‘璁ゆ棤璇悗鍙垹闄わ級
+        console.log("[sltdMydTotalByDimension dimensionType=2] code=", res && res.code, "data=", JSON.stringify(res && res.data).slice(0, 2000));
+        const list = res && res.code === 200 && Array.isArray(res.data) ? res.data : [];
+        const d = this.buildCompareData(list);
+        this.hospitalCompare = { hospitals: d.labels, seriesNames: d.seriesNames, series1: d.series1, series2: d.series2 };
+        if (!list.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犻櫌鍖虹淮搴︽暟鎹�', 'warning');
+      } catch (e) {
+        this.hospitalCompare = { hospitals: [], seriesNames: [], series1: [], series2: [] };
+        this.notify('闄㈠尯缁村害鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+      } finally {
+        this.hospitalLoading = false;
+      }
+    },
+    // 灏� [{ period, dimension, totalScore }] 缁勮涓哄垎缁勬煴鐘跺浘鏁版嵁锛堜笂鏈�/鏈湡涓ょ粍瀵规瘮锛�
+    // labelFn锛氬彲閫夛紝鐢ㄤ簬鎶婄淮搴︾紪鐮佹槧灏勪负瀛楀吀鍚嶇О锛堝垎绫荤淮搴﹀浘浼犲叆锛�
+    buildCompareData(list, labelFn) {
+      const labels = [];
+      const byCat = {};
+      list.forEach((i) => {
+        // 缁村害缂栫爜锛坉imensionType=1锛夋垨闄㈠尯鍚嶇О锛坉imensionType=2锛夛紱鑻ュ悗绔瓧娈靛懡鍚嶄笉鍚岋紝鍏滃簳鍙� period
+        const key = (i && (i.dimension || i.campusName || i.campusid)) || (i && i.period) || '';
+        if (!key) return;
+        if (!byCat[key]) { byCat[key] = {}; labels.push(key); }
+        const n = Number(i.totalScore);
+        byCat[key][i.period] = isNaN(n) ? 0 : Math.round(n * 100) / 100;
+      });
+      // 鍚庣鎸夋椂闂村崌搴忚繑鍥烇紝鍙栨渶鍚庝袱涓懆鏈熶綔涓衡�滀笂鏈� / 鏈湡鈥�
+      const periods = [...new Set(list.map((i) => i && i.period).filter(Boolean))];
+      const cur = periods[periods.length - 1];
+      const prev = periods[periods.length - 2];
+      const val = (cat, p) => (p != null && byCat[cat][p] != null ? byCat[cat][p] : 0);
+      // 杩囨护涓ゆ湡鍧囨棤鏁版嵁鐨勭淮搴�
+      const cats = labels.filter((c) => val(c, prev) !== 0 || val(c, cur) !== 0);
+      const display = labelFn ? cats.map((c) => labelFn(c)) : cats;
+      return {
+        labels: display,
+        seriesNames: this.intervalConfig().seriesNames,
+        series1: cats.map((c) => val(c, prev)),
+        series2: cats.map((c) => val(c, cur)),
       };
     },
-    genSingleData(rnd) {
-      const jitter = (lo, hi) => lo + rnd() * (hi - lo);
-      const scopeFactor = this.singleDeptWards.length ? 0.18 : 1;
-      const total = Math.round(jitter(20000, 30000) * scopeFactor);
-      const weights = [0.62, 0.27, 0.07, 0.04];
-      const counts = weights.map((w) => Math.max(0, Math.round(total * w * jitter(0.92, 1.08))));
-      const good = counts[0] + counts[1];
-      this.singleQuestionData = QUESTION_OPTIONS.map((opt, i) => ({
-        option: opt,
-        count: counts[i],
-        rate: ((counts[i] / total) * 100).toFixed(2) + '%',
+    // 绉戝/鐥呭尯缁村害 路 闂ㄨ瘖鎮h�呮弧鎰忓害寰楀垎鎺掑悕锛堢湡瀹炴帴鍙� /mzMydScoreRank锛屼笉甯﹂棶棰樻枃鏈級
+    async fetchRank() {
+      const range = this.queryParams.dateRange || [];
+      if (range.length !== 2 || !range[0] || !range[1]) {
+        this.rankData = [];
+        return;
+      }
+      this.rankLoading = true;
+      try {
+        const res = await mzMydScoreRank(this.buildRankPayload(this.rankDimension, this.rankDeptWards, ''));
+        this.rankData = this.normalizeRank(res);
+        if (!this.rankData.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犳帓鍚嶆暟鎹�', 'warning');
+      } catch (e) {
+        this.rankData = [];
+        this.notify('鎺掑悕鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+      } finally {
+        this.rankLoading = false;
+      }
+    },
+    // 鍗曢脳绉戝/鐥呭尯 路 寰楀垎鎺掑悕锛堢湡瀹炴帴鍙� /mzMydScoreRank锛屽甫闂鏂囨湰锛�
+    async fetchCross() {
+      const range = this.queryParams.dateRange || [];
+      if (range.length !== 2 || !range[0] || !range[1] || !this.singleQuestionContent) {
+        this.crossData = [];
+        return;
+      }
+      this.crossLoading = true;
+      try {
+        const res = await mzMydScoreRank(this.buildRankPayload(this.crossDimension, this.crossDeptWards, this.singleQuestionContent));
+        this.crossData = this.normalizeRank(res);
+        if (!this.crossData.length) this.notify('褰撳墠鏉′欢涓嬫殏鏃犳帓鍚嶆暟鎹�', 'warning');
+      } catch (e) {
+        this.crossData = [];
+        this.notify('鎺掑悕鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯', 'error');
+      } finally {
+        this.crossLoading = false;
+      }
+    },
+    // 缁勮鎺掑悕鎺ュ彛璇锋眰浣擄紙dimensionType/serviceType/deptCodes/districtCodes/鏃堕棿/questionText锛�
+    buildRankPayload(dimension, selectedNames, questionText) {
+      const range = this.queryParams.dateRange || [];
+      const payload = {
+        dimensionType: dimension === 'dept' ? '1' : '2',
+        serviceTypes: ['6', '14'],
+        startFinishTime: range[0],
+        endFinishTime: range[1],
+      };
+      if (questionText) payload.questionText = questionText;
+      if (selectedNames && selectedNames.length) {
+        if (dimension === 'dept') {
+          payload.deptCodes = this.mapDeptNames(selectedNames);
+        } else {
+          payload.districtCodes = this.mapWardNames(selectedNames);
+        }
+      }
+      return payload;
+    },
+    // 褰掍竴鍖栨帓鍚嶈繑鍥� List<MzMydScoreRankDTO> 鈫� [{ rank, code, name, score, itemCount }]
+    normalizeRank(res) {
+      const list = res && res.code === 200 && Array.isArray(res.data) ? res.data : [];
+      return list.map((item) => ({
+        rank: item.rank,
+        code: item.code,
+        name: item.name,
+        score: item.score,
+        itemCount: item.itemCount,
       }));
-      this.singleQuestionMeta = {
-        total: total.toLocaleString(),
-        score: ((good / total) * 100).toFixed(2) + '%',
-      };
-    },
-    genRankData(rnd) {
-      const jitter = (lo, hi) => lo + rnd() * (hi - lo);
-      this.deptRankData = DEPTS
-        .map((d) => ({ name: d, score: jitter(70, 85).toFixed(2) }))
-        .sort((a, b) => Number(b.score) - Number(a.score));
-      this.wardRankData = WARDS
-        .map((w) => ({ name: w, score: jitter(70, 85).toFixed(2) }))
-        .sort((a, b) => Number(b.score) - Number(a.score));
-    },
-    genCrossData(rnd) {
-      const jitter = (lo, hi) => lo + rnd() * (hi - lo);
-      this.crossDeptData = DEPTS
-        .map((d) => ({ name: d, score: jitter(70, 85).toFixed(2) }))
-        .sort((a, b) => Number(b.score) - Number(a.score));
-      this.crossWardData = WARDS
-        .map((w) => ({ name: w, score: jitter(70, 85).toFixed(2) }))
-        .sort((a, b) => Number(b.score) - Number(a.score));
     },
     renderCharts() {
       const c1 = echarts.getInstanceByDom(this.$refs.chart1);
@@ -433,22 +749,46 @@
       });
 
       // 2. 鍒嗙粍鏌辩姸鍥� - 鍒嗙被缁村害
-      c2.setOption({
+      // 鍒嗙被杈冨锛堝鍗佸嚑涓弧鎰忓害缁村害锛夋椂搴曢儴鍚嶇О浼氶噸鍙狅紝杩欓噷鎸夋暟閲忓姩鎬侀�傞厤锛�
+      //   鈮�6 涓細姝e父姘村钩鏍囩锛�
+      //   7~10 涓細x 杞存爣绛惧�炬枩 35掳 + 搴曢儴鐣欑櫧鍔犲ぇ + 鏌卞瓙鍙樼粏锛�
+      //   >10 涓細鍐嶅惎鐢ㄦí鍚戠缉鏀撅紙鍒濆鏄剧ず绾� 8 涓垎绫伙紝鍙嫋鍔�/婊氬姩鏌ョ湅鍏朵綑锛夈��
+      const catCategories = this.categoryCompare.categories || [];
+      const catN = catCategories.length;
+      const catRotate = catN > 6 ? 35 : 0;
+      const catEnableZoom = catN > 10;
+      const catBarWidth = catN > 10 ? 18 : catN > 6 ? 20 : 22;
+      const catLegend = catEnableZoom
+        ? { data: this.categoryCompare.seriesNames, top: 4, textStyle: { color: '#666', fontSize: 12 } }
+        : { data: this.categoryCompare.seriesNames, bottom: 8, textStyle: { color: '#666', fontSize: 12 } };
+      const catGrid = catEnableZoom
+        ? { top: 36, right: 30, bottom: 80, left: 85 }
+        : { top: 48, right: 30, bottom: catRotate ? 100 : 60, left: 85 };
+      const catOption = {
         color: ['#6DC8EC', '#5B8FF9'],
-        grid: barGrid,
+        grid: catGrid,
         tooltip: { ...baseTooltip, trigger: 'axis', axisPointer: { type: 'shadow', shadowStyle: { color: 'rgba(0,0,0,0.03)' } } },
-        legend: { data: this.categoryCompare.seriesNames, bottom: 8, textStyle: { color: '#666', fontSize: 12 } },
-        xAxis: [{ ...baseXAxis, data: this.categoryCompare.categories, axisLabel: { ...baseXAxis.axisLabel, interval: 0 } }],
+        legend: catLegend,
+        xAxis: [{ ...baseXAxis, data: catCategories, axisLabel: { ...baseXAxis.axisLabel, interval: 0, rotate: catRotate } }],
         yAxis: [{ ...baseYAxis, name: '寰楀垎', nameTextStyle: { color: '#999', fontSize: 11 } }],
         series: [
-          { name: this.categoryCompare.seriesNames[0], type: 'bar', barWidth: 22, barGap: '30%',
+          { name: this.categoryCompare.seriesNames[0], type: 'bar', barWidth: catBarWidth, barGap: '30%',
             itemStyle: { borderRadius: [6, 6, 0, 0], color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: '#6DC8EC' }, { offset: 1, color: '#48B0D5' }]) },
             data: this.categoryCompare.series1 },
-          { name: this.categoryCompare.seriesNames[1], type: 'bar', barWidth: 22,
+          { name: this.categoryCompare.seriesNames[1], type: 'bar', barWidth: catBarWidth,
             itemStyle: { borderRadius: [6, 6, 0, 0], color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{ offset: 0, color: '#5B8FF9' }, { offset: 1, color: '#3D6FDB' }]) },
             data: this.categoryCompare.series2 },
         ],
-      });
+      };
+      if (catEnableZoom) {
+        // 鍒濆鍙睍绀哄墠 8 涓垎绫诲搴︼紝閬垮厤鏌卞瓙鎸ゆ垚涓�鍥紝鐢ㄦ埛鍙í鍚戞粴鍔�/鎷栧姩鏌ョ湅鍏朵綑
+        const zoomEnd = catN > 0 ? Math.min(100, Math.round((8 / catN) * 100)) : 100;
+        catOption.dataZoom = [
+          { type: 'inside', start: 0, end: zoomEnd },
+          { type: 'slider', height: 16, bottom: 4, start: 0, end: zoomEnd },
+        ];
+      }
+      c2.setOption(catOption);
 
       // 4. 闄㈠尯缁村害 - 鍒嗙粍鏌辩姸鍥�
       c4.setOption({
@@ -527,6 +867,8 @@
 .filter-bar { display: flex; align-items: center; flex-wrap: wrap; gap: 10px; .filter-label { font-size: 13px; color: #606266; } .filter-date { width: 260px; } }
 .chart-card { margin-bottom: 0; }
 .chart-box { width: 100%; height: 360px; }
+.chart-wrap { position: relative; width: 100%; }
+.chart-empty { position: absolute; top: 0; left: 0; right: 0; bottom: 0; display: flex; align-items: center; justify-content: center; background: #fff; color: #909399; font-size: 14px; }
 .card-header { display: flex; justify-content: space-between; align-items: center; span { font-size: 15px; font-weight: 600; color: #303133; } }
 .header-right { display: flex; align-items: center; gap: 10px; .sel { width: 140px; } .sel-lg { width: 240px; } }
 .table-footer { text-align: right; padding: 10px 0 0; font-size: 13px; color: #606266; }
diff --git a/src/views/Satisfaction/sfstatistics/components/DataOverview.vue b/src/views/Satisfaction/sfstatistics/components/DataOverview.vue
index 1987125..2cfa325 100644
--- a/src/views/Satisfaction/sfstatistics/components/DataOverview.vue
+++ b/src/views/Satisfaction/sfstatistics/components/DataOverview.vue
@@ -3,7 +3,7 @@
     <!-- 椤堕儴绛涢�夛細鏃堕棿鑼冨洿 + 绉戝/鐥呭尯锛屾帶鍒舵湰椤垫墍鏈夋暟鎹� -->
     <el-card shadow="never" class="overview-card filter-card">
       <el-form inline class="filter-form">
-        <el-form-item label="鏃堕棿鑼冨洿">
+        <el-form-item label="鍑洪櫌鏃ユ湡">
           <el-date-picker
             v-model="queryParams.dateRange"
             type="daterange"
@@ -14,49 +14,117 @@
             size="small"
           />
         </el-form-item>
-        <el-form-item label="绉戝/鐥呭尯">
+        <el-form-item label="缁熻缁村害">
+          <el-radio-group
+            v-model="queryParams.statMode"
+            size="small"
+            @change="onStatModeChange"
+          >
+            <el-radio-button label="ward">鎸夌梾鍖虹粺璁�</el-radio-button>
+            <el-radio-button label="dept">鎸夌瀹ょ粺璁�</el-radio-button>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="绉戝" v-if="queryParams.statMode === 'dept'">
           <el-select
-            v-model="queryParams.deptWard"
+            v-model="queryParams.deptCodes"
+            multiple
+            collapse-tags
             clearable
             filterable
-            placeholder="鍏ㄩ儴"
+            placeholder="鍏ㄩ儴绉戝"
             size="small"
             class="filter-select"
           >
-            <el-option-group label="绉戝">
-              <el-option
-                v-for="d in deptOptions"
-                :key="'dept:' + d"
-                :label="d"
-                :value="'dept:' + d"
-              />
-            </el-option-group>
-            <el-option-group label="鐥呭尯">
-              <el-option
-                v-for="w in wardOptions"
-                :key="'ward:' + w"
-                :label="w"
-                :value="'ward:' + w"
-              />
-            </el-option-group>
+            <el-option
+              v-for="d in deptOptions"
+              :key="d.value"
+              :label="d.label"
+              :value="d.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鐥呭尯" v-else>
+          <el-select
+            v-model="queryParams.wardCodes"
+            multiple
+            collapse-tags
+            clearable
+            filterable
+            placeholder="鍏ㄩ儴鐥呭尯"
+            size="small"
+            class="filter-select"
+          >
+            <el-option
+              v-for="w in wardOptions"
+              :key="w.value"
+              :label="w.label"
+              :value="w.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="鏈嶅姟绫诲瀷">
+          <el-select
+            v-model="queryParams.serviceTypeList"
+            multiple
+            collapse-tags
+            clearable
+            filterable
+            placeholder="鍏ㄩ儴绫诲瀷"
+            size="small"
+            class="filter-select"
+          >
+            <el-option
+              v-for="s in serviceTypeOptions"
+              :key="s.value"
+              :label="s.label"
+              :value="s.value"
+            />
           </el-select>
         </el-form-item>
         <el-form-item>
-          <el-button type="primary" size="small" icon="el-icon-search" @click="fetchData">鏌ヨ</el-button>
-          <el-button size="small" icon="el-icon-refresh" @click="handleReset">閲嶇疆</el-button>
+          <el-button
+            type="primary"
+            size="small"
+            icon="el-icon-search"
+            :loading="loading"
+            @click="fetchData"
+            >鏌ヨ</el-button
+          >
+          <el-button size="small" icon="el-icon-refresh" @click="handleReset"
+            >閲嶇疆</el-button
+          >
         </el-form-item>
       </el-form>
     </el-card>
 
-    <!-- 琛ㄦ牸涓�锛氬悇鏈嶅姟椤圭洰婊℃剰搴︾粺璁★紙鍥哄畾浜旈」閫夐」鐨勯鐩級 -->
+    <!-- 琛ㄦ牸涓�锛氬悇鏈嶅姟椤圭洰婊℃剰搴︾粺璁★紙鍥哄畾鍏」閫夐」鐨勯鐩級 -->
     <el-card shadow="never" class="overview-card">
       <div slot="header" class="card-header">
         <span class="card-title">鍚勬湇鍔¢」鐩弧鎰忓害缁熻</span>
-        <el-button type="warning" size="small" icon="el-icon-download" @click="exportTable('table1')">瀵煎嚭Excel</el-button>
+        <el-button
+          type="warning"
+          size="small"
+          icon="el-icon-download"
+          @click="exportTable('table1')"
+          >瀵煎嚭Excel</el-button
+        >
       </div>
-      <el-table id="table1" :data="serviceSatisfaction" border size="small" :header-cell-style="{ background: '#f5f7fa', color: '#303133' }">
-        <el-table-column prop="category" label="鍒嗙被/棰樼洰" min-width="220" fixed="left" />
-        <el-table-column label="闈炲父婊℃剰" align="center">
+      <el-table
+        id="table1"
+        v-loading="loading"
+        element-loading-text="缁熻涓�..."
+        :data="serviceSatisfaction"
+        border
+        size="small"
+        :header-cell-style="{ background: '#f5f7fa', color: '#303133' }"
+      >
+        <el-table-column
+          prop="category"
+          label="鍒嗙被/棰樼洰"
+          min-width="220"
+          fixed="left"
+        />
+        <el-table-column label="寰堟弧鎰�" align="center">
           <el-table-column prop="veryGoodCount" label="鏁伴噺" width="90" />
           <el-table-column prop="veryGoodRate" label="姣斾緥" width="90" />
         </el-table-column>
@@ -72,11 +140,21 @@
           <el-table-column prop="badCount" label="鏁伴噺" width="90" />
           <el-table-column prop="badRate" label="姣斾緥" width="90" />
         </el-table-column>
-        <el-table-column label="涓嶉�傜敤" align="center">
+        <el-table-column label="寰堜笉婊℃剰" align="center">
+          <el-table-column prop="veryBadCount" label="鏁伴噺" width="90" />
+          <el-table-column prop="veryBadRate" label="姣斾緥" width="90" />
+        </el-table-column>
+        <el-table-column label="鏈粡鍘�" align="center">
           <el-table-column prop="naCount" label="鏁伴噺" width="90" />
           <el-table-column prop="naRate" label="姣斾緥" width="90" />
         </el-table-column>
-        <el-table-column prop="score" label="缁煎悎寰楀垎" width="100" align="center" />
+        <el-table-column
+          prop="score"
+          label="缁煎悎寰楀垎"
+          width="100"
+          align="center"
+          fixed="right"
+        />
       </el-table>
     </el-card>
 
@@ -84,17 +162,59 @@
     <el-card shadow="never" class="overview-card">
       <div slot="header" class="card-header">
         <span class="card-title">鍗曢�夐/澶氶�夐缁熻</span>
-        <el-button type="warning" size="small" icon="el-icon-download" @click="exportTable('table2')">瀵煎嚭Excel</el-button>
+        <div class="header-right">
+          <el-input
+            v-model="questionSearch"
+            size="small"
+            clearable
+            prefix-icon="el-icon-search"
+            placeholder="鎸夐鐩ā绯婃煡璇�"
+            class="search-input"
+          />
+          <el-button
+            type="warning"
+            size="small"
+            icon="el-icon-download"
+            @click="exportTable('table2')"
+            >瀵煎嚭Excel</el-button
+          >
+        </div>
       </div>
-      <div id="table2">
-        <div class="question-block" v-for="(q, qi) in questionStats" :key="qi">
-          <h4 class="q-title">{{ q.title }}</h4>
-          <el-table :data="q.options" border size="small" :header-cell-style="{ background: '#f5f7fa', color: '#303133' }">
-            <el-table-column prop="option" label="閫夐」" min-width="180" />
-            <el-table-column prop="count" label="鏁伴噺" width="100" align="center" />
-            <el-table-column prop="rate" label="姣斾緥" width="100" align="center" />
-          </el-table>
-          <div v-if="q.total" class="q-footer">鏈鏈夋晥濉啓浜烘锛�<b>{{ q.total }}</b></div>
+      <div id="table2" v-loading="loading" element-loading-text="缁熻涓�...">
+        <div class="table2-scroll">
+          <div
+            class="question-block"
+            v-for="(q, qi) in filteredQuestionStats"
+            :key="qi"
+          >
+            <h4 class="q-title">{{ q.title }}</h4>
+            <el-table
+              :data="q.options"
+              border
+              size="small"
+              :header-cell-style="{ background: '#f5f7fa', color: '#303133' }"
+            >
+              <el-table-column prop="option" label="閫夐」" min-width="180" />
+              <el-table-column
+                prop="count"
+                label="鏁伴噺"
+                width="100"
+                align="center"
+              />
+              <el-table-column
+                prop="rate"
+                label="姣斾緥"
+                width="100"
+                align="center"
+              />
+            </el-table>
+            <div v-if="q.total" class="q-footer">
+              鏈濉姤鎬婚噺锛�<b>{{ q.total }}</b>
+            </div>
+          </div>
+          <div v-if="!loading && !filteredQuestionStats.length" class="empty-tip">
+            {{ questionStats.length ? "鏈壘鍒板尮閰嶇殑棰樼洰" : "鏆傛棤鍗曢��/澶氶�夐缁熻鏁版嵁" }}
+          </div>
         </div>
       </div>
     </el-card>
@@ -104,149 +224,336 @@
       <div slot="header" class="card-header">
         <span class="card-title">鍚勭瀹�/鐥呭尯婊℃剰搴﹁瘎鍒嗗姣�</span>
         <div class="header-right">
-          <el-radio-group v-model="statDimension" size="small" @change="onStatDimensionChange">
+          <el-radio-group
+            v-model="statDimension"
+            size="small"
+            @change="onStatDimensionChange"
+          >
             <el-radio-button label="dept">鎸夌瀹�</el-radio-button>
             <el-radio-button label="ward">鎸夌梾鍖�</el-radio-button>
           </el-radio-group>
-          <el-select v-model="statDeptWard" size="small" class="stat-select" placeholder="娌跨敤椤堕儴鏉′欢">
+          <el-select
+            v-model="statDeptWard"
+            size="small"
+            class="stat-select"
+            placeholder="娌跨敤椤堕儴鏉′欢"
+          >
             <el-option label="娌跨敤椤堕儴鏉′欢" value="inherit" />
             <template v-if="statDimension === 'dept'">
-              <el-option v-for="d in deptOptions" :key="'dept:' + d" :label="d" :value="'dept:' + d" />
+              <el-option
+                v-for="d in deptOptions"
+                :key="'dept:' + d.value"
+                :label="d.label"
+                :value="'dept:' + d.value"
+              />
             </template>
             <template v-else>
-              <el-option v-for="w in wardOptions" :key="'ward:' + w" :label="w" :value="'ward:' + w" />
+              <el-option
+                v-for="w in wardOptions"
+                :key="'ward:' + w.value"
+                :label="w.label"
+                :value="'ward:' + w.value"
+              />
             </template>
           </el-select>
-          <el-button type="warning" size="small" icon="el-icon-download" @click="exportTable('table3')">瀵煎嚭Excel</el-button>
+          <el-button
+            type="warning"
+            size="small"
+            icon="el-icon-download"
+            @click="exportTable('table3')"
+            >瀵煎嚭Excel</el-button
+          >
         </div>
       </div>
-      <el-table id="table3" :data="table3Rows" border size="small" :header-cell-style="{ background: '#f5f7fa', color: '#303133' }">
-        <el-table-column prop="name" :label="statDimension === 'dept' ? '绉戝' : '鐥呭尯'" fixed="left" align="center" />
-        <el-table-column label="绗�1棰�" align="center">
-          <el-table-column prop="q1VeryGood" label="闈炲父婊℃剰" width="100" />
-          <el-table-column prop="q1Good" label="婊℃剰" width="90" />
-          <el-table-column prop="q1Normal" label="涓�鑸�" width="90" />
-          <el-table-column prop="q1Bad" label="涓嶆弧鎰�" width="90" />
-          <el-table-column prop="q1Score" label="寰楀垎" width="100" />
+      <el-table
+        id="table3"
+        v-loading="loading"
+        element-loading-text="缁熻涓�..."
+        :data="table3Rows"
+        border
+        size="small"
+        max-height="500"
+        :header-cell-style="{ background: '#f5f7fa', color: '#303133' }"
+      >
+        <el-table-column
+          prop="name"
+          :label="statDimension === 'dept' ? '绉戝' : '鐥呭尯'"
+          fixed="left"
+          align="center"
+        />
+        <el-table-column
+          v-for="q in table3Questions"
+          :key="q.title"
+          :label="q.title"
+          align="center"
+        >
+          <el-table-column
+            v-for="opt in q.options"
+            :key="opt"
+            :label="opt"
+            width="100"
+          >
+            <template slot-scope="{ row }">
+              {{
+                (row.cells[q.title] &&
+                  row.cells[q.title][opt] &&
+                  row.cells[q.title][opt].count) ||
+                  0
+              }}
+            </template>
+          </el-table-column>
+          <el-table-column label="寰楀垎" width="90">
+            <template slot-scope="{ row }">
+              {{ (row.cells[q.title] && row.cells[q.title]._score) || "0.00" }}
+            </template>
+          </el-table-column>
         </el-table-column>
-        <el-table-column label="绗�2棰�" align="center">
-          <el-table-column prop="q2VeryGood" label="闈炲父婊℃剰" width="100" />
-          <el-table-column prop="q2Good" label="婊℃剰" width="90" />
-          <el-table-column prop="q2Normal" label="涓�鑸�" width="90" />
-          <el-table-column prop="q2Bad" label="涓嶆弧鎰�" width="90" />
-          <el-table-column prop="q2Score" label="寰楀垎" width="100" />
+        <el-table-column label="缁煎悎寰楀垎" align="center">
+          <template slot-scope="{ row }">
+            {{ row.totalScore }}
+          </template>
         </el-table-column>
-        <el-table-column prop="totalScore" label="缁煎悎寰楀垎" align="center" />
       </el-table>
     </el-card>
   </div>
 </template>
 
 <script>
-import XLSX from 'xlsx';
+import { sltdMydTotalByScore,statQuestionOptionByKsOrBq } from "@/api/AiCentre/satisfaction";
+import XLSX from "xlsx";
 
-// 婊℃剰搴﹂鐨勫浐瀹氶�夐」锛堥『搴忓嵆琛ㄦ牸鍒楅『搴忥級
-const FIXED_OPTIONS = ['闈炲父婊℃剰', '婊℃剰', '涓�鑸�', '涓嶆弧鎰�', '涓嶉�傜敤'];
-const DEPTS = ['鍐呭垎娉岀', '鐨偆绉�', '鑲跨槫鍐呯', '娑堝寲鍐呯', '鑲惧唴绉�'];
-const WARDS = ['涓�鐥呭尯', '浜岀梾鍖�', '涓夌梾鍖�', '鍥涚梾鍖�', '浜旂梾鍖�'];
+// 婊℃剰搴﹂鐨勫浐瀹氶�夐」锛堥『搴忓嵆琛ㄦ牸鍒楅『搴忥級鈥斺�旇繖浜涢�夐」鐨勯鐩繘琛ㄤ竴锛屽叾浣欒繘琛ㄤ簩
+const FIXED_OPTIONS = ["寰堟弧鎰�", "婊℃剰", "涓�鑸�", "涓嶆弧鎰�", "寰堜笉婊℃剰", "鏈粡鍘�"];
+// 鏃犲垎鍊奸�夐」锛堝"鏈粡鍘�"锛夋槸鍚﹁鍏ョ患鍚堝緱鍒嗗垎姣嶏細榛樿 false锛岄伩鍏嶆媺浣庡緱鍒�
+const NO_SCORE_IN_DENOMINATOR = false;
 
-// 婊℃剰搴﹂锛堝浐瀹氫簲椤归�夐」锛宑ounts 椤哄簭瀵瑰簲 FIXED_OPTIONS锛�
-const SATISFACTION_BASE = [
-  ['璇婄枟杩囩▼涓紝鍖诲姟浜哄憳鏄惁娉ㄦ剰淇濇姢鎮ㄧ殑闅愮锛�', [3219, 1351, 142, 33, 0]],
-  ['鎮ㄥ鍖婚櫌鏈嶅姟璁炬柦鐨勬�讳綋鍗拌薄濡備綍锛�', [3110, 1369, 217, 49, 0]],
-  ['鍖婚櫌鐨勫帟鎵�鏄惁娓呮磥鏃犲紓鍛筹紵', [2973, 1504, 235, 33, 0]],
-  ['鍖婚櫌鍐呯殑璺爣鍜屾寚绀烘槸鍚︽槑纭紵', [3234, 1289, 196, 26, 0]],
-  ['鍖婚櫌鐨勭┖闂村竷灞�鏄惁渚垮埄锛�', [3037, 1460, 209, 39, 0]],
-  ['鐪嬬梾鏈熼棿锛屾偍鐨勬姳鎬ㄥ拰涓嶆弧鑳藉惁鍙婃椂寰楀埌鍥炲簲锛�', [3019, 1317, 294, 115, 0]],
-  ['鍖荤敓鏄惁鐢ㄦ偍鍚緱鎳傜殑鏂瑰紡瑙i噴闂锛�', [3402, 967, 254, 122, 0]],
-  ['鍖荤敓瀵规偍鏄惁灏婇噸锛�', [3495, 897, 249, 104, 0]],
-  ['鍖荤敓鏄惁浠旂粏鍊惧惉鎮ㄨ璇濓紵', [3422, 937, 251, 135, 0]],
-  ['瀵规寕鍙锋湇鍔′汉鍛樻湇鍔℃�佸害鏄惁婊℃剰', [3458, 1205, 52, 30, 0]],
-  ['鎮ㄥ棰勭害鎸傚彿鏄惁婊℃剰锛�', [3527, 1088, 72, 58, 0]],
-  ['鎶ゅ+瀵规偍鏄惁灏婇噸锛�', [3420, 1184, 113, 28, 0]],
-  ['鎶ゅ+鏄惁鐢ㄦ偍鍚緱鎳傜殑鏂瑰紡瑙i噴闂锛�', [3346, 1250, 122, 27, 0]],
-  ['鎶ゅ+鏄惁浠旂粏鍊惧惉鎮ㄨ璇濓紵', [3378, 1205, 134, 28, 0]],
+// 鏈嶅姟绫诲瀷瀛楀吀锛堟帴鍙� serviceType锛�
+const SERVICE_TYPES = [
+  { value: "1", label: "鐩戞祴璇勪及" },
+  { value: "2", label: "鍑洪櫌闅忚" },
+  { value: "3", label: "闂ㄨ瘖闅忚" },
+  { value: "4", label: "瀹f暀鍏虫��" },
+  { value: "5", label: "澶嶈瘖閫氱煡" },
+  { value: "6", label: "婊℃剰搴﹁皟鏌�" },
+  { value: "7", label: "鎮h�呮姤鍛�" },
+  { value: "8", label: "鍏朵粬閫氱煡" },
+  { value: "9", label: "浣撴闅忚" },
+  { value: "10", label: "鍖绘妧闅忚" },
+  { value: "11", label: "褰卞儚涓撶闅忚" },
+  { value: "12", label: "蹇冪數涓撶闅忚" },
+  { value: "13", label: "涓撶闅忚" },
 ];
 
-// 鍏朵綑棰樼洰锛堝崟閫�/澶氶�夛紝闈炲浐瀹氭弧鎰忓害閫夐」锛�
-const OTHER_BASE = [
-  {
-    title: '鎮ㄥ鎴戦櫌宸ヤ綔浜哄憳鐨勬湇鍔¤川閲忔弧鎰忎笉婊℃剰锛熴�愬垎鍊煎崟閫夐銆�',
-    type: 'single',
-    options: [['闈炲父婊℃剰', 1084], ['婊℃剰', 1959], ['涓�鑸�', 167], ['涓嶆弧鎰�', 153]],
-  },
-  {
-    title: '鎮ㄥ鍝儴鍒嗘湇鍔′笉婊℃剰锛熴�愬閫夐銆�',
-    type: 'multiple',
-    total: 408,
-    options: [['鍖荤敓璇婃柇鍜岃瘖鐤�', 131], ['鎶ょ悊鏈嶅姟', 47], ['鍏朵粬鍖诲姟浜哄憳鎶�鏈按骞�', 30], ['宸ヤ汉', 72]],
-  },
-  {
-    title: '鍖荤敓璇婃柇鍜屾不鐤椾腑鍝簺鏈嶅姟璐ㄩ噺涓嶆弧鎰忥紵銆愬閫夐銆�',
-    type: 'multiple',
-    total: 131,
-    options: [['鍖荤敓璇婃柇閿欒', 23], ['瀵规不鐤楁晥鏋滀笉婊℃剰', 72], ['鍏朵粬', 54]],
-  },
-];
+// 鏈嶅姟绫诲瀷榛樿閫変腑椤癸紙鎸� label 鍖归厤锛岄�傞厤涓嶅悓瀛楀吀鐨� value 宸紓锛�
+const DEFAULT_SERVICE_LABELS = ["浣忛櫌婊℃剰搴�", "闂ㄨ瘖婊℃剰搴�"];
 
-// 缁熶竴鎺ュ彛杩斿洖鐨勯鐩紙妯℃嫙锛夛細鍥哄畾浜旈」閫夐」 => 琛ㄤ竴锛屽叾浣� => 琛ㄤ簩
-const RAW_QUESTIONS = [
-  ...SATISFACTION_BASE.map(([title, counts]) => ({
-    title,
-    type: 'single',
-    options: FIXED_OPTIONS.map((opt, i) => ({ option: opt, count: counts[i] })),
-  })),
-  ...OTHER_BASE.map((q) => ({
-    title: q.title,
-    type: q.type,
-    total: q.total,
-    options: q.options.map(([option, count]) => ({ option, count })),
-  })),
-];
+// 鍏滃簳锛歴tore 涓棤绉戝/鐥呭尯鏁版嵁鏃朵娇鐢紙琛ㄤ笁瀵规瘮 + 绛涢�変笅鎷夛級
+const DEPTS = ["鍐呭垎娉岀", "鐨偆绉�", "鑲跨槫鍐呯", "娑堝寲鍐呯", "鑲惧唴绉�"];
+const WARDS = ["涓�鐥呭尯", "浜岀梾鍖�", "涓夌梾鍖�", "鍥涚梾鍖�", "浜旂梾鍖�"];
 
-// 纭畾鎬т吉闅忔満锛堜究浜庣瓫閫夋潯浠跺浐瀹氭椂缁撴灉绋冲畾锛�
-function hashString(str) {
-  let h = 2166136261;
-  for (let i = 0; i < str.length; i++) {
-    h ^= str.charCodeAt(i);
-    h = Math.imul(h, 16777619);
-  }
-  return h >>> 0;
-}
-function mulberry32(a) {
-  return function () {
-    a |= 0;
-    a = (a + 0x6d2b79f5) | 0;
-    let t = Math.imul(a ^ (a >>> 15), 1 | a);
-    t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
-    return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
+/**
+ * 鎺ュ彛鏁版嵁 鈫� 椤甸潰鍐呴儴棰樼洰缁撴瀯
+ * 鍏ュ弬锛氭帴鍙� data锛圠ist<QuestionResultDTO>锛�
+ * 鍑哄弬锛歔{ title, type, total, options: [{ option, count, score }] }]
+ * 鍚屼竴棰樼洰鍙兘鍒嗘暎鍦ㄥ涓换鍔★紙taskname锛夐噷锛岃繖閲屾寜銆岄鐩� + 閫夐」銆嶅悎骞剁疮鍔犳暟閲�
+ */
+function normalizeQuestions(list) {
+  const map = new Map();
+
+  // 鍏ュ弬鍙兘鏄暟缁� / {list} / {rows} / 鍗曞璞★紝缁熶竴瑙勬暣鎴愭暟缁�
+  const arr = Array.isArray(list)
+    ? list
+    : (list &&
+      (Array.isArray(list.list)
+        ? list.list
+        : Array.isArray(list.rows)
+        ? list.rows
+        : [list])) ||
+      [];
+
+  // 棰樼洰鏂囨湰瀛楁鍊欓�夛紙鏈郴缁熼鐩唴瀹圭粺涓�鍙� scriptContent锛屽吋瀹瑰巻鍙插懡鍚嶏級
+  const pickTitle = (item) => {
+    const keys = [
+      "scriptContent",
+      "questionText",
+      "qeustionText",
+      "questiontext",
+      "scriptcontent",
+      "title",
+      "name",
+      "questionName",
+    ];
+    for (const k of keys) {
+      if (item && item[k] != null && String(item[k]).trim()) {
+        return String(item[k]).trim();
+      }
+    }
+    return "";
   };
+
+  // 閫夐」鏄庣粏鍒楄〃瀛楁鍊欓��
+  const pickDetails = (item) => {
+    const keys = [
+      "subtaskDetailRatioExportList",
+      "details",
+      "optionList",
+      "options",
+      "optionResultList",
+      "subtaskDetailRatioExportlist",
+      "list",
+    ];
+    for (const k of keys) {
+      if (item && Array.isArray(item[k])) return item[k];
+    }
+    return [];
+  };
+
+  // 閫夐」鏂囨湰瀛楁鍊欓��
+  const pickOption = (d) => {
+    const keys = [
+      "optionresult",
+      "optioncontent",
+      "optionText",
+      "targetvalue",
+      "optionName",
+      "name",
+      "option",
+      "content",
+    ];
+    for (const k of keys) {
+      if (d && d[k] != null && String(d[k]).trim()) {
+        return String(d[k]).trim();
+      }
+    }
+    return "";
+  };
+
+  // 鏁伴噺瀛楁鍊欓��
+  const pickCount = (d) => {
+    const keys = ["count", "chosenQuantity", "num", "total", "chosenquantity"];
+    for (const k of keys) {
+      if (d && d[k] != null && !isNaN(Number(d[k]))) {
+        return Number(d[k]) || 0;
+      }
+    }
+    return 0;
+  };
+
+  arr.forEach((item) => {
+    if (!item || typeof item !== "object") return;
+    const title = pickTitle(item) || "鏈懡鍚嶉鐩�";
+    const details = pickDetails(item);
+    let node = map.get(title);
+    if (!node) {
+      node = { title, type: "", options: new Map() };
+      map.set(title, node);
+    }
+
+    details.forEach((d) => {
+      const option = pickOption(d);
+      if (!option) return;
+      const count = pickCount(d);
+      const rawScore = Number(d && d.score);
+      const score = isNaN(rawScore) ? null : rawScore;
+      // 棰樺瀷锛氫紭鍏� scriptType锛�1鍗曢�� 2澶氶�� 4闂瓟锛夛紝鍏舵 valueType锛�1鍗曢�� 2澶氶�� 3闂瓟 4濉┖ 5鍏跺畠锛�
+      const typeVal = String(
+        (item && item.scriptType) ||
+          (d && d.scriptType) ||
+          (d && d.valueType) ||
+          (item && item.valueType) ||
+          ""
+      );
+      if (!node.type) {
+        node.type =
+          typeVal === "2" ? "multiple" : typeVal === "1" ? "single" : "qa";
+      }
+
+      const old = node.options.get(option);
+      if (old) {
+        old.count += count;
+        if (old.score == null) old.score = score;
+      } else {
+        node.options.set(option, { option, count, score });
+      }
+    });
+  });
+
+  return Array.from(map.values()).map((n) => {
+    const options = Array.from(n.options.values());
+    const item = { title: n.title, type: n.type, options };
+    // 澶氶�夐锛氱敤鍚勯�夐」鏁伴噺涔嬪拰浣滀负濉姤鎬婚噺锛堟帴鍙f湭鍗曠嫭鎻愪緵浜烘锛�
+    if (n.type === "multiple")
+      item.total = options.reduce((s, o) => s + o.count, 0);
+    return item;
+  });
 }
 
 export default {
-  name: 'DataOverview',
+  name: "DataOverview",
   data() {
     return {
       // 椤堕儴鍏ㄥ眬绛涢��
       queryParams: {
         dateRange: [],
-        deptWard: '',
+        deptCodes: [], // 绉戝缂栫爜闆嗗悎 => leaveldeptcodes
+        wardCodes: [], // 鍑洪櫌鐥呭尯缂栫爜闆嗗悎 => leavehospitaldistrictcodes锛堟帴鍙e繀濉級
+        serviceTypeList: [], // 鏈嶅姟绫诲瀷澶氶�夛紝鎻愪氦鏃剁敤閫楀彿鎷兼帴
+        deptOrDistrict: "1", // 绉戝/鐥呭尯缁勫悎鏂瑰紡锛岄粯璁� 1锛氱闄㈢梾鍖� and 绂婚櫌绉戝
+        statMode: "ward", // 缁熻缁村害锛歸ard=鎸夌梾鍖虹粺璁� dept=鎸夌瀹ょ粺璁�
       },
-      deptOptions: DEPTS,
-      wardOptions: WARDS,
+      SERVICE_TYPES,
+      loading: false,
+
+      // 琛ㄤ簩锛氶鐩ā绯婃煡璇㈠叧閿瓧锛堢函鍓嶇杩囨护锛屼笉璇锋眰鍚庣锛�
+      questionSearch: "",
 
       // 琛ㄦ牸涓夛細缁熻缁村害 + 鐙珛绉戝/鐥呭尯鏉′欢锛�'inherit' = 娌跨敤椤堕儴锛�
-      statDimension: 'dept',
-      statDeptWard: 'inherit',
+      statDimension: "ward",
+      statDeptWard: "inherit",
 
-      // 缁熶竴鎺ュ彛杩斿洖鐨勬暟鎹紙妯℃嫙锛�
+      // 鎺ュ彛杩斿洖鐨勫師濮嬫暟鎹紙宸插綊涓�鍖栫殑棰樼洰鍒楄〃锛�
       questionList: [],
-      deptComparison: [],
-      wardComparison: [],
+      // 琛ㄤ笁锛氱瀹�/鐥呭尯璇勫垎瀵规瘮锛坮ows=琛屾暟鎹紝questions=鍔ㄦ�佸垪锛�
+      deptComparison: { rows: [], questions: [] },
+      wardComparison: { rows: [], questions: [] },
     };
   },
   computed: {
-    // 鍥哄畾浜旈」閫夐」鐨勯鐩� => 琛ㄤ竴
+    // 绉戝閫夐」锛氫紭鍏堝彇褰撳墠鐢ㄦ埛鎵�灞炵瀹わ紝鏃犲垯鍏滃簳
+    deptOptions() {
+      const list = this.$store.getters.belongDepts || [];
+      return list.length
+        ? list.map((d) => ({ label: d.deptName, value: d.deptCode }))
+        : DEPTS.map((d) => ({ label: d, value: d }));
+    },
+    // 鐥呭尯閫夐」锛氫紭鍏堝彇褰撳墠鐢ㄦ埛鎵�灞炵梾鍖猴紝鏃犲垯鍏滃簳
+    wardOptions() {
+      const list = this.$store.getters.belongWards || [];
+      return list.length
+        ? list.map((w) => ({ label: w.districtName, value: w.districtCode }))
+        : WARDS.map((w) => ({ label: w, value: w }));
+    },
+    // 鏈嶅姟绫诲瀷涓嬫媺锛氬彇 store 鐨勯殢璁跨被鍨嬪瓧鍏� tasktypes锛屽彇涓嶅埌鏃跺厹搴曟湰鍦� SERVICE_TYPES
+    serviceTypeOptions() {
+      const toOptions = (list) =>
+        (Array.isArray(list) ? list : [])
+          .map((i) => ({
+            label: String(i.label || "").trim(),
+            value: String(i.value),
+          }))
+          .filter((i) => i.label && i.value && i.value !== "undefined");
+      const taskTypes = toOptions(this.$store.getters.tasktypes);
+      return taskTypes.length ? taskTypes : SERVICE_TYPES;
+    },
+    // 鏈�夌梾鍖烘椂鐨勯粯璁ゆ煡璇㈣寖鍥达細鍏ㄩ儴鐥呭尯缂栫爜
+    defaultWardCodes() {
+      return Array.from(new Set(this.wardOptions.map((w) => w.value)));
+    },
+    // 鏈�夌瀹ゆ椂鐨勯粯璁ゆ煡璇㈣寖鍥达細鍏ㄩ儴绉戝缂栫爜
+    defaultDeptCodes() {
+      return Array.from(new Set(this.deptOptions.map((d) => d.value)));
+    },
+    // 鍥哄畾鍏」閫夐」鐨勯鐩� => 琛ㄤ竴
     satisfactionQuestions() {
       return this.questionList.filter((q) => this.isSatisfactionQuestion(q));
     },
@@ -256,54 +563,67 @@
     },
     // 琛ㄤ竴锛氭弧鎰忓害缁熻锛堝惈鎬昏琛岋級
     serviceSatisfaction() {
+      // 鍙栨寚瀹氶�夐」鐨� { count, score }锛屾湭杩斿洖鍒欒椤逛负 0
+      const pick = (q, name) => {
+        const hit = q.options.find((o) => o.option === name);
+        return hit
+          ? { count: Number(hit.count) || 0, score: hit.score }
+          : { count: 0, score: null };
+      };
+      const NAMES = FIXED_OPTIONS;
+
       const rows = this.satisfactionQuestions.map((q) => {
-        const m = {};
-        q.options.forEach((o) => (m[o.option] = o.count));
-        const veryGood = m['闈炲父婊℃剰'] || 0;
-        const good = m['婊℃剰'] || 0;
-        const normal = m['涓�鑸�'] || 0;
-        const bad = m['涓嶆弧鎰�'] || 0;
-        const na = m['涓嶉�傜敤'] || 0;
-        const total = veryGood + good + normal + bad + na;
+        const veryGood = pick(q, "寰堟弧鎰�");
+        const good = pick(q, "婊℃剰");
+        const normal = pick(q, "涓�鑸�");
+        const bad = pick(q, "涓嶆弧鎰�");
+        const veryBad = pick(q, "寰堜笉婊℃剰");
+        const na = pick(q, "鏈粡鍘�");
+        const items = [veryGood, good, normal, bad, veryBad, na];
+        const total = items.reduce((s, it) => s + it.count, 0);
         return {
           category: q.title,
-          veryGoodCount: veryGood,
-          veryGoodRate: this.rateOf(veryGood, total),
-          goodCount: good,
-          goodRate: this.rateOf(good, total),
-          normalCount: normal,
-          normalRate: this.rateOf(normal, total),
-          badCount: bad,
-          badRate: this.rateOf(bad, total),
-          naCount: na,
-          naRate: this.rateOf(na, total),
-          score: this.scoreOf([veryGood, good, normal, bad, na]),
+          veryGoodCount: veryGood.count,
+          veryGoodRate: this.rateOf(veryGood.count, total),
+          goodCount: good.count,
+          goodRate: this.rateOf(good.count, total),
+          normalCount: normal.count,
+          normalRate: this.rateOf(normal.count, total),
+          badCount: bad.count,
+          badRate: this.rateOf(bad.count, total),
+          veryBadCount: veryBad.count,
+          veryBadRate: this.rateOf(veryBad.count, total),
+          naCount: na.count,
+          naRate: this.rateOf(na.count, total),
+          score: this.scoreOfItems(items),
         };
       });
 
-      // 鎬昏琛�
-      const sum = { veryGood: 0, good: 0, normal: 0, bad: 0, na: 0 };
-      rows.forEach((r) => {
-        sum.veryGood += r.veryGoodCount;
-        sum.good += r.goodCount;
-        sum.normal += r.normalCount;
-        sum.bad += r.badCount;
-        sum.na += r.naCount;
+      // 鎬昏琛岋細鍚勯鍚岄�夐」鏁伴噺绱姞锛屽垎鍊兼部鐢ㄨ閫夐」鍒嗗��
+      const sum = NAMES.map(() => ({ count: 0, score: null }));
+      this.satisfactionQuestions.forEach((q) => {
+        NAMES.forEach((name, i) => {
+          const it = pick(q, name);
+          sum[i].count += it.count;
+          if (sum[i].score == null) sum[i].score = it.score;
+        });
       });
-      const total = sum.veryGood + sum.good + sum.normal + sum.bad + sum.na;
+      const total = sum.reduce((s, it) => s + it.count, 0);
       rows.push({
-        category: '鎬昏',
-        veryGoodCount: sum.veryGood,
-        veryGoodRate: this.rateOf(sum.veryGood, total),
-        goodCount: sum.good,
-        goodRate: this.rateOf(sum.good, total),
-        normalCount: sum.normal,
-        normalRate: this.rateOf(sum.normal, total),
-        badCount: sum.bad,
-        badRate: this.rateOf(sum.bad, total),
-        naCount: sum.na,
-        naRate: this.rateOf(sum.na, total),
-        score: this.scoreOf([sum.veryGood, sum.good, sum.normal, sum.bad, sum.na]),
+        category: "鎬昏",
+        veryGoodCount: sum[0].count,
+        veryGoodRate: this.rateOf(sum[0].count, total),
+        goodCount: sum[1].count,
+        goodRate: this.rateOf(sum[1].count, total),
+        normalCount: sum[2].count,
+        normalRate: this.rateOf(sum[2].count, total),
+        badCount: sum[3].count,
+        badRate: this.rateOf(sum[3].count, total),
+        veryBadCount: sum[4].count,
+        veryBadRate: this.rateOf(sum[4].count, total),
+        naCount: sum[5].count,
+        naRate: this.rateOf(sum[5].count, total),
+        score: this.scoreOfItems(sum),
       });
       return rows;
     },
@@ -322,138 +642,359 @@
         };
       });
     },
+    // 琛ㄤ簩锛氭寜棰樼洰妯$硦鏌ヨ锛堢函鍓嶇杩囨护锛屼笉璇锋眰鍚庣锛�
+    filteredQuestionStats() {
+      const kw = (this.questionSearch || "").trim().toLowerCase();
+      if (!kw) return this.questionStats;
+      return this.questionStats.filter((q) =>
+        (q.title || "").toLowerCase().indexOf(kw) > -1
+      );
+    },
     // 琛ㄤ笁锛氭寜缁村害 + 鐙珛鏉′欢杩囨护鍚庣殑琛�
     table3Rows() {
-      const list = this.statDimension === 'dept' ? this.deptComparison : this.wardComparison;
-      const f = this.statFilter();
-      if (!f) return list;
-      const [type, name] = f.split(':');
-      if (type !== this.statDimension) return list;
-      return list.filter((r) => r.name === name);
+      const comp =
+        this.statDimension === "dept"
+          ? this.deptComparison
+          : this.wardComparison;
+      const list = (comp && comp.rows) || [];
+      const names = this.statFilterNames();
+      if (!names || !names.length) return list;
+      return list.filter((r) => names.indexOf(r.name) > -1);
+    },
+    // 琛ㄤ笁锛氬綋鍓嶇淮搴︿笅鐨勯鐩垪锛堝姩鎬佸垪锛�
+    table3Questions() {
+      const comp =
+        this.statDimension === "dept"
+          ? this.deptComparison
+          : this.wardComparison;
+      return (comp && comp.questions) || [];
     },
   },
-  mounted() {
+  created() {
     if (!this.queryParams.dateRange || !this.queryParams.dateRange.length) {
       this.queryParams.dateRange = this.defaultRange();
     }
+    this.queryParams.serviceTypeList = this.defaultServiceTypes();
+  },
+  mounted() {
     this.fetchData();
   },
   methods: {
-    // 琛ㄤ笁鐙珛鏉′欢锛�'inherit' 鏃舵部鐢ㄩ《閮ㄦ潯浠�
-    statFilter() {
-      const v = this.statDeptWard === 'inherit' ? this.queryParams.deptWard : this.statDeptWard;
-      return v || '';
+    // 榛樿閫変腑鐨勬湇鍔$被鍨嬶紙鎸� label 鍖归厤锛屽彇涓嶅埌灏辫繑鍥炵┖鏁扮粍 = 涓嶉檺锛�
+    defaultServiceTypes() {
+      const hit = DEFAULT_SERVICE_LABELS.map((label) => {
+        const item = this.serviceTypeOptions.find((o) => o.label === label);
+        return item ? item.value : null;
+      }).filter((v) => v != null);
+      return Array.from(new Set(hit));
+    },
+    // 琛ㄤ笁鐙珛鏉′欢锛�'inherit' 鏃舵部鐢ㄩ《閮ㄦ墍閫夛紱杩斿洖閫変腑鐨勫悕绉版暟缁勶紙鎺ュ彛鍙洖鍚嶇О锛夛紝绌烘暟缁勮〃绀轰笉闄�
+    statFilterNames() {
+      const opts =
+        this.statDimension === "dept" ? this.deptOptions : this.wardOptions;
+      const nameOf = (code) => {
+        const hit = opts.find((o) => String(o.value) === String(code));
+        return hit ? hit.label : null;
+      };
+      if (this.statDeptWard === "inherit") {
+        const codes =
+          this.statDimension === "dept"
+            ? this.queryParams.deptCodes
+            : this.queryParams.wardCodes;
+        return (codes || []).map(nameOf).filter(Boolean);
+      }
+      // 鍒囨崲缁村害鍚庯紝鑻ュ凡閫夋潯浠朵笉灞炰簬褰撳墠缁村害鍒欒涓轰笉闄�
+      if (this.statDeptWard.startsWith(this.statDimension + ":")) {
+        const name = nameOf(this.statDeptWard.slice(this.statDimension.length + 1));
+        return name ? [name] : [];
+      }
+      return [];
     },
     onStatDimensionChange() {
       // 鍒囨崲缁村害鍚庯紝鑻ュ綋鍓嶅凡閫夋潯浠朵笉灞炰簬鏂扮淮搴︼紝鍒欐仮澶嶁�滄部鐢ㄩ《閮ㄢ��
-      if (this.statDeptWard !== 'inherit' && !this.statDeptWard.startsWith(this.statDimension + ':')) {
-        this.statDeptWard = 'inherit';
+      if (
+        this.statDeptWard !== "inherit" &&
+        !this.statDeptWard.startsWith(this.statDimension + ":")
+      ) {
+        this.statDeptWard = "inherit";
       }
     },
     handleReset() {
       this.queryParams.dateRange = this.defaultRange();
-      this.queryParams.deptWard = '';
+      this.queryParams.deptCodes = [];
+      this.queryParams.wardCodes = [];
+      this.queryParams.statMode = "ward";
+      this.statDimension = "ward";
+      this.statDeptWard = "inherit";
+      this.queryParams.serviceTypeList = this.defaultServiceTypes();
       this.fetchData();
     },
-    // 鍒ゆ柇棰樼洰閫夐」鏄惁涓哄浐瀹氭弧鎰忓害浜旈」
+    // 鍒囨崲缁熻缁村害锛堢瀹�/鐥呭尯锛夋椂娓呯┖鍙︿竴缁村害鐨勯�夋嫨锛屼繚璇佷簰鏂�
+    onStatModeChange() {
+      if (this.queryParams.statMode === "dept") {
+        this.queryParams.wardCodes = [];
+      } else {
+        this.queryParams.deptCodes = [];
+      }
+      // 鍗曞悜鍚屾鍒般�屽悇绉戝/鐥呭尯婊℃剰搴﹁瘎鍒嗗姣斻�嶈〃锛氶《閮� 鈫� 琛ㄤ笁
+      this.statDimension = this.queryParams.statMode;
+      this.onStatDimensionChange();
+    },
+    // 鍒ゆ柇棰樼洰鏄惁涓烘弧鎰忓害鍏」閫夐」棰橈細鎵�鏈夐�夐」閮借惤鍦ㄥ浐瀹氬叚椤瑰唴鍗冲綊琛ㄤ竴
     isSatisfactionQuestion(q) {
-      if (q.options.length !== FIXED_OPTIONS.length) return false;
-      const set = q.options.map((o) => o.option);
-      return FIXED_OPTIONS.every((o) => set.includes(o));
+      if (!q.options || !q.options.length) return false;
+      return q.options.every((o) => FIXED_OPTIONS.includes(o.option));
     },
     questionTotal(q) {
       if (q.total != null) return q.total;
       return q.options.reduce((s, o) => s + o.count, 0);
     },
     rateOf(count, total) {
-      if (!total) return '0.00%';
-      return ((count / total) * 100).toFixed(2) + '%';
+      if (!total) return "0.00%";
+      return ((count / total) * 100).toFixed(2) + "%";
     },
-    // 缁煎悎寰楀垎锛氶潪甯告弧鎰�5鍒嗐�佹弧鎰�4鍒嗐�佷竴鑸�3鍒嗐�佷笉婊℃剰2鍒嗭紝鎹㈢畻鐧惧垎鍒讹紙涓嶉�傜敤涓嶈鍏ワ級鈥斺�斿崰浣嶅叕寮忥紝鎺ュ彛灏辩华鍚庡彲鎸夊悗绔彛寰勬浛鎹�
-    scoreOf(counts) {
-      const [a, b, c, d] = counts;
-      const total = a + b + c + d;
-      if (!total) return '0.00';
-      return (((a * 5 + b * 4 + c * 3 + d * 2) / total) * 20).toFixed(2);
+    /**
+     * 缁煎悎寰楀垎锛堢湡瀹炲彛寰勶級锛毼�(鍚勯�夐」鍒嗗�� 脳 濉姤閲�) / 危(濉姤閲�)
+     * items: [{ count, score }]锛宻core 鍙栨帴鍙h繑鍥炵殑 score 瀛楁
+     * 鏃犲垎鍊奸�夐」锛堝"鏈粡鍘�"锛夐粯璁や笉璁″叆鍒嗗瓙涓庡垎姣嶏紝閬垮厤鎷変綆寰楀垎
+     */
+    scoreOfItems(items) {
+      let numerator = 0;
+      let denominator = 0;
+      items.forEach((it) => {
+        const count = Number(it && it.count) || 0;
+        const score = Number(it && it.score);
+        const hasScore = !isNaN(score);
+        if (!hasScore && !NO_SCORE_IN_DENOMINATOR) return;
+        numerator += (hasScore ? score : 0) * count;
+        denominator += count;
+      });
+      if (!denominator) return "0.00";
+      return (numerator / denominator).toFixed(2);
     },
     defaultRange() {
       const end = new Date();
       const start = new Date();
-      start.setDate(start.getDate() - 29);
+      start.setDate(start.getDate() - 91);
       const f = (d) => {
         const y = d.getFullYear();
-        const m = String(d.getMonth() + 1).padStart(2, '0');
-        const day = String(d.getDate()).padStart(2, '0');
+        const m = String(d.getMonth() + 1).padStart(2, "0");
+        const day = String(d.getDate()).padStart(2, "0");
         return `${y}-${m}-${day}`;
       };
       return [f(start), f(end)];
     },
-    dateRangeDays(range) {
-      if (Array.isArray(range) && range.length === 2 && range[0] && range[1]) {
-        const ms = new Date(range[1]).getTime() - new Date(range[0]).getTime();
-        return Math.max(1, Math.round(ms / 86400000));
+    // 鎻愮ず淇℃伅锛堝吋瀹� $modal 涓� $message锛�
+    notify(msg, type) {
+      const map = {
+        warning: ["msgWarning", "warning"],
+        error: ["msgError", "error"],
+        success: ["msgSuccess", "success"],
+      };
+      const [modalFn, msgFn] = map[type] || map.success;
+      if (this.$modal && this.$modal[modalFn]) {
+        this.$modal[modalFn](msg);
+      } else if (this.$message && this.$message[msgFn]) {
+        this.$message[msgFn](msg);
       }
-      return 30;
     },
-    // 鎷夊彇鏁版嵁锛堝綋鍓嶄负妯℃嫙鏁版嵁锛屾帴鍙e氨缁悗鏇挎崲涓虹湡瀹炶姹傦級
-    fetchData() {
-      const data = this.mockFetch(this.queryParams);
-      this.questionList = data.questionList;
-      this.deptComparison = data.deptComparison;
-      this.wardComparison = data.wardComparison;
-    },
-    mockFetch(params) {
-      const seed = hashString(JSON.stringify(params));
-      const rnd = mulberry32(seed);
-      const days = this.dateRangeDays(params.dateRange);
-      const timeFactor = Math.max(0.05, days / 30);
-      const scopeFactor = params.deptWard ? 0.18 : 1;
-      const jitter = () => 0.9 + rnd() * 0.2;
+    // 鎷夊彇婊℃剰搴︾粺璁℃暟鎹紙鎺ュ彛锛�/smartor/serviceSubtaskDetail/sltdMydTotalByScore锛�
+    async fetchData() {
+      const range = this.queryParams.dateRange || [];
+      if (range.length !== 2 || !range[0] || !range[1]) {
+        this.notify("璇峰厛閫夋嫨鍑洪櫌鏃ユ湡鑼冨洿", "warning");
+        return;
+      }
 
-      const questionList = RAW_QUESTIONS.map((q) => {
-        const options = q.options.map((o) => ({
-          option: o.option,
-          count: Math.round(o.count * timeFactor * scopeFactor * jitter()),
-        }));
-        const item = { title: q.title, type: q.type, options };
-        if (q.type === 'multiple' && q.total != null) {
-          item.total = Math.round(q.total * timeFactor * scopeFactor);
+      // 鐥呭尯 => leavehospitaldistrictcodes锛岀瀹� => leaveldeptcodes
+      // 绉戝/鐥呭尯浜掓枼锛氭寜鐥呭尯鍙紶 leavehospitaldistrictcodes锛屾寜绉戝鍙紶 leaveldeptcodes
+      const wards = this.queryParams.wardCodes || [];
+      const depts = this.queryParams.deptCodes || [];
+
+      const payload = {
+        deptOrDistrict: this.queryParams.deptOrDistrict || "1",
+        startFinishTime: range[0],
+        endFinishTime: range[1],
+      };
+      if (this.queryParams.statMode === "dept") {
+        payload.leaveldeptcodes = depts.length
+          ? Array.from(new Set(depts))
+          : this.defaultDeptCodes;
+      } else {
+        payload.leavehospitaldistrictcodes = wards.length
+          ? Array.from(new Set(wards))
+          : this.defaultWardCodes;
+      }
+      // 鏈嶅姟绫诲瀷澶氶�夛細閫楀彿鍒嗛殧锛堟帴鍙e瓧娈典负 serviceType 瀛楃涓诧級
+      const serviceTypes = this.queryParams.serviceTypeList || [];
+      if (serviceTypes.length) payload.serviceType = serviceTypes.join(",");
+      payload.serviceTypeList = serviceTypes;
+      this.loading = true;
+      try {
+        const res = await sltdMydTotalByScore(payload);
+        // 鎺掓煡鐢細鎵撳嵃鎺ュ彛鍘熷杩斿洖锛屼究浜庢牳瀵瑰瓧娈靛悕锛堢‘璁ゆ棤璇悗鍙垹闄わ級
+        console.log(
+          "[sltdMydTotalByScore] code=",
+          res && res.code,
+          "data=",
+          JSON.stringify(res && res.data).slice(0, 2000)
+        );
+        if (res && res.code === 200) {
+          this.questionList = normalizeQuestions(res.data);
+          if (!this.questionList.length)
+            this.notify("褰撳墠鏉′欢涓嬫殏鏃犵粺璁℃暟鎹�", "warning");
+        } else {
+          this.questionList = [];
+          this.notify((res && res.msg) || "缁熻鏁版嵁鑾峰彇澶辫触", "error");
         }
-        return item;
+        // 琛ㄤ笁锛氬悇绉戝/鐥呭尯婊℃剰搴﹁瘎鍒嗗姣旓紙鐪熷疄鎺ュ彛锛屽唴閮ㄨ嚜琛屽鐞嗛敊璇級
+        await this.fetchComparison();
+      } catch (e) {
+        this.questionList = [];
+        this.notify("缁熻鏁版嵁璇锋眰澶辫触锛岃绋嶅悗閲嶈瘯", "error");
+      } finally {
+        this.loading = false;
+      }
+    },
+    // 鎷夊彇鍚勭瀹�/鐥呭尯婊℃剰搴﹁瘎鍒嗗姣旓紙鎺ュ彛锛�/smartor/serviceSubtaskDetail/statQuestionOptionByKsOrBq锛�
+    async fetchComparison() {
+      const range = this.queryParams.dateRange || [];
+      if (range.length !== 2 || !range[0] || !range[1]) {
+        this.deptComparison = { rows: [], questions: [] };
+        this.wardComparison = { rows: [], questions: [] };
+        return;
+      }
+      const base = {
+        deptOrDistrict: this.queryParams.deptOrDistrict || "1",
+        startFinishTime: range[0],
+        endFinishTime: range[1],
+      };
+      try {
+        // 鎸夌瀹ょ粺璁★紙leaveldeptcodes 浼樺厛锛変笌鎸夌梾鍖虹粺璁★紙leavehospitaldistrictcodes锛夊悇鏌ヤ竴娆�
+        const [deptRes, wardRes] = await Promise.all([
+          statQuestionOptionByKsOrBq({ ...base, leaveldeptcodes: this.defaultDeptCodes }),
+          statQuestionOptionByKsOrBq({ ...base, leavehospitaldistrictcodes: this.defaultWardCodes }),
+        ]);
+        // 鎺掓煡鐢細鎵撳嵃鎺ュ彛鍘熷杩斿洖锛屼究浜庢牳瀵逛袱绾у祵濂� Map 缁撴瀯锛堢‘璁ゆ棤璇悗鍙垹闄わ級
+        console.log(
+          "[statQuestionOptionByKsOrBq] dept code=",
+          deptRes && deptRes.code,
+          "data=",
+          JSON.stringify(deptRes && deptRes.data).slice(0, 2000),
+          "| ward code=",
+          wardRes && wardRes.code,
+          "data=",
+          JSON.stringify(wardRes && wardRes.data).slice(0, 2000)
+        );
+        this.deptComparison = this.buildComparison(
+          deptRes && deptRes.code === 200 ? deptRes.data : {},
+          "dept"
+        );
+        this.wardComparison = this.buildComparison(
+          wardRes && wardRes.code === 200 ? wardRes.data : {},
+          "ward"
+        );
+      } catch (e) {
+        this.deptComparison = { rows: [], questions: [] };
+        this.wardComparison = { rows: [], questions: [] };
+        console.error("鑾峰彇绉戝/鐥呭尯璇勫垎瀵规瘮澶辫触:", e);
+      }
+    },
+    // 缁勮涓鸿〃涓夋墍闇�鐨勮/鍒楃粨鏋勶細琛�=绉戝/鐥呭尯锛屽垪=棰樼洰脳閫夐」 + 寰楀垎 + 缁煎悎寰楀垎
+    // 鏂版帴鍙h繑鍥炰袱绾у祵濂� Map锛歿 绉戝/鐥呭尯鍚嶇О: { 棰樼洰鍐呭: [QuestionCountKsOrBqDTO] } }
+    // 鍏煎鏃ф墎骞虫暟缁勶細[{ questionText, deptname, leavehospitaldistrictname, targetvalue, answerCount, singleScore }]
+    buildComparison(data, mode) {
+      const questions = [];
+      const qMap = new Map();
+      const rowMap = new Map();
+
+      // 灏嗕竴鏉� (鍚嶇О, 棰樼洰, 閫夐」, 鏁伴噺, 寰楀垎) 鏄庣粏绱姞杩涜/鍒楃粨鏋�
+      const collect = (name, title, option, count, single) => {
+        if (!title || !name) return;
+        let q = qMap.get(title);
+        if (!q) {
+          q = { title, options: [] };
+          qMap.set(title, q);
+          questions.push(q);
+        }
+        if (option && q.options.indexOf(option) === -1) q.options.push(option);
+
+        let row = rowMap.get(name);
+        if (!row) {
+          row = { name, code: this.codeFor(mode, name), cells: {} };
+          rowMap.set(name, row);
+        }
+        if (!row.cells[title]) row.cells[title] = {};
+        const cell = row.cells[title][option] || { count: 0, score: 0 };
+        cell.count += count;
+        cell.score += single;
+        row.cells[title][option] = cell;
+      };
+
+      if (Array.isArray(data)) {
+        // 鏃х粨鏋勶細鎵佸钩鏁扮粍
+        data.forEach((it) => {
+          const title = it.questionText || it.qeustionText || "";
+          const name =
+            mode === "dept"
+              ? it.deptname || ""
+              : it.leavehospitaldistrictname || "";
+          const option = it.targetvalue || it.asrtext || "";
+          collect(name, title, option, Number(it.answerCount) || 0, Number(it.singleScore) || 0);
+        });
+      } else if (data && typeof data === "object") {
+        // 鏂扮粨鏋勶細涓ょ骇宓屽 Map锛岀涓�灞� key=绉戝/鐥呭尯鍚嶇О锛岀浜屽眰 key=棰樼洰锛寁alue=閫夐」鏄庣粏鍒楄〃
+        Object.keys(data).forEach((name) => {
+          const questionMap = data[name] || {};
+          Object.keys(questionMap).forEach((title) => {
+            const list = Array.isArray(questionMap[title]) ? questionMap[title] : [];
+            list.forEach((it) => {
+              const option = it.targetvalue || it.asrtext || "";
+              collect(name, title, option, Number(it.answerCount) || 0, Number(it.singleScore) || 0);
+            });
+          });
+        });
+      }
+
+      const rows = Array.from(rowMap.values());
+      rows.forEach((row) => {
+        let totalCount = 0;
+        let totalScore = 0;
+        questions.forEach((q) => {
+          const cells = row.cells[q.title] || {};
+          let qCount = 0;
+          let qScore = 0;
+          q.options.forEach((opt) => {
+            const c = cells[opt];
+            if (c) {
+              qCount += c.count;
+              qScore += c.score;
+            }
+          });
+          // 璇ラ鐩姞鏉冨钩鍧囧垎锛毼� singleScore / 危 answerCount
+          cells._score = qCount ? (qScore / qCount).toFixed(2) : "0.00";
+          totalCount += qCount;
+          totalScore += qScore;
+          row.cells[q.title] = cells;
+        });
+        row.totalScore = totalCount ? (totalScore / totalCount).toFixed(2) : "0.00";
       });
 
-      const deptComparison = DEPTS.map((d) => this.genCompareRow(d, rnd));
-      const wardComparison = WARDS.map((w) => this.genCompareRow(w, rnd));
-
-      return { questionList, deptComparison, wardComparison };
+      return { rows, questions };
     },
-    genCompareRow(name, rnd) {
-      const r = (lo, hi) => Math.round(lo + rnd() * (hi - lo));
-      const q1VeryGood = r(20, 180);
-      const q1Good = r(5, 55);
-      const q1Normal = r(0, 4);
-      const q1Bad = r(0, 3);
-      const q2VeryGood = r(18, 175);
-      const q2Good = r(5, 55);
-      const q2Normal = r(0, 4);
-      const q2Bad = r(0, 3);
-      return {
-        name,
-        q1VeryGood, q1Good, q1Normal, q1Bad,
-        q1Score: this.scoreOf([q1VeryGood, q1Good, q1Normal, q1Bad]),
-        q2VeryGood, q2Good, q2Normal, q2Bad,
-        q2Score: this.scoreOf([q2VeryGood, q2Good, q2Normal, q2Bad]),
-        totalScore: this.scoreOf([
-          q1VeryGood + q2VeryGood,
-          q1Good + q2Good,
-          q1Normal + q2Normal,
-          q1Bad + q2Bad,
-        ]),
-      };
+    // 鍚嶇О 鈫� 缂栫爜锛堢敤浜庤〃涓夋寜椤堕儴鎵�閫夌紪鐮佽繃婊わ級
+    codeFor(mode, name) {
+      const opts = mode === "dept" ? this.deptOptions : this.wardOptions;
+      const hit = opts.find((o) => String(o.label) === String(name));
+      return hit ? hit.value : name;
     },
     exportTable(tableId) {
-      const tableNames = { table1: '鍚勬湇鍔¢」鐩弧鎰忓害缁熻', table2: '鍗曢�夐澶氶�夐缁熻', table3: '鍚勭瀹ゆ弧鎰忓害璇勫垎瀵规瘮' };
-      const name = tableNames[tableId] || '缁熻鏁版嵁';
+      const tableNames = {
+        table1: "鍚勬湇鍔¢」鐩弧鎰忓害缁熻",
+        table2: "鍗曢�夐澶氶�夐缁熻",
+        table3: "鍚勭瀹ゆ弧鎰忓害璇勫垎瀵规瘮",
+      };
+      const name = tableNames[tableId] || "缁熻鏁版嵁";
       const table = document.getElementById(tableId);
       if (!table) return;
 
@@ -461,10 +1002,10 @@
         // 浠庤〃鏍兼彁鍙栨暟鎹瀯寤哄甫鏍峰紡鐨� Excel
         const wb = XLSX.utils.book_new();
         const data = [];
-        table.querySelectorAll('tr').forEach((tr) => {
+        table.querySelectorAll("tr").forEach((tr) => {
           const row = [];
-          tr.querySelectorAll('th,td').forEach((td) => {
-            row.push((td.innerText || '').trim());
+          tr.querySelectorAll("th,td").forEach((td) => {
+            row.push((td.innerText || "").trim());
           });
           if (row.length) data.push(row);
         });
@@ -472,22 +1013,24 @@
         const ws = XLSX.utils.aoa_to_sheet(data);
         // 璁剧疆鍒楀
         const colWidths = data[0] ? data[0].map(() => ({ wch: 16 })) : [];
-        ws['!cols'] = colWidths;
+        ws["!cols"] = colWidths;
 
-        XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
-        XLSX.writeFile(wb, name + '.xlsx');
+        XLSX.utils.book_append_sheet(wb, ws, "Sheet1");
+        XLSX.writeFile(wb, name + ".xlsx");
       } catch (e) {
         // fallback: CSV
-        let csv = '锘�';
-        table.querySelectorAll('tr').forEach((tr) => {
+        let csv = "锘�";
+        table.querySelectorAll("tr").forEach((tr) => {
           const row = [];
-          tr.querySelectorAll('th,td').forEach((td) => row.push('"' + (td.innerText || '').replace(/"/g, '""') + '"'));
-          csv += row.join(',') + '\n';
+          tr.querySelectorAll("th,td").forEach((td) =>
+            row.push('"' + (td.innerText || "").replace(/"/g, '""') + '"')
+          );
+          csv += row.join(",") + "\n";
         });
-        const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });
-        const link = document.createElement('a');
+        const blob = new Blob([csv], { type: "text/csv;charset=utf-8;" });
+        const link = document.createElement("a");
         link.href = URL.createObjectURL(blob);
-        link.download = name + '.csv';
+        link.download = name + ".csv";
         link.click();
       }
     },
@@ -496,13 +1039,66 @@
 </script>
 
 <style lang="scss" scoped>
-.data-overview { .overview-card { margin-bottom: 20px; } }
-.filter-card { .filter-form { margin-bottom: -10px; } .filter-select { width: 200px; } }
-.card-header { display: flex; justify-content: space-between; align-items: center; }
-.card-title { font-size: 16px; font-weight: 600; color: #303133; }
-.header-right { display: flex; align-items: center; .stat-select { width: 180px; margin: 0 12px; } }
-.question-block { margin-bottom: 24px;
-  .q-title { margin: 0 0 12px 0; font-size: 14px; color: #606266; }
-  .q-footer { margin-top: 8px; font-size: 13px; color: #909399; text-align: right; }
+.data-overview {
+  .overview-card {
+    margin-bottom: 20px;
+  }
+}
+.filter-card {
+  .filter-form {
+    margin-bottom: -10px;
+  }
+  .filter-select {
+    width: 220px;
+  }
+  .filter-select-sm {
+    width: 150px;
+  }
+}
+.empty-tip {
+  padding: 40px 0;
+  text-align: center;
+  color: #909399;
+  font-size: 13px;
+}
+.table2-scroll {
+  max-height: 560px;
+  overflow-y: auto;
+}
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+.card-title {
+  font-size: 16px;
+  font-weight: 600;
+  color: #303133;
+}
+.header-right {
+  display: flex;
+  align-items: center;
+  .stat-select {
+    width: 180px;
+    margin: 0 12px;
+  }
+  .search-input {
+    width: 200px;
+    margin-right: 12px;
+  }
+}
+.question-block {
+  margin-bottom: 24px;
+  .q-title {
+    margin: 0 0 12px 0;
+    font-size: 14px;
+    color: #606266;
+  }
+  .q-footer {
+    margin-top: 8px;
+    font-size: 13px;
+    color: #909399;
+    text-align: right;
+  }
 }
 </style>
diff --git a/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue b/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
index c1cee6a..f0534c0 100644
--- a/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
+++ b/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
@@ -354,7 +354,7 @@
         statisticaltype: 1,
         leavehospitaldistrictcodes: ["all"],
         deptcodes: [],
-        serviceType: [],
+        serviceType: [2],
         dateRange: [],
         pageNum: 1,
         pageSize: 20,
@@ -374,23 +374,23 @@
 
       // 鏈嶅姟绫诲瀷閫夐」
       options: [
-        {
-          value: 6,
-          label: "浣忛櫌婊℃剰搴�",
-          raw: {
-            cssClass: "",
-            listClass: "",
-          },
-        },
+        // {
+        //   value: 6,
+        //   label: "浣忛櫌婊℃剰搴�",
+        //   raw: {
+        //     cssClass: "",
+        //     listClass: "",
+        //   },
+        // },
 
-        {
-          value: 14,
-          label: "闂ㄨ瘖婊℃剰搴�",
-          raw: {
-            cssClass: "",
-            listClass: "",
-          },
-        },
+        // {
+        //   value: 14,
+        //   label: "闂ㄨ瘖婊℃剰搴�",
+        //   raw: {
+        //     cssClass: "",
+        //     listClass: "",
+        //   },
+        // },
       ],
 
       // 琛ㄦ牸鏁版嵁
@@ -475,7 +475,7 @@
     // 鑾峰彇绉戝鏍�
     getDeptTree() {
       // 鑾峰彇鏈嶅姟绫诲瀷
-      // this.options = this.$store.getters.tasktypes || [];
+      this.options = this.$store.getters.tasktypes || [];
 
       // 鑾峰彇绉戝鍒楄〃
       this.flatArraydept = (this.$store.getters.belongDepts || []).map(
diff --git a/src/views/Satisfaction/sfstatistics/components/SatisfactionStatistics.vue b/src/views/Satisfaction/sfstatistics/components/SatisfactionStatistics.vue
index 59623b3..9ec0011 100644
--- a/src/views/Satisfaction/sfstatistics/components/SatisfactionStatistics.vue
+++ b/src/views/Satisfaction/sfstatistics/components/SatisfactionStatistics.vue
@@ -141,6 +141,8 @@
 
           <div
             id="satisfactionBarChart"
+            v-loading="loading"
+            element-loading-text="缁熻鍔犺浇涓�..."
             style="width: 100%; height: 400px"
           ></div>
         </div>
@@ -858,6 +860,12 @@
       }
       return this.wardList.map((ward) => ward.value);
     },
+
+    // 闂缁村害闆嗗悎锛氫粠 dimensionality_type 瀛楀吀鍙栫淮搴︾紪鐮侊紝鏌ョ淮搴︽椂蹇呬紶
+    dimensionList() {
+      const dict = this.dict && this.dict.type && this.dict.type.dimensionality_type;
+      return dict ? dict.map((d) => String(d.value)) : [];
+    },
   },
 
   mounted() {
@@ -978,6 +986,9 @@
         deptcodes: this.deptCodes, // 浣跨敤璁$畻灞炴��
         hospitaldistrictcodes: this.hospitalDistrictCodes, // 浣跨敤璁$畻灞炴��
         templateid: this.templateId,
+        questionType: this.queryParams.type || null,
+        serviceTypes: this.defaultServiceTypes,
+        dimensionList: this.dimensionList, // 闂缁村害闆嗗悎锛屾煡缁村害鏃跺繀浼�
       };
 
       const response = await satisfactionGraphDimension(params);
@@ -1153,14 +1164,14 @@
         return {
           scriptContent: item.scriptContent || "",
           scriptType: 1,
-          answerPerson: item.answerPerson || 0,
-          noAnswerPerson: item.noAnswerPerson || 0,
-          answerCount: item.answerPerson || 0,
-          averageScore: item.averageScore || 0,
-          maxScore: item.maxScore || 0,
-          minScore: item.minScore || 0,
-          answerRate: item.answerRate || 0,
-          totalCount: (item.answerPerson || 0) + (item.noAnswerPerson || 0),
+          answerPerson: Number(item.answerPerson) || 0,
+          noAnswerPerson: Number(item.noAnswerPerson) || 0,
+          answerCount: Number(item.answerPerson) || 0,
+          averageScore: Number(item.averageScore) || 0,
+          maxScore: Number(item.maxScore) || 0,
+          minScore: Number(item.minScore) || 0,
+          answerRate: Number(item.answerRate) || 0,
+          totalCount: (Number(item.answerPerson) || 0) + (Number(item.noAnswerPerson) || 0),
           options: options,
         };
       });
@@ -1189,6 +1200,7 @@
           templateid: this.templateId,
           questionType: this.queryParams.type || null,
           serviceTypes: this.defaultServiceTypes,
+          dimensionList: this.dimensionList, // 闂缁村害闆嗗悎锛屾煡缁村害鏃跺繀浼�
         };
 
         const response = await statisticsByDimension(params);
@@ -1238,14 +1250,14 @@
           dimension: item.dimension || "0", // 缁村害浠g爜
           dimensionName: this.getDimensionLabel(item.dimension || "0"), // 缁村害鍚嶇О
           scriptType: 1,
-          answerPerson: item.answerPerson || 0,
-          noAnswerPerson: item.noAnswerPerson || 0,
-          answerCount: item.answerPerson || 0,
-          averageScore: item.averageScore || 0,
-          maxScore: item.maxScore || 0,
-          minScore: item.minScore || 0,
-          answerRate: item.answerRate || 0,
-          totalCount: (item.answerPerson || 0) + (item.noAnswerPerson || 0),
+          answerPerson: Number(item.answerPerson) || 0,
+          noAnswerPerson: Number(item.noAnswerPerson) || 0,
+          answerCount: Number(item.answerPerson) || 0,
+          averageScore: Number(item.averageScore) || 0,
+          maxScore: Number(item.maxScore) || 0,
+          minScore: Number(item.minScore) || 0,
+          answerRate: Number(item.answerRate) || 0,
+          totalCount: (Number(item.answerPerson) || 0) + (Number(item.noAnswerPerson) || 0),
           options: options,
         };
       });
diff --git a/src/views/followvisit/Continue/index.vue b/src/views/followvisit/Continue/index.vue
index 1fb96fa..a98406b 100644
--- a/src/views/followvisit/Continue/index.vue
+++ b/src/views/followvisit/Continue/index.vue
@@ -1461,8 +1461,10 @@
       this.getList(1);
     },
     onthatday() {
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
@@ -1470,13 +1472,12 @@
       return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1488,7 +1489,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
       buidegetTasklist(obj).then((response) => {
diff --git a/src/views/followvisit/HistoricalFollow/index.vue b/src/views/followvisit/HistoricalFollow/index.vue
index eb2660f..cbc87c1 100644
--- a/src/views/followvisit/HistoricalFollow/index.vue
+++ b/src/views/followvisit/HistoricalFollow/index.vue
@@ -885,13 +885,12 @@
       });
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -903,7 +902,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
       buidegetTasklist(obj).then((response) => {
@@ -1101,8 +1100,10 @@
       });
     },
     onthatday() {
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
diff --git a/src/views/followvisit/OutpatientAgain/index.vue b/src/views/followvisit/OutpatientAgain/index.vue
index d8082bf..22c477b 100644
--- a/src/views/followvisit/OutpatientAgain/index.vue
+++ b/src/views/followvisit/OutpatientAgain/index.vue
@@ -173,7 +173,7 @@
             </div>
           </div>
         </el-col>
-        <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
               <el-button
@@ -185,7 +185,7 @@
               >
             </div>
           </div>
-        </el-col>
+        </el-col> -->
         <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
@@ -1015,7 +1015,7 @@
       topqueryParams: {
         pageNum: 1,
         pageSize: 10,
-        sendstateView:2,
+        sendstateView:1,
         sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 鏈嶅姟鏃堕棿(姝e簭)    1 鏈嶅姟鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
         serviceType: 3,
         searchscope: 3,
@@ -1230,8 +1230,10 @@
       this.getList(1);
     },
     onthatday() {
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
@@ -1239,16 +1241,12 @@
       return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        //   this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-        //   (obj) => obj.deptCode
-        // );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1260,7 +1258,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         visitDeptCodes: this.topqueryParams.visitDeptCodes,
         // leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
@@ -1432,10 +1430,12 @@
     resetQuery() {
       this.dateRange = [];
       this.dateRangefs = [];
+      this.serviceStatusValue = 10;
+
       this.topqueryParams = {
         pageNum: 1,
         pageSize: 10,
-        sendstateView:2,
+        sendstateView:1,
         sort: 2, //0 鏈嶅姟鏃堕棿(姝e簭)    1 鏈嶅姟鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)
         serviceType: 3,
         searchscope: 3,
diff --git a/src/views/followvisit/Tracking/index.vue b/src/views/followvisit/Tracking/index.vue
index fd1c987..9202b4c 100644
--- a/src/views/followvisit/Tracking/index.vue
+++ b/src/views/followvisit/Tracking/index.vue
@@ -168,7 +168,7 @@
             </div>
           </div>
         </el-col>
-        <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
               <el-button
@@ -180,7 +180,7 @@
               >
             </div>
           </div>
-        </el-col>
+        </el-col> -->
         <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
@@ -1007,7 +1007,7 @@
       topqueryParams: {
         pageNum: 1,
         pageSize: 10,
-        sendstateView:2,
+        sendstateView:1,
         sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 寤剁画鎶ょ悊鏃堕棿(姝e簭)    1 寤剁画鎶ょ悊鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
         serviceType: 3,
         searchscope: 3,
@@ -1222,8 +1222,10 @@
       this.getList(1);
     },
     onthatday() {
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
@@ -1231,16 +1233,15 @@
       return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-          this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1252,7 +1253,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         visitDeptCodes: this.topqueryParams.visitDeptCodes,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
@@ -1424,10 +1425,12 @@
     resetQuery() {
       this.dateRange = [];
       this.dateRangefs = [];
+      this.serviceStatusValue = 10;
+
       this.topqueryParams = {
         pageNum: 1,
         pageSize: 10,
-        sendstateView:2,
+        sendstateView:1,
         sort: 2, //0 寤剁画鎶ょ悊鏃堕棿(姝e簭)    1 寤剁画鎶ょ悊鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)
         serviceType: 3,
         searchscope: 3,
diff --git a/src/views/followvisit/again/index.vue b/src/views/followvisit/again/index.vue
index bdd1f0b..c1193ae 100644
--- a/src/views/followvisit/again/index.vue
+++ b/src/views/followvisit/again/index.vue
@@ -173,7 +173,7 @@
             </div>
           </div>
         </el-col>
-        <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
               <el-button
@@ -185,7 +185,7 @@
               >
             </div>
           </div>
-        </el-col>
+        </el-col> -->
         <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
diff --git a/src/views/followvisit/beHospitalized/followUp.vue b/src/views/followvisit/beHospitalized/followUp.vue
index 55c5573..134c2ed 100644
--- a/src/views/followvisit/beHospitalized/followUp.vue
+++ b/src/views/followvisit/beHospitalized/followUp.vue
@@ -1263,12 +1263,6 @@
         },
       ],
       loading: false,
-      serviceStatusValue: 10,
-      cascaderProps: {
-        expandTrigger: "hover", // 鎮仠灞曞紑
-        checkStrictly: true, // 鉁� 鍏抽敭锛氬厑璁搁�変腑浠绘剰涓�绾�
-        emitPath: false, // 鉁� 鍙繑鍥為�変腑鐨勫�硷紝涓嶈繑鍥炶矾寰勬暟缁�
-      },
       // 闅忚鐘舵�佺骇鑱旈�夋嫨鍣�
       serviceStatusOptions: [
         {
@@ -1418,7 +1412,7 @@
       topqueryParams: {
         pageNum: 1,
         pageSize: 10,
-        sendstateView:2,
+        sendstateView:1,
         sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
         serviceType: 18,
         searchscope: 3,
@@ -1719,8 +1713,10 @@
       this.getList(1);
     },
     onthatday() {
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
@@ -1728,13 +1724,12 @@
       return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1746,7 +1741,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
       buidegetTasklist(obj).then((response) => {
@@ -1912,10 +1907,12 @@
     resetQuery() {
       this.dateRange = [];
       this.dateRangefs = [];
+      this.serviceStatusValue = 10;
+
       this.topqueryParams = {
         pageNum: 1,
         pageSize: 10,
-        sendstateView:2,
+        sendstateView:1,
         sort: 2, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)
         serviceType: 18,
         searchscope: 3,
diff --git a/src/views/followvisit/complaint/index.vue b/src/views/followvisit/complaint/index.vue
index 195ef8c..3e0c7c3 100644
--- a/src/views/followvisit/complaint/index.vue
+++ b/src/views/followvisit/complaint/index.vue
@@ -181,7 +181,7 @@
             </div>
           </div>
         </el-col>
-        <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
               <el-button
@@ -193,7 +193,7 @@
               >
             </div>
           </div>
-        </el-col>
+        </el-col> -->
         <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
@@ -1357,8 +1357,10 @@
       this.getList(1);
     },
     onthatday() {
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
@@ -1366,13 +1368,12 @@
       return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1384,7 +1385,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
       buidegetTasklist(obj).then((response) => {
diff --git a/src/views/followvisit/discharge/index.vue b/src/views/followvisit/discharge/index.vue
index 7b355eb..3531957 100644
--- a/src/views/followvisit/discharge/index.vue
+++ b/src/views/followvisit/discharge/index.vue
@@ -244,7 +244,7 @@
           </div>
         </el-col>
         <div class="color-legend">
-          <span class="legend-item" v-if="orgname == '鐪佺珛鍚屽痉缈犺嫅闄㈠尯'">
+          <span class="legend-item" v-if="orgname == '鍗楀崕澶у闄勫睘绗竴鍖婚櫌'">
             <span class="legend-block legend-blue"></span>鏈埌闅忚鏃堕棿
           </span>
           <span class="legend-item">
@@ -1511,6 +1511,8 @@
         value: dept.districtCode,
       };
     });
+    // 鍏嶇櫥鐩磋揪锛氭牴鎹瀹�/鐥呭尯缂栫爜棰勫~鎮h�呰寖鍥�
+    this.applyFollowUpScope();
     if (this.errtype == 1) {
       this.toleadExport(2);
     } else if (this.errtype == 2) {
@@ -1725,8 +1727,10 @@
     onthatday() {
       this.resetQuerykj();
 
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
@@ -1735,10 +1739,12 @@
     },
 
     buidegetTasklist(type) {
-      if (type) {
-        this.resetQuerykj();
-      }
-      this.applyDeptWardScope();
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1750,7 +1756,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
       buidegetTasklist(obj).then((response) => {
@@ -1847,6 +1853,7 @@
     /** 鎼滅储鎸夐挳鎿嶄綔 */
     handleQuery(refresh) {
       this.applyDeptWardScope();
+      this.clearAllSelection();
       this.topqueryParams.pageNum = 1;
       // 鍒ゆ柇鏄笉鏄伐浣滃彴蹇嵎鏌ヨ
       if (this.errtype != 2) {
@@ -1857,6 +1864,17 @@
       }
       this.getList(refresh);
     },
+    // 鍏嶇櫥鐩磋揪锛氭牴鎹矾鐢变腑鐨勭瀹�/鐥呭尯缂栫爜棰勫~鎮h�呰寖鍥�
+    applyFollowUpScope() {
+      const deptCode = this.$route.query.followUpDeptCode;
+      const wardCode = this.$route.query.followUpWardCode;
+      if (!deptCode && !wardCode) return;
+      const scope = [];
+      if (deptCode) scope.push([1, deptCode]);
+      if (wardCode) scope.push([2, wardCode]);
+      this.topqueryParams.scopetype = scope;
+      this.lastScopeType = deptCode ? 1 : 2;
+    },
     // 鎮h�呰寖鍥村鐞嗭細浠庡閫夌骇鑱� scopetype 瑙f瀽绉戝/鐥呭尯
     applyDeptWardScope() {
       const value = this.topqueryParams.scopetype || [];
diff --git a/src/views/followvisit/discharge/outpatientService.vue b/src/views/followvisit/discharge/outpatientService.vue
index 5910c74..f9811f2 100644
--- a/src/views/followvisit/discharge/outpatientService.vue
+++ b/src/views/followvisit/discharge/outpatientService.vue
@@ -185,7 +185,7 @@
             </div>
           </div>
         </el-col>
-        <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
               <el-button
@@ -197,7 +197,7 @@
               >
             </div>
           </div>
-        </el-col>
+        </el-col> -->
         <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
@@ -1227,8 +1227,10 @@
       this.getList(1);
     },
     onthatday() {
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
@@ -1236,13 +1238,12 @@
       return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1254,7 +1255,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
       buidegetTasklist(obj).then((response) => {
@@ -1418,10 +1419,12 @@
     resetQuery() {
       this.dateRange = [];
       this.dateRangefs = [];
+      this.serviceStatusValue = 10;
+
       this.topqueryParams = {
         pageNum: 1,
         pageSize: 10,
-        sendstateView:2,
+        sendstateView:1,
         sort: 2, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)
         serviceType: 3,
         searchscope: 3,
diff --git a/src/views/followvisit/mzsatisfaction/index.vue b/src/views/followvisit/mzsatisfaction/index.vue
index 0dd03b0..90c44aa 100644
--- a/src/views/followvisit/mzsatisfaction/index.vue
+++ b/src/views/followvisit/mzsatisfaction/index.vue
@@ -173,7 +173,7 @@
             </div>
           </div>
         </el-col>
-        <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
               <el-button
@@ -185,7 +185,7 @@
               >
             </div>
           </div>
-        </el-col>
+        </el-col> -->
         <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
@@ -1341,8 +1341,10 @@
       this.getList(1);
     },
     onthatday() {
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
@@ -1350,13 +1352,12 @@
       return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1368,7 +1369,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
       buidegetTasklist(obj).then((response) => {
diff --git a/src/views/followvisit/operation/index.vue b/src/views/followvisit/operation/index.vue
index d98d6e5..78a237f 100644
--- a/src/views/followvisit/operation/index.vue
+++ b/src/views/followvisit/operation/index.vue
@@ -1345,7 +1345,7 @@
       topqueryParams: {
         pageNum: 1,
         pageSize: 10,
-        sendstateView:2,
+        sendstateView:1,
         sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 鎵嬫湳瀹屾垚鏃堕棿(姝e簭)    1 鎵嬫湳瀹屾垚鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
         serviceType: 19,
         searchscope: 3,
@@ -1642,8 +1642,10 @@
       this.getList(1);
     },
     onthatday() {
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
@@ -1651,13 +1653,12 @@
       return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1669,7 +1670,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
       buidegetTasklist(obj).then((response) => {
@@ -1831,10 +1832,12 @@
     resetQuery() {
       this.dateRange = [];
       this.dateRangefs = [];
+      this.serviceStatusValue = 10;
+
       this.topqueryParams = {
         pageNum: 1,
         pageSize: 10,
-        sendstateView:2,
+        sendstateView:1,
         sort: 2, //0 鎵嬫湳瀹屾垚鏃堕棿(姝e簭)    1 鎵嬫湳瀹屾垚鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)
         serviceType: 19,
         searchscope: 3,
diff --git a/src/views/followvisit/record/detailpage/index.vue b/src/views/followvisit/record/detailpage/index.vue
index 43446b9..cb7e4ef 100644
--- a/src/views/followvisit/record/detailpage/index.vue
+++ b/src/views/followvisit/record/detailpage/index.vue
@@ -336,8 +336,8 @@
             v-if="
               (orgname == '鍗楀崕澶у闄勫睘绗竴鍖婚櫌' ||
                 orgname == '涓芥按甯傜浜屼汉姘戝尰闄�' ||
-                orgname == '缂欎簯鍘夸汉姘戝尰闄�'||
-                orgname == '涓芥按甯傚骞间繚鍋ラ櫌'||
+                orgname == '缂欎簯鍘夸汉姘戝尰闄�' ||
+                orgname == '涓芥按甯傚骞间繚鍋ラ櫌' ||
                 orgname == '鏉鹃槼鍘夸腑鍖诲尰闄�') &&
               !Voicetype
             "
@@ -999,16 +999,29 @@
           <div class="collapse-section">
             <el-collapse v-model="collapseActive" accordion>
               <el-collapse-item title="鎮h�呮。妗堜俊鎭�" name="patient">
-                <el-form ref="userform2" :model="userform" label-width="90px" size="small">
+                <el-form
+                  ref="userform2"
+                  :model="userform"
+                  label-width="90px"
+                  size="small"
+                >
                   <el-row :gutter="16">
                     <el-col :span="12">
                       <el-form-item label="鎮h�呭鍚�">
-                        <el-input v-model="userform.name" placeholder="璇疯緭鍏ュ鍚�" maxlength="30"></el-input>
+                        <el-input
+                          v-model="userform.name"
+                          placeholder="璇疯緭鍏ュ鍚�"
+                          maxlength="30"
+                        ></el-input>
                       </el-form-item>
                     </el-col>
                     <el-col :span="12">
                       <el-form-item label="鎬у埆">
-                        <el-select v-model="userform.sex" placeholder="璇烽�夋嫨" style="width: 100%">
+                        <el-select
+                          v-model="userform.sex"
+                          placeholder="璇烽�夋嫨"
+                          style="width: 100%"
+                        >
                           <el-option label="鐢�" :value="1"></el-option>
                           <el-option label="濂�" :value="2"></el-option>
                         </el-select>
@@ -1018,53 +1031,78 @@
                   <el-row :gutter="16">
                     <el-col :span="12">
                       <el-form-item label="骞撮緞">
-                        <el-input v-model="userform.age" placeholder="璇疯緭鍏ュ勾榫�" maxlength="20"></el-input>
+                        <el-input
+                          v-model="userform.age"
+                          placeholder="璇疯緭鍏ュ勾榫�"
+                          maxlength="20"
+                        ></el-input>
                       </el-form-item>
                     </el-col>
                     <el-col :span="12">
                       <el-form-item label="鑱旂郴鏂瑰紡">
-                        <el-input v-model="userform.telcode" placeholder="璇疯緭鍏ヨ仈绯绘柟寮�" maxlength="20"></el-input>
+                        <el-input
+                          v-model="userform.telcode"
+                          placeholder="璇疯緭鍏ヨ仈绯绘柟寮�"
+                          maxlength="20"
+                        ></el-input>
                       </el-form-item>
                     </el-col>
                   </el-row>
                   <el-row :gutter="16">
                     <el-col :span="24">
                       <el-form-item label="浜插睘鐢佃瘽">
-                        <el-input v-model="userform.relativetelcode" placeholder="璇疯緭鍏ヤ翰灞炶仈绯绘柟寮�" maxlength="20"></el-input>
+                        <el-input
+                          v-model="userform.relativetelcode"
+                          placeholder="璇疯緭鍏ヤ翰灞炶仈绯绘柟寮�"
+                          maxlength="20"
+                        ></el-input>
                       </el-form-item>
                     </el-col>
                   </el-row>
                   <el-row :gutter="16">
                     <el-col :span="24">
                       <el-form-item label="璇婃柇鍚嶇О">
-                        <el-input v-model="form.leavediagname" placeholder="璇疯緭鍏ヨ瘖鏂�" maxlength="50"></el-input>
+                        <el-input
+                          v-model="form.leavediagname"
+                          placeholder="璇疯緭鍏ヨ瘖鏂�"
+                          maxlength="50"
+                        ></el-input>
                       </el-form-item>
                     </el-col>
                   </el-row>
                   <el-row :gutter="16">
                     <el-col :span="24">
                       <el-form-item label="鍑虹敓鍦�">
-                        <el-input v-model="userform.birthplace" placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑" maxlength="50"></el-input>
+                        <el-input
+                          v-model="userform.birthplace"
+                          placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑"
+                          maxlength="50"
+                        ></el-input>
                       </el-form-item>
                     </el-col>
                   </el-row>
                   <el-row :gutter="16">
                     <el-col :span="24">
                       <el-form-item label="灞呬綇鍦�">
-                        <el-input v-model="userform.placeOfResidence" placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑" maxlength="50"></el-input>
+                        <el-input
+                          v-model="userform.placeOfResidence"
+                          placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑"
+                          maxlength="50"
+                        ></el-input>
                       </el-form-item>
                     </el-col>
                   </el-row>
                 </el-form>
               </el-collapse-item>
-              <el-collapse-item title="鎶曡瘔寤鸿" name="advice" v-if="orgname=='缂欎簯鍘夸汉姘戝尰闄�'">
+              <el-collapse-item
+                title="鎶曡瘔寤鸿"
+                name="advice"
+                v-if="orgname == '缂欎簯鍘夸汉姘戝尰闄�'"
+              >
                 <AdviceList :subid="taskid" :taskid="id" :patid="patid" />
               </el-collapse-item>
             </el-collapse>
           </div>
-
-
-
         </div>
       </div>
     </div>
@@ -1670,7 +1708,7 @@
     },
     // 鏄惁浠ラ棶鍗峰舰寮忓睍绀猴紙闈炶闊虫湇鍔★紝鎴栬闊虫湇鍔′絾鏃犲畬鏁磋闊虫暟鎹渶鎵嬪姩濉姤锛�
     showQuestionnaireForm() {
-      return !this.Voicetype ;
+      return !this.Voicetype;
     },
     // 鏄惁涓虹鐞嗗憳瑙掕壊
     isAdmin() {
@@ -2046,13 +2084,12 @@
                 .map((obj) => obj.targetvalue)
                 .join("&");
             }
-            console.log(item.targetvalue,'item.targetvalue');
+            console.log(item.targetvalue, "item.targetvalue");
 
             if (item.targetvalue) {
               item.scriptResult = item.targetvalue.split("&");
             }
             console.log(item.scriptResult);
-
           });
         }
       });
@@ -2118,8 +2155,11 @@
           this.$modal.msgSuccess("鏈嶅姟淇濆瓨鎴愬姛");
           this.Editsingletasksonyic(this.serviceStates);
           const orgName = localStorage.getItem("orgname");
-
-          if (this.form.isVisitAgain != 1 || this.visitAgain == 1) {
+          if (
+            this.form.isVisitAgain != 1 ||
+            orgName == "涓芥按甯備腑鍖婚櫌" ||
+            this.visitAgain == 1
+          ) {
             this.Torouter();
             return;
           }
@@ -2407,7 +2447,7 @@
       savequestiondetail(obj).then((res) => {
         if (res.code == 200) {
           this.$modal.msgSuccess("鏈嶅姟淇濆瓨鎴愬姛");
-          // this.Torouter();
+
           if (
             this.form.isVisitAgain != 1 ||
             orgName == "涓芥按甯備腑鍖婚櫌" ||
@@ -2418,6 +2458,7 @@
             this.Torouter();
             return;
           }
+
           this.$modal
             .confirm(
               '浠诲姟淇濆瓨鎴愬姛鏄惁閽堝鎮h�咃細"' +
@@ -2750,6 +2791,7 @@
         // 鍚屾椂閲嶇疆涓庨�夐」鐩稿叧鐨勭姸鎬�
         // questionItem.isabnormal = false;
         questionItem.showAppendInput = false;
+        questionItem.score = null; // 鍙栨秷閫変腑鍚庢竻绌洪鐩垎鏁�
         // 娉ㄦ剰锛氬彇娑堥�変腑鏃讹紝鎴戜滑閫氬父涓嶅笇鏈涜Е鍙戦鐩烦杞�昏緫锛屾墍浠ョ洿鎺ヨ繑鍥�
         // 濡傛灉闇�瑕侊紝鍙互鍦ㄨ繖閲屾坊鍔犲彇娑堥�変腑鍚庣殑鐗瑰畾閫昏緫锛屼緥濡傞噸缃鐩簭鍒�
       } else {
@@ -2787,6 +2829,9 @@
       // 澶勭悊寮傚父鐘舵�侀珮浜�
       this.tableDatatop[questionIndex].isabnormal =
         selectedOptionObj.isabnormal;
+
+      // 澶勭悊鍒嗘暟锛氭妸閫変腑閫夐」鐨� score 甯﹀埌棰樼洰 score 涓�
+      this.tableDatatop[questionIndex].score = selectedOptionObj.score;
 
       // 澶勭悊闄勫姞杈撳叆妗嗘樉绀�
 
@@ -2881,6 +2926,10 @@
           if (obj.isabnormal) {
             this.tableDatatop[index].isabnormal = obj.isabnormal;
           }
+          // 鍥炴樉鍗曢�夐鐩垎鏁帮細鎶婂凡閫変腑閫夐」鐨� score 甯﹀埌棰樼洰 score 涓�
+          if (obj.score !== undefined && obj.score !== null) {
+            this.tableDatatop[index].score = obj.score;
+          }
           this.$forceUpdate();
         }
       });
@@ -2952,7 +3001,18 @@
 
       return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
     },
-    updateScore(a, b, c) {},
+    // 澶氶�夛細鎶婇�変腑閫夐」鐨勫垎鏁扮疮鍔犲埌棰樼洰 score 涓�
+    updateScore(selectedValues, questionIndex, question) {
+      const options = question.svyTaskTemplateTargetoptions || [];
+      const score = options.reduce((sum, opt) => {
+        if (selectedValues && selectedValues.includes(opt.optioncontent)) {
+          return sum + (Number(opt.score) || 0);
+        }
+        return sum;
+      }, 0);
+      question.score = score;
+      this.$forceUpdate();
+    },
     // 鍚堝苟淇敼鐩稿叧=============================
     toggleMergeMode() {
       this.isMergeMode = !this.isMergeMode;
diff --git a/src/views/followvisit/record/index.vue b/src/views/followvisit/record/index.vue
index 33d5726..5f33b4b 100644
--- a/src/views/followvisit/record/index.vue
+++ b/src/views/followvisit/record/index.vue
@@ -1201,13 +1201,12 @@
       return `${year}-${month}-${day}`;
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1219,7 +1218,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
       buidegetTasklist(obj).then((response) => {
@@ -1418,8 +1417,10 @@
       });
     },
     onthatday() {
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
diff --git a/src/views/followvisit/technology/index.vue b/src/views/followvisit/technology/index.vue
index b452289..33ed94e 100644
--- a/src/views/followvisit/technology/index.vue
+++ b/src/views/followvisit/technology/index.vue
@@ -1037,13 +1037,12 @@
       });
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1055,7 +1054,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
       buidegetTasklist(obj).then((response) => {
diff --git a/src/views/followvisit/zbAgain/index.vue b/src/views/followvisit/zbAgain/index.vue
index bce150c..7b94858 100644
--- a/src/views/followvisit/zbAgain/index.vue
+++ b/src/views/followvisit/zbAgain/index.vue
@@ -173,7 +173,7 @@
             </div>
           </div>
         </el-col>
-        <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
               <el-button
@@ -185,7 +185,7 @@
               >
             </div>
           </div>
-        </el-col>
+        </el-col> -->
         <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
@@ -1005,7 +1005,7 @@
       topqueryParams: {
         pageNum: 1,
         pageSize: 10,
-        sendstateView:2,
+        sendstateView:1,
         sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
         serviceType: 13,
         searchscope: 3,
@@ -1220,8 +1220,10 @@
       this.getList(1);
     },
     onthatday() {
-      this.topqueryParams.startSendDateTime = this.getCurrentDate();
-      this.topqueryParams.endSendDateTime = this.getCurrentDate();
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
       this.getList(1);
     },
     getCurrentDate() {
@@ -1229,16 +1231,15 @@
       return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-          this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.visitDeptCodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1250,7 +1251,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         visitDeptCodes: this.topqueryParams.visitDeptCodes,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
@@ -1425,7 +1426,7 @@
       this.topqueryParams = {
         pageNum: 1,
         pageSize: 10,
-        sendstateView:2,
+        sendstateView:1,
         sort: 2, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)
         serviceType: 13,
         searchscope: 3,
diff --git a/src/views/followvisit/zysatisfaction/index.vue b/src/views/followvisit/zysatisfaction/index.vue
index 1577d9a..7197083 100644
--- a/src/views/followvisit/zysatisfaction/index.vue
+++ b/src/views/followvisit/zysatisfaction/index.vue
@@ -184,7 +184,7 @@
             </div>
           </div>
         </el-col>
-        <el-col :span="1.5">
+        <!-- <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
               <el-button
@@ -196,7 +196,7 @@
               >
             </div>
           </div>
-        </el-col>
+        </el-col> -->
         <el-col :span="1.5">
           <div class="documentf">
             <div class="document">
@@ -1359,13 +1359,12 @@
       return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
     },
     buidegetTasklist(type) {
-      if (this.topqueryParams.searchscope == 3) {
-        this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
-          (obj) => obj.deptCode
-        );
-        this.topqueryParams.leavehospitaldistrictcodes =
-          store.getters.belongWards.map((obj) => obj.districtCode);
-      }
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
+        (obj) => obj.deptCode
+      );
+      this.topqueryParams.leavehospitaldistrictcodes =
+        store.getters.belongWards.map((obj) => obj.districtCode);
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1377,7 +1376,7 @@
         pageSize: 10,
         leavehospitaldistrictcodes:
           this.topqueryParams.leavehospitaldistrictcodes,
-        sendstates: [2, 3],
+        sendstateView: 1,
         leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
       };
       buidegetTasklist(obj).then((response) => {
diff --git a/src/views/login.vue b/src/views/login.vue
index 10cf9d3..ae3f1a4 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -13,6 +13,7 @@
           type="text"
           auto-complete="off"
           placeholder="璐﹀彿"
+          @blur="handleUsernameBlur"
         >
           <svg-icon
             slot="prefix"
@@ -184,6 +185,17 @@
         }
       });
     },
+    // 杈撳叆瀹岃处鍙峰悗锛屾绱㈠彲閫夋満鏋勬槸鍚﹀寘鍚�滃崡鍗庨檮涓�鈥濓紝鑻ユ湁鍒欒嚜鍔ㄥ~鍏呭瘑鐮�
+    handleUsernameBlur() {
+      if (!this.loginForm.username) return;
+      const hasNanhua = this.options.some((item) => {
+        const label = item.label || "";
+        return label.includes("鍗楀崕") && label.includes("闄勪竴");
+      });
+      if (hasNanhua) {
+        this.loginForm.password = "nhfy@0230";
+      }
+    },
     getCookie() {
       const username = Cookies.get("username");
       const password = Cookies.get("password");
diff --git a/src/views/loginSSO.vue b/src/views/loginSSO.vue
index b11fb85..73f24c1 100644
--- a/src/views/loginSSO.vue
+++ b/src/views/loginSSO.vue
@@ -162,6 +162,8 @@
           id,
           Voicetype,
           visitCount,
+          followUpDeptCode,
+          followUpWardCode,
         } = params;
         console.log(
           token,
@@ -171,6 +173,8 @@
           deptCode,
           redirect,
           campusid,
+             followUpDeptCode,
+          followUpWardCode,
           "鍙傛暟鏃ュ織"
         );
 
@@ -229,8 +233,16 @@
             visitCount: visitCount || "",
           };
           console.log("浣跨敤taskid璺宠浆鍒拌鎯呴〉:", redirectPath, redirectQuery);
+        } else if (followUpDeptCode || followUpWardCode) {
+          // 7.2 鎼哄甫绉戝/鐥呭尯缂栫爜锛岃烦杞埌鍑洪櫌闅忚鍒楄〃骞舵寜绉戝/鐥呭尯鏌ヨ
+          redirectPath = "/followvisit/discharge";
+          redirectQuery = {
+            followUpDeptCode: followUpDeptCode || "",
+            followUpWardCode: followUpWardCode || "",
+          };
+          console.log("浣跨敤绉戝/鐥呭尯缂栫爜璺宠浆鍒板嚭闄㈤殢璁垮垪琛�:", redirectPath, redirectQuery);
         } else if (redirect) {
-          // 7.2 濡傛灉浼犲叆鐨剅edirect瀛樺湪锛屼娇鐢ㄤ紶鍏ョ殑閲嶅畾鍚戣矾寰�
+          // 7.3 濡傛灉浼犲叆鐨剅edirect瀛樺湪锛屼娇鐢ㄤ紶鍏ョ殑閲嶅畾鍚戣矾寰�
           try {
             redirectPath = decodeURIComponent(redirect);
             console.log("浣跨敤浼犲叆鐨勯噸瀹氬悜璺緞:", redirectPath);
@@ -239,7 +251,7 @@
             redirectPath = this.getDefaultRedirectPath();
           }
         } else {
-          // 7.3 浣跨敤榛樿璺緞
+          // 7.4 浣跨敤榛樿璺緞
           redirectPath = this.getDefaultRedirectPath();
         }
 
diff --git a/src/views/patient/archives/childHealth/detail.vue b/src/views/patient/archives/childHealth/detail.vue
index 9505e80..be662b4 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,54 @@
       <!-- 瀹堕暱淇℃伅 -->
       <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-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" /></el-form-item></el-col>
+            <el-col :span="8"><el-form-item label="鍑虹敓瀛曞懆"><el-input v-model="archive.gestationalWeek" class="w-xs" /></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">
         <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 +99,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 +118,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 +145,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 +176,15 @@
 <script>
 import EditableTable from "../components/EditableTable.vue";
 import InfoField from "./InfoField.vue";
+import ServiceRecords from "../components/ServiceRecords.vue";
+import { loadArchives, saveArchives } from "../types";
 
 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" },
       ],
@@ -203,21 +237,17 @@
       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 : "-";
-    },
   },
   created() {
     const id = this.$route.query.id;
-    if (id) this.loadArchive(id);
+    if (id) this.loadArchive(id, this.$route.query.edit == 1);
   },
   methods: {
-    loadArchive(id) {
+    loadArchive(id, autoEdit) {
       this.loading = true;
-      const all = JSON.parse(localStorage.getItem("patientArchives") || "[]");
-      this.archive = all.find(item => item.id === id) || null;
+      this.archive = loadArchives().find((item) => item.id === id) || 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();
@@ -232,6 +262,7 @@
           Object.assign(this.form, this.archive.archiveForm.learningData);
         }
       }
+      if (autoEdit) this.editing = true;
       this.loading = false;
     },
     toggleEdit() {
@@ -251,13 +282,24 @@
           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 all = loadArchives();
         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));
+        saveArchives(all);
         this.$message.success("淇濆瓨鎴愬姛");
       }
       this.editing = !this.editing;
+    },
+    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("宸茬粨妗�");
+      }).catch(() => {});
     },
     subTypeTag(type) { const m={highRisk:"danger",nutrition:"warning",learning:"info"}; return m[type]||""; },
   },
@@ -297,6 +339,13 @@
 </script>
 
 <style lang="scss" scoped>
+// 杈撳叆妗嗗搴︼紙鎸夊瓧娈甸暱鐭尯鍒嗭級
+.w-xs { width: 90px; }
+.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; }
diff --git a/src/views/patient/archives/components/ArchiveDialog.vue b/src/views/patient/archives/components/ArchiveDialog.vue
index a5a4207..3b54e85 100644
--- a/src/views/patient/archives/components/ArchiveDialog.vue
+++ b/src/views/patient/archives/components/ArchiveDialog.vue
@@ -1,15 +1,14 @@
 <template>
   <el-dialog
-    :title="dialogTitle"
+    :title="standalone ? '鏂板缓寤烘。' : '閫夋嫨寤烘。绫诲瀷'"
     :visible.sync="dialogVisible"
-    width="750px"
+    width="640px"
     :close-on-click-modal="false"
     append-to-body
     @close="handleClose"
-    top="3vh"
   >
     <!-- 宸查�夋偅鑰呴瑙堬紙鍏宠仈寤烘。妯″紡锛� -->
-    <div class="archive-section" v-if="selectedPatients.length > 0">
+    <div class="archive-section" v-if="!standalone && selectedPatients.length > 0">
       <div class="section-title">宸查�夋偅鑰咃紙{{ selectedPatients.length }}浜猴級</div>
       <el-table :data="selectedPatients" border size="small" max-height="180">
         <el-table-column prop="patname" label="濮撳悕" width="80" align="center" />
@@ -52,186 +51,24 @@
       <el-divider />
     </div>
 
-    <!-- 鍎夸繚绉戯細瀹堕暱淇℃伅锛堝繀濉級 -->
-    <div class="archive-section" v-if="mainCategory === 'child'">
-      <div class="section-title">瀹堕暱/鐩戞姢浜轰俊鎭�</div>
-      <el-form :model="parentInfo" label-width="100px" size="small" inline>
-        <el-form-item label="瀹堕暱濮撳悕" required>
-          <el-input v-model="parentInfo.parentName" placeholder="璇疯緭鍏�" style="width:150px" />
-        </el-form-item>
-        <el-form-item label="涓庡効绔ュ叧绯�">
-          <el-select v-model="parentInfo.relation" style="width:120px">
-            <el-option label="鐖朵翰" value="father" />
-            <el-option label="姣嶄翰" value="mother" />
-            <el-option label="绁栫埗" value="grandfather" />
-            <el-option label="绁栨瘝" value="grandmother" />
-            <el-option label="鍏朵粬" value="other" />
-          </el-select>
-        </el-form-item>
-        <el-form-item label="鑱旂郴鐢佃瘽" required>
-          <el-input v-model="parentInfo.parentPhone" placeholder="鑱旂郴鐢佃瘽" style="width:150px" />
-        </el-form-item>
-        <el-form-item label="韬唤璇佸彿">
-          <el-input v-model="parentInfo.parentIdCard" placeholder="韬唤璇佸彿" style="width:200px" />
-        </el-form-item>
-        <el-form-item label="鑱旂郴鍦板潃">
-          <el-input v-model="parentInfo.address" placeholder="鑱旂郴鍦板潃" style="width:300px" />
-        </el-form-item>
-      </el-form>
-      <el-divider />
-    </div>
-
-    <!-- 寤烘。涓诲垎绫� -->
+    <!-- 涓撴绫诲瀷閫夋嫨 -->
     <div class="archive-section">
-      <div class="section-title">閫夋嫨寤烘。绫诲瀷</div>
-      <el-radio-group v-model="mainCategory" size="medium" @change="onMainCategoryChange">
-        <el-radio-button label="child">鍎夸繚绉戝缓妗�</el-radio-button>
-        <el-radio-button label="maternal">濡囦繚绉戝缓妗�</el-radio-button>
-      </el-radio-group>
-    </div>
-
-    <!-- 瀛愮被鍨� -->
-    <div class="archive-section" v-if="mainCategory">
       <div class="section-title">閫夋嫨涓撴绫诲瀷</div>
-      <el-radio-group v-model="subType" size="small" @change="onSubTypeChange">
-        <template v-if="mainCategory === 'child'">
-          <el-radio-button label="highRisk">楂樺嵄鍎夸笓妗堢鐞�</el-radio-button>
-          <el-radio-button label="nutrition">钀ュ吇鎬х柧鐥呬笓妗堢鐞�</el-radio-button>
-          <el-radio-button label="learning">瀛︿範鍥伴毦涓撴绠$悊</el-radio-button>
-        </template>
-        <template v-else>
-          <el-radio-button label="pregnancy">瀛曞闅忚</el-radio-button>
-          <el-radio-button label="menopause">鏇村勾鏈熼殢璁�</el-radio-button>
-        </template>
+      <el-radio-group v-model="subType" size="medium">
+        <el-radio-button v-for="t in typeOptions" :key="t.key" :label="t.key">{{ t.entryLabel }}</el-radio-button>
       </el-radio-group>
-    </div>
-
-    <!-- 寤烘。涓撳睘瀛楁 -->
-    <div class="archive-section" v-if="subType">
-      <div class="section-title">寤烘。淇℃伅</div>
-      <el-form :model="archiveForm" label-width="120px" size="small">
-        <!-- 鍎夸繚绉� - 楂樺嵄鍎� -->
-        <template v-if="mainCategory === 'child' && subType === 'highRisk'">
-          <el-form-item label="楂樺嵄鍥犵礌">
-            <el-select v-model="archiveForm.riskFactor" multiple placeholder="鍙閫�" style="width:100%">
-              <el-option label="鏃╀骇/浣庝綋閲�" value="preterm" />
-              <el-option label="绐掓伅鍙�" value="asphyxia" />
-              <el-option label="棰呭唴鍑鸿" value="ich" />
-              <el-option label="楂樿儐绾㈢礌琛�鐥�" value="hyperbilirubinemia" />
-              <el-option label="瀹唴鎰熸煋" value="intrauterine" />
-              <el-option label="鍏堝ぉ鐣稿舰" value="malformation" />
-              <el-option label="鍏朵粬" value="other" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="鍑虹敓浣撻噸(g)">
-            <el-input-number v-model="archiveForm.birthWeight" :min="500" :max="6000" />
-          </el-form-item>
-          <el-form-item label="鍑虹敓瀛曞懆">
-            <el-input-number v-model="archiveForm.gestationalWeek" :min="22" :max="42" :precision="1" /> 鍛�
-          </el-form-item>
-          <el-form-item label="寤烘。鍖荤敓">
-            <el-input v-model="archiveForm.doctorName" placeholder="璇疯緭鍏ュ缓妗e尰鐢�" />
-          </el-form-item>
-          <el-form-item label="澶囨敞">
-            <el-input v-model="archiveForm.remark" type="textarea" :rows="2" />
-          </el-form-item>
-        </template>
-
-        <!-- 鍎夸繚绉� - 钀ュ吇鎬х柧鐥� -->
-        <template v-if="mainCategory === 'child' && subType === 'nutrition'">
-          <el-form-item label="钀ュ吇璇婃柇" required>
-            <el-select v-model="archiveForm.nutritionDiagnosis" placeholder="璇烽�夋嫨" style="width:100%">
-              <el-option label="钀ュ吇涓嶈壇" value="malnutrition" />
-              <el-option label="瓒呴噸" value="overweight" />
-              <el-option label="鑲ヨ儢" value="obesity" />
-              <el-option label="寰噺鍏冪礌缂轰箯" value="micronutrient" />
-              <el-option label="鍠傚吇鍥伴毦" value="feeding" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="寤烘。鍖荤敓">
-            <el-input v-model="archiveForm.doctorName" placeholder="璇疯緭鍏ュ缓妗e尰鐢�" />
-          </el-form-item>
-          <el-form-item label="澶囨敞">
-            <el-input v-model="archiveForm.remark" type="textarea" :rows="2" />
-          </el-form-item>
-        </template>
-
-        <!-- 鍎夸繚绉� - 瀛︿範鍥伴毦 -->
-        <template v-if="mainCategory === 'child' && subType === 'learning'">
-          <el-form-item label="瀛︿範闂" required>
-            <el-select v-model="archiveForm.learningIssue" placeholder="璇烽�夋嫨" style="width:100%">
-              <el-option label="闃呰闅滅" value="dyslexia" />
-              <el-option label="涔﹀啓闅滅" value="dysgraphia" />
-              <el-option label="璁$畻闅滅" value="dyscalculia" />
-              <el-option label="娉ㄦ剰鍔涚己闄�" value="adhd" />
-              <el-option label="娣峰悎鍨�" value="mixed" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="寤烘。鍖荤敓">
-            <el-input v-model="archiveForm.doctorName" placeholder="璇疯緭鍏ュ缓妗e尰鐢�" />
-          </el-form-item>
-          <el-form-item label="澶囨敞">
-            <el-input v-model="archiveForm.remark" type="textarea" :rows="2" />
-          </el-form-item>
-        </template>
-
-        <!-- 濡囦繚绉� - 瀛曞闅忚 -->
-        <template v-if="mainCategory === 'maternal' && subType === 'pregnancy'">
-          <el-form-item label="鏈鏈堢粡">
-            <el-date-picker v-model="archiveForm.lmp" type="date" value-format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" style="width:100%" />
-          </el-form-item>
-          <el-row :gutter="12">
-            <el-col :span="8"><el-form-item label="瀛曞懆"><el-input-number v-model="archiveForm.gestationalWeek" :min="1" :max="42" :precision="1" /> 鍛�</el-form-item></el-col>
-            <el-col :span="8"><el-form-item label="瀛曟"><el-input-number v-model="archiveForm.gravidity" :min="1" :max="20" /></el-form-item></el-col>
-            <el-col :span="8"><el-form-item label="浜ф"><el-input-number v-model="archiveForm.parity" :min="0" :max="20" /></el-form-item></el-col>
-          </el-row>
-          <el-form-item label="棰勪骇鏈�">
-            <el-date-picker v-model="archiveForm.edd" type="date" value-format="yyyy-MM-dd" placeholder="閫夋嫨棰勪骇鏈�" style="width:100%" />
-          </el-form-item>
-          <el-form-item label="楂樺嵄濡婂">
-            <el-switch v-model="archiveForm.highRiskPregnancy" active-text="鏄�" inactive-text="鍚�" />
-          </el-form-item>
-          <el-form-item label="寤烘。鍖荤敓">
-            <el-input v-model="archiveForm.doctorName" placeholder="璇疯緭鍏ュ缓妗e尰鐢�" />
-          </el-form-item>
-          <el-form-item label="澶囨敞">
-            <el-input v-model="archiveForm.remark" type="textarea" :rows="2" />
-          </el-form-item>
-        </template>
-
-        <!-- 濡囦繚绉� - 鏇村勾鏈熼殢璁� -->
-        <template v-if="mainCategory === 'maternal' && subType === 'menopause'">
-          <el-form-item label="鏈堢粡鐘舵��">
-            <el-select v-model="archiveForm.menstrualStatus" placeholder="璇烽�夋嫨" style="width:100%">
-              <el-option label="鏈堢粡绱婁贡" value="irregular" />
-              <el-option label="闂粡锛�<12涓湀锛�" value="amenorrhea_short" />
-              <el-option label="缁濈粡锛堚墺12涓湀锛�" value="menopause" />
-              <el-option label="浜哄伐缁濈粡" value="surgical" />
-            </el-select>
-          </el-form-item>
-          <el-form-item label="鏈鏈堢粡">
-            <el-date-picker v-model="archiveForm.lmp" type="date" value-format="yyyy-MM-dd" placeholder="閫夋嫨鏃ユ湡" style="width:100%" />
-          </el-form-item>
-          <el-form-item label="寤烘。鍖荤敓">
-            <el-input v-model="archiveForm.doctorName" placeholder="璇疯緭鍏ュ缓妗e尰鐢�" />
-          </el-form-item>
-          <el-form-item label="澶囨敞">
-            <el-input v-model="archiveForm.remark" type="textarea" :rows="2" />
-          </el-form-item>
-        </template>
-      </el-form>
     </div>
 
     <div slot="footer" class="dialog-footer">
       <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
-      <el-button type="primary" :loading="submitting" @click="handleSubmit" :disabled="!canSubmit">
-        纭寤烘。
-      </el-button>
+      <el-button type="primary" :loading="submitting" @click="handleSubmit" :disabled="!canSubmit">纭寤烘。</el-button>
     </div>
   </el-dialog>
 </template>
 
 <script>
+import { ARCHIVE_TYPES, loadArchives, saveArchives, buildArchiveRecord } from "../types";
+
 export default {
   name: "ArchiveDialog",
   props: {
@@ -243,33 +80,20 @@
   data() {
     return {
       dialogVisible: false,
-      mainCategory: "",
       subType: "",
       submitting: false,
       standalonePatient: { patname: "", sex: 2, age: "", telcode: "", deptname: "", diagname: "" },
-      parentInfo: { parentName: "", relation: "", parentPhone: "", parentIdCard: "", address: "" },
-      archiveForm: {
-        riskFactor: [], birthWeight: null, gestationalWeek: null,
-        nutritionDiagnosis: "", learningIssue: "",
-        gravidity: 1, parity: 0, edd: "", lmp: "",
-        highRiskPregnancy: false, menstrualStatus: "",
-        doctorName: "", remark: "",
-      },
     };
   },
   computed: {
-    dialogTitle() {
-      return this.standalone ? "鏂板缓寤烘。" : "鎮h�呭缓妗�";
-    },
+    typeOptions() { return ARCHIVE_TYPES; },
     canSubmit() {
       if (!this.subType) return false;
-      if (this.mainCategory === 'child' && !this.parentInfo.parentName) return false;
       if (this.standalone && !this.standalonePatient.patname) return false;
+      if (!this.standalone && this.selectedPatients.length === 0) return false;
       return true;
     },
-    selectedPatients() {
-      return this.patients || [];
-    },
+    selectedPatients() { return this.patients || []; },
   },
   watch: {
     visible(val) {
@@ -282,83 +106,31 @@
   },
   methods: {
     resetForm() {
-      this.mainCategory = "";
       this.subType = "";
       this.standalonePatient = { patname: "", sex: 2, age: "", telcode: "", deptname: "", diagname: "" };
-      this.parentInfo = { parentName: "", relation: "", parentPhone: "", parentIdCard: "", address: "" };
-      this.archiveForm = {
-        riskFactor: [], birthWeight: null, gestationalWeek: null,
-        nutritionDiagnosis: "", learningIssue: "",
-        gravidity: 1, parity: 0, edd: "", lmp: "",
-        highRiskPregnancy: false, menstrualStatus: "",
-        doctorName: "", remark: "",
-      };
     },
-    onMainCategoryChange() { this.subType = ""; },
-    onSubTypeChange() {},
-
-    getSubTypeLabel() {
-      const map = { highRisk: "楂樺嵄鍎夸笓妗堢鐞�", nutrition: "钀ュ吇鎬х柧鐥呬笓妗堢鐞�", learning: "瀛︿範鍥伴毦涓撴绠$悊", pregnancy: "瀛曞闅忚", menopause: "鏇村勾鏈熼殢璁�" };
-      return map[this.subType] || "";
-    },
-    getMainCategoryLabel() {
-      return this.mainCategory === "child" ? "鍎夸繚绉戝缓妗�" : "濡囦繚绉戝缓妗�";
-    },
-
     handleSubmit() {
       if (!this.subType) { this.$message.warning("璇烽�夋嫨涓撴绫诲瀷"); return; }
+      if (this.standalone && !this.standalonePatient.patname) { this.$message.warning("璇疯緭鍏ュ鍚�"); return; }
       if (!this.standalone && this.selectedPatients.length === 0) { this.$message.warning("璇烽�夋嫨鎮h��"); return; }
       this.submitting = true;
 
-      const archives = JSON.parse(localStorage.getItem("patientArchives") || "[]");
-      const now = new Date().toISOString().replace("T", " ").substring(0, 19);
-
-      // 纭畾鎮h�呭垪琛�
-      const patientList = this.standalone
-        ? [{ ...this.standalonePatient, patid: "sa_" + Date.now() }]
-        : this.selectedPatients;
-
-      patientList.forEach((patient) => {
-        archives.push({
-          id: "arc_" + Date.now() + "_" + Math.random().toString(36).substr(2, 6),
-          patientId: patient.patid || patient.id,
-          patname: patient.patname,
-          sex: patient.sex,
-          age: patient.age,
-          telcode: patient.telcode || patient.phone || "",
-          deptname: patient.deptname || "",
-          diagname: patient.diagname || "",
-          inhospno: patient.inhospno || "",
-          outhospno: patient.outhospno || "",
-          bedNo: patient.bedNo || "",
-          drname: patient.drname || "",
-          nurseName: patient.nurseName || "",
-          starttime: patient.starttime || patient.admitdate || "",
-          mainCategory: this.mainCategory,
-          mainCategoryLabel: this.getMainCategoryLabel(),
-          subType: this.subType,
-          subTypeLabel: this.getSubTypeLabel(),
-          archiveForm: JSON.parse(JSON.stringify(this.archiveForm)),
-          parentInfo: this.mainCategory === 'child' ? JSON.parse(JSON.stringify(this.parentInfo)) : {},
-          sourcePage: this.standalone ? "standalone" : this.sourcePage,
-          status: "active",
-          createTime: now,
-          updateTime: now,
-        });
-      });
-
-      localStorage.setItem("patientArchives", JSON.stringify(archives));
+      const patientList = this.standalone ? [this.standalonePatient] : this.selectedPatients;
+      const sourcePage = this.standalone ? "standalone" : this.sourcePage;
+      const records = patientList.map((p) => buildArchiveRecord(p, this.subType, sourcePage));
+      saveArchives([...loadArchives(), ...records]);
 
       this.submitting = false;
       this.dialogVisible = false;
-      this.$message.success(`鎴愬姛鍒涘缓 ${patientList.length} 鏉″缓妗h褰昤);
+      this.$message.success(`鎴愬姛鍒涘缓 ${records.length} 鏉″缓妗h褰昤);
       this.$emit("created");
 
-      // 璺宠浆
-      const routePath = this.mainCategory === "child"
-        ? "/filing/childHealth"
-        : "/filing/maternalHealth";
-      this.$router.push({ path: routePath });
+      // 杩涘叆璇︽儏椤碉紙缂栬緫鎬侊級
+      const first = records[0];
+      const type = ARCHIVE_TYPES.find((t) => t.key === this.subType);
+      if (first && type) {
+        this.$router.push({ path: type.detailRoute, query: { id: first.id, edit: 1 } });
+      }
     },
     handleClose() { this.resetForm(); },
   },
diff --git a/src/views/patient/archives/components/ArchiveList.vue b/src/views/patient/archives/components/ArchiveList.vue
new file mode 100644
index 0000000..8dac4b7
--- /dev/null
+++ b/src/views/patient/archives/components/ArchiveList.vue
@@ -0,0 +1,148 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="80px">
+      <el-form-item label="濮撳悕">
+        <el-input v-model="queryParams.patname" placeholder="璇疯緭鍏ュ鍚�" clearable @keyup.enter.native="handleQuery" style="width:180px" />
+      </el-form-item>
+      <el-form-item label="璇婃柇">
+        <el-input v-model="queryParams.diagname" placeholder="璇疯緭鍏ヨ瘖鏂�" clearable @keyup.enter.native="handleQuery" style="width:180px" />
+      </el-form-item>
+      <el-form-item label="寤烘。鏃ユ湡">
+        <el-date-picker v-model="dateRange" style="width:240px" value-format="yyyy-MM-dd" type="daterange"
+          range-separator="-" start-placeholder="寮�濮嬫棩鏈�" end-placeholder="缁撴潫鏃ユ湡" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="medium" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" size="medium" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="medium" @click="handleCreate">鏂板缓寤烘。</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="danger" plain icon="el-icon-delete" size="medium" :disabled="multiple" @click="handleDelete">鍒犻櫎</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList" />
+    </el-row>
+
+    <el-table v-loading="loading" :data="displayList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="50" align="center" />
+      <el-table-column
+        v-for="col in typeConfig.columns"
+        :key="col.prop"
+        :label="col.label"
+        align="center"
+        show-overflow-tooltip
+      >
+        <template slot-scope="scope">
+          <el-tag v-if="col.type === 'closeStatus'" :type="scope.row.closeStatus == 1 ? 'info' : 'success'" size="mini">
+            {{ cellValue(scope.row, col) }}
+          </el-tag>
+          <span v-else>{{ cellValue(scope.row, col) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="鎿嶄綔" align="center" fixed="right" width="120">
+        <template slot-scope="scope">
+          <el-button size="medium" type="text" @click="goDetail(scope.row)">
+            <span class="button-textsc"><i class="el-icon-zoom-in" />鏌ョ湅</span>
+          </el-button>
+          <el-button size="medium" type="text" @click="handleSingleDelete(scope.row)">
+            <span style="color:#f56c6c"><i class="el-icon-delete" />鍒犻櫎</span>
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <OutpatientPicker :visible.sync="pickerVisible" :type="type" @picked="onPicked" />
+  </div>
+</template>
+
+<script>
+import OutpatientPicker from "./OutpatientPicker.vue";
+import { getTypeByKey, loadArchives, saveArchives } from "../types";
+
+export default {
+  name: "ArchiveList",
+  components: { OutpatientPicker },
+  props: {
+    type: { type: String, default: "" },
+  },
+  data() {
+    return {
+      loading: false, showSearch: true, multiple: true, ids: [], dateRange: [],
+      total: 0, allList: [], displayList: [], pickerVisible: false,
+      queryParams: { pageNum: 1, pageSize: 10, patname: "", diagname: "" },
+    };
+  },
+  computed: {
+    typeConfig() {
+      return getTypeByKey(this.type) || { columns: [], detailRoute: "/filing/maternalDetail" };
+    },
+  },
+  created() { this.getList(); },
+  methods: {
+    getList() {
+      this.loading = true;
+      const all = loadArchives().filter((item) => item.subType === this.type);
+      let filtered = [...all];
+      if (this.queryParams.patname) filtered = filtered.filter((i) => i.patname && i.patname.includes(this.queryParams.patname));
+      if (this.queryParams.diagname) filtered = filtered.filter((i) => i.diagname && i.diagname.includes(this.queryParams.diagname));
+      if (this.dateRange && this.dateRange.length === 2) {
+        filtered = filtered.filter((i) => {
+          const d = (i.createTime || "").substring(0, 10);
+          return d >= this.dateRange[0] && d <= this.dateRange[1];
+        });
+      }
+      this.total = filtered.length;
+      const start = (this.queryParams.pageNum - 1) * this.queryParams.pageSize;
+      this.displayList = filtered.slice(start, start + this.queryParams.pageSize);
+      this.loading = false;
+    },
+    handleQuery() { this.queryParams.pageNum = 1; this.getList(); },
+    resetQuery() {
+      this.dateRange = [];
+      this.queryParams = { pageNum: 1, pageSize: 10, patname: "", diagname: "" };
+      this.getList();
+    },
+    handleSelectionChange(s) { this.ids = s.map((i) => i.id); this.multiple = !s.length; },
+    handleDelete() {
+      if (this.ids.length === 0) { this.$modal.msgWarning("璇疯嚦灏戦�夋嫨涓�鏉�"); return; }
+      this.$modal.confirm("纭鍒犻櫎閫変腑妗f锛�").then(() => {
+        const remaining = loadArchives().filter((item) => !this.ids.includes(item.id));
+        saveArchives(remaining);
+        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        this.getList();
+      }).catch(() => {});
+    },
+    handleSingleDelete(row) { this.ids = [row.id]; this.handleDelete(); },
+    handleCreate() { this.pickerVisible = true; },
+    onPicked(record) {
+      this.getList();
+      this.$router.push({ path: this.typeConfig.detailRoute, query: { id: record.id, edit: 1 } });
+    },
+    goDetail(row) {
+      this.$router.push({ path: this.typeConfig.detailRoute, query: { id: row.id } });
+    },
+    getProp(obj, path) {
+      if (!path) return "";
+      return path.split(".").reduce((o, k) => (o == null ? o : o[k]), obj);
+    },
+    cellValue(row, col) {
+      const val = this.getProp(row, col.prop);
+      if (col.type === "sex") return val == 1 ? "鐢�" : "濂�";
+      if (col.type === "date") return val ? String(val).substring(0, 10) : "-";
+      if (col.type === "closeStatus") return val == 1 ? "宸茬粨妗�" : "鏈粨妗�";
+      return val || "-";
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.button-textsc { color: #3664d9; }
+</style>
diff --git a/src/views/patient/archives/components/OutpatientPicker.vue b/src/views/patient/archives/components/OutpatientPicker.vue
new file mode 100644
index 0000000..290ef91
--- /dev/null
+++ b/src/views/patient/archives/components/OutpatientPicker.vue
@@ -0,0 +1,145 @@
+<template>
+  <el-dialog
+    title="閫夋嫨闂ㄨ瘖璁板綍"
+    :visible.sync="dialogVisible"
+    width="85%"
+    append-to-body
+    top="4vh"
+    :close-on-click-modal="false"
+    @close="handleClose"
+  >
+    <el-form :inline="true" size="small" label-width="56px">
+      <el-form-item label="濮撳悕">
+        <el-input v-model="queryParams.patname" placeholder="璇疯緭鍏ュ鍚�" clearable style="width:160px" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="璇婃柇">
+        <el-input v-model="queryParams.diagname" placeholder="璇疯緭鍏ヨ瘖鏂�" clearable style="width:160px" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">鎼滅储</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">閲嶇疆</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-table
+      v-loading="loading"
+      :data="list"
+      border
+      highlight-current-row
+      style="width: 100%"
+      @current-change="handleCurrentChange"
+    >
+      <el-table-column label="灏辫瘖鏃堕棿" align="center" width="140">
+        <template slot-scope="scope">{{ formatTime(scope.row.admitdate) }}</template>
+      </el-table-column>
+      <el-table-column label="鐥呮鍙�" align="center" prop="outhospno" width="110" />
+      <el-table-column label="濮撳悕" align="center" prop="patname" width="100" />
+      <el-table-column label="鎬у埆" align="center" width="60">
+        <template slot-scope="scope">{{ scope.row.sex == 1 ? "鐢�" : "濂�" }}</template>
+      </el-table-column>
+      <el-table-column label="骞撮緞" align="center" prop="age" width="60" />
+      <el-table-column label="鑱旂郴鐢佃瘽" align="center" prop="telcode" width="120" />
+      <el-table-column label="璇婃柇" align="center" prop="diagname" show-overflow-tooltip />
+      <el-table-column label="灏辫瘖绉戝" align="center" prop="deptname" show-overflow-tooltip />
+      <el-table-column label="鎺ヨ瘖鍖荤敓" align="center" prop="drname" width="100" />
+    </el-table>
+
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+      <el-button type="primary" :disabled="!currentRow" @click="handleConfirm">纭畾</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { listPatouthosp } from "@/api/smartor/patouthosp";
+import { loadArchives, saveArchives, buildArchiveRecord } from "../types";
+import store from "@/store";
+
+export default {
+  name: "OutpatientPicker",
+  props: {
+    visible: { type: Boolean, default: false },
+    type: { type: String, default: "" },
+    sourcePage: { type: String, default: "outpatient" },
+  },
+  data() {
+    return {
+      dialogVisible: false,
+      loading: false,
+      list: [],
+      total: 0,
+      currentRow: null,
+      queryParams: { pageNum: 1, pageSize: 10, patname: "", diagname: "", searchscope: 3, deptcodes: [] },
+    };
+  },
+  watch: {
+    visible(val) {
+      this.dialogVisible = val;
+      if (val) {
+        this.currentRow = null;
+        this.getList();
+      }
+    },
+    dialogVisible(val) {
+      if (!val) this.$emit("update:visible", false);
+    },
+  },
+  methods: {
+    getList() {
+      this.loading = true;
+      if (this.queryParams.searchscope == 3) {
+        this.queryParams.deptcodes = store.getters.belongDepts.map((obj) => obj.deptCode);
+      }
+      listPatouthosp(this.queryParams)
+        .then((response) => {
+          this.list = response.rows || [];
+          this.total = response.total || 0;
+        })
+        .finally(() => { this.loading = false; });
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    resetQuery() {
+      this.queryParams = { pageNum: 1, pageSize: 10, patname: "", diagname: "", searchscope: 3, deptcodes: [] };
+      this.currentRow = null;
+      this.getList();
+    },
+    handleCurrentChange(row) {
+      this.currentRow = row;
+    },
+    formatTime(time) {
+      if (!time) return "-";
+      return String(time).substring(0, 19).replace("T", " ");
+    },
+    handleConfirm() {
+      if (!this.currentRow) return;
+      const record = buildArchiveRecord(this.currentRow, this.type, this.sourcePage);
+      const all = loadArchives();
+      all.push(record);
+      saveArchives(all);
+      this.dialogVisible = false;
+      this.$emit("picked", record);
+    },
+    handleClose() {
+      this.currentRow = null;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.dialog-footer {
+  text-align: right;
+}
+</style>
diff --git a/src/views/patient/archives/components/ServiceRecords.vue b/src/views/patient/archives/components/ServiceRecords.vue
new file mode 100644
index 0000000..560b03e
--- /dev/null
+++ b/src/views/patient/archives/components/ServiceRecords.vue
@@ -0,0 +1,344 @@
+<template>
+  <el-card class="service-records" shadow="never" style="margin-top: 14px">
+    <div slot="header" class="card-header"><span>鏈嶅姟璁板綍</span></div>
+    <div v-loading="loading">
+      <div v-if="record.length === 0" class="empty-mini">鏆傛棤鏈嶅姟璁板綍</div>
+      <div v-else class="service-record">
+        <div class="service-item" v-for="(item, idx) in record" :key="idx">
+          <el-card shadow="never" class="service-card">
+            <!-- 鏍囬琛岋細鏈嶅姟绫诲瀷 + 浠诲姟鍚嶇О + 闅忚鐘舵�� + 寮傚父鐘舵�� -->
+            <div class="service-card__header">
+              <div class="service-card__title">
+                <span class="service-badge">{{ typeName(item.serviceType) }}</span>
+                <span class="service-name">{{ item.taskName || item.templatename || "-" }}</span>
+              </div>
+              <div class="service-card__tags">
+                <el-tag v-if="item.sendstateView == 1" type="primary" size="small" effect="dark">寰呴殢璁�</el-tag>
+                <el-tag v-else-if="item.sendstateView == 2" type="success" size="small" effect="dark">宸插畬鎴�</el-tag>
+                <el-tag v-else-if="item.sendstateView == 3" type="warning" size="small" effect="dark">鏃犻渶闅忚</el-tag>
+                <span class="service-status" :class="item.excep == 0 ? 'is-ok' : 'is-bad'">
+                  {{ item.excep == 0 ? "鏈嶅姟姝e父" : item.excep == 2 ? "璀﹀憡" : "寮傚父" }}
+                </span>
+              </div>
+            </div>
+
+            <!-- 鏃堕棿绾匡細鍑洪櫌 鈫� 搴旇 鈫� 瀹屾垚 -->
+            <div class="service-card__timeline">
+              <span><em>鍑洪櫌</em>{{ fmtTime(item.endtime) }}</span>
+              <i>鈫�</i>
+              <span><em>搴旇</em>{{ fmtTime(item.visitTime) }}</span>
+              <i>鈫�</i>
+              <span><em>瀹屾垚</em>{{ fmtTime(item.finishtime) }}</span>
+            </div>
+
+            <!-- 涓夋爮涓讳綋 -->
+            <div class="service-card__columns">
+              <!-- 鈶� 鎮h�呬俊鎭� -->
+              <div class="svc-block svc-block--blue">
+                <div class="svc-block__title"><i class="el-icon-user-solid"></i>鎮h�呬俊鎭�</div>
+                <div class="svc-block__row">
+                  <span class="svc-name">{{ item.sendname || "-" }}</span>
+                  <span class="svc-sub">{{ sexName(item.sex) }}</span>
+                  <span class="svc-sub">{{ item.phone || "-" }}</span>
+                  <span class="svc-sub" v-if="item.endtime">鍑洪櫌{{ endDay(item.endtime) }}澶�</span>
+                </div>
+                <div class="svc-block__row svc-sub" v-if="item.sfzh">韬唤璇侊細{{ item.sfzh }}</div>
+                <div class="svc-block__row" v-if="item.leavediagname"><span class="svc-diag">璇婃柇</span>{{ item.leavediagname }}</div>
+              </div>
+
+              <!-- 鈶� 绉戝鐥呭尯 路 鍖绘姢 -->
+              <div class="svc-block svc-block--green">
+                <div class="svc-block__title"><i class="el-icon-office-building"></i>绉戝鐥呭尯 路 鍖绘姢</div>
+                <div class="svc-block__row">绉戝锛歿{ item.deptname || "-" }} / 鐥呭尯锛歿{ item.leavehospitaldistrictname || "-" }}</div>
+                <div class="svc-block__row">
+                  涓绘不锛歿{ item.drname || "-" }}
+                  <span class="svc-sub">缁忕锛歿{ item.managementDoctor || "-" }}</span>
+                  <span class="svc-sub">鎶ゅ+锛歿{ item.nurseName || "-" }}</span>
+                </div>
+                <div class="svc-block__row svc-sub">闅忚浜哄憳锛歿{ item.updateBy || "-" }}</div>
+                <div class="svc-block__row svc-sub">璐熻矗浜猴細{{ item.createBy || "-" }}</div>
+              </div>
+
+              <!-- 鈶� 鎵ц璇︽儏 -->
+              <div class="svc-block svc-block--gray">
+                <div class="svc-block__title"><i class="el-icon-s-management"></i>鎵ц璇︽儏</div>
+                <div class="svc-meta">
+                  <span v-if="item.sendstate || item.sendstate === 0"><em>鐘舵��</em>{{ sendStateName(item.sendstate) }}</span>
+                  <span v-if="preach(item.preachform)"><em>鎵ц</em>{{ preach(item.preachform) }}</span>
+                  <span v-if="item.templatename"><em>妯℃澘</em>{{ item.templatename }}</span>
+                  <span v-if="item.suggest !== undefined && item.suggest !== null && item.suggest !== ''"><em>鎰忚</em><dict-tag :options="dict.type.sys_suggest" :value="item.suggest" /></span>
+                  <span v-if="item.remark"><em>璇存槑</em>{{ item.remark }}</span>
+                  <span v-if="item.createTime"><em>鍒涘缓</em>{{ fmtTime(item.createTime) }}</span>
+                </div>
+              </div>
+            </div>
+          </el-card>
+        </div>
+      </div>
+    </div>
+  </el-card>
+</template>
+
+<script>
+import { getTaskservelist } from "@/api/AiCentre/index";
+
+export default {
+  name: "ServiceRecords",
+  dicts: ["sys_suggest"],
+  props: {
+    patid: { default: "" },
+  },
+  data() {
+    return { loading: false, record: [] };
+  },
+  watch: {
+    patid: { immediate: true, handler(v) { if (v) this.load(v); } },
+  },
+  methods: {
+    load(patid) {
+      this.loading = true;
+      getTaskservelist({ patid })
+        .then((res) => {
+          if (res.code === 200 && res.rows && res.rows[0]) {
+            this.record = res.rows[0].serviceSubtaskList || [];
+          } else {
+            this.record = [];
+          }
+        })
+        .catch(() => { this.record = []; })
+        .finally(() => { this.loading = false; });
+    },
+    typeName(t) {
+      if (t == 1) return "蹇冪數闅忚";
+      if (t == 2) return "鍑洪櫌闅忚";
+      if (t == 3) return "褰卞儚闅忚";
+      if (t == 4) return "瀹f暀鍏虫��";
+      return "鍏朵粬鏈嶅姟";
+    },
+    sexName(s) {
+      if (s == 1) return "鐢�";
+      if (s == 2) return "濂�";
+      return "-";
+    },
+    sendStateName(s) {
+      const map = { 1: "宸查鍙�", 2: "寰呴殢璁�", 3: "宸插彂閫�", 4: "涓嶆墽琛�", 5: "澶辫触", 6: "宸插畬鎴�", 7: "瓒呮椂" };
+      return map[s] || "-";
+    },
+    fmtTime(t) {
+      if (!t) return "-";
+      const s = String(t).replace("T", " ");
+      return s.length > 16 ? s.substring(0, 16) : s.substring(0, 10);
+    },
+    endDay(t) {
+      if (!t) return "-";
+      const d = new Date(String(t).replace("T", " ").replace(/-/g, "/"));
+      const diff = Date.now() - d.getTime();
+      return Math.round(diff / (1000 * 3600 * 24));
+    },
+    preach(v) {
+      if (!v) return "";
+      return Array.isArray(v) ? v.join("銆�") : String(v);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+$primary: #3f6ef0;
+
+.service-records {
+  .card-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    font-size: 16px;
+    font-weight: 600;
+  }
+}
+
+.empty-mini {
+  padding: 30px 0;
+  text-align: center;
+  color: #c0c4cc;
+  font-size: 14px;
+}
+
+.service-record {
+  .service-item {
+    margin-bottom: 16px;
+
+    &:last-child {
+      margin-bottom: 0;
+    }
+  }
+
+  .service-card {
+    border-radius: 12px;
+    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
+
+    ::v-deep .el-card__body {
+      padding: 20px 24px;
+    }
+  }
+
+  .service-card__header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding-bottom: 14px;
+    border-bottom: 1px dashed #eef0f4;
+  }
+
+  .service-card__title {
+    display: flex;
+    align-items: center;
+    gap: 12px;
+    min-width: 0;
+  }
+
+  .service-card__tags {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    flex-shrink: 0;
+  }
+
+  .service-badge {
+    display: inline-block;
+    padding: 4px 12px;
+    font-size: 13px;
+    font-weight: 600;
+    color: $primary;
+    background: #eef4ff;
+    border-radius: 6px;
+    white-space: nowrap;
+  }
+
+  .service-name {
+    font-size: 16px;
+    font-weight: 600;
+    color: #303133;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+  }
+
+  .service-status {
+    padding: 4px 12px;
+    font-size: 13px;
+    border-radius: 999px;
+
+    &.is-ok {
+      color: #12a182;
+      background: #e8f7f1;
+    }
+
+    &.is-bad {
+      color: #e0564c;
+      background: #fdeeee;
+    }
+  }
+
+  .service-card__timeline {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+    flex-wrap: wrap;
+    padding: 12px 0;
+    font-size: 13px;
+    color: #606266;
+
+    em {
+      font-style: normal;
+      color: #909399;
+      margin-right: 2px;
+    }
+
+    i {
+      color: #c0c4cc;
+      font-style: normal;
+    }
+  }
+
+  .service-card__columns {
+    display: flex;
+    gap: 12px;
+  }
+
+  .svc-block {
+    flex: 1;
+    min-width: 0;
+    border-radius: 6px;
+    padding: 10px 12px;
+    font-size: 13px;
+
+    &--blue {
+      background: #ecf5ff;
+      .svc-block__title { color: #409eff; }
+    }
+
+    &--green {
+      background: #edf7f0;
+      .svc-block__title { color: #67c23a; }
+    }
+
+    &--gray {
+      background: #f5f7fa;
+      .svc-block__title { color: #909399; }
+    }
+  }
+
+  .svc-block__title {
+    font-size: 12px;
+    font-weight: 600;
+    margin-bottom: 6px;
+
+    i { margin-right: 4px; }
+  }
+
+  .svc-block__row {
+    color: #303133;
+    line-height: 1.7;
+    font-size: 13px;
+    word-break: break-all;
+  }
+
+  .svc-sub {
+    color: #909399;
+    font-size: 12px;
+    margin-left: 8px;
+  }
+
+  .svc-name {
+    color: #409eff;
+    font-weight: 600;
+    cursor: default;
+  }
+
+  .svc-diag {
+    display: inline-block;
+    font-size: 11px;
+    color: #e6a23c;
+    background: #fdf6ec;
+    padding: 1px 6px;
+    border-radius: 3px;
+    margin-right: 6px;
+  }
+
+  .svc-meta {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 4px 12px;
+    font-size: 12px;
+    color: #606266;
+
+    span { white-space: normal; }
+
+    em {
+      font-style: normal;
+      color: #909399;
+      margin-right: 2px;
+    }
+  }
+}
+</style>
diff --git a/src/views/patient/archives/highRisk/index.vue b/src/views/patient/archives/highRisk/index.vue
new file mode 100644
index 0000000..7c78b9e
--- /dev/null
+++ b/src/views/patient/archives/highRisk/index.vue
@@ -0,0 +1,12 @@
+<template>
+  <ArchiveList type="highRisk" />
+</template>
+
+<script>
+import ArchiveList from "../components/ArchiveList.vue";
+
+export default {
+  name: "HighRiskArchiveList",
+  components: { ArchiveList },
+};
+</script>
diff --git a/src/views/patient/archives/learning/index.vue b/src/views/patient/archives/learning/index.vue
new file mode 100644
index 0000000..b3dee06
--- /dev/null
+++ b/src/views/patient/archives/learning/index.vue
@@ -0,0 +1,12 @@
+<template>
+  <ArchiveList type="learning" />
+</template>
+
+<script>
+import ArchiveList from "../components/ArchiveList.vue";
+
+export default {
+  name: "LearningArchiveList",
+  components: { ArchiveList },
+};
+</script>
diff --git a/src/views/patient/archives/maternalHealth/detail.vue b/src/views/patient/archives/maternalHealth/detail.vue
index 6d723e9..4d0d7db 100644
--- a/src/views/patient/archives/maternalHealth/detail.vue
+++ b/src/views/patient/archives/maternalHealth/detail.vue
@@ -3,253 +3,359 @@
     <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="archive.subType === 'pregnancy' ? 'success' : 'warning'" 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="archive.subType === 'pregnancy' ? 'success' : 'warning'" style="margin-left:8px">{{ archive.subTypeLabel }}</el-tag>
       </div>
 
-      <!-- 鎮h�呭熀鏈俊鎭� -->
-      <el-card class="info-card" shadow="never">
-        <div slot="header" class="card-header"><span>鎮h�呭熀鏈俊鎭�</span></div>
-        <el-row :gutter="20">
-          <el-col :span="6"><InfoField label="濮撳悕" :value="archive.patname" /></el-col>
-          <el-col :span="6"><InfoField label="鎬у埆" :value="archive.sex == 1 ? '鐢�' : '濂�'" /></el-col>
-          <el-col :span="6"><InfoField label="骞撮緞" :value="archive.age" /></el-col>
-          <el-col :span="6"><InfoField label="鐢佃瘽" :value="archive.telcode" /></el-col>
-        </el-row>
-        <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-tabs v-model="mainTab" type="border-card">
+        <el-tab-pane label="妗f璇︽儏" name="detail">
+          <!-- 鎮h�呭熀鏈俊鎭� -->
+          <el-card class="info-card" shadow="never">
+            <div slot="header" class="card-header"><span>鎮h�呭熀鏈俊鎭�</span></div>
+            <el-row :gutter="20">
+              <el-col :span="6"><InfoField label="濮撳悕" :value="archive.patname" /></el-col>
+              <el-col :span="6"><InfoField label="鎬у埆" :value="archive.sex == 1 ? '鐢�' : '濂�'" /></el-col>
+              <el-col :span="6"><InfoField label="骞撮緞" :value="archive.age" /></el-col>
+              <el-col :span="6"><InfoField label="鑱旂郴鐢佃瘽" :value="archive.telcode" /></el-col>
+            </el-row>
+            <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="sourceLabel" /></el-col>
+            </el-row>
+          </el-card>
 
-      <!-- 妗f鍩烘湰淇℃伅 -->
-      <el-card class="info-card" shadow="never" style="margin-top:14px">
-        <div slot="header" class="card-header">
-          <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-row v-if="archive.subType === 'pregnancy'" :gutter="20" style="margin-top:10px">
-          <el-col :span="6"><InfoField label="瀛曞懆" :value="archive.archiveForm.gestationalWeek" :editing="editing" v-model="archive.archiveForm.gestationalWeek" type="number" /></el-col>
-          <el-col :span="6"><InfoField label="瀛曟/浜ф" :value="'G'+(archive.archiveForm.gravidity||1)+'P'+(archive.archiveForm.parity||0)" /></el-col>
-          <el-col :span="6"><InfoField label="棰勪骇鏈�" :value="archive.archiveForm.edd" /></el-col>
-          <el-col :span="6"><InfoField label="楂樺嵄濡婂" :value="archive.archiveForm.highRiskPregnancy ? '鏄�' : '鍚�'" /></el-col>
-        </el-row>
-        <el-row v-if="archive.subType === 'menopause'" :gutter="20" style="margin-top:10px">
-          <el-col :span="8"><InfoField label="鏈堢粡鐘舵��" :value="menstrualLabel" /></el-col>
-          <el-col :span="8"><InfoField label="鏈鏈堢粡" :value="archive.archiveForm.lmp" /></el-col>
-        </el-row>
-      </el-card>
-
-      <!-- ===== 瀛曞闅忚锛�3涓〃鍗� ===== -->
-      <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>
-          <el-tabs v-model="activeTab" type="border-card">
-            <!-- 1. 瀛曞闅忚绯荤粺闂 -->
-            <el-tab-pane label="瀛曞闅忚绯荤粺闂" name="sysQ">
-              <el-form :model="form.pregSysQ" label-width="150px" size="small" :disabled="!editing">
+          <!-- ===== 瀛曞闅忚锛氭。妗堜俊鎭� + 棣栬瘖淇℃伅 + 濡婂鎯呭喌 鍚堝苟鍖哄潡 ===== -->
+          <el-card v-if="archive.subType === 'pregnancy'" class="info-card" shadow="never" style="margin-top:14px">
+            <div class="sub-section">
+              <div class="sub-title">妗f淇℃伅</div>
+              <el-form :model="archive" label-width="110px" size="small" :disabled="!editing">
                 <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="濉啓鏃ユ湡"><el-date-picker v-model="form.pregSysQ.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="瀛曞懆"><el-input-number v-model="form.pregSysQ.gestWeek" :min="1" :max="42" /></el-form-item></el-col>
+                  <el-col :span="8"><el-form-item label="韬唤璇佸彿"><el-input v-model="archive.idcardno" class="w-md" /></el-form-item></el-col>
+                  <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-date-picker v-model="archive.diagnosisDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
                 </el-row>
                 <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="浣撻噸(kg)"><el-input-number v-model="form.pregSysQ.weight" :precision="1" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="琛�鍘�"><el-input v-model="form.pregSysQ.bloodPressure" placeholder="鏀剁缉鍘�/鑸掑紶鍘�" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="瀹珮(cm)"><el-input-number v-model="form.pregSysQ.fundalHeight" /></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-col :span="8"><el-form-item label="鐧昏浜哄憳"><el-input v-model="archive.registrant" class="w-sm" /></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.pregSysQ.fetalHeart" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="姘磋偪"><el-select v-model="form.pregSysQ.edema" style="width:100%"><el-option label="鏃�" value="鏃�" /><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.pregSysQ.urineProtein" style="width:100%"><el-option label="-" value="-" /><el-option label="卤" value="卤" /><el-option label="+" value="+" /><el-option label="++" value="++" /></el-select></el-form-item></el-col>
-                </el-row>
-                <el-form-item label="鑷鐥囩姸"><el-input v-model="form.pregSysQ.symptoms" type="textarea" :rows="2" placeholder="澶存檿/鐪艰姳/鑳搁椃/鑵圭棝绛�" /></el-form-item>
-                <el-form-item label="澶勭悊鎰忚"><el-input v-model="form.pregSysQ.advice" type="textarea" :rows="2" /></el-form-item>
-                <el-form-item label="涓嬫闅忚鏃ユ湡"><el-date-picker v-model="form.pregSysQ.nextVisit" value-format="yyyy-MM-dd" style="width:200px" /></el-form-item>
-                <el-form-item label="闅忚鍖荤敓"><el-input v-model="form.pregSysQ.doctor" style="width:200px" /></el-form-item>
               </el-form>
-            </el-tab-pane>
+            </div>
 
-            <!-- 2. 瀛曞棣栬瘖淇℃伅鐧昏琛� -->
-            <el-tab-pane label="涓芥按濡囧辜淇濆仴闄㈠瓡濡囬璇婁俊鎭櫥璁拌〃" name="firstVisit">
-              <el-form :model="form.pregFirst" label-width="160px" size="small" :disabled="!editing">
-                <el-divider content-position="left">鍩烘湰淇℃伅</el-divider>
+            <div class="sub-section">
+              <div class="sub-title">瀛曞棣栬瘖淇℃伅鐧昏</div>
+              <el-form :model="pregForm.firstVisit" label-width="120px" size="small" :disabled="!editing">
                 <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="寤烘。鏃ユ湡"><el-date-picker v-model="form.pregFirst.regDate" 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.pregFirst.husbandName" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="涓堝か鐢佃瘽"><el-input v-model="form.pregFirst.husbandPhone" /></el-form-item></el-col>
+                  <el-col :span="8"><el-form-item label="灏辫瘖鍙�"><el-input v-model="pregForm.firstVisit.visitNo" class="w-sm" /></el-form-item></el-col>
+                  <el-col :span="8"><el-form-item label="鏈汉鑱旂郴鏂瑰紡"><el-input v-model="pregForm.firstVisit.selfPhone" class="w-sm" /></el-form-item></el-col>
+                  <el-col :span="8"><el-form-item label="鐥呭尯濮撳悕"><el-input v-model="pregForm.firstVisit.wardName" class="w-sm" /></el-form-item></el-col>
                 </el-row>
                 <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="鏈鏈堢粡"><el-date-picker v-model="form.pregFirst.lmp" 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.pregFirst.edd" 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.pregFirst.gp" placeholder="G_P_" /></el-form-item></el-col>
+                  <el-col :span="8"><el-form-item label="鑱旂郴浜鸿仈绯绘柟寮�"><el-input v-model="pregForm.firstVisit.contactPhone" class="w-sm" /></el-form-item></el-col>
+                  <el-col :span="8"><el-form-item label="韬唤璇佸彿"><el-input v-model="pregForm.firstVisit.idcardno" class="w-md" /></el-form-item></el-col>
+                  <el-col :span="8"><el-form-item label="棣栬瘖鍖荤敓"><el-input v-model="pregForm.firstVisit.firstDoctor" class="w-sm" /></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-select v-model="form.pregFirst.csHistory" style="width:100%"><el-option label="鏃�" :value="0" /><el-option label="鏈�" :value="1" /></el-select></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="娴佷骇鍙�"><el-select v-model="form.pregFirst.abortionHistory" style="width:100%"><el-option label="鏃�" :value="0" /><el-option label="鏈�" :value="1" /></el-select></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="鐤剧梾鍙�"><el-input v-model="form.pregFirst.diseaseHistory" placeholder="楂樿鍘�/绯栧翱鐥�/鐢茬姸鑵虹瓑" /></el-form-item></el-col>
+                  <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-divider content-position="left">鏈濡婂鎯呭喌</el-divider>
-                <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="韬珮(cm)"><el-input-number v-model="form.pregFirst.height" :precision="1" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="瀛曞墠浣撻噸(kg)"><el-input-number v-model="form.pregFirst.preWeight" :precision="1" /></el-form-item></el-col>
-                </el-row>
-                <el-form-item label="楂樺嵄鍥犵礌璇勪及"><el-input v-model="form.pregFirst.riskAssessment" type="textarea" :rows="2" /></el-form-item>
-                <el-form-item label="寤哄唽鍖荤敓"><el-input v-model="form.pregFirst.doctor" style="width:200px" /></el-form-item>
               </el-form>
-            </el-tab-pane>
+            </div>
 
-            <!-- 3. 鏃╁瓡闅忚鐧昏琛� -->
-            <el-tab-pane label="涓芥按濡囧辜淇濆仴闄㈡棭瀛曢殢璁跨櫥璁拌〃" name="earlyFollow">
-              <el-form :model="form.pregEarly" label-width="150px" size="small" :disabled="!editing">
-                <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="闅忚鏃ユ湡"><el-date-picker v-model="form.pregEarly.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="瀛曞懆"><el-input-number v-model="form.pregEarly.gestWeek" :min="1" :max="14" /></el-form-item></el-col>
+            <div class="sub-section">
+              <div class="sub-title">濡婂鎯呭喌</div>
+              <el-form label-width="0" size="small" :disabled="!editing">
+                <el-row :gutter="24" class="preg-cascade">
+                  <el-col :span="8">
+                    <div class="cascade-col">
+                      <div class="cascade-label">濡婂鎯呭喌</div>
+                      <el-radio-group v-model="pregForm.pregnancy.status" @change="onPregnancyStatusChange">
+                        <el-radio v-for="(opt, key) in PREGNANCY_OPTIONS" :key="key" :label="key">{{ opt.label }}</el-radio>
+                      </el-radio-group>
+                    </div>
+                  </el-col>
+                  <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>
+                      <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 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>
+                  </el-col>
                 </el-row>
-                <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="鏃╁瓡鍙嶅簲"><el-select v-model="form.pregEarly.morningSickness" style="width:100%"><el-option label="鏃�" value="鏃�" /><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.pregEarly.bleeding" style="width:100%"><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.pregEarly.abdominalPain" style="width:100%"><el-option label="鏃�" value="鏃�" /><el-option label="鏈�" value="鏈�" /></el-select></el-form-item></el-col>
-                </el-row>
-                <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="琛�甯歌"><el-input v-model="form.pregEarly.bloodRoutine" placeholder="Hb/PLT绛�" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="灏垮父瑙�"><el-input v-model="form.pregEarly.urineRoutine" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="B瓒呮鏌�"><el-input v-model="form.pregEarly.ultrasound" placeholder="CRL/NT绛�" /></el-form-item></el-col>
-                </el-row>
-                <el-form-item label="鍙堕吀琛ュ厖"><el-select v-model="form.pregEarly.folicAcid" style="width:200px"><el-option label="瑙勫緥鏈嶇敤" value="瑙勫緥鏈嶇敤" /><el-option label="鍋跺皵鏈嶇敤" value="鍋跺皵鏈嶇敤" /><el-option label="鏈湇鐢�" value="鏈湇鐢�" /></el-select></el-form-item>
-                <el-form-item label="鎸囧鎰忚"><el-input v-model="form.pregEarly.advice" type="textarea" :rows="2" /></el-form-item>
-                <el-form-item label="闅忚鍖荤敓"><el-input v-model="form.pregEarly.doctor" style="width:200px" /></el-form-item>
               </el-form>
-            </el-tab-pane>
-          </el-tabs>
-        </el-card>
-      </template>
+            </div>
+          </el-card>
 
-      <!-- ===== 鏇村勾鏈熼殢璁匡細6涓〃鍗� ===== -->
-      <template v-if="archive.subType === 'menopause'">
-        <el-card class="info-card" shadow="never" style="margin-top:14px">
-          <div slot="header" class="card-header"><span>鏇村勾鏈熼殢璁跨鐞�</span></div>
-          <el-tabs v-model="activeTab" type="border-card">
-            <!-- 1. 鏇村勾鏈熼殢璁跨郴缁熼棶棰樿〃 -->
-            <el-tab-pane label="鏇村勾鏈熼殢璁跨郴缁熼棶棰樿〃" name="sysQ">
-              <el-form :model="form.menoSysQ" label-width="150px" size="small" :disabled="!editing">
-                <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="濉啓鏃ユ湡"><el-date-picker v-model="form.menoSysQ.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="骞撮緞"><el-input-number v-model="form.menoSysQ.age" /></el-form-item></el-col>
-                </el-row>
-                <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="鏈堢粡鎯呭喌"><el-input v-model="form.menoSysQ.menstruation" placeholder="鍛ㄦ湡/缁忔湡/缁忛噺" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="鏈鏈堢粡"><el-date-picker v-model="form.menoSysQ.lmp" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="缁濈粡骞撮緞"><el-input-number v-model="form.menoSysQ.menopauseAge" /></el-form-item></el-col>
-                </el-row>
-                <el-row :gutter="20">
-                  <el-col :span="6"><el-form-item label="娼儹鍑烘睏"><el-select v-model="form.menoSysQ.hotFlash" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
-                  <el-col :span="6"><el-form-item label="澶辩湢"><el-select v-model="form.menoSysQ.insomnia" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
-                  <el-col :span="6"><el-form-item label="鎯呯华娉㈠姩"><el-select v-model="form.menoSysQ.mood" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
-                  <el-col :span="6"><el-form-item label="鐤蹭箯"><el-select v-model="form.menoSysQ.fatigue" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
-                </el-row>
-                <el-row :gutter="20">
-                  <el-col :span="6"><el-form-item label="鍏宠妭鐥�"><el-select v-model="form.menoSysQ.jointPain" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
-                  <el-col :span="6"><el-form-item label="蹇冩偢"><el-select v-model="form.menoSysQ.palpitation" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
-                  <el-col :span="6"><el-form-item label="闃撮亾骞叉订"><el-select v-model="form.menoSysQ.dryness" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
-                  <el-col :span="6"><el-form-item label="鎬ф鍑忛��"><el-select v-model="form.menoSysQ.libido" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
-                </el-row>
-                <el-form-item label="鍏朵粬鐥囩姸"><el-input v-model="form.menoSysQ.otherSymptoms" type="textarea" :rows="2" /></el-form-item>
-                <el-form-item label="澶勭悊鎰忚"><el-input v-model="form.menoSysQ.advice" type="textarea" :rows="2" /></el-form-item>
-                <el-form-item label="鍖荤敓"><el-input v-model="form.menoSysQ.doctor" style="width:200px" /></el-form-item>
-              </el-form>
-            </el-tab-pane>
+          <!-- 鏄惁寤哄唽锛堝瓡濡囬殢璁匡級 -->
+          <el-card v-if="archive.subType === 'pregnancy'" class="info-card" shadow="never" style="margin-top:14px">
+            <div slot="header" class="card-header"><span>鏄惁寤哄唽</span></div>
+            <el-form :model="pregForm.registration" label-width="120px" size="small" :disabled="!editing">
+              <el-row :gutter="20">
+                <el-col :span="8"><el-form-item label="鏄惁寤哄唽">
+                  <el-radio-group v-model="pregForm.registration.isRegistered">
+                    <el-radio label="鏄�">鏄�</el-radio><el-radio label="鍚�">鍚�</el-radio>
+                  </el-radio-group>
+                </el-form-item></el-col>
+                <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>
+            </el-form>
+          </el-card>
 
-            <!-- 2. MHT棣栬瘖鐥呭巻琛� -->
-            <el-tab-pane label="MHT棣栬瘖鐥呭巻琛�" name="mhtFirst">
-              <el-form :model="form.mhtFirst" 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.mhtFirst.date" 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.mhtFirst.chiefComplaint" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="缁濈粡骞撮檺"><el-input-number v-model="form.mhtFirst.menopauseYears" :precision="1" /></el-form-item></el-col>
-                </el-row>
-                <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="韬珮(cm)"><el-input-number v-model="form.mhtFirst.height" :precision="1" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="浣撻噸(kg)"><el-input-number v-model="form.mhtFirst.weight" :precision="1" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="BMI"><el-input-number v-model="form.mhtFirst.bmi" :precision="1" disabled /></el-form-item></el-col>
-                </el-row>
-                <el-row :gutter="20">
-                  <el-col :span="8"><el-form-item label="琛�鍘�"><el-input v-model="form.mhtFirst.bloodPressure" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="琛�绯�"><el-input-number v-model="form.mhtFirst.glucose" :precision="1" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="琛�鑴�"><el-input v-model="form.mhtFirst.lipid" placeholder="TC/TG/LDL/HDL" /></el-form-item></el-col>
-                </el-row>
-                <el-form-item label="鏃㈠線鍙�"><el-input v-model="form.mhtFirst.pastHistory" type="textarea" :rows="2" placeholder="楂樿鍘�/绯栧翱鐥�/琛�鏍�/涔宠吅鐧�/瀛愬鑲岀槫绛�" /></el-form-item>
-                <el-form-item label="濡囩妫�鏌�"><el-input v-model="form.mhtFirst.gynExam" type="textarea" :rows="2" /></el-form-item>
-                <el-form-item label="涔宠吅妫�鏌�"><el-input v-model="form.mhtFirst.breastExam" type="textarea" :rows="2" /></el-form-item>
-                <el-form-item label="杈呭姪妫�鏌�"><el-input v-model="form.mhtFirst.auxExam" type="textarea" :rows="2" placeholder="B瓒�/楠ㄥ瘑搴�/婵�绱犳按骞崇瓑" /></el-form-item>
-                <el-form-item label="MHT鏂规"><el-input v-model="form.mhtFirst.mhtPlan" type="textarea" :rows="2" placeholder="鑽墿鍚嶇О/鍓傞噺/鐢ㄦ硶/鐤楃▼" /></el-form-item>
-                <el-form-item label="鍖荤敓"><el-input v-model="form.mhtFirst.doctor" style="width:200px" /></el-form-item>
-              </el-form>
-            </el-tab-pane>
+          <!-- ===== 鍥寸粷缁忔湡MHI锛氭。妗堜俊鎭紙鍚殢璁垮懆鏈熸鏁帮級 ===== -->
+          <el-card v-if="archive.subType === 'menopause'" class="info-card" shadow="never" style="margin-top:14px">
+            <div slot="header" class="card-header">
+              <span>妗f淇℃伅</span>
+              <span class="header-sub">{{ archive.createTime ? archive.createTime.substring(0,10) : '-' }} 寤烘。</span>
+            </div>
+            <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" /></el-form-item></el-col>
+                <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-date-picker v-model="archive.diagnosisDate" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+              </el-row>
+              <el-row :gutter="20">
+                <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-col :span="8"><el-form-item label="鐧昏浜哄憳"><el-input v-model="archive.registrant" 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.followupCycles" class="w-xs" /></el-form-item></el-col>
+              </el-row>
+            </el-form>
+          </el-card>
 
-            <!-- 3. MHT澶嶈瘖鐥呭巻琛� -->
-            <el-tab-pane label="MHT澶嶈瘖鐥呭巻琛�" name="mhtFollow">
-              <el-form :model="form.mhtFollow" label-width="160px" size="small" :disabled="!editing">
+          <!-- ===== 瀛曞闅忚锛氭棭瀛曢殢璁胯〃 + 璇勫垎琛紙閫変腑銆岀粡鍜ㄨ鎸囧鍚庣户缁濞犲苟鍦ㄤ骇绉戝缓妗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-date-picker v-model="form.mhtFollow.date" value-format="yyyy-MM-dd" style="width:100%" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="鐢ㄨ嵂渚濅粠鎬�"><el-select v-model="form.mhtFollow.compliance" 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="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-select v-model="form.mhtFollow.symptomImprove" 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.mhtFollow.sideEffect" placeholder="濡備钩鎴胯儉鐥�/闃撮亾鍑鸿绛�" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="闃撮亾鍑鸿"><el-select v-model="form.mhtFollow.bleeding" style="width:100%"><el-option label="鏃�" value="鏃�" /><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="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="浣撻噸(kg)"><el-input-number v-model="form.mhtFollow.weight" :precision="1" /></el-form-item></el-col>
-                  <el-col :span="8"><el-form-item label="琛�鍘�"><el-input v-model="form.mhtFollow.bloodPressure" /></el-form-item></el-col>
+                  <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-input v-model="form.mhtFollow.reExamResult" type="textarea" :rows="2" placeholder="B瓒�/涔宠吅/婵�绱犵瓑妫�鏌ョ粨鏋�" /></el-form-item>
-                <el-form-item label="鏂规璋冩暣"><el-input v-model="form.mhtFollow.planAdjust" type="textarea" :rows="2" /></el-form-item>
-                <el-form-item label="涓嬫澶嶈瘖"><el-date-picker v-model="form.mhtFollow.nextVisit" value-format="yyyy-MM-dd" style="width:200px" /></el-form-item>
-                <el-form-item label="鍖荤敓"><el-input v-model="form.mhtFollow.doctor" style="width:200px" /></el-form-item>
+                <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>
-            </el-tab-pane>
 
-            <!-- 4. 鏀硅壇Kupperman璇勫垎鏍囧噯琛� -->
-            <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" style="width:100%" /></el-form-item></el-col>
-                </el-row>
-                <KuppermanScoreTable v-model="form.kupperman" :editing="editing" />
-              </el-form>
-            </el-tab-pane>
+              <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>
 
-            <!-- 5. 鏇村勾鏈熻瘎鍒嗛噺琛�(MRS) -->
-            <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" style="width:100%" /></el-form-item></el-col>
-                </el-row>
-                <MRSScoreTable v-model="form.mrs" :editing="editing" />
-              </el-form>
-            </el-tab-pane>
+              <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>
 
-            <!-- 6. 鍖瑰吂鍫$潯鐪犺川閲忚瘎鍒嗛噺琛�(PSQI) -->
-            <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" style="width:100%" /></el-form-item></el-col>
-                </el-row>
-                <PSQIScoreTable v-model="form.psqi" :editing="editing" />
-              </el-form>
-            </el-tab-pane>
-          </el-tabs>
-        </el-card>
-      </template>
+            <!-- 闅忚鍛ㄦ湡 -->
+            <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>
+            </el-card>
+          </template>
+
+          <!-- ===== 鍥寸粷缁忔湡MHI锛�6 涓噺琛� tab ===== -->
+          <template v-if="archive.subType === 'menopause'">
+            <el-card class="info-card" shadow="never" style="margin-top:14px">
+              <div slot="header" class="card-header"><span>鍥寸粷缁忔湡MHI绠$悊</span></div>
+              <el-tabs v-model="activeTab" type="border-card">
+                <el-tab-pane label="鏇村勾鏈熼殢璁跨郴缁熼棶棰樿〃" name="sysQ">
+                  <el-form :model="form.menoSysQ" label-width="150px" size="small" :disabled="!editing">
+                    <el-row :gutter="20">
+                      <el-col :span="8"><el-form-item label="濉啓鏃ユ湡"><el-date-picker v-model="form.menoSysQ.date" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+                      <el-col :span="8"><el-form-item label="骞撮緞"><el-input-number v-model="form.menoSysQ.age" /></el-form-item></el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                      <el-col :span="8"><el-form-item label="鏈堢粡鎯呭喌"><el-input v-model="form.menoSysQ.menstruation" placeholder="鍛ㄦ湡/缁忔湡/缁忛噺" class="w-md" /></el-form-item></el-col>
+                      <el-col :span="8"><el-form-item label="鏈鏈堢粡"><el-date-picker v-model="form.menoSysQ.lmp" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+                      <el-col :span="8"><el-form-item label="缁濈粡骞撮緞"><el-input-number v-model="form.menoSysQ.menopauseAge" /></el-form-item></el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                      <el-col :span="6"><el-form-item label="娼儹鍑烘睏"><el-select v-model="form.menoSysQ.hotFlash" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+                      <el-col :span="6"><el-form-item label="澶辩湢"><el-select v-model="form.menoSysQ.insomnia" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+                      <el-col :span="6"><el-form-item label="鎯呯华娉㈠姩"><el-select v-model="form.menoSysQ.mood" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+                      <el-col :span="6"><el-form-item label="鐤蹭箯"><el-select v-model="form.menoSysQ.fatigue" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                      <el-col :span="6"><el-form-item label="鍏宠妭鐥�"><el-select v-model="form.menoSysQ.jointPain" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+                      <el-col :span="6"><el-form-item label="蹇冩偢"><el-select v-model="form.menoSysQ.palpitation" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+                      <el-col :span="6"><el-form-item label="闃撮亾骞叉订"><el-select v-model="form.menoSysQ.dryness" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+                      <el-col :span="6"><el-form-item label="鎬ф鍑忛��"><el-select v-model="form.menoSysQ.libido" style="width:100%"><el-option :value="0" label="鏃�" /><el-option :value="1" label="杞�" /><el-option :value="2" label="涓�" /><el-option :value="3" label="閲�" /></el-select></el-form-item></el-col>
+                    </el-row>
+                    <el-form-item label="鍏朵粬鐥囩姸"><el-input v-model="form.menoSysQ.otherSymptoms" type="textarea" :rows="2" /></el-form-item>
+                    <el-form-item label="澶勭悊鎰忚"><el-input v-model="form.menoSysQ.advice" type="textarea" :rows="2" /></el-form-item>
+                    <el-form-item label="鍖荤敓"><el-input v-model="form.menoSysQ.doctor" class="w-sm" /></el-form-item>
+                  </el-form>
+                </el-tab-pane>
+
+                <el-tab-pane label="MHT棣栬瘖鐥呭巻琛�" name="mhtFirst">
+                  <el-form :model="form.mhtFirst" 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.mhtFirst.date" 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.mhtFirst.chiefComplaint" class="w-sm" /></el-form-item></el-col>
+                      <el-col :span="8"><el-form-item label="缁濈粡骞撮檺"><el-input-number v-model="form.mhtFirst.menopauseYears" :precision="1" /></el-form-item></el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                      <el-col :span="8"><el-form-item label="韬珮(cm)"><el-input-number v-model="form.mhtFirst.height" :precision="1" /></el-form-item></el-col>
+                      <el-col :span="8"><el-form-item label="浣撻噸(kg)"><el-input-number v-model="form.mhtFirst.weight" :precision="1" /></el-form-item></el-col>
+                      <el-col :span="8"><el-form-item label="BMI"><el-input-number v-model="form.mhtFirst.bmi" :precision="1" disabled /></el-form-item></el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                      <el-col :span="8"><el-form-item label="琛�鍘�"><el-input v-model="form.mhtFirst.bloodPressure" class="w-xs" /></el-form-item></el-col>
+                      <el-col :span="8"><el-form-item label="琛�绯�"><el-input-number v-model="form.mhtFirst.glucose" :precision="1" /></el-form-item></el-col>
+                      <el-col :span="8"><el-form-item label="琛�鑴�"><el-input v-model="form.mhtFirst.lipid" placeholder="TC/TG/LDL/HDL" class="w-md" /></el-form-item></el-col>
+                    </el-row>
+                    <el-form-item label="鏃㈠線鍙�"><el-input v-model="form.mhtFirst.pastHistory" type="textarea" :rows="2" placeholder="楂樿鍘�/绯栧翱鐥�/琛�鏍�/涔宠吅鐧�/瀛愬鑲岀槫绛�" /></el-form-item>
+                    <el-form-item label="濡囩妫�鏌�"><el-input v-model="form.mhtFirst.gynExam" type="textarea" :rows="2" /></el-form-item>
+                    <el-form-item label="涔宠吅妫�鏌�"><el-input v-model="form.mhtFirst.breastExam" type="textarea" :rows="2" /></el-form-item>
+                    <el-form-item label="杈呭姪妫�鏌�"><el-input v-model="form.mhtFirst.auxExam" type="textarea" :rows="2" placeholder="B瓒�/楠ㄥ瘑搴�/婵�绱犳按骞崇瓑" /></el-form-item>
+                    <el-form-item label="MHT鏂规"><el-input v-model="form.mhtFirst.mhtPlan" type="textarea" :rows="2" placeholder="鑽墿鍚嶇О/鍓傞噺/鐢ㄦ硶/鐤楃▼" /></el-form-item>
+                    <el-form-item label="鍖荤敓"><el-input v-model="form.mhtFirst.doctor" class="w-sm" /></el-form-item>
+                  </el-form>
+                </el-tab-pane>
+
+                <el-tab-pane label="MHT澶嶈瘖鐥呭巻琛�" name="mhtFollow">
+                  <el-form :model="form.mhtFollow" 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.mhtFollow.date" value-format="yyyy-MM-dd" class="w-md" /></el-form-item></el-col>
+                      <el-col :span="8"><el-form-item label="鐢ㄨ嵂渚濅粠鎬�"><el-select v-model="form.mhtFollow.compliance" style="width:100%"><el-option label="鑹ソ" value="鑹ソ" /><el-option label="涓�鑸�" value="涓�鑸�" /><el-option label="宸�" value="宸�" /></el-select></el-form-item></el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                      <el-col :span="8"><el-form-item label="鐥囩姸鏀瑰杽"><el-select v-model="form.mhtFollow.symptomImprove" 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.mhtFollow.sideEffect" placeholder="濡備钩鎴胯儉鐥�/闃撮亾鍑鸿绛�" class="w-md" /></el-form-item></el-col>
+                      <el-col :span="8"><el-form-item label="闃撮亾鍑鸿"><el-select v-model="form.mhtFollow.bleeding" style="width:100%"><el-option label="鏃�" value="鏃�" /><el-option label="鐐规淮" value="鐐规淮" /><el-option label="灏戦噺" value="灏戦噺" /><el-option label="涓噺" value="涓噺" /></el-select></el-form-item></el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                      <el-col :span="8"><el-form-item label="浣撻噸(kg)"><el-input-number v-model="form.mhtFollow.weight" :precision="1" /></el-form-item></el-col>
+                      <el-col :span="8"><el-form-item label="琛�鍘�"><el-input v-model="form.mhtFollow.bloodPressure" class="w-xs" /></el-form-item></el-col>
+                    </el-row>
+                    <el-form-item label="澶嶆煡缁撴灉"><el-input v-model="form.mhtFollow.reExamResult" type="textarea" :rows="2" placeholder="B瓒�/涔宠吅/婵�绱犵瓑妫�鏌ョ粨鏋�" /></el-form-item>
+                    <el-form-item label="鏂规璋冩暣"><el-input v-model="form.mhtFollow.planAdjust" type="textarea" :rows="2" /></el-form-item>
+                    <el-form-item label="涓嬫澶嶈瘖"><el-date-picker v-model="form.mhtFollow.nextVisit" value-format="yyyy-MM-dd" class="w-md" /></el-form-item>
+                    <el-form-item label="鍖荤敓"><el-input v-model="form.mhtFollow.doctor" class="w-sm" /></el-form-item>
+                  </el-form>
+                </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>
+                </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>
+                </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>
+                </el-tab-pane>
+              </el-tabs>
+            </el-card>
+          </template>
+        </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>
@@ -257,20 +363,48 @@
 
 <script>
 import InfoField from "../childHealth/InfoField.vue";
+import EditableTable from "../components/EditableTable.vue";
+import ServiceRecords from "../components/ServiceRecords.vue";
 import KuppermanScoreTable from "./KuppermanScoreTable.vue";
 import MRSScoreTable from "./MRSScoreTable.vue";
 import PSQIScoreTable from "./PSQIScoreTable.vue";
+import { loadArchives, saveArchives } from "../types";
+
+const PREGNANCY_OPTIONS = {
+  planBirth: { label: "棣栬瘖鎷熺敓鑲�", details: ["鍏堝厗娴佷骇"], hints: ["鍖诲澶勭疆鍚庣户缁濞犲苟鍦ㄤ骇绉戝缓妗�"] },
+  earlyAbnormal: { label: "棣栬瘖鏃╁瓡寮傚父", details: ["鑷劧娴佷骇", "鑳氳儙鍋滆偛"], hints: ["涓哄コ鎬у啀娆″濞犳彁渚涘瀛曟寚瀵�"] },
+  planAbortion: { label: "棣栬瘖鎷熶汉宸ユ祦浜�", details: ["鑽墿娴佷骇", "鎵嬫湳娴佷骇"], hints: ["缁忓挩璇㈡寚瀵煎悗缁х画濡婂骞跺湪浜х寤烘。"] },
+};
 
 export default {
   name: "MaternalHealthArchiveDetail",
-  components: { InfoField, KuppermanScoreTable, MRSScoreTable, PSQIScoreTable },
+  components: { InfoField, EditableTable, ServiceRecords, KuppermanScoreTable, MRSScoreTable, PSQIScoreTable },
   data() {
     return {
-      loading: false, archive: null, editing: false, activeTab: "sysQ",
+      PREGNANCY_OPTIONS,
+      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: "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: "" },
+        pregnancy: { status: "", details: [], hint: [] },
+        earlyFollow: { name: "", age: "", visitNo: "", wechat: "", household: "", gravidaPara: "", maritalStatus: "", buildDate: "", abortionReasons: [], otherReason: "", continuePregnancy: "", edd: "", registrationUnit: "" },
+        counseling: [
+          { date: "", content: "", person: "" }, { date: "", content: "", person: "" },
+          { date: "", content: "", person: "" }, { date: "", content: "", person: "" },
+        ],
+        score: { total: null, result: "" },
+        registration: { isRegistered: "", unregisteredReason: "", edd: "", recorder: "" },
+        followupCycle: [],
+      },
       form: {
-        pregSysQ: { date:"", gestWeek:null, weight:null, bloodPressure:"", fundalHeight:null, fetalHeart:null, edema:"鏃�", urineProtein:"-", symptoms:"", advice:"", nextVisit:"", doctor:"" },
-        pregFirst: { regDate:"", husbandName:"", husbandPhone:"", lmp:"", edd:"", gp:"", csHistory:0, abortionHistory:0, diseaseHistory:"", height:null, preWeight:null, riskAssessment:"", doctor:"" },
-        pregEarly: { date:"", gestWeek:null, morningSickness:"鏃�", bleeding:"鏃�", abdominalPain:"鏃�", bloodRoutine:"", urineRoutine:"", ultrasound:"", folicAcid:"瑙勫緥鏈嶇敤", advice:"", doctor:"" },
         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:"" },
@@ -282,48 +416,168 @@
   },
   computed: {
     sourceLabel() { const m={standalone:"鐙珛寤烘。",outpatient:"闂ㄨ瘖璁板綍",inpatient:"鍦ㄩ櫌璁板綍"}; return m[this.archive?.sourcePage]||this.archive?.sourcePage||"-"; },
-    menstrualLabel() { const m={irregular:"鏈堢粡绱婁贡",amenorrhea_short:"闂粡锛�<12涓湀锛�",menopause:"缁濈粡锛堚墺12涓湀锛�",surgical:"浜哄伐缁濈粡"}; return m[this.archive?.archiveForm?.menstrualStatus]||"-"; },
+    pregnancySubOptions() {
+      const opt = PREGNANCY_OPTIONS[this.pregForm.pregnancy.status];
+      return opt ? opt.details : [];
+    },
+    pregnancyHintOptions() {
+      const opt = PREGNANCY_OPTIONS[this.pregForm.pregnancy.status];
+      return opt ? opt.hints : [];
+    },
+    showFollowUp() {
+      return this.pregForm.pregnancy.status === "planAbortion" &&
+        this.pregForm.pregnancy.hint.includes("缁忓挩璇㈡寚瀵煎悗缁х画濡婂骞跺湪浜х寤烘。");
+    },
+    currentFollowRecords() {
+      return (this.pregForm.followupCycle || []).filter((r) => r.status === "宸插畬鎴�");
+    },
   },
   created() {
     const id = this.$route.query.id;
-    if (id) this.loadArchive(id);
+    if (id) this.loadArchive(id, this.$route.query.edit == 1);
   },
   methods: {
-    loadArchive(id) {
+    loadArchive(id, autoEdit) {
       this.loading = true;
-      const all = JSON.parse(localStorage.getItem("patientArchives") || "[]");
-      this.archive = all.find(item => item.id === id) || null;
+      this.archive = loadArchives().find((item) => item.id === id) || null;
       if (this.archive) {
-        if (this.archive.subType === 'pregnancy') this.activeTab = "sysQ";
-        else if (this.archive.subType === 'menopause') this.activeTab = "sysQ";
-        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 (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]);
+            });
+          }
         }
       }
+      if (autoEdit) this.editing = true;
       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 : "";
     },
     toggleEdit() {
       if (this.editing) {
-        this.archive.formData = JSON.parse(JSON.stringify(this.form));
-        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 (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));
-        localStorage.setItem("patientArchives", JSON.stringify(all));
+        saveArchives(all);
         this.$message.success("淇濆瓨鎴愬姛");
       }
       this.editing = !this.editing;
+    },
+    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("宸茬粨妗�");
+      }).catch(() => {});
     },
   },
 };
 </script>
 
 <style lang="scss" scoped>
+$primary: #3f6ef0;
+
+// 杈撳叆妗嗗搴︼紙鎸夊瓧娈甸暱鐭尯鍒嗭級
+.w-xs { width: 90px; }
+.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; }
 .header-sub { font-size: 13px; color: #909399; font-weight: normal; }
 .empty-wrap { text-align: center; padding: 100px 0; color: #c0c4cc; font-size: 16px; }
+
+// 钃濊壊鍒嗗壊绾� + 灏忔爣棰�
+.sub-section {
+  & + .sub-section {
+    margin-top: 24px;
+  }
+}
+.sub-title {
+  position: relative;
+  padding-left: 12px;
+  margin-bottom: 16px;
+  font-size: 15px;
+  font-weight: 600;
+  color: #303133;
+  line-height: 1.2;
+
+  &::before {
+    content: "";
+    position: absolute;
+    left: 0;
+    top: 1px;
+    bottom: 1px;
+    width: 3px;
+    border-radius: 2px;
+    background: $primary;
+  }
+
+  &::after {
+    content: "";
+    position: absolute;
+    left: 0;
+    right: 0;
+    bottom: -7px;
+    border-bottom: 1px solid #dbe5ff;
+  }
+}
+
+// 濡婂鎯呭喌 涓夌骇鍕鹃��
+.preg-cascade {
+  .cascade-col {
+    padding: 14px 16px;
+    min-height: 120px;
+    border: 1px solid #e6ecfb;
+    border-radius: 8px;
+    background: #fafbff;
+
+    .el-radio-group,
+    .el-checkbox-group {
+      display: flex;
+      flex-direction: column;
+      align-items: flex-start;
+
+      .el-radio,
+      .el-checkbox {
+        margin-right: 0;
+        margin-bottom: 8px;
+      }
+    }
+  }
+
+  .cascade-label {
+    margin-bottom: 10px;
+    font-size: 13px;
+    font-weight: 600;
+    color: $primary;
+  }
+
+  .cascade-empty {
+    padding: 10px 0;
+    font-size: 12px;
+    color: #c0c4cc;
+  }
+}
 </style>
diff --git a/src/views/patient/archives/menopause/index.vue b/src/views/patient/archives/menopause/index.vue
new file mode 100644
index 0000000..bf66584
--- /dev/null
+++ b/src/views/patient/archives/menopause/index.vue
@@ -0,0 +1,12 @@
+<template>
+  <ArchiveList type="menopause" />
+</template>
+
+<script>
+import ArchiveList from "../components/ArchiveList.vue";
+
+export default {
+  name: "MenopauseArchiveList",
+  components: { ArchiveList },
+};
+</script>
diff --git a/src/views/patient/archives/nutrition/index.vue b/src/views/patient/archives/nutrition/index.vue
new file mode 100644
index 0000000..a96425f
--- /dev/null
+++ b/src/views/patient/archives/nutrition/index.vue
@@ -0,0 +1,12 @@
+<template>
+  <ArchiveList type="nutrition" />
+</template>
+
+<script>
+import ArchiveList from "../components/ArchiveList.vue";
+
+export default {
+  name: "NutritionArchiveList",
+  components: { ArchiveList },
+};
+</script>
diff --git a/src/views/patient/archives/pregnancy/index.vue b/src/views/patient/archives/pregnancy/index.vue
new file mode 100644
index 0000000..141acdc
--- /dev/null
+++ b/src/views/patient/archives/pregnancy/index.vue
@@ -0,0 +1,12 @@
+<template>
+  <ArchiveList type="pregnancy" />
+</template>
+
+<script>
+import ArchiveList from "../components/ArchiveList.vue";
+
+export default {
+  name: "PregnancyArchiveList",
+  components: { ArchiveList },
+};
+</script>
diff --git a/src/views/patient/archives/types.js b/src/views/patient/archives/types.js
new file mode 100644
index 0000000..3f91f1b
--- /dev/null
+++ b/src/views/patient/archives/types.js
@@ -0,0 +1,187 @@
+// 濡囦繚/鍎夸繚 5 绉嶇壒娈婃偅鑰呬笓妗堟敞鍐岃〃锛堝崟涓�鏁版嵁婧愶級
+// category: maternal=濡囦繚绉� / child=鍎夸繚绉�
+// entryLabel: 鍏ュ彛锛堥棬璇婅褰曢〉閫変笓妗堬級鎸夐挳鍚�
+// label:      鍒楄〃椤�/璇︽儏椤垫爣棰�
+// columns:    鍒楄〃椤靛垪瀹氫箟 { label, prop, type }
+//   type 鍙栧�硷細text(榛樿) | sex | date | closeStatus
+export const ARCHIVE_TYPES = [
+  {
+    key: "pregnancy",
+    category: "maternal",
+    entryLabel: "鏃╁瓡鍏崇埍",
+    label: "瀛曞闅忚",
+    subTypeLabel: "瀛曞闅忚",
+    route: "/filing/pregnancy",
+    detailRoute: "/filing/maternalDetail",
+    columns: [
+      { label: "濮撳悕", prop: "patname" },
+      { label: "鍑虹敓鏃ユ湡", prop: "birthday", type: "date" },
+      { label: "韬唤璇佸彿", prop: "idcardno" },
+      { label: "鑱旂郴鐢佃瘽", prop: "telcode" },
+      { label: "璇婃柇鏃ユ湡", prop: "diagnosisDate", type: "date" },
+      { label: "寤烘。鏃ユ湡", prop: "createTime", type: "date" },
+      { label: "璇婃柇", prop: "diagname" },
+      { label: "濡婂鎯呭喌", prop: "pregnancyStatus" },
+      { label: "涓绘不鍖荤敓", prop: "attendingDoctor" },
+      { label: "缁忕鍖荤敓", prop: "managingDoctor" },
+      { label: "缁撴鐘舵��", prop: "closeStatus", type: "closeStatus" },
+      { label: "鐧昏浜哄憳", prop: "registrant" },
+    ],
+  },
+  {
+    key: "menopause",
+    category: "maternal",
+    entryLabel: "鍥寸粷缁忔湡MHI",
+    label: "鍥寸粷缁忔湡MHI",
+    subTypeLabel: "鍥寸粷缁忔湡MHI",
+    route: "/filing/menopause",
+    detailRoute: "/filing/maternalDetail",
+    columns: [
+      { label: "濮撳悕", prop: "patname" },
+      { label: "鍑虹敓鏃ユ湡", prop: "birthday", type: "date" },
+      { label: "韬唤璇佸彿", prop: "idcardno" },
+      { label: "鑱旂郴鐢佃瘽", prop: "telcode" },
+      { label: "璇婃柇鏃ユ湡", prop: "diagnosisDate", type: "date" },
+      { label: "寤烘。鏃ユ湡", prop: "createTime", type: "date" },
+      { label: "璇婃柇", prop: "diagname" },
+      { label: "闅忚鍛ㄦ湡锛堟鏁帮級", prop: "followupCycles" },
+      { label: "涓绘不鍖荤敓", prop: "attendingDoctor" },
+      { label: "缁忕鍖荤敓", prop: "managingDoctor" },
+      { label: "缁撴鐘舵��", prop: "closeStatus", type: "closeStatus" },
+      { label: "鐧昏浜哄憳", prop: "registrant" },
+    ],
+  },
+  {
+    key: "highRisk",
+    category: "child",
+    entryLabel: "楂樺嵄鍎夸笓妗�",
+    label: "楂樺嵄鍎夸笓妗�",
+    subTypeLabel: "楂樺嵄鍎夸笓妗堢鐞�",
+    route: "/filing/highRisk",
+    detailRoute: "/filing/childDetail",
+    columns: [
+      { label: "鍎跨濮撳悕", prop: "patname" },
+      { label: "瀹堕暱濮撳悕", prop: "parentInfo.parentName" },
+      { label: "鎷熼殢璁挎棩鏈�", prop: "followupDate", type: "date" },
+      { label: "鑱旂郴鐢佃瘽", prop: "telcode" },
+      { label: "璇婃柇鏃ユ湡", prop: "diagnosisDate", type: "date" },
+      { label: "寤烘。鏃ユ湡", prop: "createTime", type: "date" },
+      { label: "鍑虹敓瀛曞懆", prop: "gestationalWeek" },
+      { label: "鎬у埆", prop: "sex", type: "sex" },
+      { label: "鍑虹敓鏃ユ湡", prop: "birthday", type: "date" },
+      { label: "鍑虹敓浣撻噸", prop: "birthWeight" },
+      { label: "楂樺嵄鍎垮垎绫�", prop: "highRiskCategory" },
+      { label: "楂樺嵄鍎垮悕绉�", prop: "highRiskName" },
+      { label: "鐧昏浜哄憳", prop: "registrant" },
+    ],
+  },
+  {
+    key: "nutrition",
+    category: "child",
+    entryLabel: "钀ュ吇鎬х柧鐥�",
+    label: "钀ュ吇鎬х柧鐥�",
+    subTypeLabel: "钀ュ吇鎬х柧鐥呬笓妗堢鐞�",
+    route: "/filing/nutrition",
+    detailRoute: "/filing/childDetail",
+    columns: [
+      { label: "鍎跨濮撳悕", prop: "patname" },
+      { label: "瀹堕暱濮撳悕", prop: "parentInfo.parentName" },
+      { label: "鍑虹敓鏃ユ湡", prop: "birthday", type: "date" },
+      { label: "鑱旂郴鐢佃瘽", prop: "telcode" },
+      { label: "璇婃柇鏃ユ湡", prop: "diagnosisDate", type: "date" },
+      { label: "寤烘。鏃ユ湡", prop: "createTime", type: "date" },
+      { label: "鍑虹敓瀛曞懆", prop: "gestationalWeek" },
+      { label: "鎬у埆", prop: "sex", type: "sex" },
+      { label: "鍑虹敓浣撻噸", prop: "birthWeight" },
+      { label: "钀ュ吇鎬х柧鐥呭悕绉�", prop: "nutritionName" },
+      { label: "鐧昏浜哄憳", prop: "registrant" },
+    ],
+  },
+  {
+    key: "learning",
+    category: "child",
+    entryLabel: "瀛︿範鍥伴毦",
+    label: "瀛︿範鍥伴毦",
+    subTypeLabel: "瀛︿範鍥伴毦涓撴绠$悊",
+    route: "/filing/learning",
+    detailRoute: "/filing/childDetail",
+    columns: [
+      { label: "鍎跨濮撳悕", prop: "patname" },
+      { label: "瀹堕暱濮撳悕", prop: "parentInfo.parentName" },
+      { label: "鍑虹敓鏃ユ湡", prop: "birthday", type: "date" },
+      { label: "鑱旂郴鐢佃瘽", prop: "telcode" },
+      { label: "璇婃柇鏃ユ湡", prop: "diagnosisDate", type: "date" },
+      { label: "寤烘。鏃ユ湡", prop: "createTime", type: "date" },
+      { label: "鎬у埆", prop: "sex", type: "sex" },
+      { label: "棰勭害鎯呭喌", prop: "appointmentStatus" },
+    ],
+  },
+];
+
+export function getTypeByKey(key) {
+  return ARCHIVE_TYPES.find((t) => t.key === key);
+}
+
+// 璇诲彇 localStorage 妗f鍒楄〃
+export function loadArchives() {
+  try {
+    return JSON.parse(localStorage.getItem("patientArchives") || "[]");
+  } catch (e) {
+    return [];
+  }
+}
+
+export function saveArchives(list) {
+  localStorage.setItem("patientArchives", JSON.stringify(list));
+}
+
+// 鐢变竴鏉℃偅鑰呰褰曪紙闂ㄨ瘖/浣忛櫌/鐙珛褰曞叆锛夌敓鎴愭煇涓撴鐨勬。妗堣崏绋�
+export function buildArchiveRecord(patient, typeKey, sourcePage) {
+  const type = getTypeByKey(typeKey);
+  const now = new Date().toISOString().replace("T", " ").substring(0, 19);
+  const patid = patient.patid || patient.id || "sa_" + Date.now();
+  return {
+    id: "arc_" + Date.now() + "_" + Math.random().toString(36).substr(2, 6),
+    patientId: patid,
+    patid: patid,
+    patname: patient.patname || patient.name || "",
+    sex: patient.sex,
+    age: patient.age,
+    telcode: patient.telcode || patient.phone || "",
+    deptname: patient.deptname || "",
+    diagname: patient.diagname || "",
+    outhospno: patient.outhospno || "",
+    inhospno: patient.inhospno || "",
+    bedNo: patient.bedNo || "",
+    drname: patient.drname || "",
+    nurseName: patient.nurseName || "",
+    starttime: patient.starttime || patient.admitdate || "",
+    mainCategory: type.category,
+    mainCategoryLabel: type.category === "child" ? "鍎夸繚绉戝缓妗�" : "濡囦繚绉戝缓妗�",
+    subType: type.key,
+    subTypeLabel: type.subTypeLabel,
+    archiveForm: { doctorName: "" },
+    parentInfo: {},
+    sourcePage: sourcePage || "outpatient",
+    status: "active",
+    closeStatus: 0,
+    // 鍒楄〃椤垫柊澧炲瓧娈�
+    idcardno: patient.idcardno || "",
+    birthday: patient.birthday || patient.goday || "",
+    birthWeight: "",
+    gestationalWeek: "",
+    diagnosisDate: patient.diagnosisDate || patient.admitdate || "",
+    attendingDoctor: patient.drname || "",
+    managingDoctor: "",
+    registrant: localStorage.getItem("YongHuXM") || "",
+    pregnancyStatus: "",
+    followupCycles: "",
+    highRiskCategory: "",
+    highRiskName: "",
+    nutritionName: "",
+    appointmentStatus: "",
+    followupDate: "",
+    createTime: now,
+    updateTime: now,
+  };
+}
diff --git a/src/views/patient/patient/behospitalized.vue b/src/views/patient/patient/behospitalized.vue
index 81b612d..e35a72e 100644
--- a/src/views/patient/patient/behospitalized.vue
+++ b/src/views/patient/patient/behospitalized.vue
@@ -111,7 +111,7 @@
               娣诲姞寤剁画鎶ょ悊浠诲姟
             </el-button>
           </el-col>
-          <el-col :span="1.5">
+          <!-- <el-col :span="1.5">
             <el-button
               type="success"
               plain
@@ -122,7 +122,7 @@
             >
               鎮h�呭缓妗�</el-button
             >
-          </el-col>
+          </el-col> -->
           <el-col :span="1.5">
             <el-button
               type="danger"
diff --git a/src/views/patient/patient/profile/index.vue b/src/views/patient/patient/profile/index.vue
index 454c3fc..20af72e 100644
--- a/src/views/patient/patient/profile/index.vue
+++ b/src/views/patient/patient/profile/index.vue
@@ -1,35 +1,23 @@
 <template>
   <div class="app-container">
-    <!-- 澶撮儴鐩掑瓙 -->
-    <div class="personages">
-      <el-row :gutter="20">
-        <el-col :span="18">
-          <div class="headportrait">
-            <div class="text-center">
-              <img
-                v-imgError="require('@/assets/images/shoushuzhudaoyisheng.png')"
-                src=""
-              />
-            </div>
-            <div style="margin-left: 10px">{{ userform.name }}</div>
-            <div style="margin-left: 10px" class="text-title">
-              {{ userform.sex == 1 ? "鐢�" : "濂�" }}
-            </div>
-            <div style="margin-left: 10px" class="text-title">
-              {{ userform.age }}宀�
-            </div>
-            <div style="margin-left: 10px" class="text-title">
-              {{ userform.birthdate }}
-            </div>
-            <div style="margin-left: 10px" class="text-title">
-              {{ userform.nation }}
-            </div>
-            <div style="margin-left: 10px" class="text-title">
-              {{ userform.birthplace }}
-            </div>
-          </div></el-col
-        >
-      </el-row>
+    <!-- 鎮h�呬俊鎭ご閮� -->
+    <div class="profile-header">
+      <div class="profile-header__avatar">
+        <img
+          v-imgError="require('@/assets/images/shoushuzhudaoyisheng.png')"
+          src=""
+        />
+      </div>
+      <div class="profile-header__info">
+        <div class="profile-header__name">{{ userform.name }}</div>
+        <div class="profile-header__chips">
+          <span class="chip">{{ userform.sex == 1 ? "鐢�" : "濂�" }}</span>
+          <span class="chip">{{ userform.age }}宀�</span>
+          <span class="chip">{{ userform.birthdate }}</span>
+          <span class="chip">{{ userform.nation }}</span>
+          <span class="chip">{{ userform.birthplace }}</span>
+        </div>
+      </div>
     </div>
 
     <el-tabs type="border-card" v-model="activeName" @tab-click="handleClick">
@@ -101,67 +89,45 @@
 
     <!-- 鍋ュ悍妗f妯″潡 -->
     <div class="information-content" v-if="activeName == 'health'">
-      <div class="top-message">
-        <div class="headlines">
-          <div>鍩虹淇℃伅</div>
-          <el-button type="primary" @click="savefile">淇濆瓨鎮h�呮。妗�</el-button>
+      <div class="section-card">
+        <div class="section-card__header">
+          <span class="section-title">鍩虹淇℃伅</span>
+          <el-button type="primary" size="small" @click="savefile">淇濆瓨鎮h�呮。妗�</el-button>
         </div>
-        <div class="detailed">
+        <div class="section-card__body">
           <el-form
             ref="userform"
             :model="userform"
             :rules="rules"
-            label-width="150px"
+            label-width="110px"
+            class="profile-form"
           >
-            <el-row :gutter="20">
+            <el-row :gutter="24">
               <el-col :span="12">
                 <el-form-item label="鎮h�呭鍚�" prop="name">
-                  <el-input
-                    v-model="userform.name"
-                    placeholder="璇疯緭鍏ュ鍚�"
-                    maxlength="30"
-                  ></el-input> </el-form-item
-              ></el-col>
-            </el-row>
-            <el-row >
-              <el-col :span="12"
-                ><el-form-item label="鑱旂郴鏂瑰紡" prop="telcode">
-                  <el-input
-                    v-model="userform.telcode"
-                    placeholder="璇疯緭鍏ヨ仈绯绘柟寮�"
-                    maxlength="30"
-                  /> </el-form-item
-              ></el-col>
+                  <el-input v-model="userform.name" placeholder="璇疯緭鍏ュ鍚�" maxlength="30"></el-input>
+                </el-form-item>
+              </el-col>
               <el-col :span="12">
-                <el-form-item label="浜插睘鑱旂郴鏂瑰紡"  prop="name">
-                  <el-input
-                    v-model="userform.telcodewx"
-                    placeholder="璇疯緭鍏ュ鍚�"
-                    maxlength="30"
-                  ></el-input> </el-form-item
-              ></el-col>
-            </el-row>
-            <el-row :gutter="20">
+                <el-form-item label="鑱旂郴鏂瑰紡" prop="telcode">
+                  <el-input v-model="userform.telcode" placeholder="璇疯緭鍏ヨ仈绯绘柟寮�" maxlength="30"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="浜插睘鑱旂郴鏂瑰紡" prop="name">
+                  <el-input v-model="userform.telcodewx" placeholder="璇疯緭鍏ュ鍚�" maxlength="30"></el-input>
+                </el-form-item>
+              </el-col>
               <el-col :span="24">
                 <el-form-item label="鍑虹敓鍦�" prop="birthplace">
-                  <el-input
-                    v-model="userform.birthplace"
-                    placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑璇︾粏淇℃伅"
-                    maxlength="50"
-                  /> </el-form-item
-              ></el-col>
-            </el-row>
-            <el-row :gutter="20">
-              <el-col :span="24"
-                ><el-form-item label="灞呬綇鍦�" prop="placeOfResidence">
-                  <el-input
-                    v-model="userform.placeOfResidence"
-                    placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑璇︾粏淇℃伅"
-                    maxlength="50"
-                  /> </el-form-item
-              ></el-col>
-            </el-row>
-            <el-row :gutter="20">
+                  <el-input v-model="userform.birthplace" placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑璇︾粏淇℃伅" maxlength="50"></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="24">
+                <el-form-item label="灞呬綇鍦�" prop="placeOfResidence">
+                  <el-input v-model="userform.placeOfResidence" placeholder="鍥姐�佺渷銆佸湴甯傘�佸尯鍘裤�佽閬撶瓑璇︾粏淇℃伅" maxlength="50"></el-input>
+                </el-form-item>
+              </el-col>
               <el-col :span="24">
                 <el-form-item label="鏍囩" prop="desc">
                   <div class="xinz-inf">
@@ -193,7 +159,6 @@
                       >
                       </el-option>
                     </el-select>
-
                     <el-button
                       v-else
                       class="button-new-tag"
@@ -208,56 +173,36 @@
           </el-form>
         </div>
       </div>
-      <!-- <div class="top-message">
-        <div class="headline">鐥呭彶</div>
-        <div class="detailed">
-          <el-form :model="form" label-width="100px">
-            <el-row>
+      <div class="section-card">
+        <div class="section-card__header">
+          <span class="section-title">鐥呭彶</span>
+        </div>
+        <div class="section-card__body">
+          <el-form :model="form" label-width="110px" class="profile-form">
+            <el-row :gutter="24">
               <el-col :span="8">
                 <el-form-item label="杩囧線鐤剧梾" prop="name">
-                  <el-input
-                    v-model="form.pastIllnesses"
-                    placeholder="璇疯緭鍏�"
-                    maxlength="30"
-                  />
+                  <el-input v-model="form.pastIllnesses" placeholder="璇疯緭鍏�" maxlength="30" />
                 </el-form-item>
               </el-col>
               <el-col :span="8">
                 <el-form-item label="鑽墿杩囨晱" prop="sex">
-                  <el-input
-                    v-model="form.drugAllergy"
-                    placeholder="璇疯緭鍏ュ叿浣撹嵂鐗�/鏃�"
-                    maxlength="30"
-                  />
+                  <el-input v-model="form.drugAllergy" placeholder="璇疯緭鍏ュ叿浣撹嵂鐗�/鏃�" maxlength="30" />
                 </el-form-item>
               </el-col>
               <el-col :span="8">
                 <el-form-item label="瀹舵棌鐥呭彶" prop="age">
-                  <el-input
-                    v-model="form.familyHistory"
-                    placeholder="璇疯緭鍏ュ叿浣撶柧鐥�/鏃�"
-                    maxlength="30"
-                  />
+                  <el-input v-model="form.familyHistory" placeholder="璇疯緭鍏ュ叿浣撶柧鐥�/鏃�" maxlength="30" />
                 </el-form-item>
               </el-col>
-            </el-row>
-            <el-row>
               <el-col :span="8">
                 <el-form-item label="鎵嬫湳鍙�" prop="name">
-                  <el-input
-                    v-model="form.surgicalHistory"
-                    placeholder="璇疯緭鍏ユ墜鏈�/鏃�"
-                    maxlength="30"
-                  />
+                  <el-input v-model="form.surgicalHistory" placeholder="璇疯緭鍏ユ墜鏈�/鏃�" maxlength="30" />
                 </el-form-item>
               </el-col>
               <el-col :span="8">
                 <el-form-item label="鐢熻偛鍙�" prop="age">
-                  <el-input
-                    v-model="form.reproductiveHistory"
-                    placeholder="璇疯緭鍏ヨ儙鏁�/鏃�"
-                    maxlength="30"
-                  />
+                  <el-input v-model="form.reproductiveHistory" placeholder="璇疯緭鍏ヨ儙鏁�/鏃�" maxlength="30" />
                 </el-form-item>
               </el-col>
               <el-col :span="8">
@@ -268,8 +213,6 @@
                   </el-radio-group>
                 </el-form-item>
               </el-col>
-            </el-row>
-            <el-row>
               <el-col :span="8">
                 <el-form-item label="鍚哥儫鎯呭喌" prop="smoking">
                   <el-radio-group v-model="form.smoking">
@@ -294,8 +237,6 @@
                   </el-radio-group>
                 </el-form-item>
               </el-col>
-            </el-row>
-            <el-row>
               <el-col :span="12">
                 <el-form-item label="楗鎯呭喌" prop="diet">
                   <el-radio-group v-model="form.diet">
@@ -303,8 +244,9 @@
                     <el-radio label="2">姝e父楗</el-radio>
                     <el-radio label="3">椋熸涓嶆尟</el-radio>
                   </el-radio-group>
-                </el-form-item> </el-col
-              ><el-col :span="12">
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
                 <el-form-item label="蹇冪悊鎯呭喌" prop="psychology">
                   <el-radio-group v-model="form.psychology">
                     <el-radio label="1">蹇冩儏鎰夋偊</el-radio>
@@ -316,18 +258,20 @@
             </el-row>
           </el-form>
         </div>
-      </div> -->
-      <!-- 鑱旂郴鐢佃瘽 -->
-      <div class="bottom-message">
-        <div class="headline">
-          浜插睘鍙风爜缁存姢<span style="margin-right: 60px">&nbsp;&nbsp;</span>
-          <el-button type="primary" @click="addcompiletb">+鏂板</el-button>
+      </div>
+      <!-- 浜插睘鍙风爜缁存姢 -->
+      <div class="section-card">
+        <div class="section-card__header">
+          <span class="section-title">浜插睘鍙风爜缁存姢</span>
+          <el-button type="primary" size="small" icon="el-icon-plus" @click="addcompiletb">鏂板</el-button>
         </div>
-        <div class="Table-screen">
+        <div class="section-card__body">
           <el-table
             :data="tableData"
             style="width: 100%"
             :row-class-name="tableRowClassName"
+            stripe
+            border
           >
             <el-table-column prop="id" label="搴忓彿" width="180">
             </el-table-column>
@@ -355,7 +299,6 @@
                   size="small"
                   >缂栬緫</el-button
                 >
-
                 <el-button @click="deltb(scope.row)" type="danger" size="small"
                   >鍒犻櫎</el-button
                 >
@@ -369,7 +312,7 @@
     <div class="medical-record" v-else-if="activeName == 'medical'">
       <!-- 闂ㄨ瘖 -->
       <div v-if="sonactiveName == 'outpatient'">
-        <el-table :data="serviceData" style="width: 100%">
+        <el-table :data="serviceData" style="width: 100%" stripe border>
           <el-table-column
             label="灏辫瘖鏃堕棿"
             align="center"
@@ -458,7 +401,7 @@
       </div>
       <!-- 浣忛櫌 -->
       <div v-if="sonactiveName == 'inhospital'">
-        <el-table :data="serviceDatary" style="width: 100%">
+        <el-table :data="serviceDatary" style="width: 100%" stripe border>
           <el-table-column
             label="浣忛櫌鍙�"
             align="center"
@@ -535,7 +478,7 @@
       </div>
       <!-- 鍑洪櫌 -->
       <div v-if="sonactiveName == 'checkout'">
-        <el-table :data="serviceDatacy" style="width: 100%">
+        <el-table :data="serviceDatacy" style="width: 100%" stripe border>
           <el-table-column
             label="浣忛櫌鍙�"
             align="center"
@@ -614,91 +557,7 @@
     </div>
 
     <!-- 鏈嶅姟璁板綍 -->
-    <div
-      class="medical-recordc"
-      style="margin-top: 20px; font-size: 20px !important"
-      v-else-if="activeName == 'serve'"
-    >
-      <div style="margin-bottom: 15px" v-for="item in record">
-        <el-card class="box-card">
-          <div
-            style="
-              font-size: 22px;
-              padding-left: 5px;
-              margin: 15px 0;
-              border-left: 4px solid rgb(190, 65, 134);
-            "
-          >
-            <span v-if="item.serviceType == 2">鍑洪櫌闅忚</span>
-            <span v-if="item.serviceType == 1">蹇冪數闅忚</span>
-            <span v-if="item.serviceType == 3">褰卞儚闅忚</span>
-            <span v-if="item.serviceType == 4">瀹f暀鍏虫��</span>
-          </div>
-          <el-divider></el-divider>
-          <div style="margin-top: 10px">
-            鏈嶅姟鍚嶇О锛�<span style="color: #2775b6">{{
-              item.templatename
-            }}</span>
-          </div>
-          <div style="margin-top: 10px">
-            鍒涘缓鏃堕棿锛�<span style="color: #2775b6">{{ item.createTime }}</span>
-          </div>
-          <div style="margin-top: 10px">
-            瀹屾垚鏃堕棿锛�<span style="color: #2775b6">{{ item.finishtime }}</span>
-          </div>
-          <div style="margin-top: 10px">
-            <el-row :gutter="20">
-              <el-col :span="12"
-                >绉戝锛�
-                <span style="color: #2775b6">{{ item.deptname }}</span></el-col
-              >
-              <el-col :span="12"
-                >鐥呭尯锛�
-                <span style="color: #2775b6">{{
-                  item.leavehospitaldistrictname
-                }}</span></el-col
-              >
-            </el-row>
-          </div>
-
-          <div
-            style="
-              font-size: 20px;
-              padding-left: 5px;
-              margin: 15px 0;
-              border-left: 4px solid rgb(65, 161, 190);
-            "
-          >
-            浜哄伐璁板綍
-          </div>
-          <div style="margin-top: 10px">
-            <el-row :gutter="20">
-              <el-col :span="6"
-                >璐熻矗浜猴細
-                <span style="color: #2775b6">{{ item.createBy }}</span></el-col
-              >
-              <el-col :span="6"
-                >涓绘不鍖荤敓锛�
-                <span style="color: #2775b6">{{ item.drname }}</span></el-col
-              >
-              <el-col :span="6"
-                >璐d换鎶ゅ+
-                <span style="color: #2775b6">{{ item.nurseName }}</span></el-col
-              >
-            </el-row>
-          </div>
-          <div style="margin-top: 10px">
-            缁撴灉鐘舵�侊細
-            <span style="color: #2775b6" v-if="item.excep == 0">鏈嶅姟姝e父</span>
-            <span style="color: #b55e54" v-if="item.excep == 1">寮傚父</span>
-          </div>
-          <!-- <div style="margin-top: 10px">
-            澶囨敞锛�
-            <span style="color: #2775b6">鎻愰啋娉ㄦ剰楗鍋ュ悍</span>
-          </div> -->
-        </el-card>
-      </div>
-    </div>
+    <ServiceRecords v-else-if="activeName == 'serve'" :patid="id" />
     <!-- 鍋ュ悍鐩戞祴 -->
     <!-- <div class="medical-record" v-show="activeName == 'monitor'">
       <div v-show="sontwoactiveName == 'blood'" style="display: flex">
@@ -846,13 +705,14 @@
   Patientclinic,
 } from "@/api/patient/homepage";
 
-import { getsearchrResults, getTaskservelist } from "@/api/AiCentre/index";
+import { getsearchrResults } from "@/api/AiCentre/index";
+import ServiceRecords from "@/views/patient/archives/components/ServiceRecords.vue";
 import { listPatouthosp } from "@/api/smartor/patouthosp";
 import { listpatient } from "@/api/patient/record";
 
 export default {
   name: "Profile",
-  components: { userAvatar, userInfo, resetPwd, SFtable },
+  components: { userAvatar, userInfo, resetPwd, SFtable, ServiceRecords },
   data() {
     return {
       userform: {},
@@ -1233,24 +1093,11 @@
     handleClick(tab, event) {
       if (tab.index == "1") {
         this.getList(1);
-      } else if (tab.index == "2") {
-        this.handleClickfw();
       }
     },
     handleClickson(tab, event) {
       console.log(tab, "son");
       this.getList(tab.index);
-    },
-    // 鏌ヨ鏈嶅姟璁板綍
-    handleClickfw() {
-
-      getTaskservelist({
-        patid: this.id,
-      }).then((res) => {
-        if (res.code == 200) {
-          this.record = res.rows[0].serviceSubtaskList;
-        }
-      });
     },
     // 鑱旂郴鏂瑰紡鏂板
     Addanumber() {},
@@ -1780,134 +1627,354 @@
 </script>
 
 <style lang="scss" scoped>
-.personages {
-  height: 88px;
-  width: 100%;
-  background-color: #5e86f9;
-  border-radius: 5px;
-  padding: 20px;
-  margin-bottom: 10px;
-  line-height: 48px;
-  font-size: 25px;
-  font-weight: 600;
-  color: #ffffff;
-  .headportrait {
-    display: flex;
-    .text-center {
-      width: 55px;
-      height: 55px;
-      margin-right: 10px;
-      img {
-        width: 100%;
-        height: 100%;
-        border-radius: 50%;
-      }
+$primary: #3f6ef0;
+
+// ===== 鎮h�呬俊鎭ご閮� =====
+.profile-header {
+  position: relative;
+  display: flex;
+  align-items: center;
+  padding: 26px 32px;
+  margin-bottom: 16px;
+  border-radius: 14px;
+  overflow: hidden;
+  color: #fff;
+  background: linear-gradient(120deg, #3f6ef0 0%, #5b8cff 55%, #78a9ff 100%);
+  box-shadow: 0 8px 24px rgba(63, 110, 240, 0.26);
+
+  &::before {
+    content: "";
+    position: absolute;
+    right: -70px;
+    top: -90px;
+    width: 280px;
+    height: 280px;
+    border-radius: 50%;
+    background: rgba(255, 255, 255, 0.09);
+  }
+  &::after {
+    content: "";
+    position: absolute;
+    right: 90px;
+    bottom: -130px;
+    width: 230px;
+    height: 230px;
+    border-radius: 50%;
+    background: rgba(255, 255, 255, 0.06);
+  }
+
+  &__avatar {
+    position: relative;
+    z-index: 1;
+    width: 76px;
+    height: 76px;
+    flex-shrink: 0;
+    border-radius: 50%;
+    padding: 3px;
+    background: rgba(255, 255, 255, 0.4);
+    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.18);
+
+    img {
+      width: 100%;
+      height: 100%;
+      border-radius: 50%;
+      object-fit: cover;
+      background: #eef2fb;
     }
-    .text-title {
-      font-size: 20px;
+  }
+
+  &__info {
+    position: relative;
+    z-index: 1;
+    margin-left: 22px;
+    min-width: 0;
+  }
+
+  &__name {
+    font-size: 24px;
+    font-weight: 700;
+    letter-spacing: 1px;
+    line-height: 1.3;
+  }
+
+  &__chips {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10px;
+    margin-top: 12px;
+
+    .chip {
+      padding: 4px 14px;
+      font-size: 13px;
       font-weight: 500;
-      color: #ecfcfc;
+      border-radius: 999px;
+      background: rgba(255, 255, 255, 0.2);
+      border: 1px solid rgba(255, 255, 255, 0.3);
+      color: #f5f8ff;
+      line-height: 1.5;
     }
   }
 }
-.xinz-inf {
-  font-size: 18px;
-  // white-space: nowrap;
+
+// ===== Tabs =====
+::v-deep .el-tabs--border-card {
+  border: none;
+  border-radius: 12px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
   overflow: hidden;
-  text-overflow: ellipsis;
 
-  line-height: 48px;
+  > .el-tabs__header {
+    margin: 0;
+    background: #fff;
+    border-bottom: 1px solid #eef0f4;
 
-  .el-tag + .el-tag {
-    margin-left: 10px;
+    .el-tabs__nav {
+      border: none;
+
+      .el-tabs__item {
+        height: 54px;
+        line-height: 54px;
+        font-size: 15px;
+        color: #606266;
+        border: none !important;
+
+        .mulsz {
+          font-size: 15px;
+        }
+
+        &.is-active {
+          color: $primary;
+          font-weight: 600;
+          background: #f3f7ff;
+          box-shadow: inset 0 -3px 0 $primary;
+        }
+      }
+    }
   }
+
+  > .el-tabs__content {
+    padding: 0;
+  }
+}
+
+// ===== 鍋ュ悍妗f鍗$墖 =====
+.information-content {
+  margin-top: 16px;
+}
+
+.section-card {
+  margin-bottom: 16px;
+  background: #fff;
+  border-radius: 12px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
+  overflow: hidden;
+
+  &__header {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    padding: 16px 24px;
+    border-bottom: 1px solid #f0f2f5;
+
+    .section-title {
+      position: relative;
+      padding-left: 12px;
+      font-size: 16px;
+      font-weight: 600;
+      color: #303133;
+
+      &::before {
+        content: "";
+        position: absolute;
+        left: 0;
+        top: 50%;
+        transform: translateY(-50%);
+        width: 4px;
+        height: 16px;
+        border-radius: 2px;
+        background: $primary;
+      }
+    }
+  }
+
+  &__body {
+    padding: 20px 24px 4px;
+  }
+}
+
+// 琛ㄥ崟
+.profile-form {
+  .el-form-item {
+    margin-bottom: 18px;
+  }
+
+  ::v-deep .el-form-item__label {
+    color: #606266;
+    font-weight: 500;
+  }
+
+  ::v-deep .el-input__inner {
+    border-radius: 6px;
+  }
+}
+
+// 鏍囩
+.xinz-inf {
+  line-height: 40px;
+
+  .el-tag {
+    margin-bottom: 6px;
+    border-radius: 4px;
+
+    & + .el-tag {
+      margin-left: 8px;
+    }
+  }
+
   .button-new-tag {
-    margin-left: 10px;
+    margin-left: 8px;
     height: 32px;
     line-height: 30px;
     padding-top: 0;
     padding-bottom: 0;
   }
+
   .input-new-tag {
     width: 90px;
-    margin-left: 10px;
+    margin-left: 8px;
     vertical-align: bottom;
   }
 }
-.el-tabs--border-card {
-  // font-size: 25px;
-  .mulsz {
-    font-size: 25px;
-    margin-top: 20px;
+
+// ===== 鍖荤枟妗f琛ㄦ牸 =====
+.medical-record {
+  margin-top: 16px;
+  padding: 24px;
+  background: #fff;
+  border-radius: 12px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
+
+  ::v-deep .el-table {
+    th.el-table__cell {
+      background: #f5f7fb;
+      color: #303133;
+      font-weight: 600;
+    }
+
+    .el-table__row td {
+      padding: 10px 0;
+    }
+
+    .el-table__row--striped td {
+      background: #fafbfd;
+    }
+
+    .el-table__row:hover > td {
+      background: #f3f7ff !important;
+    }
   }
 }
-.information-content {
-  margin-top: 20px;
-  background: #ffffff;
-  border: 1px solid #dcdfe6;
-  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
-    0 0 6px 0 rgba(0, 0, 0, 0.04);
-  .top-message {
-    margin-top: 25px;
-    margin-left: 100px;
-    .detailed {
-      width: 88%;
-      border-radius: 8px;
-      padding: 30px;
-      margin-bottom: 30px;
-      background-color: #ddf0f8;
-      .bg-purple {
-        margin-bottom: 20px;
-      }
-      .spanvalue {
-        display: inline-block;
-        min-width: 200px;
-        border-bottom: 1px solid rgb(172, 172, 172);
-      }
+
+// 鍗$墖鍐呰〃鏍硷紙浜插睘鍙风爜锛�
+.section-card__body {
+  ::v-deep .el-table {
+    th.el-table__cell {
+      background: #f5f7fb;
+      color: #303133;
+      font-weight: 600;
+    }
+  }
+}
+
+// ===== 鏈嶅姟璁板綍 =====
+.service-record {
+  margin-top: 16px;
+
+  .service-item {
+    margin-bottom: 16px;
+  }
+
+  .service-card {
+    border-radius: 12px;
+    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.05);
+
+    ::v-deep .el-card__body {
+      padding: 20px 24px;
     }
   }
 
-  .headline {
-    font-size: 25px;
-    padding-left: 5px;
-    margin-bottom: 10px;
-    border-left: 8px solid rgb(65, 161, 190);
-  }
-  .headlines {
-    font-size: 25px;
+  .service-card__header {
     display: flex;
-    width: 88%;
+    align-items: center;
     justify-content: space-between;
-    padding-left: 5px;
-    margin-bottom: 10px;
-    border-left: 8px solid rgb(65, 161, 190);
+    padding-bottom: 14px;
+    border-bottom: 1px dashed #eef0f4;
   }
-  .bottom-message {
-    margin-bottom: 25px;
-    margin-left: 100px;
-    .Table-screen {
-      width: 88%;
-      padding: 30px;
-      margin-bottom: 30px;
-      border-radius: 8px;
-      background-color: #ddf0f8;
-      font-size: 20px !important;
+
+  .service-card__title {
+    display: flex;
+    align-items: center;
+    gap: 12px;
+  }
+
+  .service-badge {
+    display: inline-block;
+    padding: 4px 12px;
+    font-size: 13px;
+    font-weight: 600;
+    color: $primary;
+    background: #eef4ff;
+    border-radius: 6px;
+  }
+
+  .service-name {
+    font-size: 16px;
+    font-weight: 600;
+    color: #303133;
+  }
+
+  .service-status {
+    padding: 4px 12px;
+    font-size: 13px;
+    border-radius: 999px;
+
+    &.is-ok {
+      color: #12a182;
+      background: #e8f7f1;
+    }
+
+    &.is-bad {
+      color: #e0564c;
+      background: #fdeeee;
+    }
+  }
+
+  .service-grid {
+    display: grid;
+    grid-template-columns: repeat(4, 1fr);
+    gap: 18px 24px;
+    padding-top: 16px;
+  }
+
+  .service-cell {
+    display: flex;
+    flex-direction: column;
+    gap: 4px;
+
+    .s-label {
+      font-size: 12px;
+      color: #909399;
+    }
+
+    .s-value {
+      font-size: 14px;
+      color: #303133;
     }
   }
 }
-.medical-record {
-  margin-top: 20px;
-  margin: 20px;
-  padding: 30px;
-  background: #ffffff;
-  border: 1px solid #dcdfe6;
-  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
-    0 0 6px 0 rgba(0, 0, 0, 0.04);
-}
-.sontwoactiveName {
-  margin: 0 auto;
-}
-::v-deep.el-table .warning-row {
-  background: oldlace;
+
+// 榛樿鑱旂郴鏂瑰紡楂樹寒琛�
+::v-deep .el-table .warning-row {
+  background: #fff7e6;
 }
 </style>
diff --git a/src/views/repositoryai/intention/index.vue b/src/views/repositoryai/intention/index.vue
index 2647196..45d22c9 100644
--- a/src/views/repositoryai/intention/index.vue
+++ b/src/views/repositoryai/intention/index.vue
@@ -152,7 +152,6 @@
                   icon="el-icon-plus"
                   size="medium"
                   @click="handleAdd"
-
                   >鏂板</el-button
                 >
               </el-col>
@@ -165,7 +164,6 @@
                   size="medium"
                   :disabled="multiple"
                   @click="handleDelete"
-
                   >鍒犻櫎</el-button
                 >
               </el-col>
@@ -218,7 +216,6 @@
                 </template>
               </el-table-column>
 
-
               <!-- <el-table-column
                 label="姝e父鍊艰寖鍥�"
                 align="center"
@@ -230,7 +227,7 @@
                   <span>{{ scope.row.warnup }}~{{ scope.row.warndown }}</span>
                 </template>
               </el-table-column> -->
-             <el-table-column
+              <el-table-column
                 label="閫傜敤鍦烘櫙"
                 align="center"
                 key="suitWayList"
@@ -253,7 +250,6 @@
                     size="medium"
                     type="text"
                     @click="illnessUpdate(scope.row)"
-
                     ><span class="button-textxg"
                       ><i class="el-icon-date"></i>璇︽儏</span
                     ></el-button
@@ -290,7 +286,6 @@
                     size="medium"
                     type="text"
                     @click="handleUpdate(scope.row)"
-
                     ><span class="button-textxg"
                       ><i class="el-icon-edit"></i>淇敼</span
                     ></el-button
@@ -308,7 +303,6 @@
                     size="medium"
                     type="text"
                     @click="handleDelete(scope.row)"
-
                     ><span class="button-textsc"
                       ><i class="el-icon-delete"></i>鍒犻櫎</span
                     ></el-button
@@ -351,14 +345,14 @@
                   <el-input
                     v-model="indexform.targetname"
                     placeholder="璇疯緭鍏ユ寚鏍囧悕绉�"
-                    maxlength="40"
+                    maxlength="100"
                   />
                 </el-form-item>
               </el-col>
               <el-col :span="12">
                 <el-form-item label="鎸囨爣鍒嗙被" prop="assortid">
                   <el-select
-                  style="width: 300px;"
+                    style="width: 300px"
                     v-model="indexform.assortid"
                     size="medium"
                     filterable
@@ -379,18 +373,19 @@
                     </el-option-group>
                   </el-select>
                 </el-form-item>
-
               </el-col>
             </el-row>
             <el-row v-if="!measurement">
               <el-col :span="24">
                 <el-form-item label="鎸囨爣鎻忚堪" prop="targetdesc">
                   <el-input
+                    type="textarea"
+                    :rows="2"
                     v-model="indexform.targetdesc"
                     placeholder="璇疯緭鍏ユ寚鏍囨弿杩�"
                     id="targetdesc"
                     @focus="currentInputId = 'targetdesc'"
-                    maxlength="40"
+                    maxlength="400"
                   />
                 </el-form-item> </el-col
             ></el-row>
@@ -1293,7 +1288,7 @@
           targetregex: "",
           targetregex2: "",
           isoperation: 1,
-          isabnormal:0,
+          isabnormal: 0,
           picturePath: "",
           dynamiccruxs: [],
           nodynamiccruxs: [],
diff --git a/src/views/sfstatistics/percentage/components/ChartDialog.vue b/src/views/sfstatistics/percentage/components/ChartDialog.vue
index f8deb36..bf27f7d 100644
--- a/src/views/sfstatistics/percentage/components/ChartDialog.vue
+++ b/src/views/sfstatistics/percentage/components/ChartDialog.vue
@@ -210,6 +210,28 @@
           { value: careData.inProgress, name: "鎶ょ悊杩涜涓�" },
           { value: careData.notStarted, name: "鎶ょ悊鏈紑濮�" },
         ];
+      } else if (this.activeTab === "combined") {
+        legendData = ["寰呴殢璁�", "闅忚鎴愬姛", "闅忚澶辫触"];
+        const followUpData = {
+          pending: 0,
+          success: 0,
+          fail: 0,
+        };
+
+        this.data.forEach((item) => {
+          followUpData.pending +=
+            (item.pendingFollowUp || 0) + (item.pendingFollowUpAgain || 0);
+          followUpData.success +=
+            (item.followUpSuccess || 0) + (item.followUpSuccessAgain || 0);
+          followUpData.fail +=
+            (item.followUpFail || 0) + (item.followUpFailAgain || 0);
+        });
+
+        seriesData = [
+          { value: followUpData.pending, name: "寰呴殢璁�" },
+          { value: followUpData.success, name: "闅忚鎴愬姛" },
+          { value: followUpData.fail, name: "闅忚澶辫触" },
+        ];
       }
 
       return { legendData, seriesData };
@@ -536,6 +558,77 @@
             },
           },
         ];
+      } else if (this.activeTab === "combined") {
+        title = "缁煎悎闅忚";
+        yAxisName1 = "浜烘";
+        legendData = ["鍑洪櫌浜烘", "棣栨瀹屾垚", "鍐嶆瀹屾垚", "闅忚鐜�(%)", "鎺ㄩ�佺巼(%)"];
+        colors = ["#5470C6", "#91CC75", "#FAC858", "#EE6666", "#9A60B4"];
+
+        const dischargeData = this.data.map((item) => item.dischargeCount || 0);
+        const firstSuccessData = this.data.map(
+          (item) => item.followUpSuccess || 0
+        );
+        const againSuccessData = this.data.map(
+          (item) => item.followUpSuccessAgain || 0
+        );
+        const followUpRateData = this.data.map((item) => {
+          const success = Number(item.followUpSuccess) || 0;
+          const nonFollowUp = Number(item.nonFollowUp) || 0;
+          const followUpNeeded = Number(item.followUpNeeded) || 0;
+          const denominator = followUpNeeded + nonFollowUp;
+          return denominator > 0
+            ? Number((((success + nonFollowUp) / denominator) * 100).toFixed(2))
+            : 0;
+        });
+        const pushRateData = this.data.map((item) => {
+          const successAgain = Number(item.followUpSuccessAgain) || 0;
+          const nonFollowUp = Number(item.nonFollowUp) || 0;
+          const followUpNeeded = Number(item.followUpNeeded) || 0;
+          const denominator = followUpNeeded + nonFollowUp;
+          return denominator > 0
+            ? Number(((successAgain / denominator) * 100).toFixed(2))
+            : 0;
+        });
+
+        series = [
+          {
+            name: "鍑洪櫌浜烘",
+            type: "bar",
+            barWidth: "25%",
+            data: dischargeData,
+            itemStyle: { borderRadius: [4, 4, 0, 0] },
+          },
+          {
+            name: "棣栨瀹屾垚",
+            type: "bar",
+            barWidth: "25%",
+            data: firstSuccessData,
+            itemStyle: { borderRadius: [4, 4, 0, 0] },
+          },
+          {
+            name: "鍐嶆瀹屾垚",
+            type: "bar",
+            barWidth: "25%",
+            data: againSuccessData,
+            itemStyle: { borderRadius: [4, 4, 0, 0] },
+          },
+          {
+            name: "闅忚鐜�(%)",
+            type: "line",
+            yAxisIndex: 1,
+            data: followUpRateData,
+            symbolSize: 8,
+            lineStyle: { width: 3 },
+          },
+          {
+            name: "鎺ㄩ�佺巼(%)",
+            type: "line",
+            yAxisIndex: 1,
+            data: pushRateData,
+            symbolSize: 8,
+            lineStyle: { width: 3, type: "dotted" },
+          },
+        ];
       }
 
       return {
diff --git a/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue b/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
index fc3823c..540e2d0 100644
--- a/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
@@ -582,6 +582,18 @@
     },
 
     // ===================== 瀵煎嚭 =====================
+    getServiceTypeLabel() {
+      const val = this.queryParams.serviceType;
+      if (val == null) return "";
+      const values = Array.isArray(val) ? val : [val];
+      const list =
+        this.options && this.options.length ? this.options : this.tasktypes;
+      const labels = values
+        .map((v) => (list.find((o) => o.value === v) || {}).label)
+        .filter(Boolean);
+      return labels.join("/");
+    },
+
     async exportTable() {
       try {
         let dateRangeString = "";
@@ -603,7 +615,9 @@
           dateRangeString = isLishuiHospital ? `${now.getFullYear()}骞�${now.getMonth() + 1}鏈坄 : `${now.getMonth() + 1}鏈坄;
         }
 
-        const excelName = `缁煎悎闅忚缁熻琛╛${dateRangeString}.xlsx`;
+        const serviceTypeLabel = this.getServiceTypeLabel();
+        const serviceTypeSuffix = serviceTypeLabel ? `_${serviceTypeLabel}` : "";
+        const excelName = `缁煎悎闅忚缁熻琛�${serviceTypeSuffix}_${dateRangeString}.xlsx`;
         if (!this.tableData || this.tableData.length === 0) {
           this.$message.warning("鏆傛棤鏁版嵁鍙鍑�");
           return false;
@@ -611,7 +625,7 @@
 
         const workbook = new ExcelJS.Workbook();
         const worksheet = workbook.addWorksheet("缁煎悎缁熻");
-        this.buildExportSheet(worksheet, dateRangeString);
+        this.buildExportSheet(worksheet, dateRangeString, serviceTypeSuffix);
         const buffer = await workbook.xlsx.writeBuffer();
         const blob = new Blob([buffer], {
           type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
@@ -626,7 +640,7 @@
       }
     },
 
-    buildExportSheet(worksheet, dateRangeString) {
+    buildExportSheet(worksheet, dateRangeString, serviceTypeSuffix = "") {
       // 瀹氫箟鏍峰紡
       const titleStyle = {
         font: { name: "寰蒋闆呴粦", size: 16, bold: true },
@@ -653,7 +667,7 @@
 
       // 鏍囬琛�
       worksheet.mergeCells(1, 1, 1, 20);
-      worksheet.getCell(1, 1).value = `缁煎悎闅忚缁熻琛╛${dateRangeString}`;
+      worksheet.getCell(1, 1).value = `缁煎悎闅忚缁熻琛�${serviceTypeSuffix}_${dateRangeString}`;
       worksheet.getCell(1, 1).style = titleStyle;
       worksheet.getRow(1).height = 35;
 
diff --git a/src/views/sfstatistics/percentage/components/FirstFollowUp.vue b/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
index 67d329f..e2167f6 100644
--- a/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
@@ -590,6 +590,223 @@
             </template>
           </el-table-column>
           <el-table-column
+            v-if="isTargetHospital"
+            label="浜哄伐"
+            align="center"
+          >
+            <el-table-column
+              label="鍙戦�佸畬鎴�"
+              align="center"
+              key="manualSuccess"
+              prop="manualSuccess"
+              :render-header="Tooltipfswc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'manualSuccessInfo',
+                      '鍙戦�佸畬鎴愪汉宸ラ殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{ scope.row.manualSuccess }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="鏈�缁堝畬鎴�"
+              align="center"
+              key="manualAgainSuccess"
+              prop="manualAgainSuccess"
+              :render-header="Tooltipzzwc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'manualAgainSuccessInfo',
+                      '鏈�缁堝畬鎴愪汉宸ラ殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.manualAgainSuccess
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table-column>
+          <el-table-column
+            v-if="isTargetHospital"
+            label="璇煶"
+            align="center"
+          >
+            <el-table-column
+              label="鍙戦�佸畬鎴�"
+              align="center"
+              key="voiceSuccess"
+              prop="voiceSuccess"
+              :render-header="Tooltipfswc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'voiceSuccessInfo',
+                      '鍙戦�佸畬鎴愯闊抽殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{ scope.row.voiceSuccess }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="鏈�缁堝畬鎴�"
+              align="center"
+              key="voiceAgainSuccess"
+              prop="voiceAgainSuccess"
+              :render-header="Tooltipzzwc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'voiceAgainSuccessInfo',
+                      '鏈�缁堝畬鎴愯闊抽殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.voiceAgainSuccess
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table-column>
+          <el-table-column
+            v-if="isTargetHospital"
+            label="鐭俊"
+            align="center"
+          >
+            <el-table-column
+              label="鍙戦�佸畬鎴�"
+              align="center"
+              key="smsSuccess"
+              prop="smsSuccess"
+              :render-header="Tooltipfswc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'smsSuccessInfo',
+                      '鍙戦�佸畬鎴愮煭淇¢殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{ scope.row.smsSuccess }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="鏈�缁堝畬鎴�"
+              align="center"
+              key="smsAgainSuccess"
+              prop="smsAgainSuccess"
+              :render-header="Tooltipzzwc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'smsAgainSuccessInfo',
+                      '鏈�缁堝畬鎴愮煭淇¢殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.smsAgainSuccess
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table-column>
+          <el-table-column
+            v-if="isTargetHospital"
+            label="寰俊"
+            align="center"
+          >
+            <el-table-column
+              label="鍙戦�佸畬鎴�"
+              align="center"
+              key="weChatSuccess"
+              prop="weChatSuccess"
+              :render-header="Tooltipfswc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'wechatSuccessInfo',
+                      '鍙戦�佸畬鎴愬井淇¢殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{ scope.row.weChatSuccess }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="鏈�缁堝畬鎴�"
+              align="center"
+              key="weChatAgainSuccess"
+              prop="weChatAgainSuccess"
+              :render-header="Tooltipzzwc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'wechatAgainSuccessInfo',
+                      '鏈�缁堝畬鎴愬井淇¢殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.weChatAgainSuccess
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table-column>
+          <el-table-column
+            v-if="!isTargetHospital"
             label="浜哄伐"
             align="center"
             key="manual"
@@ -607,7 +824,13 @@
               </el-button>
             </template>
           </el-table-column>
-          <el-table-column label="璇煶" align="center" key="voice" prop="voice">
+          <el-table-column
+            v-if="!isTargetHospital"
+            label="璇煶"
+            align="center"
+            key="voice"
+            prop="voice"
+          >
             <template slot-scope="scope">
               <el-button
                 size="medium"
@@ -620,7 +843,13 @@
               </el-button>
             </template>
           </el-table-column>
-          <el-table-column label="鐭俊" align="center" key="sms" prop="sms">
+          <el-table-column
+            v-if="!isTargetHospital"
+            label="鐭俊"
+            align="center"
+            key="sms"
+            prop="sms"
+          >
             <template slot-scope="scope">
               <el-button
                 size="medium"
@@ -632,6 +861,7 @@
             </template>
           </el-table-column>
           <el-table-column
+            v-if="!isTargetHospital"
             label="寰俊"
             align="center"
             key="weChat"
@@ -748,6 +978,14 @@
       patientqueryParams: { pn: 1, ps: 10 },
       tasktypes: store.getters.tasktypes,
     };
+  },
+  computed: {
+    isTargetHospital() {
+      return (
+        this.orgname == "绗竴浜烘皯鍖婚櫌婀栨花闄㈠尯" ||
+        this.orgname == "绗竴浜烘皯鍖婚櫌鍚村北闄㈠尯"
+      );
+    },
   },
   methods: {
     loadData() {
@@ -982,6 +1220,32 @@
         [h("span", column.label)]
       );
     },
+    Tooltipfswc(h, { column }) {
+      return h(
+        "el-tooltip",
+        {
+          props: {
+            content: "棣栨鍙戦�佹偅鑰呭嵆濉姤鎴愬姛鐨勬暟閲�",
+            placement: "top",
+            effect: "dark",
+          },
+        },
+        [h("span", column.label)]
+      );
+    },
+    Tooltipzzwc(h, { column }) {
+      return h(
+        "el-tooltip",
+        {
+          props: {
+            content: "棣栨鏈畬鎴愪簩娆℃垨涓夋琛ュ伩鎺ㄩ�佹湰鏂瑰紡鐨勫畬鎴愭鏁�",
+            placement: "top",
+            effect: "dark",
+          },
+        },
+        [h("span", column.label)]
+      );
+    },
     getInnerSummaries(param) {
       const { columns, data } = param;
       const sums = [];
@@ -1207,19 +1471,21 @@
           }
         }
 
-        // 鏍规嵁 serviceType 鐢熸垚闅忚绫诲瀷鍚嶇О
+        // 鏍规嵁 serviceType 鐢熸垚闅忚绫诲瀷鍚嶇О锛堝吋瀹瑰崟閫�/澶氶�夛級
+        const serviceTypes = Array.isArray(this.queryParams.serviceType)
+          ? this.queryParams.serviceType
+          : this.queryParams.serviceType
+          ? [this.queryParams.serviceType]
+          : [];
+
         let serviceTypeName = "棣栨鍑洪櫌闅忚"; // 鏂囦欢鍚嶄娇鐢ㄧ殑鍚嶇О
         let sheetTypeName = "棣栨闅忚"; // 宸ヤ綔琛ㄤ娇鐢ㄧ殑鍚嶇О锛堢畝鍖栫増锛�
 
-        if (
-          this.queryParams.serviceType &&
-          Array.isArray(this.queryParams.serviceType) &&
-          this.queryParams.serviceType.length > 0
-        ) {
+        if (serviceTypes.length > 0) {
           // 浣跨敤 props 涓殑 options锛堝嵆 tasktypes锛�
           if (this.options && Array.isArray(this.options)) {
             const matchedTypes = this.options.filter((task) =>
-              this.queryParams.serviceType.includes(task.value)
+              serviceTypes.includes(task.value)
             );
             console.log(matchedTypes, "matchedTypes");
 
@@ -1232,14 +1498,14 @@
               serviceTypeName = `棣栨${typeNames.join("/")}`;
               // 宸ヤ綔琛ㄥ悕绠�鍖栵紙鍙栫涓�涓�+鈥滅瓑鈥濓級
               sheetTypeName = `棣栨${typeNames[0]}绛塦;
-            } else if (this.queryParams.serviceType.length > 0) {
+            } else {
               // 鏃犲尮閰嶆椂浣跨敤鍘熷鍊�
-              const typeStr = this.queryParams.serviceType.join("/");
+              const typeStr = serviceTypes.join("/");
               serviceTypeName = `棣栨${typeStr}`;
               sheetTypeName = "棣栨闅忚";
             }
-          } else if (this.queryParams.serviceType.length > 0) {
-            const typeStr = this.queryParams.serviceType.join("/");
+          } else {
+            const typeStr = serviceTypes.join("/");
             serviceTypeName = `棣栨${typeStr}`;
             sheetTypeName = "棣栨闅忚";
           }
@@ -1800,7 +2066,9 @@
       console.log(1);
 
       this.patientqueryParams.serviceTypes = queryParams.serviceType
-        ? queryParams.serviceType.join(",")
+        ? Array.isArray(queryParams.serviceType)
+          ? queryParams.serviceType.join(",")
+          : String(queryParams.serviceType)
         : null;
 
       return selectTimelyRate(this.patientqueryParams);
diff --git a/src/views/sfstatistics/percentage/components/SecondFollowUp.vue b/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
index 88fe70e..d3abd40 100644
--- a/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
@@ -554,6 +554,223 @@
             :render-header="Tooltipsfl"
           />
           <el-table-column
+            v-if="isTargetHospital"
+            label="浜哄伐"
+            align="center"
+          >
+            <el-table-column
+              label="鍙戦�佸畬鎴�"
+              align="center"
+              key="manualSuccess"
+              prop="manualSuccess"
+              :render-header="Tooltipfswc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'manualSuccessInfo',
+                      '鍙戦�佸畬鎴愪汉宸ラ殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{ scope.row.manualSuccess }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="鏈�缁堝畬鎴�"
+              align="center"
+              key="manualAgainSuccess"
+              prop="manualAgainSuccess"
+              :render-header="Tooltipzzwc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'manualAgainSuccessInfo',
+                      '鏈�缁堝畬鎴愪汉宸ラ殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.manualAgainSuccess
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table-column>
+          <el-table-column
+            v-if="isTargetHospital"
+            label="璇煶"
+            align="center"
+          >
+            <el-table-column
+              label="鍙戦�佸畬鎴�"
+              align="center"
+              key="voiceSuccess"
+              prop="voiceSuccess"
+              :render-header="Tooltipfswc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'voiceSuccessInfo',
+                      '鍙戦�佸畬鎴愯闊抽殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{ scope.row.voiceSuccess }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="鏈�缁堝畬鎴�"
+              align="center"
+              key="voiceAgainSuccess"
+              prop="voiceAgainSuccess"
+              :render-header="Tooltipzzwc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'voiceAgainSuccessInfo',
+                      '鏈�缁堝畬鎴愯闊抽殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.voiceAgainSuccess
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table-column>
+          <el-table-column
+            v-if="isTargetHospital"
+            label="鐭俊"
+            align="center"
+          >
+            <el-table-column
+              label="鍙戦�佸畬鎴�"
+              align="center"
+              key="smsSuccess"
+              prop="smsSuccess"
+              :render-header="Tooltipfswc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'smsSuccessInfo',
+                      '鍙戦�佸畬鎴愮煭淇¢殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{ scope.row.smsSuccess }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="鏈�缁堝畬鎴�"
+              align="center"
+              key="smsAgainSuccess"
+              prop="smsAgainSuccess"
+              :render-header="Tooltipzzwc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'smsAgainSuccessInfo',
+                      '鏈�缁堝畬鎴愮煭淇¢殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.smsAgainSuccess
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table-column>
+          <el-table-column
+            v-if="isTargetHospital"
+            label="寰俊"
+            align="center"
+          >
+            <el-table-column
+              label="鍙戦�佸畬鎴�"
+              align="center"
+              key="weChatSuccess"
+              prop="weChatSuccess"
+              :render-header="Tooltipfswc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'wechatSuccessInfo',
+                      '鍙戦�佸畬鎴愬井淇¢殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{ scope.row.weChatSuccess }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="鏈�缁堝畬鎴�"
+              align="center"
+              key="weChatAgainSuccess"
+              prop="weChatAgainSuccess"
+              :render-header="Tooltipzzwc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'wechatAgainSuccessInfo',
+                      '鏈�缁堝畬鎴愬井淇¢殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.weChatAgainSuccess
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table-column>
+          <el-table-column
+            v-if="!isTargetHospital"
             label="浜哄伐"
             align="center"
             key="manualAgain"
@@ -576,6 +793,7 @@
             </template>
           </el-table-column>
           <el-table-column
+            v-if="!isTargetHospital"
             label="璇煶"
             align="center"
             key="voiceAgain"
@@ -594,6 +812,7 @@
             </template>
           </el-table-column>
           <el-table-column
+            v-if="!isTargetHospital"
             label="鐭俊"
             align="center"
             key="smsAgain"
@@ -616,6 +835,7 @@
             </template>
           </el-table-column>
           <el-table-column
+            v-if="!isTargetHospital"
             label="寰俊"
             align="center"
             key="weChatAgain"
@@ -682,6 +902,14 @@
       tasktypes: store.getters.tasktypes,
     };
   },
+  computed: {
+    isTargetHospital() {
+      return (
+        this.orgname == "绗竴浜烘皯鍖婚櫌婀栨花闄㈠尯" ||
+        this.orgname == "绗竴浜烘皯鍖婚櫌鍚村北闄㈠尯"
+      );
+    },
+  },
   methods: {
     loadData() {
       this.loading = true;
@@ -746,6 +974,32 @@
         {
           props: {
             content: "(闅忚鎴愬姛+棣栨闅忚澶辫触)/棣栨搴旈殢璁�",
+            placement: "top",
+            effect: "dark",
+          },
+        },
+        [h("span", column.label)]
+      );
+    },
+    Tooltipfswc(h, { column }) {
+      return h(
+        "el-tooltip",
+        {
+          props: {
+            content: "棣栨鍙戦�佹偅鑰呭嵆濉姤鎴愬姛鐨勬暟閲�",
+            placement: "top",
+            effect: "dark",
+          },
+        },
+        [h("span", column.label)]
+      );
+    },
+    Tooltipzzwc(h, { column }) {
+      return h(
+        "el-tooltip",
+        {
+          props: {
+            content: "棣栨鏈畬鎴愪簩娆℃垨涓夋琛ュ伩鎺ㄩ�佹湰鏂瑰紡鐨勫畬鎴愭鏁�",
             placement: "top",
             effect: "dark",
           },
@@ -1121,20 +1375,21 @@
           }
         }
 
-        // 鏍规嵁 serviceType 鐢熸垚闅忚绫诲瀷鍚嶇О
+        // 鏍规嵁 serviceType 鐢熸垚闅忚绫诲瀷鍚嶇О锛堝吋瀹瑰崟閫�/澶氶�夛級
+        const serviceTypes = Array.isArray(this.queryParams.serviceType)
+          ? this.queryParams.serviceType
+          : this.queryParams.serviceType
+          ? [this.queryParams.serviceType]
+          : [];
+
         let serviceTypeName = "鍑洪櫌闅忚"; // 鏂囦欢鍚嶄娇鐢ㄧ殑鍚嶇О
         let sheetTypeName = "鍐嶆闅忚"; // 宸ヤ綔琛ㄤ娇鐢ㄧ殑鍚嶇О锛堢畝鍖栫増锛�
-        console.log(this.queryParams.serviceType);
 
-        if (
-          this.queryParams.serviceType &&
-          Array.isArray(this.queryParams.serviceType) &&
-          this.queryParams.serviceType.length > 0
-        ) {
+        if (serviceTypes.length > 0) {
           if (this.tasktypes && Array.isArray(this.tasktypes)) {
             // 杩囨护鍑哄尮閰嶇殑闅忚绫诲瀷
             const matchedTypes = this.tasktypes.filter((task) =>
-              this.queryParams.serviceType.includes(task.value)
+              serviceTypes.includes(task.value)
             );
 
             if (matchedTypes.length === 1) {
@@ -1150,22 +1405,16 @@
               serviceTypeName = typeNames.join("/");
 
               // 宸ヤ綔琛ㄥ悕锛氫娇鐢ㄧ涓�涓被鍨嬫垨绠�鍖栧悕绉�
-              if (matchedTypes.length <= 2) {
-                // 濡傛灉鍙湁2涓被鍨嬶紝閮芥樉绀�
-                sheetTypeName = `${typeNames[0]}绛塦;
-              } else {
-                // 濡傛灉瓒呰繃2涓被鍨嬶紝鍙樉绀虹涓�涓�
-                sheetTypeName = `${typeNames[0]}绛塦;
-              }
-            } else if (this.queryParams.serviceType.length > 0) {
+              sheetTypeName = `${typeNames[0]}绛塦;
+            } else {
               // 濡傛灉娌℃湁鍖归厤鐨勶紝浣跨敤鍘熷鍊�
-              const typeStr = this.queryParams.serviceType.join("/");
+              const typeStr = serviceTypes.join("/");
               serviceTypeName = typeStr;
               sheetTypeName = "鍐嶆闅忚";
             }
-          } else if (this.queryParams.serviceType.length > 0) {
+          } else {
             // 濡傛灉娌℃湁 tasktypes锛屼娇鐢ㄥ師濮嬪��
-            const typeStr = this.queryParams.serviceType.join("/");
+            const typeStr = serviceTypes.join("/");
             serviceTypeName = typeStr;
             sheetTypeName = "鍐嶆闅忚";
           }
diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
index a542f86..39b83e2 100644
--- a/src/views/sfstatistics/percentage/index.vue
+++ b/src/views/sfstatistics/percentage/index.vue
@@ -58,8 +58,7 @@
 
         <el-form-item label="鏈嶅姟绫诲瀷" prop="userName">
           <el-select
-            v-model="queryParams.serviceType"
-            multiple
+            v-model="serviceTypeSingle"
             placeholder="璇烽�夋嫨"
           >
             <el-option
@@ -319,6 +318,18 @@
       },
     };
   },
+  computed: {
+    // 鏈嶅姟绫诲瀷鍗曢�夛細UI 缁戝畾鍗曞�硷紝鍐呴儴浠嶄互鏁扮粍褰㈠紡浼犵粰鍚庣
+    serviceTypeSingle: {
+      get() {
+        const st = this.queryParams.serviceType;
+        return Array.isArray(st) ? st[0] : st;
+      },
+      set(val) {
+        this.queryParams.serviceType = val == null || val === "" ? [] : [val];
+      },
+    },
+  },
   created() {
     this.getDeptTree();
     this.loadCurrentTabData();
diff --git a/vue.config.js b/vue.config.js
index fe4bda0..fd08b34 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -36,11 +36,11 @@
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
         // target: `https://www.health-y.cn/lssf`,
-        // target: `http://192.168.100.10:8096`,
+        target: `http://192.168.100.10:8096`,
         // target: `http://192.168.100.10:8094`,//鐪佺珛鍚屽痉
         // target: `http://192.168.100.10:8095`,//鏂板崕
         // target: `http://192.168.100.10:8098`,//甯備竴
-        target:`http://localhost:8095`,
+        // target:`http://localhost:8095`,
         // target:`http://35z1t16164.qicp.vip`,
         // target: `http://192.168.100.172:8095`,
         // target: `http://192.168.100.10:8089`,//鍗楀崕
diff --git "a/\351\232\217\350\256\277\345\244\226\351\223\276\351\200\232\347\224\2509.12.zip" "b/\351\232\217\350\256\277\345\244\226\351\223\276\351\200\232\347\224\2509.12.zip"
deleted file mode 100644
index e05720c..0000000
--- "a/\351\232\217\350\256\277\345\244\226\351\223\276\351\200\232\347\224\2509.12.zip"
+++ /dev/null
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\250.zip" "b/\351\232\217\350\256\277\351\200\232\347\224\250.zip"
deleted file mode 100644
index e770d46..0000000
--- "a/\351\232\217\350\256\277\351\200\232\347\224\250.zip"
+++ /dev/null
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\2509.10.zip" "b/\351\232\217\350\256\277\351\200\232\347\224\2509.10.zip"
deleted file mode 100644
index 220f919..0000000
--- "a/\351\232\217\350\256\277\351\200\232\347\224\2509.10.zip"
+++ /dev/null
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\2509.11.zip" "b/\351\232\217\350\256\277\351\200\232\347\224\2509.11.zip"
deleted file mode 100644
index 5cdef33..0000000
--- "a/\351\232\217\350\256\277\351\200\232\347\224\2509.11.zip"
+++ /dev/null
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\250 9.14.zip" "b/\351\232\217\350\256\277\351\200\232\347\224\2509.22.zip"
similarity index 74%
rename from "\351\232\217\350\256\277\351\200\232\347\224\250 9.14.zip"
rename to "\351\232\217\350\256\277\351\200\232\347\224\2509.22.zip"
index 87b3f17..08a35f9 100644
--- "a/\351\232\217\350\256\277\351\200\232\347\224\250 9.14.zip"
+++ "b/\351\232\217\350\256\277\351\200\232\347\224\2509.22.zip"
Binary files differ

--
Gitblit v1.9.3