From b4fe2c16274a91fee4fb26d91374f95fbe2dbcec Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期一, 09 十一月 2026 15:28:21 +0800
Subject: [PATCH] 测试完成

---
 src/views/patient/archives/generateConfig/index.vue                                  |   58 
 随访适用丽水市一11.5.zip                                                                     |    0 
 src/views/patient/patient/outpatient.vue                                             |   27 
 src/views/Satisfaction/sfstatistics/components/visitStatistics.vue                   |  319 +
 src/views/patient/propaganda/QuestionnaireTask.vue                                   |    2 
 src/views/followvisit/operationAgain/index.vue                                       | 1933 ++++++++++++
 src/views/patient/archives/childHealth/detail.vue                                    |   18 
 src/views/followvisit/record/detailpage/index.vue                                    |  135 
 src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue                |  405 ++
 11.3.zip                                                                             |    0 
 src/views/patient/archives/maternalHealth/detail.vue                                 |   20 
 src/views/patient/patient/behospitalized.vue                                         |  160 
 src/views/patient/propaganda/Missioncreation.vue                                     |    1 
 随访适用丽水市一11.5 (2).zip                                                                 |    0 
 src/views/followvisit/discharge/index copy.vue                                       |    2 
 src/views/patient/archives/apiAdapter.js                                             |   11 
 src/views/sfstatistics/percentage/components/SecondFollowUp.vue                      |  550 ++-
 src/api/system/user.js                                                               |    8 
 src/store/modules/user.js                                                            |    6 
 随访适用丽水市一11.3.zip                                                                     |    0 
 src/views/sfstatistics/percentage/components/FirstFollowUp.vue                       |  848 +++-
 src/views/followvisit/record/index.vue                                               |   32 
 /dev/null                                                                            | 3708 ------------------------
 src/views/system/user/index.vue                                                      |  117 
 src/views/Satisfaction/sfstatistics/components/components/TopicPatientListDialog.vue |  322 ++
 src/views/sfstatistics/percentage/index.vue                                          |   45 
 src/views/Satisfaction/sfstatistics/components/components/TopicDialog.vue            |   73 
 src/views/patient/patient/hospital.vue                                               |   24 
 src/views/patient/patient/AwaitingAdmission.vue                                      |   24 
 src/views/patient/propaganda/particty.vue                                            |    1 
 随访适用丽水市一11.4.zip                                                                     |    0 
 src/api/patient/record.js                                                            |    8 
 src/views/followvisit/discharge/index.vue                                            |   49 
 src/views/patient/follow/index.vue                                                   |   28 
 src/views/sfstatistics/percentage/components/CombinedFollowUp.vue                    |  107 
 35 files changed, 4,740 insertions(+), 4,301 deletions(-)

diff --git a/11.3.zip b/11.3.zip
new file mode 100644
index 0000000..e7d53d0
--- /dev/null
+++ b/11.3.zip
Binary files differ
diff --git a/src/api/patient/record.js b/src/api/patient/record.js
index e318faa..c783c3b 100644
--- a/src/api/patient/record.js
+++ b/src/api/patient/record.js
@@ -42,3 +42,11 @@
     data: data
   })
 };
+// 璇煶鏈嶅姟杞汉宸ワ細鍒犻櫎鎮h�呮湭瀹屾垚闅忚浠诲姟骞堕噸鏂扮敓鎴愪汉宸ラ殢璁夸换鍔�
+export function addManualVisit(data) {
+  return request({
+    url: '/smartor/patinhosp/addManualVisit',
+    method: 'post',
+    data: data
+  })
+};
diff --git a/src/api/system/user.js b/src/api/system/user.js
index 97a0648..d35782a 100644
--- a/src/api/system/user.js
+++ b/src/api/system/user.js
@@ -126,6 +126,14 @@
     data: data,
   });
 }
+// 闅忚棰樼洰閫夐」涓嬮捇鎮h�呮湇鍔″垪琛�
+export function getSfStatisticsCountDetailsHyperLink(data) {
+  return request({
+    url: "/smartor/serviceSubtask/getSfStatisticsCountDetailsHyperLink",
+    method: "post",
+    data: data,
+  });
+}
 // 鏈強鏃舵煡璇�
 export function selectTimelyRate(data) {
   return request({
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index d98a63f..f8dec16 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -239,6 +239,12 @@
               localStorage.setItem("deptCode", "");
               localStorage.setItem("YongHuID", "");
               localStorage.setItem("YongHuXM", "");
+            } else if (orgid == "1" && campusid == 8) {
+              localStorage.setItem("orgname", "绗竴浜烘皯鍖婚櫌鍩庝笢闄㈠尯");
+              localStorage.setItem("ZuHuID", "");
+              localStorage.setItem("deptCode", "");
+              localStorage.setItem("YongHuID", "");
+              localStorage.setItem("YongHuXM", "");
             } else if (orgid == "47246116333112211A1001") {
               localStorage.setItem("orgname", "缂欎簯鍘夸汉姘戝尰闄�");
               localStorage.setItem("ZuHuID", "1429338802177000010");
diff --git a/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue b/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
index 3f1c13d..9ac25b7 100644
--- a/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
+++ b/src/views/Satisfaction/sfstatistics/components/FollowupStatistics.vue
@@ -136,6 +136,8 @@
         style="width: 100%"
         @selection-change="handleSelectionChange"
         :row-key="getRowKey"
+        show-summary
+        :summary-method="getSummaries"
       >
         <!-- 鐥呭尯鍒� -->
         <el-table-column
@@ -801,6 +803,92 @@
       return `${(num * 100).toFixed(2)}%`;
     },
 
+    // 琛ㄦ牸鍚堣琛�
+    getSummaries(param) {
+      const { columns, data } = param;
+      const sums = [];
+
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "鍚堣";
+          return;
+        }
+
+        const prop = column.property;
+
+        // 鏁板�煎垪姹傚拰
+        if (
+          [
+            "dischargeCount",
+            "nonFollowUp",
+            "followUpNeeded",
+            "joyAllCount",
+            "joyCount",
+          ].includes(prop)
+        ) {
+          sums[index] = data.reduce(
+            (sum, item) => sum + (Number(item[prop]) || 0),
+            0
+          );
+          return;
+        }
+
+        // 瀹屾垚姣旂巼锛氭弧鎰忓害濉姤閲� / 婊℃剰搴﹂鐩�婚噺
+        if (prop === "joyTotal") {
+          const totalJoyAllCount = data.reduce(
+            (sum, item) => sum + (Number(item.joyAllCount) || 0),
+            0
+          );
+          const totalJoyCount = data.reduce(
+            (sum, item) => sum + (Number(item.joyCount) || 0),
+            0
+          );
+          sums[index] =
+            totalJoyAllCount > 0
+              ? ((totalJoyCount / totalJoyAllCount) * 100).toFixed(2) + "%"
+              : "0.00%";
+          return;
+        }
+
+        // 鐧惧垎姣斿垪锛堥殢璁跨巼/鍙婃椂鐜囷級锛氬彇骞冲潎鍊硷紙0 鍊间篃鍙備笌骞冲潎锛�
+        if (prop === "followUpRate" || prop === "rate") {
+          const percentageValues = data
+            .map((item) => {
+              const value = item[prop];
+              if (
+                value === null ||
+                value === undefined ||
+                value === "" ||
+                value === "-"
+              ) {
+                return null;
+              }
+              if (typeof value === "string" && value.includes("%")) {
+                const num = parseFloat(value.replace("%", "")) / 100;
+                return isNaN(num) ? null : num;
+              }
+              const num = parseFloat(value);
+              return isNaN(num) ? null : num;
+            })
+            .filter((value) => value !== null);
+
+          sums[index] =
+            percentageValues.length > 0
+              ? (
+                  (percentageValues.reduce((sum, value) => sum + value, 0) /
+                    percentageValues.length) *
+                  100
+                ).toFixed(2) + "%"
+              : "0.00%";
+          return;
+        }
+
+        sums[index] = "";
+      });
+
+      return sums;
+    },
+
     // 鏌ョ湅鏈強鏃堕殢璁胯鎯�
     handleSeedetails(row) {
       this.currentRow = row;
@@ -842,6 +930,113 @@
         console.error("鑾峰彇婊℃剰搴﹁鎯呭け璐�:", error);
         this.$message.error("鑾峰彇璇︽儏澶辫触");
       }
+    },
+
+    // 鑾峰彇鎸囧畾鐥呭尯/绉戝鐨勯鐩鎯�
+    async fetchTopicDetail(row) {
+      const params = {
+        configKey: "joyCount",
+        ...this.queryParams,
+      };
+      // 瀵煎嚭闇�瑕佽鐥呭尯/绉戝鐨勫叏閮ㄩ鐩紝瑕嗙洊涓昏〃鍒嗛〉鍙傛暟
+      params.pageNum = 1;
+      params.pageSize = 1000;
+      if (
+        this.queryParams.dateRange &&
+        this.queryParams.dateRange.length === 2
+      ) {
+        params.startTime = this.queryParams.dateRange[0];
+        params.endTime = this.queryParams.dateRange[1];
+      }
+      if (this.queryParams.statisticaltype == 1) {
+        params.leavehospitaldistrictcodes = [row.leavehospitaldistrictcode];
+      } else {
+        params.deptcodes = [row.deptcode];
+      }
+      const response = await getSfStatisticsJoyInfo(params);
+      return response.data || {};
+    },
+
+    // 涓昏〃瀵煎嚭琛屾暟鎹�
+    getMainExportRow(item) {
+      return [
+        this.queryParams.statisticaltype == 1
+          ? item.leavehospitaldistrictname
+          : item.deptname,
+        item.dischargeCount || 0,
+        item.nonFollowUp || 0,
+        item.followUpNeeded || 0,
+        item.followUpRate || "0%",
+        item.rate ? this.formatPercent(item.rate) : "0%",
+        item.joyAllCount || 0,
+        item.joyCount || 0,
+        item.joyTotal ? this.formatPercent(item.joyTotal) : "0%",
+      ];
+    },
+
+    // 璁$畻鏂囨湰鏄剧ず瀹藉害锛堜腑鏂囨寜 2銆佽嫳鏂�/鏁板瓧鎸� 1锛�
+    textWidth(str) {
+      if (!str) return 0;
+      let width = 0;
+      for (const ch of String(str)) {
+        width += ch.charCodeAt(0) > 255 ? 2 : 1;
+      }
+      return width;
+    },
+
+    // 涓芥按甯備腑鍖婚櫌锛氭媺鍙栨墍鏈夌瀹ら鐩槑缁嗭紝鎵佸钩鍖栦负銆岄鐩�夐」銆嶅垪缁撴瀯
+    async buildLishuiTopicColumns() {
+      const topicMap = new Map();
+      const rowQuantities = [];
+
+      for (const item of this.userList) {
+        const topiclist = await this.fetchTopicDetail(item);
+        const qMap = new Map();
+
+        if (topiclist && Object.keys(topiclist).length) {
+          Object.keys(topiclist).forEach((key) => {
+            const topic = topiclist[key];
+            if (!topic || !topic.scriptContent) return;
+
+            const tKey =
+              topic.scriptid != null && topic.scriptid !== ""
+                ? String(topic.scriptid)
+                : topic.scriptContent;
+
+            if (!topicMap.has(tKey)) {
+              topicMap.set(tKey, {
+                key: tKey,
+                scriptContent: topic.scriptContent,
+                options: [],
+                optionSet: new Set(),
+              });
+            }
+
+            const t = topicMap.get(tKey);
+            const topicQ = new Map();
+            (topic.details || []).forEach((detail) => {
+              if (!detail || !detail.optionText) return;
+              if (!t.optionSet.has(detail.optionText)) {
+                t.optionSet.add(detail.optionText);
+                t.options.push(detail.optionText);
+              }
+              topicQ.set(detail.optionText, Number(detail.chosenQuantity) || 0);
+            });
+            qMap.set(tKey, topicQ);
+          });
+        }
+
+        rowQuantities.push(qMap);
+      }
+
+      const topics = Array.from(topicMap.values());
+      // 娌℃湁閫夐」鐨勯鐩粯璁ゅ~鍏呬竴涓┖閫夐」鍒楋紝閬垮厤琛ㄥご/鏁版嵁閿欎綅
+      topics.forEach((t) => {
+        if (!t.options.length) {
+          t.options = [""];
+        }
+      });
+      return { topics, rowQuantities };
     },
 
     // 瀵煎嚭鏁版嵁
@@ -935,7 +1130,11 @@
             pattern: "solid",
             fgColor: { argb: "FFF5F7FA" },
           },
-          alignment: { vertical: "middle", horizontal: "center" },
+          alignment: {
+            vertical: "middle",
+            horizontal: "center",
+            wrapText: true,
+          },
           border: {
             top: { style: "thin", color: { argb: "FFD0D0D0" } },
             left: { style: "thin", color: { argb: "FFD0D0D0" } },
@@ -955,15 +1154,17 @@
           },
         };
 
-        // 娣诲姞鎬绘爣棰�
-        worksheet.mergeCells(1, 1, 1, 10);
-        const titleCell = worksheet.getCell(1, 1);
-        titleCell.value = `婊℃剰搴﹂殢璁跨粺璁¤〃锛�${sheetNameSuffix}锛塦;
-        titleCell.style = titleStyle;
-        worksheet.getRow(1).height = 35;
+        // 涓芥按甯備腑鍖婚櫌锛氶鍏堟媺鍙栭鐩槑缁嗭紝鎵佸钩鍖栦负銆岄鐩�夐」銆嶅垪
+        let lishuiTopics = [];
+        let lishuiRowQuantities = [];
+        if (isLishuiHospital) {
+          const built = await this.buildLishuiTopicColumns();
+          lishuiTopics = built.topics;
+          lishuiRowQuantities = built.rowQuantities;
+        }
 
-        // 娣诲姞琛ㄥご
-        const headers = [
+        // 涓昏〃鍒�
+        const mainHeaders = [
           this.queryParams.statisticaltype == 1 ? "鍑洪櫌鐥呭尯" : "绉戝",
           "鍑洪櫌浜烘",
           "鏃犻渶闅忚浜烘",
@@ -974,47 +1175,161 @@
           "婊℃剰搴﹀~鎶ラ噺",
           "瀹屾垚姣旂巼",
         ];
+        const mainColumnCount = mainHeaders.length;
 
-        const headerRow = worksheet.addRow(headers);
-        headerRow.eachCell((cell) => {
-          cell.style = headerStyle;
-        });
-        headerRow.height = 25;
+        // 鎬诲垪鏁帮紙涓芥按甯備腑鍖婚櫌鍦ㄦ湯灏捐拷鍔犻鐩�夐」鍒楋級
+        const topicColumnCount = lishuiTopics.reduce(
+          (sum, t) => sum + (t.options.length || 1),
+          0
+        );
+        const totalColumns = mainColumnCount + topicColumnCount;
 
-        // 娣诲姞鏁版嵁琛�
-        this.userList.forEach((item) => {
-          const dataRow = worksheet.addRow([
-            this.queryParams.statisticaltype == 1
-              ? item.leavehospitaldistrictname
-              : item.deptname,
-            item.dischargeCount || 0,
-            item.nonFollowUp || 0,
-            item.followUpNeeded || 0,
-            item.followUpRate || "0%",
-            item.rate ? this.formatPercent(item.rate) : "0%",
-            item.joyAllCount || 0,
-            item.joyCount || 0,
-            item.joyTotal ? this.formatPercent(item.joyTotal) : "0%",
-          ]);
+        // 娣诲姞鎬绘爣棰�
+        worksheet.mergeCells(1, 1, 1, totalColumns);
+        const titleCell = worksheet.getCell(1, 1);
+        titleCell.value = `婊℃剰搴﹂殢璁跨粺璁¤〃锛�${sheetNameSuffix}锛塦;
+        titleCell.style = titleStyle;
+        worksheet.getRow(1).height = 35;
 
-          dataRow.eachCell((cell) => {
-            cell.style = cellStyle;
+        if (isLishuiHospital && lishuiTopics.length) {
+          // 璁$畻姣忎釜棰樼洰鐨勯�夐」鍒楀锛堥�夐」鏂囧瓧鑷�傚簲锛岄骞茶繃闀挎椂鎽婂鍒椼�佸繀瑕佹椂鎹㈣锛�
+          const topicColumns = lishuiTopics.map((topic) => {
+            const n = topic.options.length || 1;
+            const baseWidths = topic.options.map((opt) =>
+              opt === "" ? 10 : Math.max(10, this.textWidth(opt) + 4)
+            );
+            const sumWidth = baseWidths.reduce((s, w) => s + w, 0);
+            const topicWidth = this.textWidth(topic.scriptContent) + 4;
+            const groupWidth = Math.max(sumWidth, topicWidth);
+            const extra = (groupWidth - sumWidth) / n;
+            const widths = baseWidths.map((w) => w + extra);
+            const lines = Math.max(1, Math.ceil(topicWidth / groupWidth));
+            return { widths, lines };
           });
-          dataRow.height = 22;
-        });
+          const maxHeaderLines = topicColumns.reduce(
+            (m, t) => Math.max(m, t.lines),
+            1
+          );
 
-        // 璁剧疆鍒楀
-        worksheet.columns = [
-          { width: 20 },
-          { width: 12 },
-          { width: 12 },
-          { width: 12 },
-          { width: 12 },
-          { width: 12 },
-          { width: 15 },
-          { width: 15 },
-          { width: 12 },
-        ];
+          // 涓よ琛ㄥご锛氱涓�琛� = 涓昏〃鍒� + 棰樼洰鍚嶏紱绗簩琛� = 閫夐」鍚�
+          const headerRow1 = worksheet.addRow([]);
+          const headerRow2 = worksheet.addRow([]);
+
+          mainHeaders.forEach((h, i) => {
+            const col = i + 1;
+            headerRow1.getCell(col).value = h;
+            headerRow1.getCell(col).style = headerStyle;
+            headerRow2.getCell(col).style = headerStyle;
+            worksheet.mergeCells(
+              headerRow1.number,
+              col,
+              headerRow2.number,
+              col
+            );
+          });
+
+          let colIndex = mainColumnCount + 1;
+          lishuiTopics.forEach((topic) => {
+            const optCount = topic.options.length || 1;
+            for (let k = 0; k < optCount; k++) {
+              headerRow1.getCell(colIndex + k).style = headerStyle;
+            }
+            headerRow1.getCell(colIndex).value = topic.scriptContent;
+            if (optCount > 1) {
+              worksheet.mergeCells(
+                headerRow1.number,
+                colIndex,
+                headerRow1.number,
+                colIndex + optCount - 1
+              );
+            }
+            topic.options.forEach((opt, k) => {
+              headerRow2.getCell(colIndex + k).value = opt;
+              headerRow2.getCell(colIndex + k).style = headerStyle;
+            });
+            colIndex += optCount;
+          });
+
+          // 琛ㄥご楂樺害锛氶骞叉崲琛屾椂鎸夋渶闀块鐩鐣�
+          headerRow1.height = Math.max(30, 15 * maxHeaderLines + 8);
+          headerRow2.height = 25;
+
+          // 鏁版嵁琛�
+          this.userList.forEach((item, idx) => {
+            const row = worksheet.addRow([]);
+            const main = this.getMainExportRow(item);
+            main.forEach((v, i) => {
+              const cell = row.getCell(i + 1);
+              cell.value = v;
+              cell.style = cellStyle;
+            });
+
+            const qMap = lishuiRowQuantities[idx] || new Map();
+            let cIndex = mainColumnCount + 1;
+            for (const topic of lishuiTopics) {
+              const topicQ = qMap.get(topic.key);
+              topic.options.forEach((opt) => {
+                const cell = row.getCell(cIndex);
+                if (opt === "") {
+                  // 绌洪�夐」鍗犱綅鍒椾笉濉暟瀛�
+                  cell.value = "";
+                } else {
+                  const val = topicQ ? topicQ.get(opt) : undefined;
+                  cell.value = val === undefined || val === null ? 0 : val;
+                }
+                cell.style = cellStyle;
+                cIndex++;
+              });
+            }
+            row.height = 22;
+          });
+
+          // 鍒楀锛氫富琛ㄥ垪 + 棰樼洰閫夐」鍒�
+          const columns = [
+            { width: 20 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 15 },
+            { width: 15 },
+            { width: 12 },
+          ];
+          lishuiTopics.forEach((topic, ti) => {
+            topicColumns[ti].widths.forEach((w) => {
+              columns.push({ width: w });
+            });
+          });
+          worksheet.columns = columns;
+        } else {
+          // 鍏朵粬鍖婚櫌锛氬崟琛岃〃澶�
+          const headerRow = worksheet.addRow(mainHeaders);
+          headerRow.eachCell((cell) => {
+            cell.style = headerStyle;
+          });
+          headerRow.height = 25;
+
+          this.userList.forEach((item) => {
+            const dataRow = worksheet.addRow(this.getMainExportRow(item));
+            dataRow.eachCell((cell) => {
+              cell.style = cellStyle;
+            });
+            dataRow.height = 22;
+          });
+
+          worksheet.columns = [
+            { width: 20 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 15 },
+            { width: 15 },
+            { width: 12 },
+          ];
+        }
 
         // 鐢熸垚骞朵笅杞芥枃浠�
         const buffer = await workbook.xlsx.writeBuffer();
diff --git a/src/views/Satisfaction/sfstatistics/components/components/TopicDialog.vue b/src/views/Satisfaction/sfstatistics/components/components/TopicDialog.vue
index 3095477..ca5e54b 100644
--- a/src/views/Satisfaction/sfstatistics/components/components/TopicDialog.vue
+++ b/src/views/Satisfaction/sfstatistics/components/components/TopicDialog.vue
@@ -40,7 +40,14 @@
                 min-width="120"
               >
                 <template slot-scope="{ row }">
-                  {{ row.chosenQuantity || 0 }}
+                  <el-button
+                    v-if="row.chosenQuantity"
+                    type="text"
+                    @click="handleOptionClick(item, row)"
+                  >
+                    {{ row.chosenQuantity }}
+                  </el-button>
+                  <span v-else>0</span>
                 </template>
               </el-table-column>
               <el-table-column
@@ -83,15 +90,26 @@
     >
       <el-button @click="handleClose">鍏� 闂�</el-button>
     </div>
+
+    <!-- 閫夐」涓嬮捇锛氭偅鑰呮湇鍔″垪琛� -->
+    <TopicPatientListDialog
+      :visible.sync="patientListVisible"
+      :title="patientListTitle"
+      :drill-params="patientDrillParams"
+    />
   </div>
 </template>
 
 <script>
 import ExcelJS from "exceljs";
 import { saveAs } from "file-saver";
+import TopicPatientListDialog from "./TopicPatientListDialog.vue";
 
 export default {
   name: "TopicDialog",
+  components: {
+    TopicPatientListDialog,
+  },
   props: {
     rowData: {
       type: Object,
@@ -113,12 +131,18 @@
     return {
       processedTopicList: [],
       orgname: "", // 鏂板锛氬尰闄㈠悕绉�
+      patientListVisible: false,
+      patientListTitle: "鎮h�呮湇鍔″垪琛�",
+      patientDrillParams: {},
     };
   },
   computed: {
     configTitle() {
-      const key = this.queryParams?.configKey;
-      return key === "returnVisitCount" ? "澶嶈瘖閫氱煡" : "婊℃剰搴�";
+      return this.topType == 1 ? "澶嶈瘖閫氱煡" : "婊℃剰搴�";
+    },
+    // 涓嬮捇鎺ュ彛闇�瑕佺殑 configKey锛�1 澶嶈瘖閫氱煡锛�2 婊℃剰搴�
+    configKey() {
+      return this.topType == 1 ? "returnVisitCount" : "joyCount";
     },
   },
   created() {
@@ -158,6 +182,49 @@
       this.processedTopicList = result;
     },
 
+    // 鐐瑰嚮閫夐」鈥滈�夋嫨浜烘暟鈥濅笅閽诲埌鎮h�呮湇鍔″垪琛�
+    handleOptionClick(topicItem, detail) {
+      if (!detail || !detail.optionText) return;
+
+      const params = {
+        scriptid: topicItem.scriptid,
+        scriptContent: topicItem.scriptContent,
+        subtaskType: topicItem.subtaskType,
+        optionText: detail.optionText,
+        statisticaltype: this.queryParams.statisticaltype,
+        serviceType: this.queryParams.serviceType || [],
+        configKey: this.configKey,
+      };
+
+      // 鏃堕棿鑼冨洿
+      if (
+        this.queryParams.dateRange &&
+        this.queryParams.dateRange.length === 2
+      ) {
+        params.startTime = this.queryParams.dateRange[0];
+        params.endTime = this.queryParams.dateRange[1];
+      }
+
+      // 缁熻缁村害
+      if (this.queryParams.statisticaltype == 1) {
+        // 鎸夌梾鍖�
+        params.deptcode = this.rowData.leavehospitaldistrictcode;
+        params.leavehospitaldistrictcode =
+          this.rowData.leavehospitaldistrictcode;
+        params.leavehospitaldistrictcodes = [
+          this.rowData.leavehospitaldistrictcode,
+        ];
+      } else {
+        // 鎸夌瀹�
+        params.deptcode = this.rowData.deptcode;
+        params.deptcodes = [this.rowData.deptcode];
+      }
+
+      this.patientDrillParams = params;
+      this.patientListTitle = `銆�${detail.optionText}銆嶆偅鑰呮湇鍔″垪琛╜;
+      this.patientListVisible = true;
+    },
+
     // 鏍煎紡鍖栨棩鏈熻寖鍥村瓧绗︿覆锛堜笌涓婚〉闈竴鑷达級
     formatDateRangeForExport() {
       let dateRangeString = "";
diff --git a/src/views/Satisfaction/sfstatistics/components/components/TopicPatientListDialog.vue b/src/views/Satisfaction/sfstatistics/components/components/TopicPatientListDialog.vue
new file mode 100644
index 0000000..0b67aed
--- /dev/null
+++ b/src/views/Satisfaction/sfstatistics/components/components/TopicPatientListDialog.vue
@@ -0,0 +1,322 @@
+<template>
+  <el-dialog
+    :title="title"
+    :visible.sync="dialogVisible"
+    width="80%"
+    :close-on-click-modal="false"
+    append-to-body
+    @close="handleClose"
+  >
+    <div class="topic-patient-dialog">
+      <div class="query-bar">
+        <span class="label">鎮h�呭鍚嶆煡璇�:</span>
+        <el-input
+          v-model="searchName"
+          placeholder="璇疯緭鍏ユ偅鑰呭鍚嶈繘琛岀瓫閫�"
+          clearable
+          style="width: 300px"
+          @input="handleSearch"
+          @clear="handleSearch"
+        />
+        <span class="count">鍏� {{ filteredList.length }} 鏉¤褰�</span>
+      </div>
+
+      <el-table
+        v-loading="loading"
+        :data="filteredList"
+        style="width: 100%"
+        :border="true"
+        max-height="560"
+      >
+        <el-table-column
+          prop="sendname"
+          label="濮撳悕"
+          align="center"
+          width="100"
+        />
+        <el-table-column
+          prop="phone"
+          label="鑱旂郴鐢佃瘽"
+          align="center"
+          width="130"
+        />
+        <el-table-column
+          prop="taskName"
+          label="浠诲姟鍚嶇О"
+          align="center"
+          width="200"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          prop="sendstate"
+          label="浠诲姟鐘舵��"
+          align="center"
+          width="110"
+        >
+          <template slot-scope="{ row }">
+            <el-tag :type="getStateTagType(row.sendstate)" size="small">
+              {{ getStateText(row.sendstate) }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="visitTime"
+          label="搴旈殢璁挎椂闂�"
+          align="center"
+          width="170"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          prop="finishtime"
+          label="闅忚瀹屾垚鏃堕棿"
+          align="center"
+          width="170"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          prop="endtime"
+          label="鍑洪櫌鏃ユ湡"
+          align="center"
+          width="120"
+        >
+          <template slot-scope="{ row }">
+            <span>{{ formatTime(row.endtime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="nurseName"
+          label="璐d换鎶ゅ+"
+          align="center"
+          width="110"
+        />
+        <el-table-column
+          prop="drname"
+          label="涓绘不鍖荤敓"
+          align="center"
+          width="110"
+        />
+        <el-table-column
+          prop="excep"
+          label="缁撴灉鐘舵��"
+          align="center"
+          width="110"
+        >
+          <template slot-scope="{ row }">
+            <dict-tag :options="dict.type.sys_yujing" :value="row.excep" />
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="suggest"
+          label="澶勭悊鎰忚"
+          align="center"
+          width="110"
+        >
+          <template slot-scope="{ row }">
+            <dict-tag :options="dict.type.sys_suggest" :value="row.suggest" />
+          </template>
+        </el-table-column>
+        <el-table-column
+          prop="templatename"
+          label="鏈嶅姟妯℃澘"
+          align="center"
+          width="160"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          prop="remark"
+          label="鏈嶅姟璁板綍"
+          align="center"
+          width="160"
+          show-overflow-tooltip
+        />
+        <el-table-column
+          label="鎿嶄綔"
+          fixed="right"
+          align="center"
+          width="90"
+        >
+          <template slot-scope="{ row }">
+            <el-button type="text" size="small" @click="handleViewDetail(row)">
+              <i class="el-icon-view"></i> 鏌ョ湅
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <div v-if="hasMore" class="load-more">
+        <el-button type="text" :loading="loading" @click="loadMore">
+          鍔犺浇鏇村
+        </el-button>
+      </div>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { getSfStatisticsCountDetailsHyperLink } from "@/api/system/user";
+
+export default {
+  name: "TopicPatientListDialog",
+  dicts: ["sys_yujing", "sys_suggest"],
+  props: {
+    visible: {
+      type: Boolean,
+      default: false,
+    },
+    title: {
+      type: String,
+      default: "鎮h�呮湇鍔″垪琛�",
+    },
+    // 涓嬮捇璇锋眰鍙傛暟锛堜笉鍚垎椤碉級锛岀敱鐖剁粍浠舵瀯寤�
+    drillParams: {
+      type: Object,
+      default: () => ({}),
+    },
+  },
+  data() {
+    return {
+      pageSize: 200,
+      offset: 0,
+      hasMore: false,
+      loading: false,
+      allList: [],
+      searchName: "",
+    };
+  },
+  computed: {
+    dialogVisible: {
+      get() {
+        return this.visible;
+      },
+      set(val) {
+        this.$emit("update:visible", val);
+      },
+    },
+    filteredList() {
+      const keyword = this.searchName.trim();
+      if (!keyword) return this.allList;
+      return this.allList.filter(
+        (item) => item.sendname && item.sendname.indexOf(keyword) !== -1
+      );
+    },
+  },
+  watch: {
+    visible(newVal) {
+      if (newVal) {
+        this.resetAndLoad();
+      }
+    },
+  },
+  methods: {
+    resetAndLoad() {
+      this.offset = 0;
+      this.allList = [];
+      this.searchName = "";
+      this.hasMore = false;
+      this.fetchPage(false);
+    },
+    async fetchPage(isLoadMore) {
+      this.loading = true;
+      try {
+        const params = {
+          ...this.drillParams,
+          pageNum: this.offset,
+          pageSize: this.pageSize,
+        };
+        const response = await getSfStatisticsCountDetailsHyperLink(params);
+        const batch = response.data || [];
+        this.allList = isLoadMore ? this.allList.concat(batch) : batch;
+        this.offset += batch.length;
+        this.hasMore = batch.length >= this.pageSize;
+      } catch (error) {
+        console.error("鑾峰彇鎮h�呮湇鍔″垪琛ㄥけ璐�:", error);
+        this.$message.error("鑾峰彇鎮h�呮湇鍔″垪琛ㄥけ璐�");
+      } finally {
+        this.loading = false;
+      }
+    },
+    loadMore() {
+      this.fetchPage(true);
+    },
+    handleSearch() {
+      // 濮撳悕绛涢�変负鍓嶇鏈湴杩囨护锛屾棤闇�閲嶆柊璇锋眰
+    },
+    getStateTagType(state) {
+      const map = {
+        1: "primary",
+        2: "primary",
+        3: "success",
+        4: "info",
+        5: "danger",
+        6: "success",
+        7: "danger",
+      };
+      return map[state] || "info";
+    },
+    getStateText(state) {
+      const map = {
+        1: "琛ㄥ崟宸查鍙�",
+        2: "寰呴殢璁�",
+        3: "琛ㄥ崟宸插彂閫�",
+        4: "涓嶆墽琛�",
+        5: "鍙戦�佸け璐�",
+        6: "宸插畬鎴�",
+        7: "瓒呮椂",
+      };
+      return map[state] || "鏈煡鐘舵��";
+    },
+    formatTime(time) {
+      if (!time) return "-";
+      return time;
+    },
+    handleViewDetail(row) {
+      this.$emit("update:visible", false);
+
+      let type = "";
+      if (row.preachform && row.preachform.includes("3")) {
+        type = 1;
+      }
+      setTimeout(() => {
+        this.$router.push({
+          path: "/followvisit/record/detailpage/",
+          query: {
+            taskid: row.taskid,
+            patid: row.patid,
+            id: row.id,
+            Voicetype: type,
+          },
+        });
+      }, 300);
+    },
+    handleClose() {
+      this.$emit("close");
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.topic-patient-dialog {
+  .query-bar {
+    display: flex;
+    align-items: center;
+    margin-bottom: 16px;
+
+    .label {
+      margin-right: 10px;
+      font-weight: bold;
+    }
+
+    .count {
+      margin-left: 16px;
+      color: rgb(35, 81, 233);
+      font-size: 15px;
+    }
+  }
+
+  .load-more {
+    text-align: center;
+    padding-top: 12px;
+  }
+}
+</style>
diff --git a/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue b/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue
index 2c7ed98..ea36ad9 100644
--- a/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue
+++ b/src/views/Satisfaction/sfstatistics/components/visitStatistics.vue
@@ -383,6 +383,7 @@
 
       // 鍔犺浇鐘舵��
       loading: false,
+      orgname: "",
 
       // 閫変腑鐨勮
       ids: [],
@@ -441,6 +442,7 @@
   },
 
   created() {
+    this.orgname = localStorage.getItem("orgname");
     this.initData();
   },
 
@@ -824,6 +826,113 @@
       }
     },
 
+    // 鑾峰彇鎸囧畾鐥呭尯/绉戝鐨勯鐩鎯�
+    async fetchTopicDetail(row) {
+      const params = {
+        configKey: "returnVisitCount",
+        ...this.queryParams,
+      };
+      // 瀵煎嚭闇�瑕佽鐥呭尯/绉戝鐨勫叏閮ㄩ鐩紝瑕嗙洊涓昏〃鍒嗛〉鍙傛暟
+      params.pageNum = 1;
+      params.pageSize = 1000;
+      if (
+        this.queryParams.dateRange &&
+        this.queryParams.dateRange.length === 2
+      ) {
+        params.startTime = this.queryParams.dateRange[0];
+        params.endTime = this.queryParams.dateRange[1];
+      }
+      if (this.queryParams.statisticaltype == 1) {
+        params.leavehospitaldistrictcodes = [row.leavehospitaldistrictcode];
+      } else {
+        params.deptcodes = [row.deptcode];
+      }
+      const response = await getSfStatisticsJoyInfo(params);
+      return response.data || {};
+    },
+
+    // 涓昏〃瀵煎嚭琛屾暟鎹�
+    getMainExportRow(item) {
+      return [
+        this.queryParams.statisticaltype == 1
+          ? item.leavehospitaldistrictname
+          : item.deptname,
+        item.dischargeCount || 0,
+        item.nonFollowUp || 0,
+        item.followUpNeeded || 0,
+        item.followUpRate || "0%",
+        item.rate ? this.formatPercent(item.rate) : "0%",
+        item.joyAllCount || 0,
+        item.joyCount || 0,
+        item.joyTotal ? this.formatPercent(item.joyTotal) : "0%",
+      ];
+    },
+
+    // 璁$畻鏂囨湰鏄剧ず瀹藉害锛堜腑鏂囨寜 2銆佽嫳鏂�/鏁板瓧鎸� 1锛�
+    textWidth(str) {
+      if (!str) return 0;
+      let width = 0;
+      for (const ch of String(str)) {
+        width += ch.charCodeAt(0) > 255 ? 2 : 1;
+      }
+      return width;
+    },
+
+    // 涓芥按甯備腑鍖婚櫌锛氭媺鍙栨墍鏈夌瀹ら鐩槑缁嗭紝鎵佸钩鍖栦负銆岄鐩�夐」銆嶅垪缁撴瀯
+    async buildLishuiTopicColumns() {
+      const topicMap = new Map();
+      const rowQuantities = [];
+
+      for (const item of this.userList) {
+        const topiclist = await this.fetchTopicDetail(item);
+        const qMap = new Map();
+
+        if (topiclist && Object.keys(topiclist).length) {
+          Object.keys(topiclist).forEach((key) => {
+            const topic = topiclist[key];
+            if (!topic || !topic.scriptContent) return;
+
+            const tKey =
+              topic.scriptid != null && topic.scriptid !== ""
+                ? String(topic.scriptid)
+                : topic.scriptContent;
+
+            if (!topicMap.has(tKey)) {
+              topicMap.set(tKey, {
+                key: tKey,
+                scriptContent: topic.scriptContent,
+                options: [],
+                optionSet: new Set(),
+              });
+            }
+
+            const t = topicMap.get(tKey);
+            const topicQ = new Map();
+            (topic.details || []).forEach((detail) => {
+              if (!detail || !detail.optionText) return;
+              if (!t.optionSet.has(detail.optionText)) {
+                t.optionSet.add(detail.optionText);
+                t.options.push(detail.optionText);
+              }
+              topicQ.set(detail.optionText, Number(detail.chosenQuantity) || 0);
+            });
+            qMap.set(tKey, topicQ);
+          });
+        }
+
+        rowQuantities.push(qMap);
+      }
+
+      const topics = Array.from(topicMap.values());
+      // 娌℃湁閫夐」鐨勯鐩粯璁ゅ~鍏呬竴涓┖閫夐」鍒楋紝閬垮厤琛ㄥご/鏁版嵁閿欎綅
+      topics.forEach((t) => {
+        if (!t.options.length) {
+          t.options = [""];
+        }
+      });
+      return { topics, rowQuantities };
+    },
+
     // 瀵煎嚭鏁版嵁
     async handleExport() {
       if (!this.userList.length) {
@@ -916,7 +1025,11 @@
             pattern: "solid",
             fgColor: { argb: "FFF5F7FA" },
           },
-          alignment: { vertical: "middle", horizontal: "center" },
+          alignment: {
+            vertical: "middle",
+            horizontal: "center",
+            wrapText: true,
+          },
           border: {
             top: { style: "thin", color: { argb: "FFD0D0D0" } },
             left: { style: "thin", color: { argb: "FFD0D0D0" } },
@@ -936,15 +1049,17 @@
           },
         };
 
-        // 娣诲姞鎬绘爣棰�
-        worksheet.mergeCells(1, 1, 1, 10);
-        const titleCell = worksheet.getCell(1, 1);
-        titleCell.value = `澶嶈瘖閫氱煡缁熻琛紙${sheetNameSuffix}锛塦;
-        titleCell.style = titleStyle;
-        worksheet.getRow(1).height = 35;
+        // 涓芥按甯備腑鍖婚櫌锛氶鍏堟媺鍙栭鐩槑缁嗭紝鎵佸钩鍖栦负銆岄鐩�夐」銆嶅垪
+        let lishuiTopics = [];
+        let lishuiRowQuantities = [];
+        if (isLishuiHospital) {
+          const built = await this.buildLishuiTopicColumns();
+          lishuiTopics = built.topics;
+          lishuiRowQuantities = built.rowQuantities;
+        }
 
-        // 娣诲姞琛ㄥご
-        const headers = [
+        // 涓昏〃鍒�
+        const mainHeaders = [
           this.queryParams.statisticaltype == 1 ? "鍑洪櫌鐥呭尯" : "绉戝",
           "鍑洪櫌浜烘",
           "鏃犻渶闅忚浜烘",
@@ -955,47 +1070,161 @@
           "澶嶈瘖閫氱煡濉姤閲�",
           "瀹屾垚姣旂巼",
         ];
+        const mainColumnCount = mainHeaders.length;
 
-        const headerRow = worksheet.addRow(headers);
-        headerRow.eachCell((cell) => {
-          cell.style = headerStyle;
-        });
-        headerRow.height = 25;
+        // 鎬诲垪鏁帮紙涓芥按甯備腑鍖婚櫌鍦ㄦ湯灏捐拷鍔犻鐩�夐」鍒楋級
+        const topicColumnCount = lishuiTopics.reduce(
+          (sum, t) => sum + (t.options.length || 1),
+          0
+        );
+        const totalColumns = mainColumnCount + topicColumnCount;
 
-        // 娣诲姞鏁版嵁琛�
-        this.userList.forEach((item) => {
-          const dataRow = worksheet.addRow([
-            this.queryParams.statisticaltype == 1
-              ? item.leavehospitaldistrictname
-              : item.deptname,
-            item.dischargeCount || 0,
-            item.nonFollowUp || 0,
-            item.followUpNeeded || 0,
-            item.followUpRate || "0%",
-            item.rate ? this.formatPercent(item.rate) : "0%",
-            item.joyAllCount || 0,
-            item.joyCount || 0,
-            item.joyTotal ? this.formatPercent(item.joyTotal) : "0%",
-          ]);
+        // 娣诲姞鎬绘爣棰�
+        worksheet.mergeCells(1, 1, 1, totalColumns);
+        const titleCell = worksheet.getCell(1, 1);
+        titleCell.value = `澶嶈瘖閫氱煡缁熻琛紙${sheetNameSuffix}锛塦;
+        titleCell.style = titleStyle;
+        worksheet.getRow(1).height = 35;
 
-          dataRow.eachCell((cell) => {
-            cell.style = cellStyle;
+        if (isLishuiHospital && lishuiTopics.length) {
+          // 璁$畻姣忎釜棰樼洰鐨勯�夐」鍒楀锛堥�夐」鏂囧瓧鑷�傚簲锛岄骞茶繃闀挎椂鎽婂鍒椼�佸繀瑕佹椂鎹㈣锛�
+          const topicColumns = lishuiTopics.map((topic) => {
+            const n = topic.options.length || 1;
+            const baseWidths = topic.options.map((opt) =>
+              opt === "" ? 10 : Math.max(10, this.textWidth(opt) + 4)
+            );
+            const sumWidth = baseWidths.reduce((s, w) => s + w, 0);
+            const topicWidth = this.textWidth(topic.scriptContent) + 4;
+            const groupWidth = Math.max(sumWidth, topicWidth);
+            const extra = (groupWidth - sumWidth) / n;
+            const widths = baseWidths.map((w) => w + extra);
+            const lines = Math.max(1, Math.ceil(topicWidth / groupWidth));
+            return { widths, lines };
           });
-          dataRow.height = 22;
-        });
+          const maxHeaderLines = topicColumns.reduce(
+            (m, t) => Math.max(m, t.lines),
+            1
+          );
 
-        // 璁剧疆鍒楀
-        worksheet.columns = [
-          { width: 20 },
-          { width: 12 },
-          { width: 12 },
-          { width: 12 },
-          { width: 12 },
-          { width: 12 },
-          { width: 15 },
-          { width: 15 },
-          { width: 12 },
-        ];
+          // 涓よ琛ㄥご锛氱涓�琛� = 涓昏〃鍒� + 棰樼洰鍚嶏紱绗簩琛� = 閫夐」鍚�
+          const headerRow1 = worksheet.addRow([]);
+          const headerRow2 = worksheet.addRow([]);
+
+          mainHeaders.forEach((h, i) => {
+            const col = i + 1;
+            headerRow1.getCell(col).value = h;
+            headerRow1.getCell(col).style = headerStyle;
+            headerRow2.getCell(col).style = headerStyle;
+            worksheet.mergeCells(
+              headerRow1.number,
+              col,
+              headerRow2.number,
+              col
+            );
+          });
+
+          let colIndex = mainColumnCount + 1;
+          lishuiTopics.forEach((topic) => {
+            const optCount = topic.options.length || 1;
+            for (let k = 0; k < optCount; k++) {
+              headerRow1.getCell(colIndex + k).style = headerStyle;
+            }
+            headerRow1.getCell(colIndex).value = topic.scriptContent;
+            if (optCount > 1) {
+              worksheet.mergeCells(
+                headerRow1.number,
+                colIndex,
+                headerRow1.number,
+                colIndex + optCount - 1
+              );
+            }
+            topic.options.forEach((opt, k) => {
+              headerRow2.getCell(colIndex + k).value = opt;
+              headerRow2.getCell(colIndex + k).style = headerStyle;
+            });
+            colIndex += optCount;
+          });
+
+          // 琛ㄥご楂樺害锛氶骞叉崲琛屾椂鎸夋渶闀块鐩鐣�
+          headerRow1.height = Math.max(30, 15 * maxHeaderLines + 8);
+          headerRow2.height = 25;
+
+          // 鏁版嵁琛�
+          this.userList.forEach((item, idx) => {
+            const row = worksheet.addRow([]);
+            const main = this.getMainExportRow(item);
+            main.forEach((v, i) => {
+              const cell = row.getCell(i + 1);
+              cell.value = v;
+              cell.style = cellStyle;
+            });
+
+            const qMap = lishuiRowQuantities[idx] || new Map();
+            let cIndex = mainColumnCount + 1;
+            for (const topic of lishuiTopics) {
+              const topicQ = qMap.get(topic.key);
+              topic.options.forEach((opt) => {
+                const cell = row.getCell(cIndex);
+                if (opt === "") {
+                  // 绌洪�夐」鍗犱綅鍒椾笉濉暟瀛�
+                  cell.value = "";
+                } else {
+                  const val = topicQ ? topicQ.get(opt) : undefined;
+                  cell.value = val === undefined || val === null ? 0 : val;
+                }
+                cell.style = cellStyle;
+                cIndex++;
+              });
+            }
+            row.height = 22;
+          });
+
+          // 鍒楀锛氫富琛ㄥ垪 + 棰樼洰閫夐」鍒�
+          const columns = [
+            { width: 20 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 15 },
+            { width: 15 },
+            { width: 12 },
+          ];
+          lishuiTopics.forEach((topic, ti) => {
+            topicColumns[ti].widths.forEach((w) => {
+              columns.push({ width: w });
+            });
+          });
+          worksheet.columns = columns;
+        } else {
+          // 鍏朵粬鍖婚櫌锛氬崟琛岃〃澶�
+          const headerRow = worksheet.addRow(mainHeaders);
+          headerRow.eachCell((cell) => {
+            cell.style = headerStyle;
+          });
+          headerRow.height = 25;
+
+          this.userList.forEach((item) => {
+            const dataRow = worksheet.addRow(this.getMainExportRow(item));
+            dataRow.eachCell((cell) => {
+              cell.style = cellStyle;
+            });
+            dataRow.height = 22;
+          });
+
+          worksheet.columns = [
+            { width: 20 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 12 },
+            { width: 15 },
+            { width: 15 },
+            { width: 12 },
+          ];
+        }
 
         // 鐢熸垚骞朵笅杞芥枃浠�
         const buffer = await workbook.xlsx.writeBuffer();
diff --git a/src/views/followvisit/discharge/index copy.vue b/src/views/followvisit/discharge/index copy.vue
index 04a61d9..b10c016 100644
--- a/src/views/followvisit/discharge/index copy.vue
+++ b/src/views/followvisit/discharge/index copy.vue
@@ -911,7 +911,7 @@
       },
       // endOut: 1,
       endOut:
-        localStorage.getItem("orgname") == "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�" ? 0 : 1, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
+        localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 0 : 1, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
       endOuts: [
         {
           value: 0,
diff --git a/src/views/followvisit/discharge/index.vue b/src/views/followvisit/discharge/index.vue
index f99e472..99ad37f 100644
--- a/src/views/followvisit/discharge/index.vue
+++ b/src/views/followvisit/discharge/index.vue
@@ -73,7 +73,7 @@
         <el-form-item label="缁忕鍖荤敓" prop="managementDoctor">
           <el-input
             v-model="topqueryParams.managementDoctor"
-            placeholder="璇疯緭鍏ヤ富娌诲尰鐢�"
+            placeholder="璇疯緭鍏ョ粡绠″尰鐢�"
           ></el-input>
         </el-form-item>
         <el-form-item label="鏃ユ湡闄愬埗" prop="status">
@@ -115,6 +115,24 @@
           <el-select v-model="topqueryParams.sort" placeholder="璇烽�夋嫨">
             <el-option
               v-for="item in topicoptionssort"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="褰撳墠鎵ц鏂瑰紡" prop="currentPreachforms">
+          <el-select
+            v-model="topqueryParams.currentPreachforms"
+            placeholder="璇烽�夋嫨"
+            multiple
+            clearable
+            collapse-tags
+          >
+            <el-option
+              v-for="item in currentPreachformOptions"
               :key="item.value"
               :label="item.label"
               :value="item.value"
@@ -1320,7 +1338,7 @@
       },
       // endOut: 1,
       endOut:
-        localStorage.getItem("orgname") == "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�" ? 0 : 1, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
+        localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 0 : 1, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
       endOuts: [
         {
           value: 0,
@@ -1384,6 +1402,7 @@
             : "",
         leaveldeptcodes: [],
         leavehospitaldistrictcodes: [],
+        currentPreachforms: [],
       },
       orgname: "",
       propss: { multiple: true },
@@ -1414,6 +1433,16 @@
           value: 5,
           label: "鏃犻渶闅忚",
         },
+      ],
+
+      currentPreachformOptions: [
+        { value: "1", label: "浜哄伐" },
+        { value: "2", label: "绾歌川" },
+        { value: "3", label: "鏅鸿兘璇煶" },
+        { value: "4", label: "鐭俊" },
+        { value: "5", label: "寰俊鍏紬鍙�" },
+        { value: "6", label: "寰俊灏忕▼搴�" },
+        { value: "7", label: "鏈悗闅忚" },
       ],
 
       sextype: [
@@ -1613,7 +1642,12 @@
       }
 
       try {
-        const response = await getTaskservelist(this.topqueryParams);
+        // 褰撳墠鎵ц鏂瑰紡涓哄閫夛紝闇�杞垚閫楀彿鍒嗛殧瀛楃涓诧紙濡� 1,2,5锛�
+        const params = { ...this.topqueryParams };
+        if (Array.isArray(params.currentPreachforms)) {
+          params.currentPreachforms = params.currentPreachforms.join(",");
+        }
+        const response = await getTaskservelist(params);
 
         // 鉁� 绗竴姝ワ細鍏堥攣瀹氭仮澶嶇姸鎬�
         this.isRestoring = true;
@@ -1660,10 +1694,11 @@
             });
           }
           if (item.currentPreachform) {
+
+
             item.currentPreachform = this.checkboxlist.find(
-              (item) => item.value == item.currentPreachform
-            )?.value;
-            console.log(item.currentPreachform, "mi");
+              (items) => items.value == item.currentPreachform
+            )?.label;
           }
         });
 
@@ -2002,6 +2037,7 @@
         scopetype: [],
         leaveldeptcodes: [],
         leavehospitaldistrictcodes: [],
+        currentPreachforms: [],
       };
       this.handleQuery(1);
     },
@@ -2022,6 +2058,7 @@
         scopetype: [],
         leaveldeptcodes: [],
         leavehospitaldistrictcodes: [],
+        currentPreachforms: [],
       };
     },
     handleSelectionChange(rows) {
diff --git a/src/views/followvisit/operationAgain/index.vue b/src/views/followvisit/operationAgain/index.vue
new file mode 100644
index 0000000..5abcbbe
--- /dev/null
+++ b/src/views/followvisit/operationAgain/index.vue
@@ -0,0 +1,1933 @@
+<template>
+  <div class="app-container">
+     <statistics-cards
+      :cardlist="cardlist"
+      :ycvalue="ycvalue"
+      :jgvalue="jgvalue"
+      :show-warning-condition="orgname == '鐪佺珛鍚屽痉缈犺嫅闄㈠尯'"
+    />
+    <el-row :gutter="20">
+      <!--鐢ㄦ埛鏁版嵁-->
+      <el-form
+        :model="topqueryParams"
+        ref="queryForm"
+        size="small"
+        :inline="true"
+        v-show="showSearch"
+        label-width="98px"
+      >
+        <el-form-item label="浠诲姟鍚嶇О">
+          <el-input
+            v-model="topqueryParams.taskName"
+            placeholder="璇烽�夋嫨浠诲姟鍚嶇О"
+          ></el-input>
+        </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-date-picker>
+        </el-form-item>
+        <el-form-item label="搴旈殢璁挎椂闂�">
+          <el-date-picker
+            v-model="dateRangefs"
+            style="width: 240px"
+            value-format="yyyy-MM-dd"
+            type="daterange"
+            range-separator="-"
+            start-placeholder="寮�濮嬫棩鏈�"
+            end-placeholder="缁撴潫鏃ユ湡"
+          ></el-date-picker>
+        </el-form-item>
+
+        <el-form-item label="鎮h�呭鍚�" prop="sendname">
+          <el-input
+            v-model="topqueryParams.sendname"
+            placeholder="璇疯緭鍏ユ偅鑰呭鍚�"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="璇婃柇鍚嶇О" prop="leavediagname">
+          <el-input
+            v-model="topqueryParams.leavediagname"
+            placeholder="璇疯緭鍏ヨ瘖鏂悕绉�"
+          ></el-input>
+        </el-form-item>
+
+        <el-form-item label="鎮h�呰寖鍥�" prop="status">
+          <el-cascader
+            v-model="topqueryParams.scopetype"
+            placeholder="榛樿鍏ㄩ儴"
+            :options="sourcetype"
+            filterable
+            clearable
+            :props="{ expandTrigger: 'hover' }"
+            @change="handleChange"
+          ></el-cascader>
+        </el-form-item>
+
+        <el-form-item label="闅忚鐘舵��" prop="status">
+          <el-cascader
+            v-model="serviceStatusValue"
+            placeholder="璇烽�夋嫨"
+            :options="serviceStatusOptions"
+            :props="cascaderProps"
+            @change="handleServiceStatusChange"
+            clearable
+          ></el-cascader>
+        </el-form-item>
+        <el-form-item label="鎺掑簭鏂瑰紡" prop="status">
+          <el-select v-model="topqueryParams.sort" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in topicoptionssort"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item>
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            size="medium"
+            @click="handleQuery(1)"
+            >鎼滅储</el-button
+          >
+          <el-button icon="el-icon-refresh" size="medium" @click="resetQuery"
+            >閲嶇疆</el-button
+          >
+        </el-form-item>
+      </el-form>
+      <el-divider></el-divider>
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="warning"
+                plain
+                icon="el-icon-upload2"
+                size="medium"
+                @click="handleExport"
+                >瀵煎嚭</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <!-- <el-col :span="1.5">
+          <el-button
+            type="primary"
+            icon="el-icon-plus"
+            size="medium"
+            @click="handleAdd"
+            >鏂板</el-button
+          >
+        </el-col> -->
+
+        <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="warning"
+                plain
+                icon="el-icon-warning-outline"
+                size="medium"
+                @click="toleadExport(1)"
+                >鎵ц澶辫触</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="danger"
+                plain
+                icon="el-icon-warning"
+                size="medium"
+                @click="toleadExport(2)"
+                >缁撴灉寮傚父</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="success"
+                plain
+                size="medium"
+                @click="buidegetTasklist()"
+                >寰呭姙鏈嶅姟</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+        <!-- <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button
+                type="primary"
+                plain
+                size="medium"
+                @click="affiliation()"
+                >鏈汉鎵�灞炴湇鍔�</el-button
+              >
+            </div>
+          </div>
+        </el-col> -->
+        <el-col :span="1.5">
+          <div class="documentf">
+            <div class="document">
+              <el-button type="success" size="medium" @click="onthatday()"
+                >浠婃棩鏈嶅姟</el-button
+              >
+            </div>
+          </div>
+        </el-col>
+      </el-row>
+      <el-table
+        v-loading="loading"
+        :data="userList"
+        :row-class-name="tableRowClassName"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="50" align="center" />
+        <el-table-column
+          label="浠诲姟鍚嶇О"
+          fixed
+          width="150"
+          show-overflow-tooltip
+          align="center"
+          key="taskName"
+          prop="taskName"
+        />
+        <!-- <el-table-column label="搴忓彿" fixed align="center" key="id" prop="id" /> -->
+        <el-table-column
+          label="濮撳悕"
+          width="100"
+          align="center"
+          key="sendname"
+          prop="sendname"
+        >
+          <template slot-scope="scope">
+            <el-button
+              size="medium"
+              type="text"
+              @click="
+                gettoken360(
+                  scope.row.sfzh,
+                  scope.row.drcode,
+                  scope.row.drname,
+                  scope.row.patid
+                )
+              "
+              ><span class="button-textsc">{{
+                scope.row.sendname
+              }}</span></el-button
+            >
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="闅忚鐘舵��"
+          align="center"
+          key="sendstateView"
+          prop="sendstateView"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <el-tooltip
+              class="item"
+              effect="dark"
+              :content="scope.row.remark"
+              placement="top-start"
+            >
+              <div v-if="scope.row.sendstateView == 1">
+                <el-tag type="primary" :disable-transitions="false"
+                  >寰呴殢璁�</el-tag
+                >
+              </div>
+              <div v-if="scope.row.sendstateView == 2">
+                <el-tag type="success" :disable-transitions="false"
+                  >宸插畬鎴�</el-tag
+                >
+              </div>
+              <div v-if="scope.row.sendstateView == 3">
+                <el-tag type="warning" :disable-transitions="false"
+                  >鏃犻渶闅忚</el-tag
+                >
+              </div>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+        <!-- <el-table-column
+          label="浠诲姟寮傚父璇存槑"
+          width="120"
+          align="center"
+          key="remark"
+          prop="remark" -->
+        />
+
+        <el-table-column
+          label="澶勭悊鎰忚"
+          align="center"
+          key="suggest"
+          prop="suggest"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <dict-tag
+              :options="dict.type.sys_suggest"
+              :value="scope.row.suggest"
+            />
+          </template>
+        </el-table-column>
+
+        <el-table-column
+          label="闅忚瀹屾垚鏃堕棿"
+          sortable
+          align="center"
+          prop="finishtime"
+          width="160"
+        >
+          <template slot-scope="scope">
+            <span>{{ parseTime(scope.row.finishtime) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="灏辫瘖鏃ユ湡"
+          width="200"
+          align="center"
+          key="endtime"
+          prop="endtime"
+        >
+          <template slot-scope="scope">
+            <span>{{ formatTime(scope.row.endtime) }}</span>
+          </template></el-table-column
+        >
+        <el-table-column
+          label="搴旈殢璁挎棩鏈�"
+          width="146"
+          align="center"
+          key="visitTime"
+          prop="visitTime"
+        >
+          <template slot-scope="scope">
+            <span>{{ formatTime(scope.row.visitTime) }}</span>
+          </template></el-table-column
+        >
+        <el-table-column
+          label="涓绘不鍖荤敓"
+          width="120"
+          align="center"
+          key="drname"
+          prop="drname"
+        />
+
+        <!-- <el-table-column
+          label="鏈嶅姟澶╂暟"
+          width="120"
+          align="center"
+          key="endDay"
+          prop="endDay"
+        >
+          <template slot-scope="scope">
+            <span>{{ scope.row.endDay ? scope.row.endDay + "澶�" : "" }}</span>
+          </template>
+        </el-table-column> -->
+        <el-table-column
+          label="韬唤璇佸彿鐮�"
+          width="200"
+          align="center"
+          key="sfzh"
+          prop="sfzh"
+        />
+        <el-table-column
+          label="鑱旂郴鐢佃瘽"
+          width="200"
+          align="center"
+          key="phone"
+          prop="phone"
+        />
+        <el-table-column
+          label="璐d换鎶ゅ+"
+          width="120"
+          align="center"
+          key="nurseName"
+          prop="nurseName"
+        />
+
+        <!-- <el-table-column
+          label="鐥呭巻鍙�"
+          align="center"
+          sortable
+          key="medicalRecordNo"
+          prop="medicalRecordNo"
+          width="120"
+        /> -->
+
+        <!-- <el-table-column label="骞撮緞" align="center" key="age" prop="age" /> -->
+        <!-- <el-table-column label="鎬у埆"width="100" align="center" key="sex" prop="sex" /> -->
+        <!-- <el-table-column label="搴婂彿" align="center" key="badNo" prop="badNo" /> -->
+        <el-table-column
+          label="棣栨闅忚绉戝"
+          align="center"
+          key="deptname"
+          prop="deptname"
+          width="120"
+        >
+        </el-table-column>
+        <el-table-column
+          label="鏈绉戝"
+          align="center"
+          key="visitDeptName"
+          prop="visitDeptName"
+          width="120"
+        >
+        </el-table-column>
+        <el-table-column
+          label="鐥呭尯"
+          align="center"
+          key="leavehospitaldistrictname"
+          prop="leavehospitaldistrictname"
+          width="120"
+        >
+        </el-table-column>
+
+        <el-table-column
+          label="璇婃柇鍚嶇О"
+          align="center"
+          key="leavediagname"
+          prop="leavediagname"
+          width="120"
+          :show-overflow-tooltip="true"
+        >
+        </el-table-column>
+        <el-table-column
+          label="闅忚浜哄憳"
+          align="center"
+          key="updateBy"
+          prop="updateBy"
+          width="120"
+        />
+
+        <el-table-column
+          label="鏈嶅姟闅忚妯℃澘鍚嶇О"
+          align="center"
+          key="templatename"
+          prop="templatename"
+          width="200"
+        />
+        <el-table-column
+          label="浠诲姟鐘舵��"
+          align="center"
+          key="sendstate"
+          prop="sendstate"
+          width="120"
+        >
+          <template slot-scope="scope">
+            <el-tooltip
+              class="item"
+              effect="dark"
+              :content="scope.row.remark"
+              placement="top-start"
+            >
+              <div v-if="scope.row.sendstate == 1">
+                <el-tag type="primary" :disable-transitions="false"
+                  >琛ㄥ崟宸查鍙�</el-tag
+                >
+              </div>
+              <div v-if="scope.row.sendstate == 2">
+                <el-tag type="primary" :disable-transitions="false"
+                  >寰呴殢璁�</el-tag
+                >
+              </div>
+              <div v-if="scope.row.sendstate == 3">
+                <el-tag type="success" :disable-transitions="false"
+                  >琛ㄥ崟宸插彂閫�</el-tag
+                >
+              </div>
+              <div v-if="scope.row.sendstate == 4">
+                <el-tag type="info" :disable-transitions="false">涓嶆墽琛�</el-tag>
+              </div>
+              <div v-if="scope.row.sendstate == 5">
+                <el-tag type="danger" :disable-transitions="false"
+                  >鍙戦�佸け璐�</el-tag
+                >
+              </div>
+              <div v-if="scope.row.sendstate == 6">
+                <el-tag type="success" :disable-transitions="false"
+                  >宸插畬鎴�</el-tag
+                >
+              </div>
+              <div v-if="scope.row.sendstate == 7">
+                <el-tag type="danger" :disable-transitions="false">瓒呮椂</el-tag>
+              </div>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="浠诲姟鎵ц鏂瑰紡"
+          align="center"
+          key="preachform"
+          prop="preachform"
+          width="160"
+          :show-overflow-tooltip="true"
+        >
+          <template slot-scope="scope">
+            <span v-for="item in scope.row.preachform">{{ item }}銆� </span>
+          </template>
+        </el-table-column>
+        <!-- <el-table-column
+          label="浠诲姟鍙戦�佹祦绋�"
+          align="center"
+          key="serviceSubtaskRecordList"
+          prop="serviceSubtaskRecordList"
+          width="160"
+          :show-overflow-tooltip="true"
+        >
+          <template slot-scope="scope">
+            <span v-for="item in scope.row.serviceSubtaskRecordList"
+              >{{ item.remark }}銆�
+            </span>
+          </template>
+        </el-table-column> -->
+        <el-table-column
+          label="浠诲姟缁撴灉璇存槑"
+          width="220"
+          align="center"
+          key="remark"
+          prop="remark"
+        >
+          <template slot-scope="scope" v-if="scope.row.remark">
+            <el-tooltip
+              :content="scope.row.remark"
+              placement="top"
+              effect="dark"
+            >
+              <el-tag
+                type="warning"
+                v-if="scope.row.sendstate != 5 && scope.row.sendstate != 4"
+                >{{ scope.row.remark }}</el-tag
+              >
+              <el-tag type="warning" v-else>{{ scope.row.remark }}</el-tag>
+            </el-tooltip>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鎿嶄綔"
+          align="center"
+          fixed="right"
+          width="300"
+          class-name="small-padding fixed-width"
+        >
+          <template slot-scope="scope">
+            <!-- <el-tooltip
+              class="item"
+              effect="dark"
+              content="鍐嶆闅忚"
+              placement="top"
+            >
+              <el-button
+                size="medium"
+                type="text"
+                v-if="scope.row.isVisitAgain!=2"
+                @click="followupvisit(scope.row)"
+                ><span class="button-bb"
+                  ><i class="el-icon-s-promotion"></i>鍐嶆闅忚</span
+                ></el-button
+              >
+            </el-tooltip>
+            <el-tooltip
+              v-if="scope.row.sendstate == 1 || scope.row.sendstate == 2"
+              class="item"
+              effect="dark"
+              content="鏆傚仠鏈嶅姟"
+              placement="top"
+            >
+              <el-button
+                size="medium"
+                type="text"
+                @click="handlestop(scope.row)"
+
+                ><span class="button-sc"
+                  ><i class="el-icon-remove-outline"></i>鏆傚仠鏈嶅姟</span
+                ></el-button
+              >
+            </el-tooltip> -->
+            <el-button size="medium" type="text" @click="Seedetails(scope.row)"
+              ><span class="button-zx"
+                ><i class="el-icon-s-order"></i>鏌ョ湅璇︽儏</span
+              ></el-button
+            >
+            <el-button
+              size="medium"
+              type="text"
+              @click="handleUpdate(scope.row)"
+              ><span class="button-textxga"
+                ><i class="el-icon-edit"></i>鎮h�呰繃婊�</span
+              ></el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination
+        v-show="total > 0"
+        :total="total"
+        :page.sync="topqueryParams.pageNum"
+        :limit.sync="topqueryParams.pageSize"
+        @pagination="getList"
+      />
+    </el-row>
+    <!-- 娣诲姞鎴栦慨鏀瑰奖鍍忛殢璁垮璇濇 -->
+    <el-dialog
+      :title="amendtag ? '淇敼鎮h�呬俊鎭�' : '鏂板鎮h��'"
+      :visible.sync="Labelchange"
+      width="900px"
+    >
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="濮撳悕" width="100" prop="name">
+              <el-input
+                v-model="form.name"
+                placeholder="璇疯緭鍏ュ鍚�"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="鎬у埆" width="100" prop="sex">
+              <el-select v-model="form.sex" placeholder="璇烽�夋嫨鎬у埆">
+                <el-option
+                  v-for="dict in sextype"
+                  :key="dict.value"
+                  :label="dict.label"
+                  :value="dict.value"
+                ></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="骞撮緞" prop="age">
+              <el-input
+                v-model="form.age"
+                placeholder="璇疯緭鍏ュ勾榫�"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="8">
+            <el-form-item label="杩囨护鍖荤敓" width="100" prop="filterDrname">
+              <el-input
+                v-model="form.filterDrname"
+                placeholder="璇疯緭鍏ュ尰鐢熷鍚�"
+                maxlength="30"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+       <el-row>
+  <el-col :span="24">
+    <el-form-item label="杩囨护鍘熷洜">
+      <el-input
+        v-model="form.notrequiredreason"
+        type="textarea"
+        placeholder="璇疯緭鍏ヨ繃婊ゅ師鍥�"
+      ></el-input>
+      <!-- 鎻愰啋鏂囧瓧 -->
+      <div class="filter-warning">
+        <i class="el-icon-warning-outline"></i>
+        璇ュ姛鑳介�傜敤浜庢浜°�佸垪鍏ュ尰闄㈤粦鍚嶅崟銆佹槑纭嫆缁濋殢璁跨瓑鎮h�呯殑杩囨护鎺掗櫎锛岃繃婊ゅ悗璇ユ偅鑰呮墍鏈夎繘琛屼腑浠诲姟鍏ㄩ儴鍋滄涓旀棤娉曞尮閰嶆柊鐨勯殢璁夸换鍔★紝璇疯皑鎱庢搷浣滐紒
+      </div>
+    </el-form-item>
+  </el-col>
+</el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+        <el-button @click="cancel">鍙� 娑�</el-button>
+      </div>
+    </el-dialog>
+    <!-- 淇敼鍙戦�佹椂闂村璇濇 -->
+    <el-dialog
+      title="鍙戦�佹椂闂磋缃�"
+      :visible.sync="modificationVisible"
+      width="45%"
+    >
+      <div style="margin-bottom: 20px; color: red">
+        缁熶竴淇敼褰撳ぉ鏈彂閫佺殑浠诲姟鏃堕棿
+      </div>
+
+      <el-form
+        :model="ruleForm"
+        :rules="rules"
+        ref="ruleForm"
+        label-width="120px"
+        class="demo-ruleForm"
+      >
+        <el-form-item label="鍙戦�佹棩鏈�">
+          <el-date-picker
+            v-model="ruleForm.value1"
+            type="date"
+            placeholder="閫夋嫨鏃ユ湡"
+          >
+          </el-date-picker>
+        </el-form-item>
+
+        <el-form-item label="鏃堕棿娈�" prop="type">
+          <el-checkbox-group v-model="ruleForm.type">
+            <el-checkbox label="涓婂崍" name="type"></el-checkbox>
+            <el-checkbox label="涓嬪崍" name="type"></el-checkbox>
+            <el-checkbox label="鏅氫笂" name="type"></el-checkbox>
+          </el-checkbox-group>
+        </el-form-item>
+        <el-form-item label="涓婂崍鏃堕棿鍖洪棿" required>
+          <el-time-picker
+            is-range
+            v-model="ruleForm.value2"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫椂闂�"
+            end-placeholder="缁撴潫鏃堕棿"
+            placeholder="閫夋嫨鏃堕棿鑼冨洿"
+          >
+          </el-time-picker>
+        </el-form-item>
+        <el-form-item label="涓嬪崍鏃堕棿鍖洪棿" required>
+          <el-time-picker
+            is-range
+            v-model="ruleForm.value3"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫椂闂�"
+            end-placeholder="缁撴潫鏃堕棿"
+            placeholder="閫夋嫨鏃堕棿鑼冨洿"
+          >
+          </el-time-picker>
+        </el-form-item>
+        <el-form-item label="鏅氫笂鏃堕棿鍖洪棿" required>
+          <el-time-picker
+            is-range
+            v-model="ruleForm.value4"
+            range-separator="鑷�"
+            start-placeholder="寮�濮嬫椂闂�"
+            end-placeholder="缁撴潫鏃堕棿"
+            placeholder="閫夋嫨鏃堕棿鑼冨洿"
+          >
+          </el-time-picker>
+        </el-form-item>
+      </el-form>
+
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="modificationVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="modificationVisible = false"
+          >纭� 瀹�</el-button
+        >
+      </span>
+    </el-dialog>
+    <!-- 鍐嶆闅忚 -->
+    <el-dialog title="鎮h�呭啀娆¢殢璁�" :visible.sync="dialogFormVisible">
+      <el-form ref="zcform" :rules="zcrules" :model="zcform" label-width="80px">
+        <el-form-item label="浠诲姟鍚嶇О">
+          <el-input
+            style="width: 400px"
+            disabled
+            v-model="zcform.taskName"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鎮h�呭悕绉�">
+          <el-input
+            style="width: 400px"
+            disabled
+            v-model="zcform.sendname"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="骞撮緞">
+          <el-input
+            style="width: 400px"
+            disabled
+            v-model="zcform.age"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="绉戝">
+          <el-input
+            style="width: 400px"
+            disabled
+            v-model="zcform.deptname"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鐥呭尯">
+          <el-input
+            style="width: 400px"
+            disabled
+            v-model="zcform.leavehospitaldistrictname"
+          ></el-input>
+        </el-form-item>
+
+        <el-form-item label="闅忚鏂瑰紡" prop="resource">
+          <el-radio-group v-model="zcform.resource">
+            <el-radio label="1">鏈梾鍖洪殢璁�</el-radio>
+            <el-radio label="2">闅忚涓績闅忚</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <!-- <el-form-item label="鍗冲埢鍙戦��">
+          <el-switch v-model="zcform.delivery"></el-switch>
+        </el-form-item> -->
+        <el-form-item label="鏈嶅姟鏃堕棿">
+          <el-input
+            style="width: 400px"
+            disabled
+            v-model="zcform.endtime"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="闅忚瀹屾垚鏃堕棿" prop="date1">
+          <el-date-picker
+            type="date"
+            placeholder="閫夋嫨鏃ユ湡"
+            v-model="zcform.date1"
+            style="width: 100%"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item label="闅忚璁板綍">
+          <el-input type="textarea" v-model="zcform.remark"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="dialogFormVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="setupsubtask">纭鍒涘缓鏈嶅姟</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  delUser,
+  addUser,
+  updateUser,
+  resetUserPwd,
+  changeUserStatus,
+} from "@/api/system/user";
+import {
+  getTaskservelist,
+  buidegetTasklist,
+  addserviceSubtask,
+  query360PatInfo,
+  query360PatInfonh,
+} from "@/api/AiCentre/index";
+import { alterpatient, particularpatient } from "@/api/patient/homepage";
+import Treeselect from "@riophae/vue-treeselect";
+import store from "@/store";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import StatisticsCards from "@/components/StatisticsCards";
+
+export default {
+  name: "Discharge",
+  dicts: ["sys_normal_disable", "sys_user_sex", "sys_yujing", "sys_suggest"],
+  components: { Treeselect,StatisticsCards },
+  data() {
+    return {
+      // 閬僵灞�
+      loading: true,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      dialogFormVisible: false,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 鐢ㄦ埛琛ㄦ牸鏁版嵁
+      userList: null,
+      // 寮瑰嚭灞傛爣棰�
+      title: "鏂板褰卞儚闅忚",
+      // 鏄惁鏄剧ず淇敼銆佹坊鍔犲脊鍑哄眰
+      addalteropen: false,
+      // 淇敼鍙戦�佹椂闂村璇濇
+      modificationVisible: false,
+      // 閮ㄩ棬鍚嶇О
+      deptName: undefined,
+      // 榛樿瀵嗙爜
+      initPassword: undefined,
+      // 鏃ユ湡鑼冨洿
+      dateRange: [],
+      dateRangefs: [],
+      // 宀椾綅閫夐」
+      postOptions: [],
+      ruleForm: {
+        type: [],
+      },
+      zcform: {},
+      dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
+      inputVisible: false,
+      Labelchange: false,
+      ycvalue: 0,
+      yfsvalue: "",
+      inputValue: "",
+      preachform: "",
+      previewVisible: false, //褰卞儚闅忚棰勮寮规
+      radio: "",
+      radios: [],
+      total: 0, // 鎬绘潯鏁�
+      ImportQuantity: 999, //瀵煎奖鍍忛殢璁挎暟閲�
+      //棰勮褰卞儚闅忚淇℃伅
+      previewvalue: {
+        username: "杩欎釜鍖荤敓瀵逛綘鎬庝箞鏍�",
+      },
+      value: [],
+      list: [],
+      jgvalue: 0,
+
+      sourcetype: [
+        {
+          value: 1,
+          label: "绉戝",
+          children: [],
+        },
+        {
+          value: 2,
+          label: "鐥呭尯",
+          children: [],
+        },
+        {
+          value: 3,
+          label: "鍏ㄩ儴",
+        },
+      ],
+      loading: false,
+      cardlist: [
+        {
+          name: "鎮h�呮湇鍔℃�婚噺",
+          value: 0,
+        },
+
+        {
+          name: "鏃犻渶闅忚",
+          value: 0,
+        },
+        {
+          name: "闇�闅忚",
+          value: 0,
+        },
+        {
+          name: "寰呴殢璁�",
+          value: 0,
+        },
+        {
+          name: "宸插畬鎴�",
+          value: 0,
+        },
+      ],
+      zcrules: {
+        date1: [
+          { required: true, message: "璇烽�夋嫨闅忚鏂瑰紡", trigger: "change" },
+        ],
+        resource: [
+          { required: true, message: "璇烽�夋嫨闅忚鏃堕棿", trigger: "blur" },
+        ],
+      },
+      // 绾ц仈閫夋嫨鍣ㄧ粦瀹氬��
+      serviceStatusValue: 10,
+      cascaderProps: {
+        expandTrigger: "hover", // 鎮仠灞曞紑
+        checkStrictly: true, // 鉁� 鍏抽敭锛氬厑璁搁�変腑浠绘剰涓�绾�
+        emitPath: false, // 鉁� 鍙繑鍥為�変腑鐨勫�硷紝涓嶈繑鍥炶矾寰勬暟缁�
+      },
+      // 鏈嶅姟鐘舵�侀�夐」锛堜竴绾у拰浜岀骇鍊间笉鍐茬獊锛�
+      serviceStatusOptions: [
+        {
+          value: null,
+          label: "鍏ㄩ儴",
+        },
+        {
+          value: 10, // 涓�绾э細寰呴殢璁�
+          label: "寰呴殢璁�",
+          children: [
+            { value: 1, label: "琚鍙�" },
+            { value: 2, label: "寰呭彂閫�" },
+            { value: 3, label: "宸插彂閫�" },
+            { value: 5, label: "鍙戦�佸け璐�" },
+            { value: 7, label: "瓒呮椂" },
+          ],
+        },
+        {
+          value: 20, // 涓�绾э細宸插畬鎴�
+          label: "宸插畬鎴�",
+          children: [{ value: 6, label: "宸插畬鎴�" }],
+        },
+        {
+          value: 30, // 涓�绾э細鏃犻渶闅忚
+          label: "鏃犻渶闅忚",
+          children: [{ value: 4, label: "涓嶆墽琛�" }],
+        },
+      ],
+      // 琛ㄥ崟鍙傛暟
+      form: {
+        phonenumber: "",
+        totagid: "",
+        types: "",
+        nickName: "",
+        qystatus: "",
+        btstatus: "",
+      },
+      topicoptionssort: [
+        {
+          value: 0,
+          label: "鏈嶅姟鏃堕棿(姝e簭)",
+        },
+        {
+          value: 1,
+          label: "鏈嶅姟鏃堕棿(鍊掑簭)",
+        },
+        {
+          value: 2,
+          label: "鍙戦�佹椂闂�(姝e簭)",
+        },
+        {
+          value: 3,
+          label: "鍙戦�佹椂闂�(鍊掑簭)",
+        },
+        {
+          value: 7,
+          label: "搴旈殢璁挎棩鏈�(姝e簭)",
+        },
+        {
+          value: 8,
+          label: "搴旈殢璁挎棩鏈�(鍊掑簭)",
+        },
+      ],
+      // 鏌ヨ鍙傛暟
+      topqueryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        sendstateView:1,
+        sort: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 8 : 2, //0 鏈嶅姟鏃堕棿(姝e簭)    1 鏈嶅姟鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
+        serviceType: 19,
+        searchscope: 3,
+        visitCount: 2,
+        scopetype: [],
+        visitDeptCodes: [],
+        // leaveldeptcodes:[],
+        leavehospitaldistrictcodes: [],
+      },
+      propss: { multiple: true },
+      options: [],
+
+      topicoptions: [
+        {
+          value: null,
+          label: "鍏ㄩ儴",
+        },
+        {
+          value: 1,
+          label: "寰呴殢璁�",
+        },
+        {
+          value: 2,
+          label: "闅忚涓�",
+        },
+        {
+          value: 3,
+          label: "鏈畬鎴�",
+        },
+        {
+          value: 4,
+          label: "宸插畬鎴�",
+        },
+        {
+          value: 5,
+          label: "鏃犻渶闅忚",
+        },
+      ],
+      sextype: [
+        {
+          value: 1,
+          label: "鐢�",
+        },
+        {
+          value: 2,
+          label: "濂�",
+        },
+      ],
+      topicoptionsyj: [
+        {
+          value: 1,
+          label: "寮傚父",
+        },
+        {
+          value: 0,
+          label: "姝e父",
+        },
+      ],
+      url: "http://9.208.2.190:8090/smartor/serviceExternal/query360PatInfo",
+      postData: {
+        XiaoXiTou: {
+          FaSongFCSJC: "ZJHES",
+          FaSongJGID: localStorage.getItem("orgid"),
+          FaSongJGMC: localStorage.getItem("orgname"),
+          FaSongSJ: "2025-01-09聽17:29:36",
+          FaSongXTJC: "SUIFANGXT",
+          FaSongXTMC: "闅忚绯荤粺",
+          XiaoXiID: "5FA92AFB-9833-4608-87C7-F56A654AC171",
+          XiaoXiLX: "SC_LC_360STCX",
+          XiaoXiMC: "360聽瑙嗗浘鏌ヨ",
+          ZuHuID: localStorage.getItem("ZuHuID"),
+          ZuHuMC: localStorage.getItem("orgname"),
+        },
+        YeWuXX: {
+          BingRenXX: {
+            ZhengJianHM: "",
+            ZhengJianLXDM: "01",
+            ZhengJianLXMC: "灞呮皯韬唤璇�",
+            ZuZhiJGID: localStorage.getItem("orgid"),
+            ZuZhiJGMC: localStorage.getItem("orgname"),
+          },
+          YongHuXX: {
+            XiTongID: "SUIFANGXT",
+            XiTongMC: "闅忚绯荤粺",
+            YongHuID: localStorage.getItem("YongHuID"),
+            YongHuXM: localStorage.getItem("YongHuXM"),
+            ZuZhiJGID: localStorage.getItem("orgid"),
+            ZuZhiJGMC: localStorage.getItem("orgname"),
+            idp: "lyra",
+          },
+        },
+      },
+      amendtag: false,
+      errtype: "",
+      leavehospitaldistrictcode: "",
+      serviceState: [],
+      checkboxlist: [],
+      // 琛ㄥ崟鏍¢獙
+      rules: {},
+    };
+  },
+  watch: {},
+  created() {
+    this.serviceState = store.getters.serviceState;
+    this.checkboxlist = store.getters.checkboxlist;
+    this.errtype = this.$route.query.errtype;
+    this.leavehospitaldistrictcode =
+      this.$route.query.leavehospitaldistrictcode;
+    this.sourcetype[0].children = store.getters.belongDepts.map((dept) => {
+      return {
+        label: dept.deptName,
+        value: dept.deptCode,
+      };
+    });
+    this.sourcetype[1].children = store.getters.belongWards.map((dept) => {
+      return {
+        label: dept.districtName,
+        value: dept.districtCode,
+      };
+    });
+    if (this.errtype) {
+      this.toleadExport(2);
+    } else {
+      this.getList(1);
+    }
+    this.getConfigKey("sys.user.initPassword").then((response) => {
+      this.initPassword = response.msg;
+    });
+  },
+  activated() {
+    this.getList(1);
+  },
+  methods: {
+    /** 鏌ヨ闅忚鏈嶅姟鍒楄〃 */
+    getList(refresh) {
+      // 榛樿鍏ㄩ儴
+
+      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);
+      }
+      // 鎺ュ彈寮傚父璺宠浆
+      if (this.errtype) {
+        this.topqueryParams.leavehospitaldistrictcodes.push(
+          this.leavehospitaldistrictcode
+        );
+        console.log(this.topqueryParams.leavehospitaldistrictcodes, "11");
+      }
+      this.loading = true;
+      if (
+        this.topqueryParams.leavehospitaldistrictcodes[0] &&
+        this.topqueryParams.visitDeptCodes[0]
+      ) {
+        this.topqueryParams.deptOrDistrict = 4;
+      } else {
+        this.topqueryParams.deptOrDistrict = 1;
+      }
+
+      if (!this.followupAuthority()) {
+        this.$message.warning("鏈厤缃瀹�/鐥呭尯鐩稿叧鏉冮檺涓嶅彲鏌ヨ");
+        return Promise.reject(new Error("鏃犳潈闄愭煡璇�"));
+      }
+      getTaskservelist(this.topqueryParams).then((response) => {
+        this.userList = response.rows[0].serviceSubtaskList;
+        this.total = response.total;
+        if (refresh) {
+          this.cardlist[0].value =
+            Number(response.rows[0].wxsf) + Number(response.rows[0].xsf) || 0;
+          // this.cardlist[1].value = response.rows[0].wzx;
+          this.cardlist[1].value = response.rows[0].wxsf || 0;
+          this.ycvalue = response.rows[0].yc;
+          this.cardlist[2].value = response.rows[0].xsf || 0;
+          this.cardlist[3].value = response.rows[0].dsf || 0;
+          this.cardlist[4].value = response.rows[0].ywc || 0;
+          this.yfsvalue = response.rows[0].yfs;
+        }
+        this.loading = false;
+        this.userList.forEach((item) => {
+          let idArray = null;
+          if (item.endtime) {
+            item.endDay = this.daysBetween(item.endtime);
+          }
+
+          if (item.preachform) {
+            if (item.endtime) {
+              item.preachformson = item.preachform;
+              idArray = item.preachform.split(",");
+            }
+
+            item.preachform = idArray.map((value) => {
+              // 鏌ユ壘id瀵瑰簲鐨勫璞�
+              const item = this.checkboxlist.find(
+                (item) => item.value == value
+              );
+              // 濡傛灉鎵惧埌瀵瑰簲鐨刬d锛岃繑鍥瀕abel鍊硷紝鍚﹀垯杩斿洖null
+              return item ? item.label : null;
+            });
+          }
+        });
+        this.total = response.total;
+      });
+    },
+    affiliation() {
+      this.topqueryParams.managementDoctorCode = store.getters.hisUserId;
+
+      this.getList(1);
+    },
+    onthatday() {
+      this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+      this.topqueryParams.sendstate = null;
+      this.topqueryParams.startSendDateTime = null;
+      this.topqueryParams.endSendDateTime = this.getCurrentDate(); // 寮�濮嬮殢璁挎棩鏈� <= 浠婂ぉ
+      this.getList(1);
+    },
+    getCurrentDate() {
+      const now = new Date();
+      return now.toISOString().slice(0, 10); // 鎴彇鍓�10涓瓧绗︼紝鍗� YYYY-MM-DD
+    },
+    buidegetTasklist(type) {
+      // 鐢ㄦ埛鏉冮檺涓嬫墍鏈夊緟闅忚浠诲姟锛氫紶閫掑叏閮ㄧ瀹ゅ拰鐥呭尯
+      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(
+          this.leavehospitaldistrictcode
+        );
+      }
+      let obj = {
+        pageNum: 1,
+        pageSize: 10,
+        leavehospitaldistrictcodes:
+          this.topqueryParams.leavehospitaldistrictcodes,
+        sendstateView: 1,
+        visitDeptCodes: this.topqueryParams.visitDeptCodes,
+        // leaveldeptcodes: this.topqueryParams.leaveldeptcodes,
+      };
+      buidegetTasklist(obj).then((response) => {
+        this.userList = response.rows[0].serviceSubtaskList;
+        this.total = response.total;
+        if (refresh) {
+          this.cardlist[0].value =
+            Number(response.rows[0].wxsf) + Number(response.rows[0].xsf) || 0;
+          this.cardlist[1].value = response.rows[0].wzx;
+          this.cardlist[2].value = response.rows[0].ysf;
+          this.ycvalue = response.rows[0].yc;
+          this.cardlist[3].value = response.rows[0].fssb;
+          this.cardlist[4].value = response.rows[0].dsf;
+          // this.cardlist[5].value = response.rows[0].yfs2;
+          this.yfsvalue = response.rows[0].yfs;
+        }
+        this.loading = false;
+        this.userList.forEach((item) => {
+          let idArray = null;
+          if (item.endtime) {
+            item.endDay = this.daysBetween(item.endtime);
+          }
+
+          if (item.preachform) {
+            if (item.endtime) {
+              item.preachformson = item.preachform;
+              idArray = item.preachform.split(",");
+            }
+
+            item.preachform = idArray.map((value) => {
+              // 鏌ユ壘id瀵瑰簲鐨勫璞�
+              const item = this.checkboxlist.find(
+                (item) => item.value == value
+              );
+              // 濡傛灉鎵惧埌瀵瑰簲鐨刬d锛岃繑鍥瀕abel鍊硷紝鍚﹀垯杩斿洖null
+              return item ? item.label : null;
+            });
+          }
+        });
+        this.total = response.total;
+      });
+    },
+    // 鏌ョ湅鏈嶅姟闅忚璇︽儏
+    Referencequestion(row) {
+      this.previewVisible = true;
+    },
+    // 娣诲姞寮规鎼滅储
+    remoteMethod(query) {
+      if (query !== "") {
+        this.loading = true;
+        setTimeout(() => {
+          this.loading = false;
+          this.options = this.list.filter((item) => {
+            return item.label.toLowerCase().indexOf(query.toLowerCase()) > -1;
+          });
+        }, 200);
+      } else {
+        this.options = [];
+      }
+    },
+    // 褰卞儚闅忚鐘舵�佷慨鏀�
+    handleStatusChange(row) {
+      let text = row.status === "0" ? "鍚敤" : "鍋滅敤";
+      this.$modal
+        .confirm('纭瑕�"' + text + '""' + row.userName + '"鐢ㄦ埛鍚楋紵')
+        .then(function () {
+          return changeUserStatus(row.userId, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "鎴愬姛");
+        })
+        .catch(function () {
+          row.status = row.status === "0" ? "1" : "0";
+        });
+    },
+
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        userId: undefined,
+        deptId: undefined,
+        userName: undefined,
+        nickName: undefined,
+        password: undefined,
+        phonenumber: undefined,
+        email: undefined,
+        sex: undefined,
+        status: "0",
+        remark: undefined,
+        postIds: [],
+        roleIds: [],
+      };
+      this.resetForm("form");
+    },
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery(refresh) {
+      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.pageNum = 1;
+      this.topqueryParams.startOutHospTime = this.dateRange[0];
+      this.topqueryParams.endOutHospTime = this.dateRange[1];
+      this.topqueryParams.startSendDateTime = this.dateRangefs[0];
+      this.topqueryParams.endSendDateTime = this.dateRangefs[1];
+      console.log("2");
+      this.getList(refresh);
+    },
+    // 鎮h�呰寖鍥村鐞�
+    handleChange(value) {
+      let type = value[0];
+      let code = value.slice(-1)[0];
+      this.topqueryParams.leavehospitaldistrictcodes = [];
+      this.topqueryParams.visitDeptCodes = [];
+      // this.topqueryParams.leaveldeptcodes = [];
+      if (type == 1) {
+        this.topqueryParams.visitDeptCodes.push(code);
+        // this.topqueryParams.leaveldeptcodes.push(code);
+        this.topqueryParams.leavehospitaldistrictcodes = [];
+        this.topqueryParams.searchscope = 1;
+      } else if (type == 2) {
+        this.topqueryParams.leavehospitaldistrictcodes.push(code);
+        this.topqueryParams.visitDeptCodes = [];
+        // this.topqueryParams.leaveldeptcodes = [];
+        this.topqueryParams.searchscope = 2;
+      } else {
+        this.topqueryParams.searchscope = 3;
+      }
+    },
+    // 闅忚鐘舵�佸彉鏇村鐞�
+    handleServiceStatusChange(value) {
+      // 娓呯┖閫夋嫨
+      if (value === null || value === undefined || value === "") {
+        this.topqueryParams.sendstateView = null;
+        this.topqueryParams.sendstate = null;
+        return;
+      }
+      console.log(value, "value");
+
+      // 涓�绾ц妭鐐圭殑鍊硷紙澶т簬绛変簬10锛�
+      if (value >= 10) {
+        // 閫変腑浜嗕竴绾�
+        switch (value) {
+          case 10:
+            this.topqueryParams.sendstateView = 1; // 寰呴殢璁�
+            break;
+          case 20:
+            this.topqueryParams.sendstateView = 2; // 宸插畬鎴�
+            break;
+          case 30:
+            this.topqueryParams.sendstateView = 3; // 鏃犻渶闅忚
+            break;
+        }
+        this.topqueryParams.sendstate = null;
+      } else {
+        // 閫変腑浜嗕簩绾э紙鍏蜂綋鐘舵�侊級
+        this.topqueryParams.sendstateView = null;
+        this.topqueryParams.sendstate = value;
+      }
+    },
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.dateRange = [];
+      this.dateRangefs = [];
+      this.serviceStatusValue = 10;
+
+      this.topqueryParams = {
+        pageNum: 1,
+        pageSize: 10,
+        sendstateView:1,
+        sort: 2, //0 鏈嶅姟鏃堕棿(姝e簭)    1 鏈嶅姟鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)
+        serviceType: 19,
+        searchscope: 3,
+        visitCount: 2,
+        scopetype: [],
+        visitDeptCodes: [],
+        // leaveldeptcodes:[],
+        leavehospitaldistrictcodes: [],
+      };
+      this.handleQuery(1);
+    },
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.userId);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+    //鍒犻櫎閫夐」
+    handleClose(tag) {
+      this.dynamicTags.splice(this.dynamicTags.indexOf(tag), 1);
+    },
+    //瑙﹀彂鏂板杈撳叆
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick((_) => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    //鑾峰彇澶卞幓鐒︾偣瑙﹀彂
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.dynamicTags.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = "";
+    },
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.$router.push({
+        path: "/followvisit/QuestionnaireTask",
+        query: {
+          type: 2,
+          serviceType: 19,
+        },
+      });
+    },
+    //鎮h��360璺宠浆
+    gettoken360(sfzh, drcode, drname, id) {
+      // const orgname = localStorage.getItem("orgname");
+      if (orgname == "鍗楀崕澶у闄勫睘绗竴鍖婚櫌") {
+        query360PatInfonh(id).then((res) => {
+          if (res.data) {
+            window.open(res.data, "_blank");
+          } else {
+            this.$modal.msgWarning("360鏌ヨ鏃犵粨鏋�");
+          }
+        });
+        return;
+      } else if (
+        orgname == "绗竴浜烘皯鍖婚櫌婀栨花闄㈠尯" ||
+        orgname == "绗竴浜烘皯鍖婚櫌鍚村北闄㈠尯"
+      ) {
+        let url = `http://192.200.81.189:9100/blj/view?BINGRENID=${id}&YONGHUID=DBA`;
+        window.open(url, "_blank");
+        return;
+      }
+
+      this.postData.YeWuXX.BingRenXX.ZhengJianHM = sfzh;
+
+      query360PatInfo(this.postData).then((res) => {
+        if (res.data.url) {
+          window.open(res.data.url, "_blank");
+          // this.linkUrl = res.data.url;
+        } else {
+          this.$modal.msgWarning("360鏌ヨ鏃犵粨鏋�");
+        }
+      });
+    },
+
+    /** 閲嶇疆瀵嗙爜鎸夐挳鎿嶄綔 */
+    handleResetPwd(row) {
+      this.$prompt('璇疯緭鍏�"' + row.userName + '"鐨勬柊瀵嗙爜', "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        closeOnClickModal: false,
+        inputPattern: /^.{5,20}$/,
+        inputErrorMessage: "鐢ㄦ埛瀵嗙爜闀垮害蹇呴』浠嬩簬 5 鍜� 20 涔嬮棿",
+      })
+        .then(({ value }) => {
+          resetUserPwd(row.userId, value).then((response) => {
+            this.$modal.msgSuccess("淇敼鎴愬姛锛屾柊瀵嗙爜鏄細" + value);
+          });
+        })
+        .catch(() => {});
+    },
+    // 鍙栨秷鎸夐挳
+    cancel() {
+      this.Labelchange = false;
+      this.reset();
+    },
+    /** 鎻愪氦鎸夐挳 */
+    submitForm: function () {
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          this.form.isoperation = 2;
+          this.form.notrequiredFlag = 1;
+          alterpatient(this.form)
+            .then((response) => {
+              console.log(response);
+            })
+            .then(() => {
+              this.getList(1);
+              this.$modal.msgSuccess("鎮h�呰繃婊ゆ垚鍔�");
+            });
+
+          this.reset();
+          this.Labelchange = false;
+        }
+      });
+    },
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎鐢ㄦ埛缂栧彿涓�"' + userIds + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delUser(userIds);
+        })
+        .then(() => {
+          this.getList(1);
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    // 鍏ㄩ儴鍋滄
+    AllStop() {
+      this.$modal
+        .confirm("鏄惁鍋滄鍏ㄩ儴浠诲姟锛�")
+        .then(function () {
+          return console.log("鍋滄鎴愬姛");
+        })
+        .then(() => {
+          this.getList(1);
+          this.$modal.msgWarning("鍋滄鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    // 鍏ㄩ儴寮�濮�
+    AllStarted() {
+      this.$modal
+        .confirm("鏄惁寮�鍚叏閮ㄤ换鍔★紵")
+        .then(function () {
+          return console.log("寮�鍚垚鍔�");
+        })
+        .then(() => {
+          this.getList(1);
+          this.$modal.msgSuccess("寮�鍚垚鍔�");
+        })
+        .catch(() => {});
+    },
+    // 浠诲姟閲嶇疆
+    TaskReset() {
+      this.$modal
+        .confirm("鏄惁閲嶇疆閫変腑鐨勪换鍔¢」锛�")
+        .then(function () {
+          return console.log("閫変腑鎴愬姛");
+        })
+        .then(() => {
+          this.getList(1);
+          this.$modal.msgSuccess("閲嶇疆鎴愬姛");
+        })
+        .catch(() => {});
+    },
+    // 璁剧疆鍙戦�佹椂闂�
+    Sendtimesetting() {
+      this.modificationVisible = true;
+    },
+    // 璺宠浆璇︽儏椤�
+    Seedetails(row) {
+      let type = "";
+      console.log(row, "rwo");
+      if (row.type == 1) {
+        type = 1;
+      }
+      this.$router.push({
+        path: "/followvisit/record/detailpage/",
+        query: {
+          taskid: row.taskid,
+          patid: row.patid,
+          id: row.id,
+          Voicetype: type,
+          visitCount: this.topqueryParams.visitCount,
+        },
+      });
+    },
+    // 鍐嶆闅忚
+    followupvisit(row) {
+      this.zcform = row;
+      this.zcform.endtime = this.formatTime(this.zcform.endtime);
+      this.dialogFormVisible = true;
+    },
+    onSubmit() {},
+    // 鏆傚仠鏈嶅姟
+    handlestop(row) {
+      let objson = row;
+      this.$modal
+        .confirm(
+          '鏄惁纭鏆傚仠浠诲姟鍚嶇О涓�"' +
+            row.taskName +
+            '鎮h�呭悕绉颁负"' +
+            row.sendname +
+            '"鐨勬暟鎹」锛�'
+        )
+        .then(() => {
+          getTaskservelist({
+            patid: row.patid,
+            taskid: row.taskid,
+          }).then((res) => {
+            if (res.code == 200) {
+              objson.sendstate = 4;
+              objson.remark = "鏈嶅姟鏆傚仠";
+              Editsingletaskson(objson).then((res) => {
+                if (res.code) {
+                  this.$modal.msgSuccess("璁板綍鎴愬姛");
+                  this.getList(1);
+                }
+              });
+            }
+          });
+        })
+        .catch(() => {});
+    },
+    // 鎮h�呰繃婊よЕ鍙�
+    handleUpdate(row) {
+      particularpatient(row.patid).then((response) => {
+        this.form = response.data;
+        this.form.filterDrname = store.getters.nickName;
+      });
+      this.amendtag = true;
+      this.Labelchange = true;
+    },
+    // 渚挎嵎鎸夐挳
+    toleadExport(too) {
+      if (too == 1) {
+        this.topqueryParams.sendstate = 4;
+        this.topqueryParams.excep = null;
+      } else if (too == 2) {
+        this.topqueryParams.excep = 1;
+      }
+      this.handleQuery();
+    },
+    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
+    handleExport() {
+      this.topqueryParams.pageNum = null;
+      this.topqueryParams.pageSize = null;
+      this.download(
+        "smartor/serviceSubtask/patItemExport",
+        {
+          ...this.topqueryParams,
+        },
+        `user_${new Date().getTime()}.xlsx`
+      );
+    },
+    // 寮傚父鍒楁覆鏌�
+    tableRowClassName({ row, rowIndex }) {
+      if (row.excep == 1) {
+        return "warning-row";
+      }
+      return "";
+    },
+    // 鍒涘缓鍐嶆闅忚鏈嶅姟
+    setupsubtask() {
+      this.$refs["zcform"].validate((valid) => {
+        if (valid) {
+          this.zcform.remark =
+            this.zcform.remark + "銆�" + this.getCurrentTime() + "銆�";
+          let form = structuredClone(this.zcform);
+          form.visitTime = this.formatTime(form.date1);
+          form.finishtime = "";
+          if (form.resource) {
+            if (form.resource == 2) {
+              form.serviceType = 13;
+            }
+          } else {
+            this.$modal.msgError("鏈�夋嫨闅忚鏂瑰紡");
+          }
+          form.id = null;
+          form.sendstate = 2;
+          form.preachform = form.preachformson;
+          form.longTask = 0;
+          addserviceSubtask(form).then((res) => {
+            if (res.code == 200) {
+              this.$modal.msgSuccess("鍒涘缓鎴愬姛");
+            } else {
+              this.$modal.msgError("鍒涘缓澶辫触");
+            }
+            this.dialogFormVisible = false;
+          });
+        }
+      });
+    },
+    getCurrentTime() {
+      const now = new Date();
+      const year = now.getFullYear();
+      const month = String(now.getMonth() + 1).padStart(2, "0");
+      const day = String(now.getDate()).padStart(2, "0");
+      const hours = String(now.getHours()).padStart(2, "0");
+      const minutes = String(now.getMinutes()).padStart(2, "0");
+      const seconds = String(now.getSeconds()).padStart(2, "0");
+
+      return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.el-button--primary.is-plain {
+  color: #ffffff;
+  background: #409eff;
+  border-color: #4fabe9;
+}
+
+.document {
+  // width: 100px;
+  height: 50px;
+}
+::v-deep.el-table .warning-row {
+  background: #eec4c4;
+}
+
+.documentf {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.download {
+  text-align: center;
+
+  .el-upload__tip {
+    font-size: 23px;
+  }
+
+  .el-upload__text {
+    font-size: 23px;
+  }
+}
+
+.uploading {
+  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);
+}
+
+.el-tag + .el-tag {
+  margin-left: 10px;
+}
+
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+
+.drexamine {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  padding: 30px;
+  background: #daeaf5;
+
+  img {
+    width: 100px;
+    height: 100px;
+  }
+}
+
+.qrcode-dialo {
+  // text-align: center;
+  //   display: flex;
+  margin: 20px;
+  padding: 30px;
+  background: #edf1f7;
+  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);
+
+  .topic-dev {
+    margin-bottom: 25px;
+    font-size: 20px !important;
+
+    .dev-text {
+      margin-bottom: 10px;
+    }
+  }
+}
+::v-deep.leftvlue .el-card__body {
+  background: #f2f8ff;
+  color: #324a9b;
+}
+::v-deep.leftvlue .el-card__body:hover {
+  background: #3664d9;
+  color: #fff;
+  cursor: pointer; /* 榧犳爣鎮诞鏃跺彉涓烘墜褰� */
+}
+::v-deep.errleftvlue .el-card__body {
+  background: #fdd0d7;
+}
+::v-deep.errleftvlue .el-card__body:hover {
+  background: #f88d96;
+  cursor: pointer; /* 榧犳爣鎮诞鏃跺彉涓烘墜褰� */
+}
+
+::v-deep.ysfleftvlue .el-card__body {
+  background: #d0fdd8;
+}
+::v-deep.ysfleftvlue .el-card__body:hover {
+  background: #8df8a4;
+  cursor: pointer; /* 榧犳爣鎮诞鏃跺彉涓烘墜褰� */
+}
+.button-bb {
+  font-weight: 500;
+  background-color: #2ba05c;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+.button-xq {
+  font-weight: 500;
+  background-color: #409eff;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+.button-sc {
+  font-weight: 500;
+  background-color: #b3a21f;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+.button-zx {
+  background: #4fabe9;
+  padding: 5px;
+  border-radius: 1px;
+  color: #ffffff;
+}
+.button-textxga {
+  color: #de7897;
+}
+::v-deep.el-radio-group {
+  span {
+    font-size: 24px;
+  }
+}
+.filter-warning {
+  margin-top: 8px;
+  padding: 10px 14px;
+  background: #fff7e6;
+  border: 1px solid #ffe58f;
+  border-radius: 6px;
+  color: #d46b08;
+  font-size: 18px;
+  line-height: 1.6;
+  display: flex;
+  align-items: flex-start;
+  gap: 6px;
+}
+
+.filter-warning .el-icon-warning-outline {
+  font-size: 16px;
+  color: #faad14;
+  flex-shrink: 0;
+  margin-top: 2px;
+}
+// 閫夐」瀛椾綋鏀惧ぇ
+// ::v-deep.el-checkbox-group {
+//   span {
+//     font-size: 24px;
+//   }
+// }
+</style>
diff --git a/src/views/followvisit/record/detailpage/index.vue b/src/views/followvisit/record/detailpage/index.vue
index d52a2b9..99123e5 100644
--- a/src/views/followvisit/record/detailpage/index.vue
+++ b/src/views/followvisit/record/detailpage/index.vue
@@ -127,10 +127,9 @@
               </el-tooltip>
             </template>
           </el-table-column>
-                <el-table-column
+          <el-table-column
             v-if="
-              orgname == '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�' ||
-              orgname == '涓芥按甯備腑鍖婚櫌'
+              orgname == '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�' || orgname == '涓芥按甯備腑鍖婚櫌'
             "
             label="鎷ㄥ彿鐘舵��"
             width="120"
@@ -305,8 +304,6 @@
             show-overflow-tooltip
           >
           </el-table-column>
-
-
 
           <el-table-column
             prop="bankcardno"
@@ -718,7 +715,13 @@
           <!-- 椤堕儴鎿嶄綔鍖哄煙 -->
           <div class="section-header">
             <h3><i class="el-icon-s-operation"></i> 浜哄伐澶勭悊</h3>
+
             <div class="header-actions">
+              <div v-if="form.doctorOpinion2" class="last-opinion">
+                <i class="el-icon-sunny"></i>
+                <span class="last-opinion-label">涓婃鐨勫鐞嗘剰瑙侊細</span>
+                <span class="last-opinion-text">{{ form.doctorOpinion2 }}</span>
+              </div>
               <!-- 鍩虹鎿嶄綔鎸夐挳缁� -->
               <div class="action-group basic-actions">
                 <el-button type="primary" plain @click="alterpatient('')">
@@ -798,6 +801,8 @@
               </div>
             </div>
           </div>
+
+
 
           <!-- 琛ㄥ崟鍖哄煙 -->
           <div class="form-content">
@@ -1017,6 +1022,14 @@
                   </el-button>
                   <el-button plain type="info" @click="Editsingletaskson('5')">
                     浜哄伐闅忚
+                  </el-button>
+                  <el-button
+                    plain
+                    v-if="orgname != '缂欎簯绗簩浜烘皯鍖婚櫌'"
+                    type="primary"
+                    @click="Editsingletaskson('7')"
+                  >
+                    鍥為櫌澶嶆煡澶嶈瘖
                   </el-button>
                   <el-button
                     type="primary"
@@ -1278,6 +1291,15 @@
                 v-model="form.remark2"
               ></el-input>
             </el-form-item>
+            <el-form-item label="澶勭悊鎰忚">
+              <el-input
+                class="custom-disabled"
+                type="textarea"
+                disabled
+                v-model="form.doctorOpinion2"
+                placeholder="鏃�"
+              ></el-input>
+            </el-form-item>
           </el-collapse-item>
 
           <!-- 涓嬫闅忚淇℃伅 - 榛樿灞曞紑 -->
@@ -1328,7 +1350,10 @@
               </el-col>
             </el-row>
             <el-form-item label="闅忚绫诲瀷" prop="resource">
-              <el-radio-group v-model="form.resource">
+              <el-radio-group
+                v-model="form.resource"
+                @change="handleResourceChange"
+              >
                 <el-radio label="1">鏈梾鍖洪殢璁�</el-radio>
                 <el-radio label="2">闅忚涓績闅忚</el-radio>
               </el-radio-group>
@@ -1336,11 +1361,12 @@
             <el-form-item label="闅忚璁板綍" :required="form.resource == '2'">
               <el-input type="textarea" v-model="form.remark"></el-input>
             </el-form-item>
-            <el-form-item label="鍖荤敓澶勭悊鎰忚" prop="doctorOpinion">
-              <el-input
-                type="textarea"
-                v-model="form.doctorOpinion"
-              ></el-input>
+            <el-form-item
+              label="鍖荤敓澶勭悊鎰忚"
+              prop="doctorOpinion"
+              :required="isDoctorOpinionRequired"
+            >
+              <el-input type="textarea" v-model="form.doctorOpinion"></el-input>
             </el-form-item>
           </el-collapse-item>
         </el-collapse>
@@ -1639,8 +1665,19 @@
             trigger: "change",
           },
         ],
+        // 鍖荤敓澶勭悊鎰忚锛氫粎銆岄殢璁夸腑蹇冮殢璁裤��+銆屼附姘村競涓尰闄€�嶆椂蹇呭~锛屽叾浣欐儏鍐典笉鏍¢獙
         doctorOpinion: [
-          { required: true, message: "璇疯緭鍏ュ尰鐢熷鐞嗘剰瑙�", trigger: "blur" },
+          {
+            validator: (rule, value, callback) => {
+              const needRequired =
+                this.form.resource == "2" && this.orgname === "涓芥按甯備腑鍖婚櫌";
+              if (needRequired && !String(value || "").trim()) {
+                return callback(new Error("璇疯緭鍏ュ尰鐢熷鐞嗘剰瑙�"));
+              }
+              callback();
+            },
+            trigger: "blur",
+          },
         ],
       },
       userrules: {
@@ -1764,6 +1801,10 @@
         failed: "error",
       };
       return typeMap[this.callStatus];
+    },
+    // 鍖荤敓澶勭悊鎰忚鏄惁蹇呭~锛氶殢璁跨被鍨嬮�夈�岄殢璁夸腑蹇冮殢璁裤�嶄笖褰撳墠鏈烘瀯涓轰附姘村競涓尰闄�
+    isDoctorOpinionRequired() {
+      return this.form.resource == "2" && this.orgname === "涓芥按甯備腑鍖婚櫌";
     },
     // 鏄惁浠ラ棶鍗峰舰寮忓睍绀猴紙闈炶闊虫湇鍔★紝鎴栬闊虫湇鍔′絾鏃犲畬鏁磋闊虫暟鎹渶鎵嬪姩濉姤锛�
     showQuestionnaireForm() {
@@ -2274,6 +2315,26 @@
             path: "/followvisit/discharge",
           });
         }
+      } else if (this.form.serviceType == 3) {
+        if (this.visitCount != 1) {
+          this.$router.push({
+            path: "/logisticsservice/OutpatientAgain",
+          });
+        } else {
+          this.$router.push({
+            path: "/followvisit/discharge",
+          });
+        }
+      } else if (this.form.serviceType == 19) {
+        if (this.visitCount != 1) {
+          this.$router.push({
+            path: "/logisticsservice/operationAgain",
+          });
+        } else {
+          this.$router.push({
+            path: "/followvisit/discharge",
+          });
+        }
       } else {
         // location.reload();
         this.$router.go(-1);
@@ -2635,7 +2696,8 @@
           console.log(this.form.templatename, "templatename");
 
           this.form.remark = this.form.remark || "";
-          this.form.doctorOpinion = this.form.doctorOpinion || "";
+          this.form.doctorOpinion2 = this.form.doctorOpinion || "";
+          this.form.doctorOpinion = "";
           this.logsheetlist = res.rows[0].serviceSubtaskList;
           this.templateid = this.form.templateid;
           this.selectedTag = this.form.excep;
@@ -3069,6 +3131,14 @@
         }
       });
     },
+    // 鍒囨崲闅忚绫诲瀷鍚庯紝閲嶇疆鍖荤敓澶勭悊鎰忚鐨勬牎楠岀姸鎬侊紙蹇呭~鏉′欢闅忕被鍨嬪彉鍖栵級
+    handleResourceChange() {
+      this.$nextTick(() => {
+        if (this.$refs.zcform) {
+          this.$refs.zcform.clearValidate("doctorOpinion");
+        }
+      });
+    },
     // 鍒涘缓鍐嶆闅忚鏈嶅姟
     setupsubtask() {
       this.$refs["zcform"].validate((valid) => {
@@ -3084,6 +3154,10 @@
           this.form.remark =
             this.form.remark + "銆�" + this.getCurrentTime() + "銆�";
           let form = structuredClone(this.form);
+          // 鍐嶆闅忚鍗斥�滃洖闄㈠鏌ュ璇娾�濓細澶勭悊鎰忚缃负 suggest=7
+          if (String(form.suggest) !== "7") {
+            form.suggest = "7";
+          }
           form.visitTime = this.parseTime(form.date1);
           form.finishtime = "";
           if (form.resource) {
@@ -4121,6 +4195,41 @@
   }
 }
 
+/* 涓婃鐨勫鐞嗘剰瑙� */
+.last-opinion {
+  display: flex;
+  gap: 8px;
+  margin-bottom: 20px;
+  padding: 8px 14px;
+  background: linear-gradient(135deg, #ecfdf5 0%, #f0fdfa 100%);
+  border: 1px solid #d1fae5;
+  border-left: 4px solid #10b981;
+  border-radius: 8px;
+  box-shadow: 0 1px 3px rgba(16, 185, 129, 0.08);
+  line-height: 1.5;
+
+  > i {
+    font-size: 18px;
+    color: #10b981;
+    flex-shrink: 0;
+  }
+
+  .last-opinion-label {
+    font-size: 13px;
+    color: #059669;
+    font-weight: 600;
+    white-space: nowrap;
+    flex-shrink: 0;
+  }
+
+  .last-opinion-text {
+    font-size: 14px;
+    color: #334155;
+    word-break: break-word;
+    white-space: pre-wrap;
+  }
+}
+
 /* 閫氳瘽鎺у埗鍖哄煙 */
 .call-controls {
   margin: 15px 0;
diff --git a/src/views/followvisit/record/index.vue b/src/views/followvisit/record/index.vue
index 24a3773..de3b3c4 100644
--- a/src/views/followvisit/record/index.vue
+++ b/src/views/followvisit/record/index.vue
@@ -70,6 +70,18 @@
             placeholder="璇疯緭鍏ヨ瘖鏂悕绉�"
           ></el-input>
         </el-form-item>
+        <el-form-item label="涓绘不鍖荤敓" prop="drname">
+          <el-input
+            v-model="topqueryParams.drname"
+            placeholder="璇疯緭鍏ヤ富娌诲尰鐢�"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="缁忕鍖荤敓" prop="managementDoctor">
+          <el-input
+            v-model="topqueryParams.managementDoctor"
+            placeholder="璇疯緭鍏ョ粡绠″尰鐢�"
+          ></el-input>
+        </el-form-item>
         <!-- <el-form-item label="鏈嶅姟鐘舵��" prop="status">
           <el-select
             v-model="topqueryParams.sendstateView"
@@ -368,6 +380,13 @@
           align="center"
           key="drname"
           prop="drname"
+        />
+        <el-table-column
+          label="缁忕鍖荤敓"
+          align="center"
+          key="managementDoctor"
+          prop="managementDoctor"
+          width="120"
         />
         <el-table-column
           label="璇婃柇鍚嶇О"
@@ -964,15 +983,20 @@
         serviceType: 13,
         searchscope: 3,
         sendstateView: 1,
-
+        visitCount: 1,
         sendstate: null,
- sort:
+        sort:
           localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌"
             ? 8
             : localStorage.getItem("orgname") == "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�"
             ? 2
             : 1, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)        scopetype: [],
         leaveldeptcodes: [],
+        managementDoctor:
+          localStorage.getItem("orgname") == "缂欎簯鍘夸汉姘戝尰闄�" ||
+          localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌"
+            ? store.getters.nickName
+            : "",
         leavehospitaldistrictcodes: [],
       },
       propss: { multiple: true },
@@ -1399,6 +1423,8 @@
         sort: 2,
         searchscope: 2,
         sendstateView: 1,
+        visitCount: 1,
+
         scopetype: [],
         leaveldeptcodes: [],
         leavehospitaldistrictcodes: [],
@@ -1563,6 +1589,8 @@
           Voicetype: type,
           visitCount: 1,
           again: 1,
+          visitCount: this.topqueryParams.visitCount,
+
         },
       });
     },
diff --git a/src/views/patient/archives/apiAdapter.js b/src/views/patient/archives/apiAdapter.js
index 3b1ec81..3967ff4 100644
--- a/src/views/patient/archives/apiAdapter.js
+++ b/src/views/patient/archives/apiAdapter.js
@@ -115,6 +115,11 @@
       address: row.parentAddress || "",
     });
   }
+  // 闅忚鍛ㄦ湡锛氳鎯呰〃 followupPeriod 瀛� JSON 鏁扮粍锛岀粺涓�杩樺師鍒� archive.followupCycle
+  // 锛堝垪琛ㄤ富琛ㄨ娌℃湁璇ュ瓧娈碉紝杩欓噷闈欓粯璺宠繃锛�
+  if (row.followupPeriod) {
+    target.followupCycle = unpackJson(row.followupPeriod, []);
+  }
   if (row.sourceType === "1" || row.sourceType === 1) target.sourcePage = "outpatient";
   return target;
 }
@@ -266,6 +271,12 @@
     closeStatus: archive.closeStatus == null ? "0" : String(archive.closeStatus),
   });
 
+  // 闅忚鍛ㄦ湡锛�5 绉嶄笓妗堢粺涓�瀛� followupPeriod锛圝SON 鏁扮粍锛夈��
+  // pregnancy 鐨� followupCycle 鏀惧湪 pregFormData 閲岋紝鐢变笅鏂� pregnancy 鍒嗘敮鍗曠嫭澶勭悊锛岃繖閲屾帓闄や互鍏嶈瑕嗙洊銆�
+  if (key !== "pregnancy") {
+    payload.followupPeriod = packJson(archive.followupCycle || []);
+  }
+
   if (key === "pregnancy") {
     const p = archive.pregFormData || {};
     const reg = p.registration || {};
diff --git a/src/views/patient/archives/childHealth/detail.vue b/src/views/patient/archives/childHealth/detail.vue
index 2c13ee6..3fc4b09 100644
--- a/src/views/patient/archives/childHealth/detail.vue
+++ b/src/views/patient/archives/childHealth/detail.vue
@@ -173,6 +173,12 @@
         </el-form>
       </el-card>
 
+      <!-- 闅忚鍛ㄦ湡锛堝効淇濅笁绉嶄笓妗堥�氱敤锛� -->
+      <el-card v-if="archive.subType === 'highrisk' || archive.subType === 'nutrition' || archive.subType === 'learning'" class="info-card" shadow="never" style="margin-top:14px">
+        <div slot="header" class="card-header"><span>闅忚鍛ㄦ湡</span></div>
+        <EditableTable :data.sync="followupCycle" :editing="editing" :columns="followupColumns" auto-seq="seq" />
+      </el-card>
+
         </el-tab-pane>
 
         <el-tab-pane label="鏈嶅姟璁板綍" name="service">
@@ -205,6 +211,16 @@
         trainDate:"", trainingType:"", trainContent:"", duration:40, trainer:"", progress:"鑹ソ" },
       growthData: [], neuroData: [], interventionData: [],
       measureData: [], dietData: [], planData: [],
+      followupCycle: [],
+      followupColumns: [
+        { prop:"seq", label:"搴忓彿", width:60 },
+        { prop:"planDate", label:"鎷熼殢璁挎棩鏈�", width:180, type:"date" },
+        { prop:"status", label:"鐘跺喌", width:130, type:"select", options:["宸插畬鎴�","鏈畬鎴�"], default:"鏈畬鎴�" },
+        { prop:"method", label:"闅忚鏂瑰紡", width:110 },
+        { prop:"situation", label:"闅忚鎯呭喌", minWidth:160 },
+        { prop:"followDate", label:"闅忚鏃ユ湡", width:130, type:"date" },
+        { prop:"staff", label:"闅忚浜哄憳", width:110 },
+      ],
       growthColumns: [
         { prop:"checkDate", label:"妫�鏌ユ棩鏈�", width:180, type:"date" },{ prop:"monthAge", label:"鏈堥緞", width:80 },
         { prop:"weight", label:"浣撻噸(kg)", width:100, type:"number" },{ prop:"height", label:"韬珮(cm)", width:100, type:"number" },
@@ -297,6 +313,7 @@
           this.archive = archive || null;
           if (this.archive) {
             if (!this.archive.parentInfo) this.archive.parentInfo = {};
+            this.followupCycle = this.archive.followupCycle || [];
             if (this.archive.subType === 'highrisk') {
               this.activeTab = "growth";
               this.growthData = this.archive.growthData || getDefaultGrowthData();
@@ -333,6 +350,7 @@
           this.archive.dietData = JSON.parse(JSON.stringify(this.dietData));
           this.archive.planData = JSON.parse(JSON.stringify(this.planData));
         }
+        this.archive.followupCycle = JSON.parse(JSON.stringify(this.followupCycle));
         this.loading = true;
         saveArchive(this.archive)
           .then(() => {
diff --git a/src/views/patient/archives/generateConfig/index.vue b/src/views/patient/archives/generateConfig/index.vue
index 6570053..2a2c077 100644
--- a/src/views/patient/archives/generateConfig/index.vue
+++ b/src/views/patient/archives/generateConfig/index.vue
@@ -182,6 +182,20 @@
             </el-table-column>
 
             <el-table-column
+              label="闅忚鍛ㄦ湡"
+              align="center"
+              min-width="180"
+              :show-overflow-tooltip="true"
+            >
+              <template slot-scope="scope">
+                <span v-if="formatFollowupCycle(scope.row)">
+                  {{ formatFollowupCycle(scope.row) }}
+                </span>
+                <span v-else style="color: #c0c4cc">鈥�</span>
+              </template>
+            </el-table-column>
+
+            <el-table-column
               label="澶囨敞"
               align="center"
               prop="remark"
@@ -241,7 +255,7 @@
     <el-dialog
       :title="dialogTitle"
       :visible.sync="dialogVisible"
-      width="45%"
+      width="60%"
       :close-on-click-modal="false"
       @close="cancelForm"
     >
@@ -337,6 +351,16 @@
           <div class="form-tip">浠庣柧鐥呰瘖鏂〃涓�夋嫨锛屾寜 ICD10 缂栫爜鍖归厤鎮h��</div>
         </el-form-item>
 
+        <el-form-item label="闅忚鍛ㄦ湡閰嶇疆">
+          <EditableTable
+            :data.sync="form.followupCycle"
+            :editing="true"
+            :columns="followupColumns"
+            auto-seq="seq"
+          />
+          <div class="form-tip">瀹氫箟璇ヨ鍒欏尮閰嶅悗寤烘。鐨勯殢璁胯鍒掞紙闅忚鍛ㄦ湡 / 鏂瑰紡 / 鍐呭锛�</div>
+        </el-form-item>
+
         <el-form-item label="澶囨敞" prop="remark">
           <el-input
             v-model="form.remark"
@@ -375,6 +399,7 @@
 } from "@/api/smartor/specificArchiveGenerateConfig";
 import { getillnesslist } from "@/api/AiCentre/index";
 import OptionalForm from "@/components/OptionalForm";
+import EditableTable from "../components/EditableTable.vue";
 
 // 閮ㄩ棬绫诲瀷锛�1 绉戝锛�2 鐥呭尯
 const DEPT_TYPE_OPTIONS = [
@@ -403,7 +428,7 @@
 
 export default {
   name: "GenerateConfig",
-  components: { OptionalForm },
+  components: { OptionalForm, EditableTable },
   data() {
     // 绉戝/鐥呭尯缂栫爜 涓� 璇婃柇缂栫爜 鑷冲皯濉啓涓�椤癸紝鍚﹀垯璇ヨ鍒欐棤娉曞尮閰嶄换浣曟偅鑰�
     const validateDeptOrIcd = (rule, value, callback) => {
@@ -420,6 +445,14 @@
       // 甯搁噺
       DEPT_TYPE_OPTIONS,
       DEPT_CATEGORY_OPTIONS,
+
+      // 闅忚鍛ㄦ湡閰嶇疆鍒楋紙闅忚璁″垝妯℃澘锛氬簭鍙� / 闅忚鍛ㄦ湡 / 闅忚鏂瑰紡 / 闅忚鍐呭锛�
+      followupColumns: [
+        { prop: "seq", label: "搴忓彿", width: 60 },
+        { prop: "cycle", label: "闅忚鍛ㄦ湡", width: 180 },
+        { prop: "method", label: "闅忚鏂瑰紡", width: 160 },
+        { prop: "content", label: "闅忚鍐呭", minWidth: 240 },
+      ],
 
       // 閬僵灞�
       loading: false,
@@ -461,6 +494,7 @@
         archiveType: "",
         deptCodes: [],
         icdList: [],
+        followupCycle: [],
         remark: "",
       },
       // 琛ㄥ崟鏍¢獙
@@ -583,6 +617,7 @@
         archiveType: row.archiveType || "",
         deptCodes: this.parseJsonArray(row.deptCodes),
         icdList: this.resolveIcdCodes(row.icd10Codes),
+        followupCycle: this.parseJsonArray(row.followupPeriod),
         remark: row.remark || "",
       };
     },
@@ -657,6 +692,10 @@
           this.form.icdList && this.form.icdList.length
             ? JSON.stringify(this.form.icdList.map((d) => d.icdcode))
             : "[]";
+        data.followupPeriod =
+          this.form.followupCycle && this.form.followupCycle.length
+            ? JSON.stringify(this.form.followupCycle)
+            : "[]";
 
         saveSpecificArchiveGenerateConfig(data)
           .then((response) => {
@@ -694,6 +733,7 @@
         archiveType: "",
         deptCodes: [],
         icdList: [],
+        followupCycle: [],
         remark: "",
       };
     },
@@ -759,6 +799,20 @@
         .join("銆�");
     },
 
+    /** 闅忚鍛ㄦ湡 -> 灞曠ず鏂囨湰锛堥殢璁垮懆鏈� / 闅忚鏂瑰紡 鎷兼帴锛� */
+    formatFollowupCycle(row) {
+      const list = this.parseJsonArray(row.followupPeriod);
+      if (!list.length) return "";
+      return list
+        .map((c) => {
+          const cycle = c.cycle || "";
+          const method = c.method ? "(" + c.method + ")" : "";
+          return cycle + method;
+        })
+        .filter((s) => s.trim())
+        .join("銆�");
+    },
+
     /** 瑙f瀽鍚庣杩斿洖鐨� JSON 瀛楃涓诧紙deptCodes / icd10Codes锛� */
     parseJsonArray(val) {
       if (!val) return [];
diff --git a/src/views/patient/archives/maternalHealth/detail.vue b/src/views/patient/archives/maternalHealth/detail.vue
index c654b43..df11566 100644
--- a/src/views/patient/archives/maternalHealth/detail.vue
+++ b/src/views/patient/archives/maternalHealth/detail.vue
@@ -173,6 +173,19 @@
             </el-card>
           </template>
 
+          <!-- 闅忚鍛ㄦ湡锛堝洿缁濈粡鏈烳HI锛� -->
+          <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>
+              <EditableTable
+                :data.sync="followupCycle"
+                :editing="editing"
+                :columns="followupColumns"
+                auto-seq="seq"
+              />
+            </el-card>
+          </template>
+
           <!-- ===== 鍥寸粷缁忔湡MHI锛�6 涓噺琛� tab ===== -->
           <template v-if="archive.subType === 'menopause'">
             <el-card class="info-card" shadow="never" style="margin-top:14px">
@@ -404,6 +417,7 @@
     return {
       PREGNANCY_OPTIONS, PREGNANCY_DETAIL_OPTIONS, PREGNANCY_DETAIL_HINTS, UNREGISTERED_REASONS,
       loading: false, archive: null, editing: true, activeTab: "sysQ", mainTab: "detail",
+      followupCycle: [],
       followupColumns: [
         { prop: "seq", label: "搴忓彿", width: 60 },
         { prop: "planDate", label: "鎷熼殢璁挎棩鏈�", width: 180, type: "date" },
@@ -536,6 +550,7 @@
                   if (this.archive.formData[k]) Object.assign(this.form[k], this.archive.formData[k]);
                 });
               }
+              this.followupCycle = this.archive.followupCycle || [];
             }
           }
           if (autoEdit) this.editing = true;
@@ -611,7 +626,10 @@
       if (this.editing) {
         // 鍏堟妸椤甸潰琛ㄥ崟鍥炲~鍒版。妗堝璞★紝鍐嶆暣浣撴彁浜�
         if (this.archive.subType === "pregnancy") this.archive.pregFormData = JSON.parse(JSON.stringify(this.pregForm));
-        if (this.archive.subType === "menopause") this.archive.formData = JSON.parse(JSON.stringify(this.form));
+        if (this.archive.subType === "menopause") {
+          this.archive.formData = JSON.parse(JSON.stringify(this.form));
+          this.archive.followupCycle = JSON.parse(JSON.stringify(this.followupCycle));
+        }
         this.loading = true;
         saveArchive(this.archive)
           .then(() => {
diff --git a/src/views/patient/follow/index.vue b/src/views/patient/follow/index.vue
index d29ceff..2e403ef 100644
--- a/src/views/patient/follow/index.vue
+++ b/src/views/patient/follow/index.vue
@@ -388,11 +388,39 @@
     },
   },
   created() {
+    // 褰撳墠鏈烘瀯涓轰附姘村競涓尰闄㈡椂锛屽缓妗f棩鏈熼粯璁ゆ渶杩戜竴涓湀
+    if (localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌") {
+      this.dateRange = this.getLastMonthRange();
+      this.queryParams.createTimeStart = this.dateRange[0];
+      this.queryParams.createTimeEnd = this.dateRange[1];
+    }
     this.getList();
     this.gettabList();
     this.Filterreason = store.getters.Filterreason;
   },
   methods: {
+    /** 鑾峰彇鏈�杩戜竴涓湀鏃堕棿鑼冨洿 */
+    getLastMonthRange() {
+      const end = new Date();
+      const start = new Date();
+      start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+
+      const formatDate = (date) => {
+        const year = date.getFullYear();
+        const month = String(date.getMonth() + 1).padStart(2, "0");
+        const day = String(date.getDate()).padStart(2, "0");
+        return `${year}-${month}-${day} 00:00:00`;
+      };
+
+      const formatEndDate = (date) => {
+        const year = date.getFullYear();
+        const month = String(date.getMonth() + 1).padStart(2, "0");
+        const day = String(date.getDate()).padStart(2, "0");
+        return `${year}-${month}-${day} 23:59:59`;
+      };
+
+      return [formatDate(start), formatEndDate(end)];
+    },
     /** 鏌ヨ鎮h�呭垪琛� */
     getList() {
       this.loading = true;
diff --git a/src/views/patient/patient/AwaitingAdmission.vue b/src/views/patient/patient/AwaitingAdmission.vue
index 64fb662..ac01323 100644
--- a/src/views/patient/patient/AwaitingAdmission.vue
+++ b/src/views/patient/patient/AwaitingAdmission.vue
@@ -433,6 +433,13 @@
                 </div>
               </template>
             </el-table>
+            <pagination
+              v-show="taskTotal > 0"
+              :total="taskTotal"
+              :page.sync="taskQueryParams.pageNum"
+              :limit.sync="taskQueryParams.pageSize"
+              @pagination="loadTaskList"
+            />
           </div>
         </el-col>
       </el-row>
@@ -631,6 +638,11 @@
       taskList: [], // 浠诲姟鍒楄〃
       selectedTask: null, // 閫変腑鐨勪换鍔″垪琛�
       batchLoading: false, // 鎵归噺鎻愪氦鍔犺浇鐘舵��
+      taskQueryParams: {
+        pageNum: 1,
+        pageSize: 20,
+      },
+      taskTotal: 0,
       deptcode: "",
       Patientrange: [
         {
@@ -1070,22 +1082,24 @@
       // 鏄剧ず寮圭獥
       this.batchTaskVisible = true;
 
-      // 鑾峰彇浠诲姟鍒楄〃
-      this.loadTaskList(deptcode);
+      // 閲嶇疆浠诲姟鍒嗛〉骞惰幏鍙栦换鍔″垪琛�
+      this.taskQueryParams.pageNum = 1;
+      this.loadTaskList();
     },
 
     /** 鍔犺浇浠诲姟鍒楄〃 */
-    loadTaskList(deptcode) {
+    loadTaskList() {
       this.batchLoading = true;
       let topqueryParams = {
-        pageNum: 1,
-        pageSize: 10,
+        pageNum: this.taskQueryParams.pageNum,
+        pageSize: this.taskQueryParams.pageSize,
         serviceType: 3,
         type: 2,
       };
       //         deptcode: deptcode,鍙栨秷绉戝闄愬埗
       getTasklist(topqueryParams).then((response) => {
         this.taskList = response.rows;
+        this.taskTotal = response.total;
         this.batchLoading = false;
       });
     },
diff --git a/src/views/patient/patient/behospitalized.vue b/src/views/patient/patient/behospitalized.vue
index f1f22c6..b92d1e1 100644
--- a/src/views/patient/patient/behospitalized.vue
+++ b/src/views/patient/patient/behospitalized.vue
@@ -122,6 +122,20 @@
               娣诲姞寤剁画鎶ょ悊浠诲姟
             </el-button>
           </el-col>
+          <!-- 璇煶鏈嶅姟杞汉宸ユ寜閽� -->
+          <el-col :span="1.5">
+            <el-button
+              type="primary"
+              plain
+              icon="el-icon-refresh-right"
+              size="medium"
+              :disabled="multiple"
+              v-if="orgname === '绗竴浜烘皯鍖婚櫌婀栨花闄㈠尯'||orgname === '绗竴浜烘皯鍖婚櫌鍚村北闄㈠尯'||orgname === '绗竴浜烘皯鍖婚櫌鍩庝笢闄㈠尯'"
+              @click="handleManualVisit"
+            >
+              璇煶鏈嶅姟杞汉宸�
+            </el-button>
+          </el-col>
           <!-- <el-col :span="1.5">
             <el-button
               type="success"
@@ -314,7 +328,7 @@
     <!-- 鎵归噺娣诲姞寤剁画鎶ょ悊浠诲姟寮圭獥 -->
     <!-- 鎵归噺娣诲姞寤剁画鎶ょ悊浠诲姟寮圭獥 -->
     <el-dialog
-      title="鎵归噺娣诲姞寤剁画鎶ょ悊"
+      :title="batchMode === 'manual' ? '璇煶鏈嶅姟杞汉宸�' : '鎵归噺娣诲姞寤剁画鎶ょ悊'"
       :visible.sync="batchTaskVisible"
       width="90%"
       append-to-body
@@ -391,7 +405,9 @@
         <el-col :span="12">
           <div class="batch-task-section">
             <div class="section-header">
-              <h4>寤剁画鎶ょ悊浠诲姟</h4>
+              <h4>
+                {{ batchMode === "manual" ? "浜哄伐闅忚浠诲姟" : "寤剁画鎶ょ悊浠诲姟" }}
+              </h4>
               <div v-if="selectedTask" class="task-selected-hint selected">
                 <i class="el-icon-success"></i>
                 <span>宸查�夋嫨锛歿{ selectedTask.taskName }}</span>
@@ -453,7 +469,11 @@
               <template #empty>
                 <div class="empty-message">
                   <i class="el-icon-document"></i>
-                  <span>鏆傛棤鍙敤寤剁画鎶ょ悊浠诲姟</span>
+                  <span>{{
+                    batchMode === "manual"
+                      ? "鏆傛棤鍙敤浜哄伐闅忚浠诲姟"
+                      : "鏆傛棤鍙敤寤剁画鎶ょ悊浠诲姟"
+                  }}</span>
                   <span class="empty-tips">璇疯仈绯荤鐞嗗憳鍒涘缓浠诲姟</span>
                 </div>
               </template>
@@ -473,7 +493,15 @@
           @click="submitBatchTask"
           :disabled="!selectedTask || batchLoading"
         >
-          {{ batchLoading ? "鍒涘缓涓�..." : "鍒涘缓寤剁画鎶ょ悊浠诲姟" }}
+          {{
+            batchLoading
+              ? batchMode === "manual"
+                ? "杞崲涓�..."
+                : "鍒涘缓涓�..."
+              : batchMode === "manual"
+              ? "纭杞汉宸�"
+              : "鍒涘缓寤剁画鎶ょ悊浠诲姟"
+          }}
         </el-button>
       </div>
     </el-dialog>
@@ -581,7 +609,7 @@
 import { delUser } from "@/api/system/user";
 import formatTime from "@/filters/index";
 
-import { listpatient } from "@/api/patient/record";
+import { listpatient, addManualVisit } from "@/api/patient/record";
 import {
   messagelistpatient,
   alterpatient,
@@ -639,6 +667,7 @@
       initPassword: undefined,
       amendtag: false, //鏄惁淇敼
       // 鎵归噺浠诲姟鐩稿叧鏁版嵁
+      batchMode: "continue", // 寮圭獥妯″紡锛歝ontinue 寤剁画鎶ょ悊 / manual 璇煶鏈嶅姟杞汉宸�
       batchTaskVisible: false, // 寮圭獥鍙鎬�
       selectedPatients: [], // 閫変腑鐨勬偅鑰呭垪琛�
       taskList: [], // 浠诲姟鍒楄〃
@@ -669,7 +698,7 @@
           label: "鐥呭尯鎮h��",
         },
       ],
-      orgName: localStorage.getItem("orgname"),
+      orgname: localStorage.getItem("orgname"),
 
       postData: {
         XiaoXiTou: {
@@ -811,6 +840,8 @@
     this.queryParams.leavehospitaldistrictcodes = store.getters.belongWards.map(
       (obj) => obj.districtCode
     );
+    console.log(this.orgname);
+
     this.getList();
     // this.listDept();
     this.gettabList();
@@ -929,37 +960,52 @@
         return;
       }
 
-      // 鑾峰彇閫変腑鎮h�呯殑绉戝淇℃伅
-      const patientDepts = new Set();
-      let deptcode = "";
-      this.ids.forEach((patId) => {
-        const patient = this.userList.find((item) => item.patid === patId);
-        if (patient) {
-          patientDepts.add(patient.deptname);
-          deptcode = patient.deptcode;
-        }
-      });
-
+      this.batchMode = "continue";
       // 鑾峰彇閫変腑鎮h�呭垪琛�
       this.selectedPatients = this.userList.filter((item) =>
         this.ids.includes(item.patid)
       );
+      this.selectedTask = null;
 
       // 鏄剧ず寮圭獥
       this.batchTaskVisible = true;
 
       // 鑾峰彇浠诲姟鍒楄〃
-      this.loadTaskList(deptcode);
+      this.loadTaskList();
+    },
+
+    /** 璇煶鏈嶅姟杞汉宸ユ寜閽偣鍑� */
+    handleManualVisit() {
+      // 鏍¢獙鏄惁閫変腑鎮h��
+      if (this.ids.length === 0) {
+        this.$modal.msgWarning("璇疯嚦灏戦�変腑1鍚嶆偅鑰�");
+        return;
+      }
+
+      this.batchMode = "manual";
+      // 鑾峰彇閫変腑鎮h�呭垪琛�
+      this.selectedPatients = this.userList.filter((item) =>
+        this.ids.includes(item.patid)
+      );
+      this.selectedTask = null;
+
+      // 鏄剧ず寮圭獥
+      this.batchTaskVisible = true;
+
+      // 鑾峰彇浠诲姟鍒楄〃
+      this.loadTaskList();
     },
 
     /** 鍔犺浇浠诲姟鍒楄〃 */
-    loadTaskList(deptcode) {
+    loadTaskList() {
       this.batchLoading = true;
       let topqueryParams = {
         pageNum: 1,
-        pageSize: 100, // 璁剧疆杈冨ぇ鐨勫垎椤佃幏鍙栨洿澶氫换鍔�
-        type: 2, // 寤剁画鎶ょ悊浠诲姟绫诲瀷
+        pageSize: 1000, // 璁剧疆杈冨ぇ鐨勫垎椤佃幏鍙栨洿澶氫换鍔�
       };
+      if (this.batchMode !== "manual") {
+        topqueryParams.type = 2; // 寤剁画鎶ょ悊浠诲姟绫诲瀷
+      }
       topqueryParams.deptcodes = store.getters.belongDepts.map(
         (obj) => obj.deptCode
       );
@@ -968,11 +1014,21 @@
       );
       getTasklist(topqueryParams)
         .then((response) => {
-          this.taskList = response.rows;
+          this.taskList = response.rows || [];
+          if (this.batchMode === "manual") {
+            // 鍙繚鐣欍�屼汉宸ャ�嶄换鍔″舰寮忥紙preachform 鍚� 1锛�
+            this.taskList = this.taskList.filter((task) =>
+              this.isManualTask(task)
+            );
+          }
           this.batchLoading = false;
 
           if (this.taskList.length === 0) {
-            this.$modal.msgWarning("褰撳墠绉戝鏃犲彲鐢ㄥ欢缁姢鐞嗕换鍔�");
+            this.$modal.msgWarning(
+              this.batchMode === "manual"
+                ? "褰撳墠绉戝鏃犲彲鐢ㄤ汉宸ラ殢璁夸换鍔�"
+                : "褰撳墠绉戝鏃犲彲鐢ㄥ欢缁姢鐞嗕换鍔�"
+            );
           }
         })
         .catch((error) => {
@@ -981,16 +1037,38 @@
         });
     },
 
+    /** 鍒ゆ柇鏄惁涓恒�屼汉宸ャ�嶄换鍔″舰寮忥紙preachform 鍚� 1锛� */
+    isManualTask(task) {
+      if (task.preachform != null && task.preachform !== "") {
+        const forms = String(task.preachform)
+          .split(",")
+          .map((s) => s.trim());
+        if (forms.includes("1")) return true;
+      }
+      if (Array.isArray(task.preachformList)) {
+        return task.preachformList.some(
+          (item) => String(item.preachform) === "1"
+        );
+      }
+      return false;
+    },
+
     /** 澶勭悊浠诲姟閫夋嫨鍙樺寲 */
     handleTaskSelectionChange(currentRow) {
       this.selectedTask = currentRow;
     },
 
-    /** 鎵归噺鎻愪氦寤剁画鎶ょ悊浠诲姟 */
+    /** 鎵归噺鎻愪氦锛堝欢缁姢鐞� / 璇煶鏈嶅姟杞汉宸ワ級 */
     async submitBatchTask() {
       // 鏍¢獙鏄惁閫変腑浠诲姟
       if (!this.selectedTask) {
         this.$modal.msgWarning("璇烽�夋嫨1涓换鍔�");
+        return;
+      }
+
+      // 璇煶鏈嶅姟杞汉宸ワ細璧版柊鎺ュ彛
+      if (this.batchMode === "manual") {
+        this.submitManualVisit();
         return;
       }
 
@@ -1066,6 +1144,40 @@
       }
     },
 
+    /** 璇煶鏈嶅姟杞汉宸ワ細鍒犻櫎鏈畬鎴愰殢璁夸换鍔″苟閲嶆柊鐢熸垚浜哄伐闅忚浠诲姟 */
+    async submitManualVisit() {
+      this.batchLoading = true;
+      try {
+        const params = {
+          patids: this.selectedPatients.map((item) => item.patid),
+          taskid: this.selectedTask.taskid,
+        };
+        const response = await addManualVisit(params);
+        if (response.code === 200) {
+          const data = response.data || {};
+          const generated = data.generatedCount || 0;
+          const noDischarge = (data.noDischargeRecordPatids || []).length;
+          const noArchive = (data.noArchivePatids || []).length;
+          const failed = (data.generateFailedPatids || []).length;
+          let msg = `鎴愬姛鐢熸垚 ${generated} 涓汉宸ラ殢璁夸换鍔;
+          if (noDischarge) msg += `锛�${noDischarge} 浜烘棤鍑洪櫌璁板綍`;
+          if (noArchive) msg += `锛�${noArchive} 浜烘棤鎮h�呮。妗坄;
+          if (failed) msg += `锛�${failed} 浜虹敓鎴愬け璐;
+          this.$modal.msgSuccess(msg);
+          this.batchTaskVisible = false;
+          this.getList(); // 鍒锋柊鎮h�呭垪琛�
+        } else {
+          this.$modal.msgError(response.msg || "璇煶鏈嶅姟杞汉宸ュけ璐�");
+        }
+      } catch (error) {
+        this.$modal.msgError(
+          "璇煶鏈嶅姟杞汉宸ュけ璐ワ細" + (error.message || "缃戠粶閿欒")
+        );
+      } finally {
+        this.batchLoading = false;
+      }
+    },
+
     /** 璁$畻闅忚缁撴潫鏃堕棿锛堝湪闄㈡偅鑰咃細鍑洪櫌鍚�7澶╋級 */
     getFollowUpEndTime(admitDate) {
       if (!admitDate) return "";
diff --git a/src/views/patient/patient/hospital.vue b/src/views/patient/patient/hospital.vue
index 9058f8a..7f12039 100644
--- a/src/views/patient/patient/hospital.vue
+++ b/src/views/patient/patient/hospital.vue
@@ -500,6 +500,13 @@
                 </div>
               </template>
             </el-table>
+            <pagination
+              v-show="taskTotal > 0"
+              :total="taskTotal"
+              :page.sync="taskQueryParams.pageNum"
+              :limit.sync="taskQueryParams.pageSize"
+              @pagination="loadTaskList"
+            />
           </div>
         </el-col>
       </el-row>
@@ -676,6 +683,11 @@
       taskList: [], // 浠诲姟鍒楄〃
       selectedTask: null, // 閫変腑鐨勪换鍔�
       batchLoading: false, // 鎵归噺鎻愪氦鍔犺浇鐘舵��
+      taskQueryParams: {
+        pageNum: 1,
+        pageSize: 20,
+      },
+      taskTotal: 0,
       // 鏃ユ湡鑼冨洿
       dateRange: [],
       source: [
@@ -920,8 +932,9 @@
       // 鏄剧ず寮圭獥
       this.batchTaskVisible = true;
 
-      // 鑾峰彇浠诲姟鍒楄〃
-      this.loadTaskList(deptcode);
+      // 閲嶇疆浠诲姟鍒嗛〉骞惰幏鍙栦换鍔″垪琛�
+      this.taskQueryParams.pageNum = 1;
+      this.loadTaskList();
     },
     /** 琛ㄦ牸琛屾牱寮� */
     tableRowClassName({ row, rowIndex }) {
@@ -941,11 +954,11 @@
       }
     },
     /** 鍔犺浇浠诲姟鍒楄〃 */
-    loadTaskList(deptcode) {
+    loadTaskList() {
       this.batchLoading = true;
       let topqueryParams = {
-        pageNum: 1,
-        pageSize: 100, // 璁剧疆杈冨ぇ鐨勫垎椤佃幏鍙栨洿澶氫换鍔�
+        pageNum: this.taskQueryParams.pageNum,
+        pageSize: this.taskQueryParams.pageSize,
         type: 2, // 鏍规嵁瀹為檯鎯呭喌璋冩暣
       };
       topqueryParams.deptcodes = store.getters.belongDepts.map(
@@ -957,6 +970,7 @@
       getTasklist(topqueryParams)
         .then((response) => {
           this.taskList = response.rows;
+          this.taskTotal = response.total;
           this.batchLoading = false;
 
           if (this.taskList.length === 0) {
diff --git a/src/views/patient/patient/outpatient.vue b/src/views/patient/patient/outpatient.vue
index 4ec86cf..7cfad0f 100644
--- a/src/views/patient/patient/outpatient.vue
+++ b/src/views/patient/patient/outpatient.vue
@@ -168,6 +168,7 @@
           </el-col>
           <el-col :span="1.5">
             <el-button
+            v-if="orgname='涓芥按甯傚骞间繚鍋ラ櫌'"
               type="success"
               plain
               icon="el-icon-folder-add"
@@ -475,6 +476,13 @@
                 </div>
               </template>
             </el-table>
+            <pagination
+              v-show="taskTotal > 0"
+              :total="taskTotal"
+              :page.sync="taskQueryParams.pageNum"
+              :limit.sync="taskQueryParams.pageSize"
+              @pagination="loadTaskList"
+            />
           </div>
         </el-col>
       </el-row>
@@ -681,6 +689,11 @@
       taskList: [], // 浠诲姟鍒楄〃
       selectedTask: null, // 閫変腑鐨勪换鍔″垪琛�
       batchLoading: false, // 鎵归噺鎻愪氦鍔犺浇鐘舵��
+      taskQueryParams: {
+        pageNum: 1,
+        pageSize: 20,
+      },
+      taskTotal: 0,
       // 鎮h�呭缓妗�
       archiveDialogVisible: false,
       archivePatients: [],
@@ -695,7 +708,7 @@
           id: 1,
         },
       ],
-      orgName: localStorage.getItem("orgname"),
+      orgname: localStorage.getItem("orgname"),
       postData: {
         XiaoXiTou: {
           FaSongFCSJC: "ZJHES",
@@ -1149,22 +1162,24 @@
       // 鏄剧ず寮圭獥
       this.batchTaskVisible = true;
 
-      // 鑾峰彇浠诲姟鍒楄〃
-      this.loadTaskList(deptcode);
+      // 閲嶇疆浠诲姟鍒嗛〉骞惰幏鍙栦换鍔″垪琛�
+      this.taskQueryParams.pageNum = 1;
+      this.loadTaskList();
     },
 
     /** 鍔犺浇浠诲姟鍒楄〃 */
-    loadTaskList(deptcode) {
+    loadTaskList() {
       this.batchLoading = true;
       let topqueryParams = {
-        pageNum: 1,
-        pageSize: 10,
+        pageNum: this.taskQueryParams.pageNum,
+        pageSize: this.taskQueryParams.pageSize,
         serviceType: 3,
         type: 2,
       };
       //         deptcode: deptcode,鍙栨秷绉戝闄愬埗
       getTasklist(topqueryParams).then((response) => {
         this.taskList = response.rows;
+        this.taskTotal = response.total;
         this.batchLoading = false;
       });
     },
diff --git a/src/views/patient/propaganda/Missioncreation.vue b/src/views/patient/propaganda/Missioncreation.vue
index db38b79..eaa298b 100644
--- a/src/views/patient/propaganda/Missioncreation.vue
+++ b/src/views/patient/propaganda/Missioncreation.vue
@@ -1741,6 +1741,7 @@
       this.leavehospitaldistrictcodes = [];
       this.deptcodesWards = [];
       this.queryParamsdept.taskId = this.form.taskid;
+      this.queryParamsdept.taskid = this.form.taskid;
       console.log(1, this.queryParamsdept);
 
       taskdepthospgetsonlist(this.queryParamsdept).then((res) => {
diff --git a/src/views/patient/propaganda/QuestionnaireTask.vue b/src/views/patient/propaganda/QuestionnaireTask.vue
index 4235af7..1cea8bc 100644
--- a/src/views/patient/propaganda/QuestionnaireTask.vue
+++ b/src/views/patient/propaganda/QuestionnaireTask.vue
@@ -2256,8 +2256,8 @@
       this.deptcodesWards = [];
       this.medicalCodes = [];
       this.medicalOptions = [];
-      // this.queryParamsdept.taskId = this.form.taskid;
       this.queryParamsdept.taskId = this.form.taskid;
+      this.queryParamsdept.taskid = this.form.taskid;
 
       if (this.form.appltype == 5) {
         rwztaskdepthospgetsonlist(this.queryParamsdept).then((res) => {
diff --git a/src/views/patient/propaganda/particty.vue b/src/views/patient/propaganda/particty.vue
index 16482f9..c8887a6 100644
--- a/src/views/patient/propaganda/particty.vue
+++ b/src/views/patient/propaganda/particty.vue
@@ -2280,6 +2280,7 @@
       this.deptcodesWards = [];
       this.medicalCodes = [];
       this.medicalOptions = [];
+      this.queryParamsdept.taskid = this.form.taskid;
       this.queryParamsdept.taskId = this.form.taskid;
 
       if (this.form.appltype == 5) {
diff --git a/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue b/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
index ebdec78..b070bbf 100644
--- a/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
@@ -621,6 +621,46 @@
           </el-table-column>
         </el-table-column>
 
+        <!-- ===== 闅忚鎯呭喌锛堜附姘村競涓尰闄紝浠庨娆¢殢璁跨Щ鍏ワ級 ===== -->
+        <el-table-column align="center" label="闅忚鎯呭喌">
+          <el-table-column
+            label="姝e父璇煶"
+            align="center"
+            width="100"
+            prop="taskSituation1"
+          />
+          <el-table-column
+            label="鎮h�呮嫆鎺ユ垨鎷掕"
+            align="center"
+            width="100"
+            prop="taskSituation2"
+          />
+          <el-table-column
+            label="闈㈣鎴栬�呮帴璇�"
+            align="center"
+            width="100"
+            prop="taskSituation3"
+          />
+          <el-table-column
+            label="寰俊闅忚"
+            align="center"
+            width="100"
+            prop="taskSituation4"
+          />
+          <el-table-column
+            label="闅忚鐢佃瘽涓嶆纭�"
+            align="center"
+            width="100"
+            prop="taskSituation5"
+          />
+          <el-table-column
+            label="鍏朵粬鎯呭喌涓嶅疁闅忚"
+            align="center"
+            width="100"
+            prop="taskSituation6"
+          />
+        </el-table-column>
+
         <!-- ===== 鏂板璁$畻鎸囨爣 ===== -->
         <el-table-column
           label="闅忚鐜�"
@@ -662,6 +702,39 @@
             >
               <span class="button-zx">{{ scope.row.manuallyCalled }}</span>
             </el-button>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="鍐嶆闅忚鎺ㄩ�佷汉鏁�"
+          align="center"
+          prop="againFollowUpPushCount"
+        >
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              @click="
+                handleViewDetails(
+                  scope.row,
+                  'againFollowUpPushCountInfo',
+                  '鍐嶆闅忚鎺ㄩ�佸垪琛�',
+                  '1'
+                )
+              "
+            >
+              <span class="button-zx">{{
+                scope.row.againFollowUpPushCount
+              }}</span>
+            </el-button>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="杩借釜闅忚鎺ㄩ�佺巼"
+          align="center"
+          prop="againFollowUpPushRate"
+          :render-header="TooltipAgainFollowUpPushRate"
+        >
+          <template slot-scope="scope">
+            <span>{{ calculateAgainFollowUpPushRate(scope.row) }}</span>
           </template>
         </el-table-column>
       </el-table>
@@ -979,6 +1052,14 @@
       return ((successAgain / denominator) * 100).toFixed(2) + "%";
     },
 
+    // 杩借釜闅忚鎺ㄩ�佺巼 = 鍐嶆闅忚鎺ㄩ�佷汉鏁� / 鍑洪櫌浜烘
+    calculateAgainFollowUpPushRate(row) {
+      const pushCount = Number(row.againFollowUpPushCount) || 0;
+      const discharge = Number(row.dischargeCount) || 0;
+      if (discharge <= 0) return "0.00%";
+      return ((pushCount / discharge) * 100).toFixed(2) + "%";
+    },
+
     // ===================== 姹囨�� =====================
     getSummaries(param) {
       const { columns, data } = param;
@@ -1020,6 +1101,19 @@
             sums[index] =
               (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2) +
               "%";
+        } else if (prop === "againFollowUpPushRate") {
+          const totalPush = data.reduce(
+            (s, row) => s + (Number(row.againFollowUpPushCount) || 0),
+            0
+          );
+          const totalDischarge = data.reduce(
+            (s, row) => s + (Number(row.dischargeCount) || 0),
+            0
+          );
+          sums[index] =
+            totalDischarge > 0
+              ? ((totalPush / totalDischarge) * 100).toFixed(2) + "%"
+              : "0.00%";
         } else {
           // 鏁板瓧鍒楁眰鍜�
           const values = data.map((item) => Number(item[prop]) || 0);
@@ -1714,6 +1808,19 @@
         [h("span", column.label)]
       );
     },
+    TooltipAgainFollowUpPushRate(h, { column }) {
+      return h(
+        "el-tooltip",
+        {
+          props: {
+            content: "鍐嶆闅忚鎺ㄩ�佷汉鏁�/鍑洪櫌浜烘",
+            placement: "top",
+            effect: "dark",
+          },
+        },
+        [h("span", column.label)]
+      );
+    },
   },
 };
 </script>
diff --git a/src/views/sfstatistics/percentage/components/FirstFollowUp.vue b/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
index adabf9f..ff4f3c8 100644
--- a/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
@@ -156,6 +156,7 @@
                   </template>
                 </el-table-column>
                 <el-table-column
+                  v-if="!isTargetHospital"
                   label="寰呴殢璁�"
                   align="center"
                   key="pendingFollowUp"
@@ -179,6 +180,62 @@
                       }}</span>
                     </el-button>
                   </template>
+                </el-table-column>
+                <el-table-column
+                  v-if="isTargetHospital"
+                  label="寰呴殢璁�"
+                  align="center"
+                >
+                  <el-table-column
+                    label="寰呭彂閫�"
+                    align="center"
+                    key="pendingFollowUpWaitSend"
+                    prop="pendingFollowUpWaitSend"
+                  >
+                    <template slot-scope="scope">
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="
+                          handleViewDetails(
+                            scope.row,
+                            'pendingFollowUpWaitSendInfo',
+                            '寰呭彂閫佸垪琛�',
+                            '1'
+                          )
+                        "
+                      >
+                        <span class="button-zx">{{
+                          scope.row.pendingFollowUpWaitSend
+                        }}</span>
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    label="宸插彂閫�"
+                    align="center"
+                    key="pendingFollowUpSent"
+                    prop="pendingFollowUpSent"
+                  >
+                    <template slot-scope="scope">
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="
+                          handleViewDetails(
+                            scope.row,
+                            'pendingFollowUpSentInfo',
+                            '宸插彂閫佸垪琛�',
+                            '1'
+                          )
+                        "
+                      >
+                        <span class="button-zx">{{
+                          scope.row.pendingFollowUpSent
+                        }}</span>
+                      </el-button>
+                    </template>
+                  </el-table-column>
                 </el-table-column>
                 <el-table-column
                   label="闅忚鎴愬姛"
@@ -206,6 +263,7 @@
                   </template>
                 </el-table-column>
                 <el-table-column
+                  v-if="!isTargetHospital"
                   label="闅忚澶辫触"
                   align="center"
                   key="followUpFail"
@@ -272,9 +330,9 @@
                       type="text"
                       @click="handleSeeDetails(scope.row)"
                     >
-                      <span class="button-zx"
-                        >{{ (Number(scope.row.rate) * 100).toFixed(2) }}%</span
-                      >
+                      <span class="button-zx">{{
+                        getTimelyRateText(scope.row)
+                      }}</span>
                     </el-button>
                   </template>
                 </el-table-column>
@@ -476,6 +534,7 @@
             </template>
           </el-table-column>
           <el-table-column
+            v-if="!isTargetHospital"
             label="寰呴殢璁�"
             align="center"
             key="pendingFollowUp"
@@ -496,6 +555,60 @@
                 <span class="button-zx">{{ scope.row.pendingFollowUp }}</span>
               </el-button>
             </template>
+          </el-table-column>
+          <el-table-column
+            v-if="isTargetHospital"
+            label="寰呴殢璁�"
+            align="center"
+          >
+            <el-table-column
+              label="寰呭彂閫�"
+              align="center"
+              key="pendingFollowUpWaitSend"
+              prop="pendingFollowUpWaitSend"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'pendingFollowUpWaitSendInfo',
+                      '寰呭彂閫佸垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.pendingFollowUpWaitSend
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="宸插彂閫�"
+              align="center"
+              key="pendingFollowUpSent"
+              prop="pendingFollowUpSent"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'pendingFollowUpSentInfo',
+                      '宸插彂閫佸垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.pendingFollowUpSent
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
           </el-table-column>
           <el-table-column
             label="闅忚鎴愬姛"
@@ -520,6 +633,7 @@
             </template>
           </el-table-column>
           <el-table-column
+            v-if="!isTargetHospital"
             label="闅忚澶辫触"
             align="center"
             key="followUpFail"
@@ -583,73 +697,39 @@
                 type="text"
                 @click="handleSeeDetails(scope.row)"
               >
-                <span class="button-zx"
-                  >{{ (Number(scope.row.rate) * 100).toFixed(2) }}%</span
-                >
+                <span class="button-zx">{{
+                  getTimelyRateText(scope.row)
+                }}</span>
               </el-button>
             </template>
           </el-table-column>
           <el-table-column
-            v-if="isTargetHospital"
-            label="浜哄伐"
+            v-if="orgname == '缂欎簯鍘夸汉姘戝尰闄�'"
+            label="鍙婃椂闅忚浜烘"
             align="center"
+            key="timelyFollowUp"
+            prop="timelyFollowUp"
+            width="138"
           >
-            <el-table-column
-              label="鍙戦�佸畬鎴�"
-              align="center"
-              key="manual"
-              prop="manual"
-              :render-header="Tooltipfswc"
-            >
-              <template slot-scope="scope">
-                <el-button
-                  size="medium"
-                  type="text"
-                  @click="
-                    handleViewDetails(
-                      scope.row,
-                      'manualInfo',
-                      '鍙戦�佸畬鎴愪汉宸ラ殢璁垮垪琛�'
-                    )
-                  "
-                >
-                  <span class="button-zx">{{ scope.row.manual }}</span>
-                </el-button>
-              </template>
-            </el-table-column>
-            <el-table-column
-              label="鏈�缁堝畬鎴�"
-              align="center"
-              key="manualSuccess"
-              prop="manualSuccess"
-              :render-header="Tooltipzzwc"
-            >
-              <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>
+            <template slot-scope="scope">
+              <el-button
+                size="medium"
+                type="text"
+                @click="
+                  handleViewDetails(
+                    scope.row,
+                    'timelyFollowUpInfo',
+                    '鍙婃椂闅忚鍒楄〃'
+                  )
+                "
+              >
+                <span class="button-zx">{{ scope.row.timelyFollowUp }}</span>
+              </el-button>
+            </template>
           </el-table-column>
-          <el-table-column
-            v-if="isTargetHospital"
-            label="璇煶"
-            align="center"
-          >
+          <el-table-column v-if="isTargetHospital" label="璇煶" align="center">
             <el-table-column
-              label="鍙戦�佸畬鎴�"
+              label="鍙戦�佹暟"
               align="center"
               key="voice"
               prop="voice"
@@ -672,7 +752,7 @@
               </template>
             </el-table-column>
             <el-table-column
-              label="鏈�缁堝畬鎴�"
+              label="鎴愬姛鏁�"
               align="center"
               key="voiceSuccess"
               prop="voiceSuccess"
@@ -690,74 +770,14 @@
                     )
                   "
                 >
-                  <span class="button-zx">{{
-                    scope.row.voiceSuccess
-                  }}</span>
+                  <span class="button-zx">{{ scope.row.voiceSuccess }}</span>
                 </el-button>
               </template>
             </el-table-column>
           </el-table-column>
-          <el-table-column
-            v-if="isTargetHospital"
-            label="鐭俊"
-            align="center"
-          >
+          <el-table-column v-if="isTargetHospital" label="寰俊" align="center">
             <el-table-column
-              label="鍙戦�佸畬鎴�"
-              align="center"
-              key="sms"
-              prop="sms"
-              :render-header="Tooltipfswc"
-            >
-              <template slot-scope="scope">
-                <el-button
-                  size="medium"
-                  type="text"
-                  @click="
-                    handleViewDetails(
-                      scope.row,
-                      'smsInfo',
-                      '鍙戦�佸畬鎴愮煭淇¢殢璁垮垪琛�'
-                    )
-                  "
-                >
-                  <span class="button-zx">{{ scope.row.sms }}</span>
-                </el-button>
-              </template>
-            </el-table-column>
-            <el-table-column
-              label="鏈�缁堝畬鎴�"
-              align="center"
-              key="smsSuccess"
-              prop="smsSuccess"
-              :render-header="Tooltipzzwc"
-            >
-              <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>
-          <el-table-column
-            v-if="isTargetHospital"
-            label="寰俊"
-            align="center"
-          >
-            <el-table-column
-              label="鍙戦�佸畬鎴�"
+              label="鍙戦�佹暟"
               align="center"
               key="weChat"
               prop="weChat"
@@ -780,7 +800,7 @@
               </template>
             </el-table-column>
             <el-table-column
-              label="鏈�缁堝畬鎴�"
+              label="鎴愬姛鏁�"
               align="center"
               key="weChatSuccess"
               prop="weChatSuccess"
@@ -798,13 +818,108 @@
                     )
                   "
                 >
-                  <span class="button-zx">{{
-                    scope.row.weChatSuccess
-                  }}</span>
+                  <span class="button-zx">{{ scope.row.weChatSuccess }}</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="sms"
+              prop="sms"
+              :render-header="Tooltipfswc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'smsInfo',
+                      '鍙戦�佸畬鎴愮煭淇¢殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{ scope.row.sms }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="鎴愬姛鏁�"
+              align="center"
+              key="smsSuccess"
+              prop="smsSuccess"
+              :render-header="Tooltipzzwc"
+            >
+              <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>
+          <el-table-column v-if="isTargetHospital" label="浜哄伐" align="center">
+            <el-table-column
+              label="鍙戦�佹暟"
+              align="center"
+              key="manual"
+              prop="manual"
+              :render-header="Tooltipfswc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'manualInfo',
+                      '鍙戦�佸畬鎴愪汉宸ラ殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{ scope.row.manual }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="鎴愬姛鏁�"
+              align="center"
+              key="manualSuccess"
+              prop="manualSuccess"
+              :render-header="Tooltipzzwc"
+            >
+              <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>
+
           <el-table-column
             v-if="!isTargetHospital"
             label="浜哄伐"
@@ -881,11 +996,9 @@
           </el-table-column>
         </el-table-column>
 
-        <!-- 闅忚鎯呭喌鍒楋紙浠呬附姘村競涓尰闄㈡樉绀猴級 -->
+        <!-- 闅忚鎯呭喌鍒楋紙涓芥按甯備腑鍖婚櫌宸茬Щ鍒扮患鍚堢粺璁★紝姝ゅ浠呮櫙瀹佺暡鏃忚嚜娌诲幙浜烘皯鍖婚櫌鏄剧ず锛� -->
         <el-table-column
-          v-if="
-            orgname == '涓芥按甯備腑鍖婚櫌' || orgname == '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'
-          "
+          v-if="orgname == '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'"
           align="center"
           label="闅忚鎯呭喌"
         >
@@ -1090,8 +1203,8 @@
       const need = Number(needFollowUp) || 0;
       const pending = Number(pendingFollowUp) || 0;
 
-      // 鍒嗘瘝 = 闇�闅忚 - 寰呴殢璁�
-      const denominator = need - pending;
+      // 鐩爣鍖婚櫌锛氭垚鍔熺巼 = 闅忚鎴愬姛 / 闇�闅忚锛涘叾浠栵細闅忚鎴愬姛 / (闇�闅忚 - 寰呴殢璁�)
+      const denominator = this.isTargetHospital ? need : need - pending;
 
       if (denominator <= 0) {
         return "0.00%";
@@ -1099,6 +1212,26 @@
 
       const rate = (success / denominator) * 100;
       return rate.toFixed(2) + "%";
+    },
+    // 璁$畻鍙婃椂鐜囷紙鐩爣鍖婚櫌锛夛細(闇�闅忚 - 浜哄伐瑙勫畾鏃堕棿鍐呮病鎵撹繃鐢佃瘽) / 闇�闅忚
+    calculateTimelyRate(needFollowUp, manualCallTimeout) {
+      const need = Number(needFollowUp) || 0;
+      const timeout = Number(manualCallTimeout) || 0;
+      if (need <= 0) {
+        return "0.00%";
+      }
+      const rate = ((need - timeout) / need) * 100;
+      return (rate < 0 ? 0 : rate).toFixed(2) + "%";
+    },
+    // 鍙婃椂鐜囧睍绀烘枃妗堬細鐩爣鍖婚櫌鍓嶇璁$畻锛屽叾浠栫敤鍚庣 rate 瀛楁
+    getTimelyRateText(row) {
+      if (this.isTargetHospital) {
+        return this.calculateTimelyRate(
+          row.needFollowUp,
+          row.manualCallTimeout
+        );
+      }
+      return (Number(row.rate) * 100).toFixed(2) + "%";
     },
     // 鍦ㄧ粺璁℃眹鎬绘柟娉曚腑澶勭悊鎴愬姛鐜�
     getSummaries(param) {
@@ -1129,17 +1262,51 @@
             return sum + (Number(item.pendingFollowUp) || 0);
           }, 0);
 
-          const denominator = totalNeed - totalPending;
+          const denominator = this.isTargetHospital
+            ? totalNeed
+            : totalNeed - totalPending;
 
           if (denominator > 0) {
             sums[index] = ((totalSuccess / denominator) * 100).toFixed(2) + "%";
           } else {
             sums[index] = "0.00%";
           }
-        } else if (
-          column.property === "followUpRate" ||
-          column.property === "rate"
-        ) {
+        } else if (column.property === "rate") {
+          if (this.isTargetHospital) {
+            const totalNeed = data.reduce(
+              (sum, item) => sum + (Number(item.needFollowUp) || 0),
+              0
+            );
+            const totalTimeout = data.reduce(
+              (sum, item) => sum + (Number(item.manualCallTimeout) || 0),
+              0
+            );
+            sums[index] = this.calculateTimelyRate(totalNeed, totalTimeout);
+          } else {
+            const percentageValues = data
+              .map((item) => {
+                const value = item[column.property];
+                if (!value || value === "-" || value === "0%") return null;
+                if (typeof value === "string" && value.includes("%")) {
+                  const numValue = parseFloat(value.replace("%", "")) / 100;
+                  return isNaN(numValue) ? null : numValue;
+                } else {
+                  const numValue = parseFloat(value);
+                  return isNaN(numValue) ? null : numValue;
+                }
+              })
+              .filter((value) => value !== null && value !== 0);
+
+            if (percentageValues.length > 0) {
+              const average =
+                percentageValues.reduce((sum, value) => sum + value, 0) /
+                percentageValues.length;
+              sums[index] = (average * 100).toFixed(2) + "%";
+            } else {
+              sums[index] = "0.00%";
+            }
+          }
+        } else if (column.property === "followUpRate") {
           const percentageValues = data
             .map((item) => {
               const value = item[column.property];
@@ -1185,7 +1352,9 @@
         "el-tooltip",
         {
           props: {
-            content: "闅忚鎴愬姛/(闇�闅忚-寰呴殢璁�)",
+            content: this.isTargetHospital
+              ? "闅忚鎴愬姛/闇�闅忚"
+              : "闅忚鎴愬姛/(闇�闅忚-寰呴殢璁�)",
             placement: "top",
             effect: "dark",
           },
@@ -1198,8 +1367,9 @@
         "el-tooltip",
         {
           props: {
-            content:
-              "(鍑洪櫌鏃堕棿+浠诲姟鍛ㄦ湡)灏忎簬瀹屾垚鏃堕棿鍗充负瓒呮椂;(闇�闅忚-瓒呮椂)/闇�闅忚",
+            content: this.isTargetHospital
+              ? "鍙婃椂鐜�=(闇�闅忚-浜哄伐瑙勫畾鏃堕棿鍐呮病鎵撹繃鐢佃瘽)/闇�闅忚"
+              : "(鍑洪櫌鏃堕棿+浠诲姟鍛ㄦ湡)灏忎簬瀹屾垚鏃堕棿鍗充负瓒呮椂;(闇�闅忚-瓒呮椂)/闇�闅忚",
             placement: "top",
             effect: "dark",
           },
@@ -1275,17 +1445,51 @@
             return sum + (Number(item.pendingFollowUp) || 0);
           }, 0);
 
-          const denominator = totalNeed - totalPending;
+          const denominator = this.isTargetHospital
+            ? totalNeed
+            : totalNeed - totalPending;
 
           if (denominator > 0) {
             sums[index] = ((totalSuccess / denominator) * 100).toFixed(2) + "%";
           } else {
             sums[index] = "0.00%";
           }
-        } else if (
-          column.property === "followUpRate" ||
-          column.property === "rate"
-        ) {
+        } else if (column.property === "rate") {
+          if (this.isTargetHospital) {
+            const totalNeed = data.reduce(
+              (sum, item) => sum + (Number(item.needFollowUp) || 0),
+              0
+            );
+            const totalTimeout = data.reduce(
+              (sum, item) => sum + (Number(item.manualCallTimeout) || 0),
+              0
+            );
+            sums[index] = this.calculateTimelyRate(totalNeed, totalTimeout);
+          } else {
+            const percentageValues = data
+              .map((item) => {
+                const value = item[column.property];
+                if (!value || value === "-" || value === "0%") return null;
+                if (typeof value === "string" && value.includes("%")) {
+                  const numValue = parseFloat(value.replace("%", "")) / 100;
+                  return isNaN(numValue) ? null : numValue;
+                } else {
+                  const numValue = parseFloat(value);
+                  return isNaN(numValue) ? null : numValue;
+                }
+              })
+              .filter((value) => value !== null && value !== 0);
+
+            if (percentageValues.length > 0) {
+              const average =
+                percentageValues.reduce((sum, value) => sum + value, 0) /
+                percentageValues.length;
+              sums[index] = (average * 100).toFixed(2) + "%";
+            } else {
+              sums[index] = "0.00%";
+            }
+          }
+        } else if (column.property === "followUpRate") {
           const percentageValues = data
             .map((item) => {
               const value = item[column.property];
@@ -1629,13 +1833,12 @@
         },
       };
 
-      // 鏍囬
-      worksheet.mergeCells(1, 1, 1, 10);
-      worksheet.getCell(1, 1).value = `${areaName}鍖荤敓闅忚鍒楄〃`;
-      worksheet.getCell(1, 1).style = titleStyle;
-      worksheet.getRow(1).height = 30;
+      const graded = this.isTargetHospital;
+      // 鎴愬姛鐜囷細鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄笉灞曠ず锛涘強鏃剁巼锛氫附姘村競涓尰闄笉灞曠ず
+      const showSuccessRate = this.orgname != "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�";
+      const showTimelyRate = this.orgname != "涓芥按甯備腑鍖婚櫌";
 
-      // 琛ㄥご
+      // 鍒楀畾涔夛紙涓庡睍寮�鐨勫尰鐢熷瓙琛ㄤ繚鎸佷竴鑷达級
       const headers = [
         "鍖荤敓濮撳悕",
         "绉戝",
@@ -1643,13 +1846,26 @@
         "鏃犻渶闅忚",
         "搴旈殢璁�",
         "闇�闅忚",
-        "寰呴殢璁�",
+        ...(graded ? ["寰呭彂閫�", "宸插彂閫�"] : ["寰呴殢璁�"]),
         "闅忚鎴愬姛",
-        "闅忚澶辫触",
-        "鎴愬姛鐜�", // 鏂板
-        "闅忚鐜�", // 鍘熸潵鍦ㄦ垚鍔熺巼浣嶇疆
+        ...(graded ? [] : ["闅忚澶辫触"]),
+        ...(showSuccessRate ? ["鎴愬姛鐜�"] : []),
+        "闅忚鐜�",
+        ...(showTimelyRate ? ["鍙婃椂鐜�"] : []),
+        "浜哄伐",
+        "璇煶",
+        "鐭俊",
+        "寰俊",
       ];
+      const totalCols = headers.length;
 
+      // 鏍囬
+      worksheet.mergeCells(1, 1, 1, totalCols);
+      worksheet.getCell(1, 1).value = `${areaName}鍖荤敓闅忚鍒楄〃`;
+      worksheet.getCell(1, 1).style = titleStyle;
+      worksheet.getRow(1).height = 30;
+
+      // 琛ㄥご
       const headerRow = worksheet.addRow(headers);
       headerRow.eachCell((cell) => {
         cell.style = headerStyle;
@@ -1665,15 +1881,26 @@
           item.nonFollowUp,
           item.followUpNeeded,
           item.needFollowUp,
-          item.pendingFollowUp,
+          ...(graded
+            ? [item.pendingFollowUpWaitSend || 0, item.pendingFollowUpSent || 0]
+            : [item.pendingFollowUp || 0]),
           item.followUpSuccess,
-          item.followUpFail,
-          this.calculateSuccessRate(
-            item.followUpSuccess,
-            item.needFollowUp,
-            item.pendingFollowUp
-          ),
+          ...(graded ? [] : [item.followUpFail || 0]),
+          ...(showSuccessRate
+            ? [
+                this.calculateSuccessRate(
+                  item.followUpSuccess,
+                  item.needFollowUp,
+                  item.pendingFollowUp
+                ),
+              ]
+            : []),
           item.followUpRate,
+          ...(showTimelyRate ? [this.getTimelyRateText(item)] : []),
+          item.manual || 0,
+          item.voice || 0,
+          item.sms || 0,
+          item.weChat || 0,
         ]);
         row.eachCell((cell) => {
           cell.style = cellStyle;
@@ -1691,58 +1918,66 @@
         };
       });
 
-      // 鍒楀
-      worksheet.columns = [
-        { width: 15 },
-        { width: 15 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 }, // 鎴愬姛鐜�
-        { width: 12 }, // 闅忚鐜�
-      ];
+      // 鍒楀锛堝墠涓ゅ垪濮撳悕/绉戝杈冨锛屽叾浣欑粺涓�锛�
+      const widths = [15, 15];
+      headers.slice(2).forEach(() => widths.push(12));
+      worksheet.columns = widths.map((width) => ({ width }));
     },
     getDoctorExportSummary(data) {
-      const sums = ["灏忚"];
+      const graded = this.isTargetHospital;
+      const showSuccessRate = this.orgname != "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�";
+      const showTimelyRate = this.orgname != "涓芥按甯備腑鍖婚櫌";
 
-      const keys = [
-        "dischargeCount",
-        "nonFollowUp",
-        "followUpNeeded",
-        "needFollowUp",
-        "pendingFollowUp",
-        "followUpSuccess",
-        "followUpFail",
-      ];
+      const sums = ["灏忚", "-"];
+
+      // 鏁板�煎垪姹傚拰
+      const keys = graded
+        ? [
+            "dischargeCount",
+            "nonFollowUp",
+            "followUpNeeded",
+            "needFollowUp",
+            "pendingFollowUpWaitSend",
+            "pendingFollowUpSent",
+            "followUpSuccess",
+          ]
+        : [
+            "dischargeCount",
+            "nonFollowUp",
+            "followUpNeeded",
+            "needFollowUp",
+            "pendingFollowUp",
+            "followUpSuccess",
+            "followUpFail",
+          ];
 
       keys.forEach((key) => {
         sums.push(data.reduce((t, r) => t + (Number(r[key]) || 0), 0));
       });
 
       // 鎴愬姛鐜囷紙骞冲潎鍊硷級
-      const successRates = data
-        .map((item) => {
-          const success = Number(item.followUpSuccess) || 0;
-          const need = Number(item.needFollowUp) || 0;
-          const pending = Number(item.pendingFollowUp) || 0;
-          const denominator = need - pending;
-          if (denominator <= 0) return 0;
-          return success / denominator;
-        })
-        .filter((rate) => !isNaN(rate));
+      if (showSuccessRate) {
+        const successRates = data
+          .map((item) => {
+            const success = Number(item.followUpSuccess) || 0;
+            const need = Number(item.needFollowUp) || 0;
+            const pending = Number(item.pendingFollowUp) || 0;
+            const denominator = graded ? need : need - pending;
+            if (denominator <= 0) return 0;
+            return success / denominator;
+          })
+          .filter((rate) => !isNaN(rate));
 
-      sums.push(
-        successRates.length
-          ? (
-              (successRates.reduce((a, b) => a + b, 0) / successRates.length) *
-              100
-            ).toFixed(2) + "%"
-          : "0.00%"
-      );
+        sums.push(
+          successRates.length
+            ? (
+                (successRates.reduce((a, b) => a + b, 0) /
+                  successRates.length) *
+                100
+              ).toFixed(2) + "%"
+            : "0.00%"
+        );
+      }
 
       // 闅忚鐜囷紙骞冲潎鍊硷級
       const followUpRates = data
@@ -1758,6 +1993,38 @@
             ).toFixed(2) + "%"
           : "0.00%"
       );
+
+      // 鍙婃椂鐜囷紙鐩爣鍖婚櫌璁$畻锛屽叾浠栧彇 rate 骞冲潎锛�
+      if (showTimelyRate) {
+        if (graded) {
+          const totalNeed = data.reduce(
+            (s, r) => s + (Number(r.needFollowUp) || 0),
+            0
+          );
+          const totalTimeout = data.reduce(
+            (s, r) => s + (Number(r.manualCallTimeout) || 0),
+            0
+          );
+          sums.push(this.calculateTimelyRate(totalNeed, totalTimeout));
+        } else {
+          const rateValues = data
+            .map((i) => this.extractPercentageValue(i.rate))
+            .filter(Boolean);
+          sums.push(
+            rateValues.length
+              ? (
+                  (rateValues.reduce((a, b) => a + b, 0) / rateValues.length) *
+                  100
+                ).toFixed(2) + "%"
+              : "0.00%"
+          );
+        }
+      }
+
+      // 浜哄伐/璇煶/鐭俊/寰俊
+      ["manual", "voice", "sms", "weChat"].forEach((key) => {
+        sums.push(data.reduce((t, r) => t + (Number(r[key]) || 0), 0));
+      });
 
       return sums;
     },
@@ -1835,7 +2102,7 @@
           right: { style: "thin", color: { argb: "FFD0D0D0" } },
         },
       };
-      // 鏄惁涓虹洰鏍囧尰闄紙浜哄伐/璇煶/鐭俊/寰俊 鎸� 鍙戦�佸畬鎴�/鏈�缁堝畬鎴� 鍒嗙骇灞曠ず锛�
+      // 鏄惁涓虹洰鏍囧尰闄紙浜哄伐/璇煶/鐭俊/寰俊 鎸� 鍙戦�佹暟/鎴愬姛鏁� 鍒嗙骇灞曠ず锛�
       const graded = this.isTargetHospital;
 
       const baseHeaders = [
@@ -1846,15 +2113,25 @@
         "鏃犻渶闅忚浜烘",
         "搴旈殢璁夸汉娆�",
       ];
-      const coreHeaders = [
-        "闇�闅忚",
-        "寰呴殢璁�",
-        "闅忚鎴愬姛",
-        "闅忚澶辫触",
-        "鎴愬姛鐜�",
-        "闅忚鐜�",
-        "鍙婃椂鐜�",
-      ];
+      const coreHeaders = this.isTargetHospital
+        ? [
+            "闇�闅忚",
+            "寰呭彂閫�",
+            "宸插彂閫�",
+            "闅忚鎴愬姛",
+            "鎴愬姛鐜�",
+            "闅忚鐜�",
+            "鍙婃椂鐜�",
+          ]
+        : [
+            "闇�闅忚",
+            "寰呴殢璁�",
+            "闅忚鎴愬姛",
+            "闅忚澶辫触",
+            "鎴愬姛鐜�",
+            "闅忚鐜�",
+            "鍙婃椂鐜�",
+          ];
       const methodGroups = this.getMethodColumns();
 
       const baseCount = baseHeaders.length; // 6
@@ -1890,14 +2167,37 @@
         worksheet.getCell(2, coreStartCol).value = serviceTypeName;
         worksheet.getCell(2, coreStartCol).style = headerStyle;
 
-        // 绗�3琛岋細闅忚鏍稿績鍒楃旱鍚戝悎骞� + 闅忚鏂瑰紡鍒嗙粍妯悜鍚堝苟
-        for (let k = 0; k < coreCount; k++) {
-          const col = coreStartCol + k;
+        // 绗�3琛岋細闅忚鏍稿績鍒楋紙鐩爣鍖婚櫌鈥滃緟闅忚鈥濅笅宓屽鈥滃緟鍙戦��/宸插彂閫佲�濓級
+        worksheet.mergeCells(3, coreStartCol, headerEndRow, coreStartCol);
+        worksheet.getCell(3, coreStartCol).value = "闇�闅忚";
+        worksheet.getCell(3, coreStartCol).style = headerStyle;
+
+        worksheet.mergeCells(3, coreStartCol + 1, 3, coreStartCol + 2);
+        worksheet.getCell(3, coreStartCol + 1).value = "寰呴殢璁�";
+        worksheet.getCell(3, coreStartCol + 1).style = headerStyle;
+
+        worksheet.mergeCells(
+          3,
+          coreStartCol + 3,
+          headerEndRow,
+          coreStartCol + 3
+        );
+        worksheet.getCell(3, coreStartCol + 3).value = "闅忚鎴愬姛";
+        worksheet.getCell(3, coreStartCol + 3).style = headerStyle;
+
+        ["鎴愬姛鐜�", "闅忚鐜�", "鍙婃椂鐜�"].forEach((label, i) => {
+          const col = coreStartCol + 4 + i;
           worksheet.mergeCells(3, col, headerEndRow, col);
-          const cell = worksheet.getCell(3, col);
-          cell.value = coreHeaders[k];
-          cell.style = headerStyle;
-        }
+          worksheet.getCell(3, col).value = label;
+          worksheet.getCell(3, col).style = headerStyle;
+        });
+
+        // 绗�4琛岋細寰呭彂閫�/宸插彂閫� 瀛愬垪
+        worksheet.getCell(4, coreStartCol + 1).value = "寰呭彂閫�";
+        worksheet.getCell(4, coreStartCol + 1).style = headerStyle;
+        worksheet.getCell(4, coreStartCol + 2).value = "宸插彂閫�";
+        worksheet.getCell(4, coreStartCol + 2).style = headerStyle;
+
         let mc = methodStartCol;
         methodGroups.forEach((g) => {
           if (g.fields.length > 1) {
@@ -1909,7 +2209,7 @@
           mc += g.fields.length;
         });
 
-        // 绗�4琛岋細闅忚鏂瑰紡瀛愬垪锛堝彂閫佸畬鎴�/鏈�缁堝畬鎴愶級
+        // 绗�4琛岋細闅忚鏂瑰紡瀛愬垪锛堝彂閫佹暟/鎴愬姛鏁帮級
         mc = methodStartCol;
         methodGroups.forEach((g) => {
           g.fields.forEach((field, idx) => {
@@ -1966,9 +2266,13 @@
           item.nonFollowUp || 0,
           item.followUpNeeded || 0,
           item.needFollowUp || 0,
-          item.pendingFollowUp || 0,
+          // 寰呴殢璁匡細鐩爣鍖婚櫌鎷嗕负寰呭彂閫�/宸插彂閫侊紝鍏朵粬鐢ㄥ緟闅忚
+          ...(this.isTargetHospital
+            ? [item.pendingFollowUpWaitSend || 0, item.pendingFollowUpSent || 0]
+            : [item.pendingFollowUp || 0]),
           item.followUpSuccess || 0,
-          item.followUpFail || 0,
+          // 闅忚澶辫触锛氱洰鏍囧尰闄笉鏄剧ず
+          ...(this.isTargetHospital ? [] : [item.followUpFail || 0]),
           // 鎴愬姛鐜� - 闇�瑕佸姩鎬佽绠�
           this.calculateSuccessRate(
             item.followUpSuccess,
@@ -1976,7 +2280,7 @@
             item.pendingFollowUp
           ),
           item.followUpRate || "0%", // 闅忚鐜�
-          item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%", // 鍙婃椂鐜�
+          this.getTimelyRateText(item), // 鍙婃椂鐜�
         ];
         methodGroups.forEach((g) => {
           g.fields.forEach((field) => {
@@ -2010,13 +2314,29 @@
       worksheet.columns = widths.map((width) => ({ width }));
     },
     getMethodColumns() {
-      // 闅忚鏂瑰紡鍒楅厤缃細鐩爣鍖婚櫌鎸夆�滃彂閫佸畬鎴�/鏈�缁堝畬鎴愨�濆垎绾у睍绀�
+      // 闅忚鏂瑰紡鍒楅厤缃細鐩爣鍖婚櫌鎸夆�滃彂閫佹暟/鎴愬姛鏁扳�濆垎绾у睍绀�
       if (this.isTargetHospital) {
         return [
-          { label: "浜哄伐", fields: ["manual", "manualSuccess"], sub: ["鍙戦�佸畬鎴�", "鏈�缁堝畬鎴�"] },
-          { label: "璇煶", fields: ["voice", "voiceSuccess"], sub: ["鍙戦�佸畬鎴�", "鏈�缁堝畬鎴�"] },
-          { label: "鐭俊", fields: ["sms", "smsSuccess"], sub: ["鍙戦�佸畬鎴�", "鏈�缁堝畬鎴�"] },
-          { label: "寰俊", fields: ["weChat", "weChatSuccess"], sub: ["鍙戦�佸畬鎴�", "鏈�缁堝畬鎴�"] },
+          {
+            label: "浜哄伐",
+            fields: ["manual", "manualSuccess"],
+            sub: ["鍙戦�佹暟", "鎴愬姛鏁�"],
+          },
+          {
+            label: "璇煶",
+            fields: ["voice", "voiceSuccess"],
+            sub: ["鍙戦�佹暟", "鎴愬姛鏁�"],
+          },
+          {
+            label: "鐭俊",
+            fields: ["sms", "smsSuccess"],
+            sub: ["鍙戦�佹暟", "鎴愬姛鏁�"],
+          },
+          {
+            label: "寰俊",
+            fields: ["weChat", "weChatSuccess"],
+            sub: ["鍙戦�佹暟", "鎴愬姛鏁�"],
+          },
         ];
       }
       return [
@@ -2036,9 +2356,9 @@
         0, // 4: nonFollowUp
         0, // 5: followUpNeeded
         0, // 6: needFollowUp
-        0, // 7: pendingFollowUp
-        0, // 8: followUpSuccess
-        0, // 9: followUpFail
+        0, // 7: 寰呭彂閫�/寰呴殢璁�
+        0, // 8: 宸插彂閫�/闅忚鎴愬姛
+        0, // 9: 闅忚鎴愬姛/闅忚澶辫触
         "0%", // 10: 鎴愬姛鐜�
         "0%", // 11: 闅忚鐜�
         "0%", // 12: 鍙婃椂鐜�
@@ -2056,19 +2376,27 @@
         summaries[4] += Number(item.nonFollowUp) || 0;
         summaries[5] += Number(item.followUpNeeded) || 0;
         summaries[6] += Number(item.needFollowUp) || 0;
-        summaries[7] += Number(item.pendingFollowUp) || 0;
-        summaries[8] += Number(item.followUpSuccess) || 0;
-        summaries[9] += Number(item.followUpFail) || 0;
+        if (this.isTargetHospital) {
+          summaries[7] += Number(item.pendingFollowUpWaitSend) || 0;
+          summaries[8] += Number(item.pendingFollowUpSent) || 0;
+          summaries[9] += Number(item.followUpSuccess) || 0;
+        } else {
+          summaries[7] += Number(item.pendingFollowUp) || 0;
+          summaries[8] += Number(item.followUpSuccess) || 0;
+          summaries[9] += Number(item.followUpFail) || 0;
+        }
         methodFields.forEach((field, i) => {
           summaries[methodStartIndex + i] += Number(item[field]) || 0;
         });
       });
 
-      // 鎴愬姛鐜囪绠�
-      const totalSuccess = summaries[8]; // followUpSuccess鐨勬�诲拰
+      // 鎴愬姛鐜囪绠楋細闅忚鎴愬姛 / 闇�闅忚锛堢洰鏍囧尰闄級锛屽惁鍒� 闅忚鎴愬姛 / (闇�闅忚-寰呴殢璁�)
+      const totalSuccess = this.isTargetHospital ? summaries[9] : summaries[8];
       const totalNeed = summaries[6]; // needFollowUp鐨勬�诲拰
-      const totalPending = summaries[7]; // pendingFollowUp鐨勬�诲拰
-      const denominator = totalNeed - totalPending;
+      const totalPending = summaries[7]; // 寰呭彂閫�/寰呴殢璁跨殑鎬诲拰
+      const denominator = this.isTargetHospital
+        ? totalNeed
+        : totalNeed - totalPending;
 
       if (denominator > 0) {
         summaries[10] = ((totalSuccess / denominator) * 100).toFixed(2) + "%";
@@ -2088,15 +2416,23 @@
         summaries[11] = (avgFollowUpRate * 100).toFixed(2) + "%";
       }
 
-      // 鍙婃椂鐜囪绠�
-      const rateValues = this.tableData
-        .map((item) => this.extractPercentageValue(item.rate))
-        .filter((value) => value !== null);
+      // 鍙婃椂鐜囪绠楋細鐩爣鍖婚櫌 (闇�闅忚-浜哄伐瓒呮椂)/闇�闅忚锛屽叾浠栧彇鍚庣 rate 骞冲潎
+      if (this.isTargetHospital) {
+        const totalTimeout = this.tableData.reduce(
+          (sum, item) => sum + (Number(item.manualCallTimeout) || 0),
+          0
+        );
+        summaries[12] = this.calculateTimelyRate(totalNeed, totalTimeout);
+      } else {
+        const rateValues = this.tableData
+          .map((item) => this.extractPercentageValue(item.rate))
+          .filter((value) => value !== null);
 
-      if (rateValues.length > 0) {
-        const avgRate =
-          rateValues.reduce((sum, val) => sum + val, 0) / rateValues.length;
-        summaries[12] = (avgRate * 100).toFixed(2) + "%";
+        if (rateValues.length > 0) {
+          const avgRate =
+            rateValues.reduce((sum, val) => sum + val, 0) / rateValues.length;
+          summaries[12] = (avgRate * 100).toFixed(2) + "%";
+        }
       }
 
       // 鏍煎紡鍖栨暟瀛�
@@ -2137,14 +2473,14 @@
       }
       // 鍑洪櫌鏃堕棿鑼冨洿
       if (queryParams.hospitalEndTime) {
-        this.patientqueryParams.hospitalStartTime =
+        this.patientqueryParams.startOutHospTime =
           queryParams.hospitalStartTime;
-        this.patientqueryParams.hospitalEndTime = queryParams.hospitalEndTime;
+        this.patientqueryParams.endOutHospTime = queryParams.hospitalEndTime;
       } else {
-        this.patientqueryParams.hospitalStartTime = this.parseTime(
+        this.patientqueryParams.startOutHospTime = this.parseTime(
           queryParams.dateRangecy[0]
         );
-        this.patientqueryParams.hospitalEndTime = this.parseTime(
+        this.patientqueryParams.endOutHospTime = this.parseTime(
           queryParams.dateRangecy[1]
         );
       }
diff --git a/src/views/sfstatistics/percentage/components/SecondFollowUp.vue b/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
index f49c5f4..e675bef 100644
--- a/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
@@ -154,6 +154,7 @@
                   </template>
                 </el-table-column>
                 <el-table-column
+                  v-if="!isTargetHospital"
                   label="寰呴殢璁�"
                   align="center"
                   key="pendingFollowUpAgain"
@@ -177,6 +178,62 @@
                       }}</span>
                     </el-button>
                   </template>
+                </el-table-column>
+                <el-table-column
+                  v-if="isTargetHospital"
+                  label="寰呴殢璁�"
+                  align="center"
+                >
+                  <el-table-column
+                    label="寰呭彂閫�"
+                    align="center"
+                    key="pendingFollowUpWaitSendAgain"
+                    prop="pendingFollowUpWaitSendAgain"
+                  >
+                    <template slot-scope="scope">
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="
+                          handleViewDetails(
+                            scope.row,
+                            'pendingFollowUpWaitSendAgainInfo',
+                            '寰呭彂閫佸垪琛�',
+                            '1'
+                          )
+                        "
+                      >
+                        <span class="button-zx">{{
+                          scope.row.pendingFollowUpWaitSendAgain
+                        }}</span>
+                      </el-button>
+                    </template>
+                  </el-table-column>
+                  <el-table-column
+                    label="宸插彂閫�"
+                    align="center"
+                    key="pendingFollowUpSentAgain"
+                    prop="pendingFollowUpSentAgain"
+                  >
+                    <template slot-scope="scope">
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="
+                          handleViewDetails(
+                            scope.row,
+                            'pendingFollowUpSentAgainInfo',
+                            '宸插彂閫佸垪琛�',
+                            '1'
+                          )
+                        "
+                      >
+                        <span class="button-zx">{{
+                          scope.row.pendingFollowUpSentAgain
+                        }}</span>
+                      </el-button>
+                    </template>
+                  </el-table-column>
                 </el-table-column>
                 <el-table-column
                   label="闅忚鎴愬姛"
@@ -204,6 +261,7 @@
                   </template>
                 </el-table-column>
                 <el-table-column
+                  v-if="!isTargetHospital"
                   label="闅忚澶辫触"
                   align="center"
                   key="followUpFailAgain"
@@ -457,6 +515,7 @@
             </template>
           </el-table-column>
           <el-table-column
+            v-if="!isTargetHospital"
             label="寰呴殢璁�"
             align="center"
             key="pendingFollowUpAgain"
@@ -479,6 +538,60 @@
                 }}</span>
               </el-button>
             </template>
+          </el-table-column>
+          <el-table-column
+            v-if="isTargetHospital"
+            label="寰呴殢璁�"
+            align="center"
+          >
+            <el-table-column
+              label="寰呭彂閫�"
+              align="center"
+              key="pendingFollowUpWaitSendAgain"
+              prop="pendingFollowUpWaitSendAgain"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'pendingFollowUpWaitSendAgainInfo',
+                      '鍐嶆闅忚寰呭彂閫佸垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.pendingFollowUpWaitSendAgain
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="宸插彂閫�"
+              align="center"
+              key="pendingFollowUpSentAgain"
+              prop="pendingFollowUpSentAgain"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'pendingFollowUpSentAgainInfo',
+                      '鍐嶆闅忚宸插彂閫佸垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{
+                    scope.row.pendingFollowUpSentAgain
+                  }}</span>
+                </el-button>
+              </template>
+            </el-table-column>
           </el-table-column>
           <el-table-column
             label="闅忚鎴愬姛"
@@ -505,6 +618,7 @@
             </template>
           </el-table-column>
           <el-table-column
+            v-if="!isTargetHospital"
             label="闅忚澶辫触"
             align="center"
             key="followUpFailAgain"
@@ -553,67 +667,40 @@
             prop="followUpRateAgain"
             :render-header="Tooltipsfl"
           />
+
           <el-table-column
-            v-if="isTargetHospital"
-            label="浜哄伐"
+            v-if="orgname == '缂欎簯鍘夸汉姘戝尰闄�'"
+            label="澶嶈瘖澶嶆煡鏁伴噺"
             align="center"
+            key="suggest7CountAgain"
+            prop="suggest7CountAgain"
           >
-            <el-table-column
-              label="鍙戦�佸畬鎴�"
-              align="center"
-              key="manualAgain"
-              prop="manualAgain"
-              :render-header="Tooltipfswc"
-            >
-              <template slot-scope="scope">
-                <el-button
-                  size="medium"
-                  type="text"
-                  @click="
-                    handleViewDetails(
-                      scope.row,
-                      'manualAgainInfo',
-                      '鍙戦�佸畬鎴愪汉宸ラ殢璁垮垪琛�'
-                    )
-                  "
-                >
-                  <span class="button-zx">{{ scope.row.manualAgain }}</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>
+            <template slot-scope="scope">
+              <el-button
+                size="medium"
+                type="text"
+                @click="
+                  handleViewDetails(
+                    scope.row,
+                    'suggest7CountAgainInfo',
+                    '鍐嶆闅忚澶嶈瘖澶嶆煡鍒楄〃'
+                  )
+                "
+              >
+                <span class="button-zx">{{
+                  scope.row.suggest7CountAgain
+                }}</span>
+              </el-button>
+            </template>
           </el-table-column>
+
           <el-table-column
             v-if="isTargetHospital"
             label="璇煶"
             align="center"
           >
             <el-table-column
-              label="鍙戦�佸畬鎴�"
+              label="鍙戦�佹暟"
               align="center"
               key="voiceAgain"
               prop="voiceAgain"
@@ -636,7 +723,7 @@
               </template>
             </el-table-column>
             <el-table-column
-              label="鏈�缁堝畬鎴�"
+              label="鎴愬姛鏁�"
               align="center"
               key="voiceAgainSuccess"
               prop="voiceAgainSuccess"
@@ -661,13 +748,67 @@
               </template>
             </el-table-column>
           </el-table-column>
+                  <el-table-column
+            v-if="isTargetHospital"
+            label="寰俊"
+            align="center"
+          >
+            <el-table-column
+              label="鍙戦�佹暟"
+              align="center"
+              key="weChatAgain"
+              prop="weChatAgain"
+              :render-header="Tooltipfswc"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="
+                    handleViewDetails(
+                      scope.row,
+                      'weChatAgainInfo',
+                      '鍙戦�佸畬鎴愬井淇¢殢璁垮垪琛�'
+                    )
+                  "
+                >
+                  <span class="button-zx">{{ scope.row.weChatAgain }}</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"
           >
             <el-table-column
-              label="鍙戦�佸畬鎴�"
+              label="鍙戦�佹暟"
               align="center"
               key="smsAgain"
               prop="smsAgain"
@@ -690,7 +831,7 @@
               </template>
             </el-table-column>
             <el-table-column
-              label="鏈�缁堝畬鎴�"
+              label="鎴愬姛鏁�"
               align="center"
               key="smsAgainSuccess"
               prop="smsAgainSuccess"
@@ -715,16 +856,17 @@
               </template>
             </el-table-column>
           </el-table-column>
-          <el-table-column
+
+                    <el-table-column
             v-if="isTargetHospital"
-            label="寰俊"
+            label="浜哄伐"
             align="center"
           >
             <el-table-column
-              label="鍙戦�佸畬鎴�"
+              label="鍙戦�佹暟"
               align="center"
-              key="weChatAgain"
-              prop="weChatAgain"
+              key="manualAgain"
+              prop="manualAgain"
               :render-header="Tooltipfswc"
             >
               <template slot-scope="scope">
@@ -734,20 +876,20 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'weChatAgainInfo',
-                      '鍙戦�佸畬鎴愬井淇¢殢璁垮垪琛�'
+                      'manualAgainInfo',
+                      '鍙戦�佸畬鎴愪汉宸ラ殢璁垮垪琛�'
                     )
                   "
                 >
-                  <span class="button-zx">{{ scope.row.weChatAgain }}</span>
+                  <span class="button-zx">{{ scope.row.manualAgain }}</span>
                 </el-button>
               </template>
             </el-table-column>
             <el-table-column
-              label="鏈�缁堝畬鎴�"
+              label="鎴愬姛鏁�"
               align="center"
-              key="weChatAgainSuccess"
-              prop="weChatAgainSuccess"
+              key="manualAgainSuccess"
+              prop="manualAgainSuccess"
               :render-header="Tooltipzzwc"
             >
               <template slot-scope="scope">
@@ -757,13 +899,13 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'wechatAgainSuccessInfo',
-                      '鏈�缁堝畬鎴愬井淇¢殢璁垮垪琛�'
+                      'manualAgainSuccessInfo',
+                      '鏈�缁堝畬鎴愪汉宸ラ殢璁垮垪琛�'
                     )
                   "
                 >
                   <span class="button-zx">{{
-                    scope.row.weChatAgainSuccess
+                    scope.row.manualAgainSuccess
                   }}</span>
                 </el-button>
               </template>
@@ -946,7 +1088,9 @@
         "el-tooltip",
         {
           props: {
-            content: "闅忚鎴愬姛/(闇�闅忚-寰呴殢璁�)",
+            content: this.isTargetHospital
+              ? "闅忚鎴愬姛/闇�闅忚"
+              : "闅忚鎴愬姛/(闇�闅忚-寰呴殢璁�)",
             placement: "top",
             effect: "dark",
           },
@@ -1103,7 +1247,7 @@
             return sum + (Number(item.pendingFollowUpAgain) || 0);
           }, 0);
 
-          const denominator = totalNeed - totalPending;
+          const denominator = this.isTargetHospital ? totalNeed : totalNeed - totalPending;
 
           if (denominator > 0) {
             sums[index] = ((totalSuccess / denominator) * 100).toFixed(2) + "%";
@@ -1181,7 +1325,7 @@
             return sum + (Number(item.pendingFollowUpAgain) || 0);
           }, 0);
 
-          const denominator = totalNeed - totalPending;
+          const denominator = this.isTargetHospital ? totalNeed : totalNeed - totalPending;
 
           if (denominator > 0) {
             sums[index] = ((totalSuccess / denominator) * 100).toFixed(2) + "%";
@@ -1312,8 +1456,8 @@
       const need = Number(needFollowUp) || 0;
       const pending = Number(pendingFollowUp) || 0;
 
-      // 鍒嗘瘝 = 闇�闅忚 - 寰呴殢璁�
-      const denominator = need - pending;
+      // 鍒嗘瘝 = 闇�闅忚锛堢洰鏍囧尰闄級/ 闇�闅忚 - 寰呴殢璁匡紙鍏朵粬锛�
+      const denominator = this.isTargetHospital ? need : need - pending;
 
       if (denominator <= 0) {
         return "0.00%";
@@ -1535,13 +1679,11 @@
         },
       };
 
-      // 鏍囬
-      worksheet.mergeCells(1, 1, 1, 10);
-      worksheet.getCell(1, 1).value = `${areaName}鍖荤敓鍐嶆闅忚鍒楄〃`;
-      worksheet.getCell(1, 1).style = titleStyle;
-      worksheet.getRow(1).height = 30;
+      const graded = this.isTargetHospital;
+      // 鎴愬姛鐜囷細鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄笉灞曠ず
+      const showSuccessRate = this.orgname != "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�";
 
-      // 琛ㄥご
+      // 鍒楀畾涔夛紙涓庡睍寮�鐨勫尰鐢熷瓙琛ㄤ繚鎸佷竴鑷达級
       const headers = [
         "鍖荤敓濮撳悕",
         "绉戝",
@@ -1549,13 +1691,25 @@
         "鏃犻渶闅忚",
         "搴旈殢璁�",
         "闇�闅忚",
-        "寰呴殢璁�",
+        ...(graded ? ["寰呭彂閫�", "宸插彂閫�"] : ["寰呴殢璁�"]),
         "闅忚鎴愬姛",
-        "闅忚澶辫触",
-        "鎴愬姛鐜�", // 鏂板
-        "闅忚鐜�", // 鍘熸潵鍦ㄦ垚鍔熺巼浣嶇疆
+        ...(graded ? [] : ["闅忚澶辫触"]),
+        ...(showSuccessRate ? ["鎴愬姛鐜�"] : []),
+        "闅忚鐜�",
+        "浜哄伐",
+        "璇煶",
+        "鐭俊",
+        "寰俊",
       ];
+      const totalCols = headers.length;
 
+      // 鏍囬
+      worksheet.mergeCells(1, 1, 1, totalCols);
+      worksheet.getCell(1, 1).value = `${areaName}鍖荤敓鍐嶆闅忚鍒楄〃`;
+      worksheet.getCell(1, 1).style = titleStyle;
+      worksheet.getRow(1).height = 30;
+
+      // 琛ㄥご
       const headerRow = worksheet.addRow(headers);
       headerRow.eachCell((cell) => {
         cell.style = headerStyle;
@@ -1571,15 +1725,28 @@
           item.nonFollowUp,
           item.followUpNeeded,
           item.needFollowUpAgain,
-          item.pendingFollowUpAgain,
+          ...(graded
+            ? [
+                item.pendingFollowUpWaitSendAgain || 0,
+                item.pendingFollowUpSentAgain || 0,
+              ]
+            : [item.pendingFollowUpAgain || 0]),
           item.followUpSuccessAgain,
-          item.followUpFailAgain,
-          this.calculateSuccessRate(
-            item.followUpSuccessAgain,
-            item.needFollowUpAgain,
-            item.pendingFollowUpAgain
-          ),
+          ...(graded ? [] : [item.followUpFailAgain || 0]),
+          ...(showSuccessRate
+            ? [
+                this.calculateSuccessRate(
+                  item.followUpSuccessAgain,
+                  item.needFollowUpAgain,
+                  item.pendingFollowUpAgain
+                ),
+              ]
+            : []),
           item.followUpRateAgain,
+          item.manualAgain || 0,
+          item.voiceAgain || 0,
+          item.smsAgain || 0,
+          item.weChatAgain || 0,
         ]);
         row.eachCell((cell) => {
           cell.style = cellStyle;
@@ -1599,33 +1766,28 @@
         };
       });
 
-      // 鍒楀
-      worksheet.columns = [
-        { width: 15 },
-        { width: 15 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 },
-        { width: 12 }, // 鎴愬姛鐜�
-        { width: 12 }, // 闅忚鐜�
-      ];
+      // 鍒楀锛堝墠涓ゅ垪濮撳悕/绉戝杈冨锛屽叾浣欑粺涓�锛�
+      const widths = [15, 15];
+      headers.slice(2).forEach(() => widths.push(12));
+      worksheet.columns = widths.map((width) => ({ width }));
     },
     /** 鍐嶆闅忚 - 鍖荤敓瀛愯〃瀵煎嚭灏忚 */
     getDoctorAgainExportSummary(data) {
-      const sums = ["灏忚"];
+      const graded = this.isTargetHospital;
+      const showSuccessRate = this.orgname != "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�";
+
+      const sums = ["灏忚", "-"];
 
       const keys = [
         "dischargeCount",
         "nonFollowUp",
         "followUpNeeded",
         "needFollowUpAgain",
-        "pendingFollowUpAgain",
+        ...(graded
+          ? ["pendingFollowUpWaitSendAgain", "pendingFollowUpSentAgain"]
+          : ["pendingFollowUpAgain"]),
         "followUpSuccessAgain",
-        "followUpFailAgain",
+        ...(graded ? [] : ["followUpFailAgain"]),
       ];
 
       keys.forEach((key) => {
@@ -1633,25 +1795,28 @@
       });
 
       // 鎴愬姛鐜囷紙骞冲潎鍊硷級
-      const successRates = data
-        .map((item) => {
-          const success = Number(item.followUpSuccessAgain) || 0;
-          const need = Number(item.needFollowUpAgain) || 0;
-          const pending = Number(item.pendingFollowUpAgain) || 0;
-          const denominator = need - pending;
-          if (denominator <= 0) return 0;
-          return success / denominator;
-        })
-        .filter((rate) => !isNaN(rate));
+      if (showSuccessRate) {
+        const successRates = data
+          .map((item) => {
+            const success = Number(item.followUpSuccessAgain) || 0;
+            const need = Number(item.needFollowUpAgain) || 0;
+            const pending = Number(item.pendingFollowUpAgain) || 0;
+            const denominator = graded ? need : need - pending;
+            if (denominator <= 0) return 0;
+            return success / denominator;
+          })
+          .filter((rate) => !isNaN(rate));
 
-      sums.push(
-        successRates.length
-          ? (
-              (successRates.reduce((a, b) => a + b, 0) / successRates.length) *
-              100
-            ).toFixed(2) + "%"
-          : "0.00%"
-      );
+        sums.push(
+          successRates.length
+            ? (
+                (successRates.reduce((a, b) => a + b, 0) /
+                  successRates.length) *
+                100
+              ).toFixed(2) + "%"
+            : "0.00%"
+        );
+      }
 
       // 闅忚鐜囷紙骞冲潎鍊硷級
       const followUpRates = data
@@ -1666,6 +1831,13 @@
               100
             ).toFixed(2) + "%"
           : "0.00%"
+      );
+
+      // 浜哄伐/璇煶/鐭俊/寰俊
+      ["manualAgain", "voiceAgain", "smsAgain", "weChatAgain"].forEach(
+        (key) => {
+          sums.push(data.reduce((t, r) => t + (Number(r[key]) || 0), 0));
+        }
       );
 
       return sums;
@@ -1745,7 +1917,7 @@
         },
       };
 
-      // 鏄惁涓虹洰鏍囧尰闄紙浜哄伐/璇煶/鐭俊/寰俊 鎸� 鍙戦�佸畬鎴�/鏈�缁堝畬鎴� 鍒嗙骇灞曠ず锛�
+      // 鏄惁涓虹洰鏍囧尰闄紙浜哄伐/璇煶/鐭俊/寰俊 鎸� 鍙戦�佹暟/鎴愬姛鏁� 鍒嗙骇灞曠ず锛�
       const graded = this.isTargetHospital;
 
       const baseHeaders = [
@@ -1758,9 +1930,9 @@
       ];
       const coreHeaders = [
         "闇�闅忚",
-        "寰呴殢璁�",
+        ...(this.isTargetHospital ? ["寰呭彂閫�", "宸插彂閫�"] : ["寰呴殢璁�"]),
         "闅忚鎴愬姛",
-        "闅忚澶辫触",
+        ...(this.isTargetHospital ? [] : ["闅忚澶辫触"]),
         "鎴愬姛鐜�",
         "闅忚鐜�",
       ];
@@ -1799,14 +1971,37 @@
         worksheet.getCell(2, coreStartCol).value = "鍐嶆鍑洪櫌闅忚";
         worksheet.getCell(2, coreStartCol).style = headerStyle;
 
-        // 绗�3琛岋細闅忚鏍稿績鍒楃旱鍚戝悎骞� + 闅忚鏂瑰紡鍒嗙粍妯悜鍚堝苟
-        for (let k = 0; k < coreCount; k++) {
-          const col = coreStartCol + k;
+        // 绗�3琛岋細闅忚鏍稿績鍒楋紙鐩爣鍖婚櫌鈥滃緟闅忚鈥濅笅宓屽鈥滃緟鍙戦��/宸插彂閫佲�濓級
+        worksheet.mergeCells(3, coreStartCol, headerEndRow, coreStartCol);
+        worksheet.getCell(3, coreStartCol).value = "闇�闅忚";
+        worksheet.getCell(3, coreStartCol).style = headerStyle;
+
+        worksheet.mergeCells(3, coreStartCol + 1, 3, coreStartCol + 2);
+        worksheet.getCell(3, coreStartCol + 1).value = "寰呴殢璁�";
+        worksheet.getCell(3, coreStartCol + 1).style = headerStyle;
+
+        worksheet.mergeCells(
+          3,
+          coreStartCol + 3,
+          headerEndRow,
+          coreStartCol + 3
+        );
+        worksheet.getCell(3, coreStartCol + 3).value = "闅忚鎴愬姛";
+        worksheet.getCell(3, coreStartCol + 3).style = headerStyle;
+
+        ["鎴愬姛鐜�", "闅忚鐜�"].forEach((label, i) => {
+          const col = coreStartCol + 4 + i;
           worksheet.mergeCells(3, col, headerEndRow, col);
-          const cell = worksheet.getCell(3, col);
-          cell.value = coreHeaders[k];
-          cell.style = headerStyle;
-        }
+          worksheet.getCell(3, col).value = label;
+          worksheet.getCell(3, col).style = headerStyle;
+        });
+
+        // 绗�4琛岋細寰呭彂閫�/宸插彂閫� 瀛愬垪
+        worksheet.getCell(4, coreStartCol + 1).value = "寰呭彂閫�";
+        worksheet.getCell(4, coreStartCol + 1).style = headerStyle;
+        worksheet.getCell(4, coreStartCol + 2).value = "宸插彂閫�";
+        worksheet.getCell(4, coreStartCol + 2).style = headerStyle;
+
         let mc = methodStartCol;
         methodGroups.forEach((g) => {
           if (g.fields.length > 1) {
@@ -1818,7 +2013,7 @@
           mc += g.fields.length;
         });
 
-        // 绗�4琛岋細闅忚鏂瑰紡瀛愬垪锛堝彂閫佸畬鎴�/鏈�缁堝畬鎴愶級
+        // 绗�4琛岋細闅忚鏂瑰紡瀛愬垪锛堝彂閫佹暟/鎴愬姛鏁帮級
         mc = methodStartCol;
         methodGroups.forEach((g) => {
           g.fields.forEach((field, idx) => {
@@ -1875,9 +2070,14 @@
           item.nonFollowUp || 0,
           item.followUpNeeded || 0,
           item.needFollowUpAgain || 0,
-          item.pendingFollowUpAgain || 0,
+          ...(this.isTargetHospital
+            ? [
+                item.pendingFollowUpWaitSendAgain || 0,
+                item.pendingFollowUpSentAgain || 0,
+              ]
+            : [item.pendingFollowUpAgain || 0]),
           item.followUpSuccessAgain || 0,
-          item.followUpFailAgain || 0,
+          ...(this.isTargetHospital ? [] : [item.followUpFailAgain || 0]),
           // 鎴愬姛鐜� - 闇�瑕佸姩鎬佽绠�
           this.calculateSuccessRate(
             item.followUpSuccessAgain,
@@ -1918,13 +2118,13 @@
       worksheet.columns = widths.map((width) => ({ width }));
     },
     getMethodColumns() {
-      // 闅忚鏂瑰紡鍒楅厤缃細鐩爣鍖婚櫌鎸夆�滃彂閫佸畬鎴�/鏈�缁堝畬鎴愨�濆垎绾у睍绀�
+      // 闅忚鏂瑰紡鍒楅厤缃細鐩爣鍖婚櫌鎸夆�滃彂閫佹暟/鎴愬姛鏁扳�濆垎绾у睍绀�
       if (this.isTargetHospital) {
         return [
-          { label: "浜哄伐", fields: ["manualAgain", "manualAgainSuccess"], sub: ["鍙戦�佸畬鎴�", "鏈�缁堝畬鎴�"] },
-          { label: "璇煶", fields: ["voiceAgain", "voiceAgainSuccess"], sub: ["鍙戦�佸畬鎴�", "鏈�缁堝畬鎴�"] },
-          { label: "鐭俊", fields: ["smsAgain", "smsAgainSuccess"], sub: ["鍙戦�佸畬鎴�", "鏈�缁堝畬鎴�"] },
-          { label: "寰俊", fields: ["weChatAgain", "weChatAgainSuccess"], sub: ["鍙戦�佸畬鎴�", "鏈�缁堝畬鎴�"] },
+          { label: "浜哄伐", fields: ["manualAgain", "manualAgainSuccess"], sub: ["鍙戦�佹暟", "鎴愬姛鏁�"] },
+          { label: "璇煶", fields: ["voiceAgain", "voiceAgainSuccess"], sub: ["鍙戦�佹暟", "鎴愬姛鏁�"] },
+          { label: "鐭俊", fields: ["smsAgain", "smsAgainSuccess"], sub: ["鍙戦�佹暟", "鎴愬姛鏁�"] },
+          { label: "寰俊", fields: ["weChatAgain", "weChatAgainSuccess"], sub: ["鍙戦�佹暟", "鎴愬姛鏁�"] },
         ];
       }
       return [
@@ -1936,20 +2136,35 @@
     },
 
     getExportSummaries() {
-      const summaries = [
-        "鍚堣",
-        "/",
-        "/",
-        0, // 3: dischargeCount
-        0, // 4: nonFollowUp
-        0, // 5: followUpNeeded
-        0, // 6: needFollowUpAgain
-        0, // 7: pendingFollowUpAgain
-        0, // 8: followUpSuccessAgain
-        0, // 9: followUpFailAgain
-        "0%", // 10: 鎴愬姛鐜�
-        "0%", // 11: 闅忚鐜�
-      ];
+      const summaries = this.isTargetHospital
+        ? [
+            "鍚堣",
+            "/",
+            "/",
+            0, // 3: dischargeCount
+            0, // 4: nonFollowUp
+            0, // 5: followUpNeeded
+            0, // 6: needFollowUpAgain
+            0, // 7: pendingFollowUpWaitSendAgain
+            0, // 8: pendingFollowUpSentAgain
+            0, // 9: followUpSuccessAgain
+            "0%", // 10: 鎴愬姛鐜�
+            "0%", // 11: 闅忚鐜�
+          ]
+        : [
+            "鍚堣",
+            "/",
+            "/",
+            0, // 3: dischargeCount
+            0, // 4: nonFollowUp
+            0, // 5: followUpNeeded
+            0, // 6: needFollowUpAgain
+            0, // 7: pendingFollowUpAgain
+            0, // 8: followUpSuccessAgain
+            0, // 9: followUpFailAgain
+            "0%", // 10: 鎴愬姛鐜�
+            "0%", // 11: 闅忚鐜�
+          ];
 
       const methodFields = this.getMethodColumns().reduce(
         (arr, g) => arr.concat(g.fields),
@@ -1963,19 +2178,28 @@
         summaries[4] += Number(item.nonFollowUp) || 0;
         summaries[5] += Number(item.followUpNeeded) || 0;
         summaries[6] += Number(item.needFollowUpAgain) || 0;
-        summaries[7] += Number(item.pendingFollowUpAgain) || 0;
-        summaries[8] += Number(item.followUpSuccessAgain) || 0;
-        summaries[9] += Number(item.followUpFailAgain) || 0;
+        if (this.isTargetHospital) {
+          summaries[7] += Number(item.pendingFollowUpWaitSendAgain) || 0;
+          summaries[8] += Number(item.pendingFollowUpSentAgain) || 0;
+          summaries[9] += Number(item.followUpSuccessAgain) || 0;
+        } else {
+          summaries[7] += Number(item.pendingFollowUpAgain) || 0;
+          summaries[8] += Number(item.followUpSuccessAgain) || 0;
+          summaries[9] += Number(item.followUpFailAgain) || 0;
+        }
         methodFields.forEach((field, i) => {
           summaries[methodStartIndex + i] += Number(item[field]) || 0;
         });
       });
 
       // 鎴愬姛鐜囪绠�
-      const totalSuccess = summaries[8]; // followUpSuccessAgain鐨勬�诲拰
+      const totalSuccess = this.isTargetHospital
+        ? summaries[9] // followUpSuccessAgain鐨勬�诲拰
+        : summaries[8]; // followUpSuccessAgain鐨勬�诲拰
       const totalNeed = summaries[6]; // needFollowUpAgain鐨勬�诲拰
-      const totalPending = summaries[7]; // pendingFollowUpAgain鐨勬�诲拰
-      const denominator = totalNeed - totalPending;
+      const denominator = this.isTargetHospital
+        ? totalNeed
+        : totalNeed - summaries[7];
 
       if (denominator > 0) {
         summaries[10] = ((totalSuccess / denominator) * 100).toFixed(2) + "%";
diff --git a/src/views/sfstatistics/percentage/index copy.vue b/src/views/sfstatistics/percentage/index copy.vue
deleted file mode 100644
index 9917362..0000000
--- a/src/views/sfstatistics/percentage/index copy.vue
+++ /dev/null
@@ -1,3708 +0,0 @@
-<template>
-  <div class="Questionnairemanagement">
-    <div class="leftvlue">
-      <div class="leftvlue-bg">
-        <el-row :gutter="20">
-          <!--鏍囩鏁版嵁-->
-          <el-col :span="24" :xs="24">
-            <el-form
-              :model="queryParams"
-              ref="queryForm"
-              size="small"
-              :inline="true"
-              v-show="showSearch"
-              label-width="98px"
-            >
-              <el-form-item label="缁熻绫诲瀷" prop="userName">
-                <el-select
-                  v-model="queryParams.statisticaltype"
-                  placeholder="璇烽�夋嫨缁熻绫诲瀷"
-                >
-                  <el-option
-                    v-for="item in Statisticallist"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-                <el-select
-                  style="margin-left: 10px"
-                  v-if="queryParams.statisticaltype == 1"
-                  v-model="queryParams.leavehospitaldistrictcodes"
-                  size="medium"
-                  multiple
-                  filterable
-                  placeholder="璇烽�夋嫨鐥呭尯"
-                >
-                  <el-option
-                    v-for="item in flatArrayhospit"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-                <el-select
-                  v-else-if="queryParams.statisticaltype == 2"
-                  v-model="queryParams.deptcodes"
-                  size="medium"
-                  multiple
-                  filterable
-                  placeholder="璇烽�夋嫨绉戝"
-                >
-                  <el-option
-                    v-for="item in flatArraydept"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-
-              <el-form-item label="鏈嶅姟绫诲瀷" prop="userName">
-                <el-select
-                  v-model="queryParams.serviceType"
-                  multiple
-                  placeholder="璇烽�夋嫨"
-                >
-                  <el-option
-                    v-for="item in options"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item
-                label-width="200"
-                label="搴旈殢璁挎椂闂磋寖鍥�"
-                prop="userName"
-              >
-                <el-date-picker
-                  v-model="queryParams.dateRange"
-                  value-format="yyyy-MM-dd HH:mm:ss"
-                  type="daterange"
-                  range-separator="鑷�"
-                  start-placeholder="寮�濮嬫棩鏈�"
-                  end-placeholder="缁撴潫鏃ユ湡"
-                  :default-time="['00:00:00', '23:59:59']"
-                >
-                </el-date-picker>
-              </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-button
-                type="warning"
-                plain
-                icon="el-icon-download"
-                size="medium"
-                @click="exportTable"
-                >瀵煎嚭</el-button
-              >
-              <el-button
-                type="primary"
-                plain
-                icon="el-icon-data-line"
-                size="medium"
-                @click="showChartDialog"
-                >缁熻瓒嬪娍鍥�</el-button
-              >
-            </el-form>
-
-            <!-- 鏂板锛歍ab鏍囩椤� -->
-            <el-tabs v-model="activeTab" @tab-click="handleTabClick">
-              <el-tab-pane label="棣栨闅忚" name="first">
-                <div class="your-table-container">
-                  <el-table
-                    ref="exportTable"
-                    id="exportTableid"
-                    v-loading="loading"
-                    :data="firstFollowUpList"
-                    :border="true"
-                    @selection-change="handleSelectionChange"
-                    @expand-change="handleRowClick"
-                    :row-key="getRowKey"
-                    show-summary
-                    :summary-method="getSummaries"
-                    :expand-row-keys="expands"
-                  >
-                    <!-- 灞曞紑琛岀澶村垪 -->
-                    <el-table-column type="expand">
-                      <template slot-scope="props">
-                        <el-table
-                          :data="props.row.doctorStats"
-                          border
-                          style="width: 95%; margin: 0 auto"
-                          class="inner-table"
-                          show-summary
-                          :summary-method="getInnerSummaries"
-                        >
-                          <el-table-column
-                            label="鍖荤敓濮撳悕"
-                            prop="drname"
-                            align="center"
-                          />
-                          <el-table-column
-                            label="绉戝"
-                            width="120"
-                            prop="deptname"
-                            align="center"
-                          />
-                          <el-table-column
-                            label="鍑洪櫌浜烘"
-                            prop="dischargeCount"
-                            align="center"
-                          />
-                          <el-table-column
-                            label="鍑洪櫌浜烘"
-                            align="center"
-                            key="dischargeCount"
-                            prop="dischargeCount"
-                          >
-                          </el-table-column>
-
-                          <el-table-column
-                            label="鏃犻渶闅忚浜烘"
-                            align="center"
-                            width="100"
-                            key="nonFollowUp"
-                            prop="nonFollowUp"
-                          >
-                          </el-table-column>
-                          <el-table-column
-                            label="搴旈殢璁夸汉娆�"
-                            align="center"
-                            width="100"
-                            key="followUpNeeded"
-                            prop="followUpNeeded"
-                          >
-                          </el-table-column>
-                          <el-table-column align="center" label="棣栨鍑洪櫌闅忚">
-                            <el-table-column
-                              label="闇�闅忚"
-                              align="center"
-                              key="needFollowUp"
-                              prop="needFollowUp"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="寰呴殢璁�"
-                              align="center"
-                              key="pendingFollowUp"
-                              prop="pendingFollowUp"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="闅忚鎴愬姛"
-                              align="center"
-                              key="followUpSuccess"
-                              prop="followUpSuccess"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="闅忚澶辫触"
-                              align="center"
-                              key="followUpFail"
-                              prop="followUpFail"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="闅忚鐜�"
-                              align="center"
-                              width="120"
-                              key="followUpRate"
-                              prop="followUpRate"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              v-if="orgname != '涓芥按甯備腑鍖婚櫌'"
-                              label="鍙婃椂鐜�"
-                              align="center"
-                              width="120"
-                              key="rate"
-                              prop="rate"
-                            >
-                              <template slot-scope="scope">
-                                <el-button
-                                  size="medium"
-                                  type="text"
-                                  @click="Seedetails(scope.row)"
-                                  ><span class="button-zx"
-                                    >{{
-                                      (Number(scope.row.rate) * 100).toFixed(2)
-                                    }}%</span
-                                  ></el-button
-                                >
-                              </template>
-                            </el-table-column>
-                            <el-table-column
-                              label="浜哄伐"
-                              align="center"
-                              key="manual"
-                              prop="manual"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="鐭俊"
-                              align="center"
-                              key="sms"
-                              prop="sms"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="寰俊"
-                              align="center"
-                              key="weChat"
-                              prop="weChat"
-                            >
-                            </el-table-column>
-                          </el-table-column>
-                        </el-table>
-                      </template>
-                    </el-table-column>
-                    <el-table-column
-                      label="鍑洪櫌鐥呭尯"
-                      align="center"
-                      sortable
-                      key="leavehospitaldistrictname"
-                      prop="leavehospitaldistrictname"
-                      width="150"
-                      :show-overflow-tooltip="true"
-                      :sort-method="sortChineseNumber"
-                    />
-                    <el-table-column
-                      label="绉戝"
-                      align="center"
-                      key="deptname"
-                      prop="deptname"
-                      :show-overflow-tooltip="true"
-                    />
-                    <el-table-column
-                      label="鍑洪櫌浜烘"
-                      align="center"
-                      key="dischargeCount"
-                      prop="dischargeCount"
-                    >
-                    </el-table-column>
-
-                    <el-table-column
-                      label="鏃犻渶闅忚浜烘"
-                      align="center"
-                      width="100"
-                      key="nonFollowUp"
-                      prop="nonFollowUp"
-                    >
-                    </el-table-column>
-                    <el-table-column
-                      label="搴旈殢璁夸汉娆�"
-                      align="center"
-                      width="100"
-                      key="followUpNeeded"
-                      prop="followUpNeeded"
-                    >
-                    </el-table-column>
-                    <el-table-column align="center" label="棣栨鍑洪櫌闅忚">
-                      <el-table-column
-                        label="闇�闅忚"
-                        align="center"
-                        key="needFollowUp"
-                        prop="needFollowUp"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.needFollowUpInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '闇�闅忚鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.needFollowUp
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="寰呴殢璁�"
-                        align="center"
-                        key="pendingFollowUp"
-                        prop="pendingFollowUp"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.pendingFollowUpInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '寰呴殢璁垮垪琛�'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.pendingFollowUp
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="闅忚鎴愬姛"
-                        align="center"
-                        key="followUpSuccess"
-                        prop="followUpSuccess"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.followUpSuccessInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '闅忚鎴愬姛鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.followUpSuccess
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="闅忚澶辫触"
-                        align="center"
-                        key="followUpFail"
-                        prop="followUpFail"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.followUpFailInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '闅忚澶辫触鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.followUpFail
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="闅忚鐜�"
-                        align="center"
-                        width="120"
-                        key="followUpRate"
-                        prop="followUpRate"
-                      >
-                      </el-table-column>
-                      <el-table-column
-                        v-if="orgname != '涓芥按甯備腑鍖婚櫌'"
-                        label="鍙婃椂鐜�"
-                        align="center"
-                        width="120"
-                        key="rate"
-                        prop="rate"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="Seedetails(scope.row)"
-                            ><span class="button-zx"
-                              >{{
-                                (Number(scope.row.rate) * 100).toFixed(2)
-                              }}%</span
-                            ></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="浜哄伐"
-                        align="center"
-                        key="manual"
-                        prop="manual"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.manualInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '浜哄伐闅忚鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.manual
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="鐭俊"
-                        align="center"
-                        key="sms"
-                        prop="sms"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.smsInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '鐭俊闅忚鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.sms
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="寰俊"
-                        align="center"
-                        key="weChat"
-                        prop="weChat"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.weChatInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '寰俊闅忚鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.weChat
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                    </el-table-column>
-
-                    <!-- 闅忚鎯呭喌鍒楋紙浠呬附姘村競涓尰闄㈡樉绀猴級 -->
-                    <el-table-column
-                      v-if="
-                        orgname == '涓芥按甯備腑鍖婚櫌' ||
-                        orgname == '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'
-                      "
-                      align="center"
-                      label="闅忚鎯呭喌"
-                    >
-                      <el-table-column
-                        label="姝e父璇煶"
-                        align="center"
-                        width="100"
-                        key="taskSituation1"
-                        prop="taskSituation1"
-                      >
-                      </el-table-column
-                      ><el-table-column
-                        label="鎮h�呮嫆鎺ユ垨鎷掕"
-                        align="center"
-                        width="100"
-                        key="taskSituation2"
-                        prop="taskSituation2"
-                      >
-                      </el-table-column
-                      ><el-table-column
-                        label="闈㈣鎴栬�呮帴璇�"
-                        align="center"
-                        width="100"
-                        key="taskSituation3"
-                        prop="taskSituation3"
-                      >
-                      </el-table-column
-                      ><el-table-column
-                        label="寰俊闅忚"
-                        align="center"
-                        width="100"
-                        key="taskSituation4"
-                        prop="taskSituation4"
-                      >
-                      </el-table-column
-                      ><el-table-column
-                        label="闅忚鐢佃瘽涓嶆纭�"
-                        align="center"
-                        width="100"
-                        key="taskSituation5"
-                        prop="taskSituation5"
-                      >
-                      </el-table-column
-                      ><el-table-column
-                        label="鍏朵粬鎯呭喌涓嶅疁闅忚"
-                        align="center"
-                        width="100"
-                        key="taskSituation6"
-                        prop="taskSituation6"
-                      >
-                      </el-table-column>
-                    </el-table-column>
-                  </el-table>
-                </div>
-              </el-tab-pane>
-
-              <el-tab-pane label="鍐嶆闅忚" name="second">
-                <div class="your-table-container">
-                  <el-table
-                    ref="exportTableSecond"
-                    id="exportTableidSecond"
-                    v-loading="loadingSecond"
-                    :data="secondFollowUpList"
-                    :border="true"
-                    @selection-change="handleSelectionChangeSecond"
-                    @expand-change="handleRowClickSecond"
-                    :row-key="getRowKey"
-                    show-summary
-                    :summary-method="getSummariesSecond"
-                    :expand-row-keys="expandsSecond"
-                  >
-                    <!-- 灞曞紑琛岀澶村垪 -->
-                    <el-table-column type="expand">
-                      <template slot-scope="props">
-                        <el-table
-                          :data="props.row.doctorStats"
-                          border
-                          style="width: 95%; margin: 0 auto"
-                          class="inner-table"
-                          show-summary
-                          :summary-method="getInnerSummariesSecond"
-                        >
-                          <el-table-column
-                            label="鍖荤敓濮撳悕"
-                            prop="drname"
-                            align="center"
-                          />
-                          <el-table-column
-                            label="绉戝"
-                            width="120"
-                            prop="deptname"
-                            align="center"
-                          />
-                          <el-table-column
-                            label="鍑洪櫌浜烘"
-                            prop="dischargeCount"
-                            align="center"
-                          />
-                          <el-table-column
-                            label="鍑洪櫌浜烘"
-                            align="center"
-                            key="dischargeCount"
-                            prop="dischargeCount"
-                          >
-                          </el-table-column>
-
-                          <el-table-column
-                            label="鏃犻渶闅忚浜烘"
-                            align="center"
-                            width="100"
-                            key="nonFollowUp"
-                            prop="nonFollowUp"
-                          >
-                          </el-table-column>
-                          <el-table-column
-                            label="搴旈殢璁夸汉娆�"
-                            align="center"
-                            width="100"
-                            key="followUpNeeded"
-                            prop="followUpNeeded"
-                          >
-                          </el-table-column>
-                          <el-table-column align="center" label="鍐嶆鍑洪櫌闅忚">
-                            <el-table-column
-                              label="闇�闅忚"
-                              align="center"
-                              key="needFollowUpAgain"
-                              prop="needFollowUpAgain"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="寰呴殢璁�"
-                              align="center"
-                              key="pendingFollowUpAgain"
-                              prop="pendingFollowUpAgain"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="闅忚鎴愬姛"
-                              align="center"
-                              key="followUpSuccessAgain"
-                              prop="followUpSuccessAgain"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="闅忚澶辫触"
-                              align="center"
-                              key="followUpFailAgain"
-                              prop="followUpFailAgain"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="闅忚鐜�"
-                              align="center"
-                              width="120"
-                              key="followUpRateAgain"
-                              prop="followUpRateAgain"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="浜哄伐"
-                              align="center"
-                              key="manualAgain"
-                              prop="manualAgain"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="鐭俊"
-                              align="center"
-                              key="smsAgain"
-                              prop="smsAgain"
-                            >
-                            </el-table-column>
-                            <el-table-column
-                              label="寰俊"
-                              align="center"
-                              key="weChatAgain"
-                              prop="weChatAgain"
-                            >
-                            </el-table-column>
-                          </el-table-column>
-                        </el-table>
-                      </template>
-                    </el-table-column>
-                    <el-table-column
-                      label="鍑洪櫌鐥呭尯"
-                      align="center"
-                      sortable
-                      key="leavehospitaldistrictname"
-                      prop="leavehospitaldistrictname"
-                      width="150"
-                      :show-overflow-tooltip="true"
-                      :sort-method="sortChineseNumber"
-                    />
-                    <el-table-column
-                      label="绉戝"
-                      align="center"
-                      key="deptname"
-                      prop="deptname"
-                      :show-overflow-tooltip="true"
-                    />
-                    <el-table-column
-                      label="鍑洪櫌浜烘"
-                      align="center"
-                      key="dischargeCount"
-                      prop="dischargeCount"
-                    >
-                    </el-table-column>
-
-                    <el-table-column
-                      label="鏃犻渶闅忚浜烘"
-                      align="center"
-                      width="100"
-                      key="nonFollowUp"
-                      prop="nonFollowUp"
-                    >
-                    </el-table-column>
-                    <el-table-column
-                      label="搴旈殢璁夸汉娆�"
-                      align="center"
-                      width="100"
-                      key="followUpNeeded"
-                      prop="followUpNeeded"
-                    >
-                    </el-table-column>
-                    <el-table-column align="center" label="鍐嶆鍑洪櫌闅忚">
-                      <el-table-column
-                        label="闇�闅忚"
-                        align="center"
-                        key="needFollowUpAgain"
-                        prop="needFollowUpAgain"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.needFollowUpAgainInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '鍐嶆闅忚闇�闅忚鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.needFollowUpAgain
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="寰呴殢璁�"
-                        align="center"
-                        key="pendingFollowUpAgain"
-                        prop="pendingFollowUpAgain"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.pendingFollowUpAgainInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '鍐嶆闅忚寰呴殢璁垮垪琛�'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.pendingFollowUpAgain
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="闅忚鎴愬姛"
-                        align="center"
-                        key="followUpSuccessAgain"
-                        prop="followUpSuccessAgain"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.followUpSuccessAgainInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '鍐嶆闅忚闅忚鎴愬姛鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.followUpSuccessAgain
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="闅忚澶辫触"
-                        align="center"
-                        key="followUpFailAgain"
-                        prop="followUpFailAgain"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.followUpFailAgainInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '鍐嶆闅忚闅忚澶辫触鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.followUpFailAgain
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="闅忚鐜�"
-                        align="center"
-                        width="120"
-                        key="followUpRateAgain"
-                        prop="followUpRateAgain"
-                      >
-                      </el-table-column>
-                      <el-table-column
-                        label="浜哄伐"
-                        align="center"
-                        key="manualAgain"
-                        prop="manualAgain"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.manualAgainInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '鍐嶆闅忚浜哄伐闅忚鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.manualAgain
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="鐭俊"
-                        align="center"
-                        key="smsAgain"
-                        prop="smsAgain"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.smsAgainInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '鍐嶆闅忚鐭俊闅忚鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.smsAgain
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                      <el-table-column
-                        label="寰俊"
-                        align="center"
-                        key="weChatAgain"
-                        prop="weChatAgain"
-                      >
-                        <template slot-scope="scope">
-                          <el-button
-                            size="medium"
-                            type="text"
-                            @click="
-                              viewDetails(
-                                scope.row.weChatAgainInfo,
-                                scope.row.leavehospitaldistrictname +
-                                  '鍐嶆闅忚寰俊闅忚鍒楄〃'
-                              )
-                            "
-                            ><span class="button-zx">{{
-                              scope.row.weChatAgain
-                            }}</span></el-button
-                          >
-                        </template>
-                      </el-table-column>
-                    </el-table-column>
-                  </el-table>
-                </div>
-              </el-tab-pane>
-            </el-tabs>
-          </el-col>
-        </el-row>
-      </div>
-    </div>
-    <!-- 缁熻瓒嬪娍鍥惧脊绐� -->
-    <el-dialog
-      title="闅忚缁熻瓒嬪娍鍥�"
-      :visible.sync="chartDialogVisible"
-      width="80%"
-      :close-on-click-modal="false"
-    >
-      <div class="chart-container">
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <div class="chart-title">闅忚鐘舵�佸垎甯�</div>
-            <div id="pieChart" style="width: 100%; height: 400px"></div>
-          </el-col>
-          <el-col :span="12">
-            <div class="chart-title">闅忚瓒嬪娍鍒嗘瀽</div>
-            <div id="barLineChart" style="width: 100%; height: 400px"></div>
-          </el-col>
-        </el-row>
-      </div>
-    </el-dialog>
-    <el-dialog
-      title="鏈強鏃堕殢璁挎偅鑰呮湇鍔�"
-      :visible.sync="SeedetailsVisible"
-      v-loading="Seedloading"
-      width="70%"
-      :close-on-click-modal="false"
-    >
-      <div class="examine-jic">
-        <div class="jic-value">
-          <el-row :gutter="20">
-            <!--鐢ㄦ埛鏁版嵁-->
-            <el-form
-              :model="patientqueryParams"
-              ref="queryForm"
-              size="small"
-              :inline="true"
-              label-width="98px"
-            >
-              <el-form-item label="鎮h�咃細">
-                <el-input
-                  v-model="patientqueryParams.name"
-                  @keyup.enter.native="handleQuery"
-                ></el-input>
-              </el-form-item>
-              <el-form-item label="鎮h�呰瘖鏂細">
-                <el-input
-                  v-model="patientqueryParams.leavediagname"
-                  @keyup.enter.native="handleQuery"
-                ></el-input>
-              </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>
-            <!-- 閫夋嫨鎮h�呭垪琛� -->
-            <el-table :data="logsheetlist" style="width: 100%">
-              <el-table-column
-                prop="sendname"
-                align="center"
-                label="濮撳悕"
-                width="100"
-              >
-              </el-table-column>
-              <el-table-column
-                prop="taskName"
-                align="center"
-                width="200"
-                show-overflow-tooltip
-                label="浠诲姟鍚嶇О"
-              >
-              </el-table-column>
-              <el-table-column
-                prop="sendstate"
-                align="center"
-                width="200"
-                label="浠诲姟鐘舵��"
-              >
-                <template slot-scope="scope">
-                  <div v-if="scope.row.sendstate == 1">
-                    <el-tag type="primary" :disable-transitions="false"
-                      >琛ㄥ崟宸查鍙�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 2">
-                    <el-tag type="primary" :disable-transitions="false"
-                      >寰呴殢璁�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 3">
-                    <el-tag type="success" :disable-transitions="false"
-                      >琛ㄥ崟宸插彂閫�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 4">
-                    <el-tag type="info" :disable-transitions="false"
-                      >涓嶆墽琛�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 5">
-                    <el-tag type="danger" :disable-transitions="false"
-                      >鍙戦�佸け璐�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 6">
-                    <el-tag type="success" :disable-transitions="false"
-                      >宸插畬鎴�</el-tag
-                    >
-                  </div>
-                </template>
-              </el-table-column>
-              <el-table-column
-                prop="visitTime"
-                align="center"
-                label="搴旈殢璁挎椂闂�"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-              <el-table-column
-                prop="finishtime"
-                align="center"
-                label="闅忚瀹屾垚鏃堕棿"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-              <el-table-column
-                label="鍑洪櫌鏃ユ湡"
-                width="200"
-                align="center"
-                key="endtime"
-                prop="endtime"
-              >
-                <template slot-scope="scope">
-                  <span>{{ formatTime(scope.row.endtime) }}</span>
-                </template></el-table-column
-              >
-              <el-table-column
-                label="璐d换鎶ゅ+"
-                width="120"
-                align="center"
-                key="nurseName"
-                prop="nurseName"
-              />
-              <el-table-column
-                label="涓绘不鍖荤敓"
-                width="120"
-                align="center"
-                key="drname"
-                prop="drname"
-              />
-
-              <el-table-column
-                label="缁撴灉鐘舵��"
-                align="center"
-                key="excep"
-                prop="excep"
-                width="120"
-              >
-                <template slot-scope="scope">
-                  <dict-tag
-                    :options="dict.type.sys_yujing"
-                    :value="scope.row.excep"
-                  />
-                </template>
-              </el-table-column>
-              <el-table-column
-                label="澶勭悊鎰忚"
-                align="center"
-                key="suggest"
-                prop="suggest"
-                width="120"
-              >
-                <template slot-scope="scope">
-                  <dict-tag
-                    :options="dict.type.sys_suggest"
-                    :value="scope.row.suggest"
-                  />
-                </template>
-              </el-table-column>
-
-              <el-table-column
-                prop="templatename"
-                align="center"
-                label="鏈嶅姟妯℃澘"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-              <el-table-column
-                prop="remark"
-                align="center"
-                label="鏈嶅姟璁板綍"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-
-              <el-table-column
-                prop="bankcardno"
-                align="center"
-                label="鍛煎彨鐘舵��"
-                width="210"
-              >
-              </el-table-column>
-              <el-table-column
-                label="鎿嶄綔"
-                fixed="right"
-                align="center"
-                width="200"
-                class-name="small-padding fixed-width"
-              >
-                <template slot-scope="scope">
-                  <el-button
-                    size="medium"
-                    type="text"
-                    @click="SeedetailsgGo(scope.row)"
-                    ><span class="button-zx"
-                      ><i class="el-icon-s-order"></i>鏌ョ湅</span
-                    ></el-button
-                  >
-                </template>
-              </el-table-column>
-            </el-table>
-          </el-row>
-          <pagination
-            v-show="patienttotal > 0 && this.patientqueryParams.allhosp != 6"
-            :total="patienttotal"
-            :page.sync="patientqueryParams.pn"
-            :limit.sync="patientqueryParams.ps"
-            @pagination="Seedetailstion"
-          />
-        </div>
-      </div>
-    </el-dialog>
-    <!-- 鍚勭被璇︽儏 -->
-    <el-dialog
-      :title="infotitle"
-      :visible.sync="infotitleVisible"
-      v-loading="infotitloading"
-      width="70%"
-      :close-on-click-modal="false"
-    >
-      <div style="margin-bottom: 16px; display: flex; align-items: center">
-        <span style="margin-right: 10px; font-weight: bold">鎮h�呭鍚嶆煡璇�:</span>
-        <el-input
-          v-model="searchName"
-          placeholder="璇疯緭鍏ユ偅鑰呭鍚嶈繘琛岀瓫閫�"
-          clearable
-          style="width: 300px"
-          @input="handleSearch"
-          @clear="handleSearch"
-        >
-        </el-input>
-        <span
-          style="margin-left: 10px; color: rgb(35, 81, 233); font-size: 16px"
-        >
-          鍏� {{ infotitlelist.length }} 鏉¤褰�
-        </span>
-      </div>
-      <div class="examine-jic">
-        <div class="jic-value">
-          <el-row :gutter="20">
-            <!-- 閫夋嫨鎮h�呭垪琛� -->
-            <div
-              class="data-list"
-              ref="dataList"
-              @scroll="handleScroll"
-              v-loading="infotitloading"
-            >
-              <el-table
-                :data="currentDisplayList"
-                height="660"
-                style="width: 100%"
-              >
-                <el-table-column
-                  prop="sendname"
-                  align="center"
-                  label="濮撳悕"
-                  width="100"
-                >
-                </el-table-column>
-                <el-table-column
-                  prop="taskName"
-                  align="center"
-                  width="200"
-                  show-overflow-tooltip
-                  label="浠诲姟鍚嶇О"
-                >
-                </el-table-column>
-                <el-table-column
-                  prop="sendstate"
-                  align="center"
-                  width="200"
-                  label="浠诲姟鐘舵��"
-                >
-                  <template slot-scope="scope">
-                    <div v-if="scope.row.sendstate == 1">
-                      <el-tag type="primary" :disable-transitions="false"
-                        >琛ㄥ崟宸查鍙�</el-tag
-                      >
-                    </div>
-                    <div v-if="scope.row.sendstate == 2">
-                      <el-tag type="primary" :disable-transitions="false"
-                        >寰呴殢璁�</el-tag
-                      >
-                    </div>
-                    <div v-if="scope.row.sendstate == 3">
-                      <el-tag type="success" :disable-transitions="false"
-                        >琛ㄥ崟宸插彂閫�</el-tag
-                      >
-                    </div>
-                    <div v-if="scope.row.sendstate == 4">
-                      <el-tag type="info" :disable-transitions="false"
-                        >涓嶆墽琛�</el-tag
-                      >
-                    </div>
-                    <div v-if="scope.row.sendstate == 5">
-                      <el-tag type="danger" :disable-transitions="false"
-                        >鍙戦�佸け璐�</el-tag
-                      >
-                    </div>
-                    <div v-if="scope.row.sendstate == 6">
-                      <el-tag type="success" :disable-transitions="false"
-                        >宸插畬鎴�</el-tag
-                      >
-                    </div>
-                  </template>
-                </el-table-column>
-                <el-table-column
-                  label="浠诲姟鎵ц鏂瑰紡"
-                  align="center"
-                  key="preachform"
-                  prop="preachform"
-                  width="160"
-                  :show-overflow-tooltip="true"
-                >
-                  <template slot-scope="scope">
-                    <span v-for="item in scope.row.preachform"
-                      >{{ item }}銆�
-                    </span>
-                  </template>
-                </el-table-column>
-                <el-table-column
-                  prop="visitTime"
-                  align="center"
-                  label="搴旈殢璁挎椂闂�"
-                  width="200"
-                  show-overflow-tooltip
-                >
-                </el-table-column>
-                <el-table-column
-                  prop="finishtime"
-                  align="center"
-                  label="闅忚瀹屾垚鏃堕棿"
-                  width="200"
-                  show-overflow-tooltip
-                >
-                </el-table-column>
-                <el-table-column
-                  label="鍑洪櫌鏃ユ湡"
-                  width="200"
-                  align="center"
-                  key="endtime"
-                  prop="endtime"
-                >
-                  <template slot-scope="scope">
-                    <span>{{ formatTime(scope.row.endtime) }}</span>
-                  </template></el-table-column
-                >
-                <el-table-column
-                  label="璐d换鎶ゅ+"
-                  width="120"
-                  align="center"
-                  key="nurseName"
-                  prop="nurseName"
-                />
-                <el-table-column
-                  label="涓绘不鍖荤敓"
-                  width="120"
-                  align="center"
-                  key="drname"
-                  prop="drname"
-                />
-
-                <el-table-column
-                  label="缁撴灉鐘舵��"
-                  align="center"
-                  key="excep"
-                  prop="excep"
-                  width="120"
-                >
-                  <template slot-scope="scope">
-                    <dict-tag
-                      :options="dict.type.sys_yujing"
-                      :value="scope.row.excep"
-                    />
-                  </template>
-                </el-table-column>
-                <el-table-column
-                  label="澶勭悊鎰忚"
-                  align="center"
-                  key="suggest"
-                  prop="suggest"
-                  width="120"
-                >
-                  <template slot-scope="scope">
-                    <dict-tag
-                      :options="dict.type.sys_suggest"
-                      :value="scope.row.suggest"
-                    />
-                  </template>
-                </el-table-column>
-
-                <el-table-column
-                  prop="templatename"
-                  align="center"
-                  label="鏈嶅姟妯℃澘"
-                  width="200"
-                  show-overflow-tooltip
-                >
-                </el-table-column>
-                <el-table-column
-                  prop="remark"
-                  align="center"
-                  label="鏈嶅姟璁板綍"
-                  width="200"
-                  show-overflow-tooltip
-                >
-                </el-table-column>
-
-                <el-table-column
-                  prop="bankcardno"
-                  align="center"
-                  label="鍛煎彨鐘舵��"
-                  width="210"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="鎿嶄綔"
-                  fixed="right"
-                  align="center"
-                  width="200"
-                  class-name="small-padding fixed-width"
-                >
-                  <template slot-scope="scope">
-                    <el-button
-                      size="medium"
-                      type="text"
-                      @click="SeedetailsgGo(scope.row)"
-                      ><span class="button-zx"
-                        ><i class="el-icon-s-order"></i>鏌ョ湅</span
-                      ></el-button
-                    >
-                  </template>
-                </el-table-column>
-              </el-table>
-            </div>
-          </el-row>
-        </div>
-      </div>
-    </el-dialog>
-  </div>
-</template>
-
-<script>
-import {
-  toamendtag,
-  addapitag,
-  deletetag,
-  changetagcategory,
-} from "@/api/system/label";
-import store from "@/store";
-import { getSfStatistics, selectTimelyRate } from "@/api/system/user";
-import * as XLSX from "xlsx";
-import FileSaver from "file-saver";
-import ExcelJS from "exceljs";
-import { saveAs } from "file-saver";
-import Treeselect from "@riophae/vue-treeselect";
-import "@riophae/vue-treeselect/dist/vue-treeselect.css";
-
-const shortcuts = [
-  {
-    text: "浠婂ぉ",
-    onClick(picker) {
-      picker.$emit("pick", new Date());
-    },
-  },
-  {
-    text: "鏄ㄥぉ",
-    onClick(picker) {
-      const date = new Date();
-      date.setTime(date.getTime() - 3600 * 1000 * 24);
-      picker.$emit("pick", date);
-    },
-  },
-  {
-    text: "涓�鍛ㄥ墠",
-    onClick(picker) {
-      const date = new Date();
-      date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
-      picker.$emit("pick", date);
-    },
-  },
-];
-
-export default {
-  name: "Percentage",
-  dicts: ["sys_normal_disable", "sys_user_sex"],
-  components: { Treeselect },
-  data() {
-    return {
-      // 鏂板锛歍ab鏍囩椤垫帶鍒�
-      activeTab: "first", // 褰撳墠婵�娲荤殑tab锛宖irst-棣栨闅忚锛宻econd-鍐嶆闅忚
-
-      // 鍒嗙鐨勬暟鎹垪琛�
-      firstFollowUpList: [], // 棣栨闅忚鏁版嵁
-      secondFollowUpList: [], // 鍐嶆闅忚鏁版嵁
-
-      // 鍒嗙鐨勫姞杞界姸鎬�
-      loading: false, // 棣栨闅忚琛ㄦ牸鍔犺浇鐘舵��
-      loadingSecond: false, // 鍐嶆闅忚琛ㄦ牸鍔犺浇鐘舵��
-
-      // 鍒嗙鐨勫睍寮�鐘舵��
-      expands: [], // 棣栨闅忚琛ㄦ牸灞曞紑琛�
-      expandsSecond: [], // 鍐嶆闅忚琛ㄦ牸灞曞紑琛�
-
-      // 鍒嗙鐨勯�夋嫨鐘舵��
-      ids: [], // 棣栨闅忚閫変腑椤�
-      idsSecond: [], // 鍐嶆闅忚閫変腑椤�
-
-      orgname: "",
-      infotitlelist: [],
-      currentDisplayList: [],
-      loadIndex: 0,
-      pageSize: 100,
-      isLoading: false,
-
-      Seedloading: false,
-      chartDialogVisible: false,
-      infotitleVisible: false,
-      searchName: "",
-      infotitloading: false,
-      infotitle: "",
-      pieChart: null,
-      barLineChart: null,
-
-      single: true,
-      multiple: true,
-      showSearch: true,
-      idds: "",
-      total: 0,
-      flatArrayhospit: [],
-      flatArraydept: [],
-      patienttotal: 0,
-      logsheetlist: [],
-      Statisticallist: [
-        {
-          label: "鐥呭尯缁熻",
-          value: 1,
-        },
-        {
-          label: "绉戝缁熻",
-          value: 2,
-        },
-      ],
-      patientqueryParams: {
-        pn: 1,
-        ps: 10,
-      },
-      amendtag: false,
-      lstamendtag: false,
-      scavisible: false,
-      deleteVisible: false,
-      deletefenl: "楂樿鍘�",
-      tagform: {
-        isupload: "",
-        tagname: "",
-        tagcategoryid: "",
-        tagdescription: "",
-      },
-      classifyform: {
-        categoryname: "",
-      },
-      title: "",
-      open: false,
-      dateRange: [],
-      postOptions: [],
-      roleOptions: [],
-      allDeptCodes: [],
-      allWardCodes: [],
-      checkboxlist: [],
-      form: {},
-      forms: {
-        name: "",
-      },
-      numberlb: 22,
-      dialogFormVisible: false,
-      lstamendtagVisible: false,
-      goQRCodeVisible: false,
-      sidecolumnval: "",
-      propss: { multiple: true },
-      SeedetailsVisible: false,
-      options: store.getters.tasktypes,
-      pickerOptions: {
-        disabledDate(time) {
-          return time.getTime() < Date.now() - 3600 * 1000 * 24;
-        },
-        shortcuts: shortcuts,
-      },
-      pickerOptionsa: {
-        disabledDate(time) {
-          return time.getTime() > Date.now();
-        },
-        shortcuts: shortcuts,
-      },
-      queryParams: {
-        serviceType: [2],
-        dateRange: [],
-        statisticaltype: 1,
-        leavehospitaldistrictcodes: ["all"],
-        deptcodes: [],
-        visitCount: 1, // 鏂板锛氶殢璁挎鏁板弬鏁帮紝1-棣栨锛�2-鍐嶆
-      },
-      columns: [
-        { key: 0, label: `鏍囩缂栧彿`, visible: true },
-        { key: 1, label: `鏍囩鍚嶇О`, visible: true },
-        { key: 2, label: `鏍囩鏄电О`, visible: true },
-        { key: 3, label: `閮ㄩ棬`, visible: true },
-        { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
-        { key: 5, label: `鐘舵�乣, visible: true },
-        { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
-      ],
-    };
-  },
-  watch: {},
-  created() {
-    this.getDeptTree();
-    this.getFirstFollowUpList(); // 榛樿鍔犺浇棣栨闅忚鏁版嵁
-    this.checkboxlist = store.getters.checkboxlist;
-    this.orgname = localStorage.getItem("orgname");
-  },
-
-  methods: {
-    /** 鏌ヨ棣栨闅忚鍒楄〃 */
-    async getFirstFollowUpList() {
-      this.loading = true;
-      this.queryParams.visitCount = 1; // 璁剧疆闅忚娆℃暟涓洪娆�
-
-      const params = {
-        ...this.queryParams,
-        leavehospitaldistrictcodes:
-          this.queryParams.leavehospitaldistrictcodes.includes("all")
-            ? this.allWardCodes
-            : this.queryParams.leavehospitaldistrictcodes,
-        deptcodes: this.queryParams.deptcodes.includes("all")
-          ? this.allDeptCodes
-          : this.queryParams.deptcodes,
-      };
-
-      delete params.leavehospitaldistrictcodes.all;
-      delete params.deptcodes.all;
-
-      try {
-        const response = await getSfStatistics(params);
-        this.firstFollowUpList = this.customSort(response.data);
-        this.total = response.total;
-      } catch (error) {
-        console.error("鑾峰彇棣栨闅忚鏁版嵁澶辫触:", error);
-        this.$message.error("鑾峰彇棣栨闅忚鏁版嵁澶辫触");
-      } finally {
-        this.loading = false;
-      }
-    },
-
-    /** 鏌ヨ鍐嶆闅忚鍒楄〃 */
-    async getSecondFollowUpList() {
-      this.loadingSecond = true;
-      this.queryParams.visitCount = 2; // 璁剧疆闅忚娆℃暟涓哄啀娆�
-
-      const params = {
-        ...this.queryParams,
-        leavehospitaldistrictcodes:
-          this.queryParams.leavehospitaldistrictcodes.includes("all")
-            ? this.allWardCodes
-            : this.queryParams.leavehospitaldistrictcodes,
-        deptcodes: this.queryParams.deptcodes.includes("all")
-          ? this.allDeptCodes
-          : this.queryParams.deptcodes,
-      };
-
-      delete params.leavehospitaldistrictcodes.all;
-      delete params.deptcodes.all;
-
-      try {
-        const response = await getSfStatistics(params);
-        this.secondFollowUpList = this.customSort(response.data);
-        this.total = response.total;
-      } catch (error) {
-        console.error("鑾峰彇鍐嶆闅忚鏁版嵁澶辫触:", error);
-        this.$message.error("鑾峰彇鍐嶆闅忚鏁版嵁澶辫触");
-      } finally {
-        this.loadingSecond = false;
-      }
-    },
-
-    /** Tab鍒囨崲浜嬩欢 */
-    handleTabClick(tab) {
-      if (tab.name === "first") {
-        if (this.firstFollowUpList.length === 0) {
-          this.getFirstFollowUpList();
-        }
-      } else if (tab.name === "second") {
-        if (this.secondFollowUpList.length === 0) {
-          this.getSecondFollowUpList();
-        }
-      }
-    },
-    sortChineseNumber(aRow, bRow) {
-      const a = aRow.leavehospitaldistrictname;
-      const b = bRow.leavehospitaldistrictname;
-
-      // 涓枃鏁板瓧鍒伴樋鎷変集鏁板瓧鐨勬槧灏勶紙鎵╁睍鍒�45锛�
-      const chineseNumMap = {
-        涓�: 1,
-        浜�: 2,
-        涓�: 3,
-        鍥�: 4,
-        浜�: 5,
-        鍏�: 6,
-        涓�: 7,
-        鍏�: 8,
-        涔�: 9,
-        鍗�: 10,
-        鍗佷竴: 11,
-        鍗佷簩: 12,
-        鍗佷笁: 13,
-        鍗佸洓: 14,
-        鍗佷簲: 15,
-        鍗佸叚: 16,
-        鍗佷竷: 17,
-        鍗佸叓: 18,
-        鍗佷節: 19,
-        浜屽崄: 20,
-        浜屽崄涓�: 21,
-        浜屽崄浜�: 22,
-        浜屽崄涓�: 23,
-        浜屽崄鍥�: 24,
-        浜屽崄浜�: 25,
-        浜屽崄鍏�: 26,
-        浜屽崄涓�: 27,
-        浜屽崄鍏�: 28,
-        浜屽崄涔�: 29,
-        涓夊崄: 30,
-        涓夊崄涓�: 31,
-        涓夊崄浜�: 32,
-        涓夊崄涓�: 33,
-        涓夊崄鍥�: 34,
-        涓夊崄浜�: 35,
-        涓夊崄鍏�: 36,
-        涓夊崄涓�: 37,
-        涓夊崄鍏�: 38,
-        涓夊崄涔�: 39,
-        鍥涘崄: 40,
-        鍥涘崄涓�: 41,
-        鍥涘崄浜�: 42,
-        鍥涘崄涓�: 43,
-        鍥涘崄鍥�: 44,
-        鍥涘崄浜�: 45,
-      };
-
-      // 鎻愬彇涓枃鏁板瓧
-      const getNumberFromText = (text) => {
-        if (!text || typeof text !== "string") return -1;
-
-        // 鍖归厤涓枃鏁板瓧锛屾敮鎸佷竴鍒板洓鍗佷簲
-        const match = text.match(/^([涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+)/);
-
-        if (match && match[1]) {
-          const chineseNum = match[1];
-          return chineseNumMap[chineseNum] !== undefined
-            ? chineseNumMap[chineseNum]
-            : -1;
-        }
-
-        // 濡傛灉娌℃湁鍖归厤鍒颁腑鏂囨暟瀛楋紝灏濊瘯鍖归厤闃挎媺浼暟瀛�
-        const arabicMatch = text.match(/^(\d+)/);
-        if (arabicMatch && arabicMatch[1]) {
-          const num = parseInt(arabicMatch[1], 10);
-          return num >= 1 && num <= 45 ? num : -1;
-        }
-
-        return -1;
-      };
-
-      const numA = getNumberFromText(a);
-      const numB = getNumberFromText(b);
-
-      // 澶勭悊鏃犳硶瑙f瀽鐨勬儏鍐�
-      if (numA === -1 && numB === -1) {
-        return (a || "").localeCompare(b || "");
-      }
-      if (numA === -1) return 1;
-      if (numB === -1) return -1;
-
-      return numA - numB;
-    },
-    // 鎼滅储澶勭悊鍑芥暟
-    handleSearch() {
-      if (!this.searchName.trim()) {
-        // 濡傛灉鎼滅储妗嗕负绌猴紝鏄剧ず鎵�鏈夋暟鎹�
-        this.currentDisplayList = [...this.infotitlelist];
-      } else {
-        // 鏍规嵁鎮h�呭鍚嶈繘琛岀瓫閫夛紙涓嶅尯鍒嗗ぇ灏忓啓锛�
-        const keyword = this.searchName.toLowerCase();
-        this.currentDisplayList = this.infotitlelist.filter((item) => {
-          return item.sendname && item.sendname.toLowerCase().includes(keyword);
-        });
-      }
-    },
-    customSort(data) {
-      // 瀹氫箟鎮ㄦ湡鏈涚殑鐥呭尯椤哄簭锛堟墿灞曞埌鍥涘崄浜旓級
-      const order = [
-        "涓�",
-        "浜�",
-        "涓�",
-        "鍥�",
-        "浜�",
-        "鍏�",
-        "涓�",
-        "鍏�",
-        "涔�",
-        "鍗�",
-        "鍗佷竴",
-        "鍗佷簩",
-        "鍗佷笁",
-        "鍗佸洓",
-        "鍗佷簲",
-        "鍗佸叚",
-        "鍗佷竷",
-        "鍗佸叓",
-        "鍗佷節",
-        "浜屽崄",
-        "浜屽崄涓�",
-        "浜屽崄浜�",
-        "浜屽崄涓�",
-        "浜屽崄鍥�",
-        "浜屽崄浜�",
-        "浜屽崄鍏�",
-        "浜屽崄涓�",
-        "浜屽崄鍏�",
-        "浜屽崄涔�",
-        "涓夊崄",
-        "涓夊崄涓�",
-        "涓夊崄浜�",
-        "涓夊崄涓�",
-        "涓夊崄鍥�",
-        "涓夊崄浜�",
-        "涓夊崄鍏�",
-        "涓夊崄涓�",
-        "涓夊崄鍏�",
-        "涓夊崄涔�",
-        "鍥涘崄",
-        "鍥涘崄涓�",
-        "鍥涘崄浜�",
-        "鍥涘崄涓�",
-        "鍥涘崄鍥�",
-        "鍥涘崄浜�",
-      ];
-
-      return data.sort((a, b) => {
-        // 鎻愬彇鐥呭尯鍚嶇О涓殑涓枃鏁板瓧閮ㄥ垎
-        const getIndex = (name) => {
-          if (!name || typeof name !== "string") return -1;
-
-          // 鍖归厤涓枃鏁板瓧
-          const chineseMatch = name.match(/^([涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+)/);
-          if (chineseMatch && chineseMatch[1]) {
-            return order.indexOf(chineseMatch[1]);
-          }
-
-          // 鍖归厤闃挎媺浼暟瀛�
-          const arabicMatch = name.match(/^(\d+)/);
-          if (arabicMatch && arabicMatch[1]) {
-            const num = parseInt(arabicMatch[1], 10);
-            if (num >= 1 && num <= 45) {
-              return num - 1; // 鍥犱负鏁扮粍绱㈠紩浠�0寮�濮�
-            }
-          }
-
-          return -1;
-        };
-
-        const indexA = getIndex(a.leavehospitaldistrictname);
-        const indexB = getIndex(b.leavehospitaldistrictname);
-
-        // 鎺掑簭閫昏緫
-        if (indexA === -1 && indexB === -1) {
-          return (a.leavehospitaldistrictname || "").localeCompare(
-            b.leavehospitaldistrictname || ""
-          );
-        }
-        if (indexA === -1) return 1;
-        if (indexB === -1) return -1;
-        return indexA - indexB;
-      });
-    },
-    getRowKey(row) {
-      return row.statisticaltype === 1
-        ? row.leavehospitaldistrictcode
-        : row.deptcode;
-    },
-
-    // 澶勭悊琛岀偣鍑诲睍寮�
-    handleRowClick(row) {
-      console.log(row, "row");
-
-      // 濡傛灉宸茬粡灞曞紑鍒欐敹璧�
-      if (this.expands.includes(this.getRowKey(row))) {
-        this.expands = [];
-        return;
-      }
-      // 澶勭悊鏌ヨ鍙傛暟
-      const params = {
-        ...this.queryParams,
-        // 濡傛灉閫夋嫨浜�"鍏ㄩ儴"锛屽垯浼犳墍鏈夌梾鍖�/绉戝浠g爜
-        deptcodes: this.queryParams.deptcodes.includes("all")
-          ? this.allDeptCodes
-          : this.queryParams.deptcodes,
-        leavehospitaldistrictcodes: [row.leavehospitaldistrictcode],
-        drcode: "1",
-        visitCount: 1, // 璁剧疆涓洪娆¢殢璁�
-      };
-
-      // 绉婚櫎鍙兘瀛樺湪鐨�"all"鍊�
-      delete params.leavehospitaldistrictcodes.all;
-      delete params.deptcodes.all;
-      // 濡傛灉璇ヨ杩樻病鏈夊姞杞藉尰鐢熸暟鎹紝鍒欏姞杞�
-      if (!row.doctorStats) {
-        this.loading = true;
-        getSfStatistics(params).then((res) => {
-          this.$set(row, "doctorStats", res.data);
-          this.expands = [this.getRowKey(row)];
-          this.loading = false;
-        });
-      } else {
-        this.expands = [this.getRowKey(row)];
-      }
-    },
-    getSummaries(param) {
-      const { columns, data } = param;
-      const sums = [];
-
-      columns.forEach((column, index) => {
-        if (index === 0) {
-          sums[index] = "鍚堣";
-          return;
-        }
-        if (index === 1 || index === 2) {
-          sums[index] = "/";
-          return;
-        }
-
-        // 瀵圭櫨鍒嗘瘮瀛楁鐗规畩澶勭悊 - 鍙栧钩鍧囧��
-        if (
-          column.property === "followUpRate" ||
-          column.property === "rate" ||
-          column.property === "followUpRateAgain"
-        ) {
-          // 鎻愬彇鎵�鏈夋湁鏁堢櫨鍒嗘瘮鍊煎苟杞崲涓哄皬鏁�
-          const percentageValues = data
-            .map((item) => {
-              const value = item[column.property];
-              if (!value || value === "-" || value === "0%") return null;
-
-              // 澶勭悊甯︾櫨鍒嗗彿鐨勬暟鎹�
-              if (typeof value === "string" && value.includes("%")) {
-                // 鍘婚櫎鐧惧垎鍙峰苟杞崲涓哄皬鏁�
-                const numValue = parseFloat(value.replace("%", "")) / 100;
-                return isNaN(numValue) ? null : numValue;
-              } else {
-                // 澶勭悊宸茬粡鏄皬鏁扮殑鏁版嵁
-                const numValue = parseFloat(value);
-                return isNaN(numValue) ? null : numValue;
-              }
-            })
-            .filter((value) => value !== null && value !== 0); // 杩囨护鎺塶ull鍜�0鍊�
-
-          if (percentageValues.length > 0) {
-            const average =
-              percentageValues.reduce((sum, value) => sum + value, 0) /
-              percentageValues.length;
-            sums[index] = (average * 100).toFixed(2) + "%";
-          } else {
-            sums[index] = "0.00%";
-          }
-        } else {
-          // 鏅�氭暟瀛楀瓧娈� - 姹傚拰
-          const values = data.map((item) => {
-            const value = item[column.property];
-            if (value === "-" || value === "" || value === null) return 0;
-            return Number(value) || 0;
-          });
-
-          if (!values.every((value) => isNaN(value))) {
-            sums[index] = values.reduce((prev, curr) => prev + curr, 0);
-            sums[index] = this.formatNumber(sums[index]);
-          } else {
-            sums[index] = "-";
-          }
-        }
-      });
-
-      return sums;
-    },
-
-    // 鍐呴儴琛ㄦ牸鍚堣琛岃绠楁柟娉�
-    getInnerSummaries(param) {
-      const { columns, data } = param;
-      const sums = [];
-
-      columns.forEach((column, index) => {
-        if (index === 0) {
-          sums[index] = "灏忚";
-          return;
-        }
-
-        if (column.property === "drname" || column.property === "deptname") {
-          sums[index] = "-";
-          return;
-        }
-
-        // 瀵圭櫨鍒嗘瘮瀛楁鐗规畩澶勭悊 - 鍙栧钩鍧囧��
-        if (column.property === "followUpRate" || column.property === "rate") {
-          // 鎻愬彇鎵�鏈夋湁鏁堢櫨鍒嗘瘮鍊煎苟杞崲涓哄皬鏁�
-          const percentageValues = data
-            .map((item) => {
-              const value = item[column.property];
-              if (!value || value === "-" || value === "0%") return null;
-
-              // 澶勭悊甯︾櫨鍒嗗彿鐨勬暟鎹�
-              if (typeof value === "string" && value.includes("%")) {
-                // 鍘婚櫎鐧惧垎鍙峰苟杞崲涓哄皬鏁�
-                const numValue = parseFloat(value.replace("%", "")) / 100;
-                return isNaN(numValue) ? null : numValue;
-              } else {
-                // 澶勭悊宸茬粡鏄皬鏁扮殑鏁版嵁
-                const numValue = parseFloat(value);
-                return isNaN(numValue) ? null : numValue;
-              }
-            })
-            .filter((value) => value !== null && value !== 0);
-
-          if (percentageValues.length > 0) {
-            const average =
-              percentageValues.reduce((sum, value) => sum + value, 0) /
-              percentageValues.length;
-            sums[index] = (average * 100).toFixed(2) + "%";
-          } else {
-            sums[index] = "0.00%";
-          }
-        } else {
-          // 鏅�氭暟瀛楀瓧娈� - 姹傚拰
-          const values = data.map((item) => {
-            const value = item[column.property];
-            if (value === "-" || value === "" || value === null) return 0;
-            return Number(value) || 0;
-          });
-
-          if (!values.every((value) => isNaN(value))) {
-            sums[index] = values.reduce((prev, curr) => prev + curr, 0);
-            sums[index] = this.formatNumber(sums[index]);
-          } else {
-            sums[index] = "-";
-          }
-        }
-      });
-
-      return sums;
-    },
-
-    // 杈呭姪鏂规硶锛氭彁鍙栫櫨鍒嗘瘮鏁板��
-    extractPercentageValue(value) {
-      if (!value) return null;
-
-      if (typeof value === "string") {
-        // 澶勭悊甯︾櫨鍒嗗彿鐨勫瓧绗︿覆
-        if (value.includes("%")) {
-          const num = parseFloat(value.replace("%", ""));
-          return isNaN(num) ? null : num / 100;
-        }
-        // 澶勭悊绾暟瀛楀瓧绗︿覆
-        const num = parseFloat(value);
-        return isNaN(num) ? null : num;
-      }
-
-      // 澶勭悊鏁板瓧绫诲瀷
-      return typeof value === "number" ? value : null;
-    },
-
-    // 鏁板瓧鏍煎紡鍖栨柟娉�
-    formatNumber(num) {
-      if (isNaN(num)) return "-";
-      return Number.isInteger(num) ? num.toString() : num.toFixed(0);
-    },
-    /** 淇敼鏍囩 */
-    handleUpdate(row) {
-      console.log(row, "淇敼鏍囩");
-      this.lstamendtagVisible = true;
-      this.lstamendtag = true;
-      this.tagform = {
-        isupload: row.isupload,
-        tagname: row.tagname,
-        tagcategoryid: row.tagcategoryid,
-        tagdescription: row.tagdescription,
-        tagid: row.tagid,
-      };
-    },
-    // 鑾峰彇绉戝鏍�
-    getDeptTree() {
-      // 绉戝鍒楄〃
-      this.flatArraydept = store.getters.belongDepts.map((dept) => {
-        return {
-          label: dept.deptName,
-          value: dept.deptCode,
-        };
-      });
-      // 瀛樺偍鎵�鏈夌瀹や唬鐮�
-      this.allDeptCodes = store.getters.belongDepts.map(
-        (dept) => dept.deptCode
-      );
-
-      // 鐥呭尯鍒楄〃
-      this.flatArrayhospit = store.getters.belongWards.map((ward) => {
-        return {
-          label: ward.districtName,
-          value: ward.districtCode,
-        };
-      });
-
-      // 瀛樺偍鎵�鏈夌梾鍖轰唬鐮�
-      this.allWardCodes = store.getters.belongWards.map(
-        (ward) => ward.districtCode
-      );
-      this.flatArraydept.push({ label: "鍏ㄩ儴", value: "all" });
-      this.flatArrayhospit.push({ label: "鍏ㄩ儴", value: "all" });
-    },
-    flattenArray(multiArray) {
-      let result = [];
-
-      // 閫掑綊鍑芥暟锛岀敤浜庡皢澶氱骇鏁扮粍杞崲涓轰竴缁存暟缁勶紝鍙寘鍚渶搴曞眰鐨勫厓绱�
-      function flatten(element) {
-        // 濡傛灉褰撳墠鍏冪礌鏈夊瓙鍏冪礌锛岀户缁�掑綊
-        if (element.children && element.children.length > 0) {
-          element.children.forEach((child) => flatten(child));
-        } else {
-          // 鍏嬮殕鍏冪礌浠ラ伩鍏嶄慨鏀瑰師濮嬫暟鎹�
-          let item = JSON.parse(JSON.stringify(element));
-          result.push(item); // 灏嗘渶搴曞眰鐨勫厓绱犳坊鍔犲埌缁撴灉鏁扮粍
-        }
-      }
-
-      // 浠庨《灞傚厓绱犲紑濮嬮�掑綊
-      multiArray.forEach((element) => flatten(element));
-      return result; // 杩斿洖鍙寘鍚渶搴曞眰鍏冪礌鐨勪竴缁存暟缁�
-    },
-    addladeltag() {
-      this.lstamendtagVisible = true;
-      this.lstamendtag = false;
-      this.tagform = {
-        isupload: "",
-        tagname: "",
-        tagcategoryid: "",
-        tagdescription: "",
-        tagid: "",
-      };
-    },
-    Seedetails(row) {
-      this.SeedetailsVisible = true;
-      this.Seedloading = true;
-      if (queryParams.dateRange) {
-        this.patientqueryParams.starttime = this.parseTime(
-          this.queryParams.dateRange[0]
-        );
-        this.patientqueryParams.endtime = this.parseTime(
-          this.queryParams.dateRange[1]
-        );
-      } else {
-        this.patientqueryParams.endtime = null;
-        this.patientqueryParams.starttime = null;
-      }
-
-      this.patientqueryParams.deptcode = row.deptcode;
-      selectTimelyRate(this.patientqueryParams).then((response) => {
-        this.logsheetlist = response.data.detail;
-        this.patienttotal = response.data.total;
-        this.Seedloading = false;
-      });
-    },
-    Seedetailstion() {
-      selectTimelyRate(this.patientqueryParams).then((response) => {
-        this.logsheetlist = response.data.detail;
-        this.patienttotal = response.data.total;
-        this.Seedloading = false;
-      });
-    },
-    viewDetails(row, title) {
-      this.infotitleVisible = true;
-      this.infotitle = title;
-      this.infotitlelist = row; // 鍋囪row灏辨槸闇�瑕佸睍绀虹殑璇︾粏鏁扮粍
-      console.log(this.infotitlelist, "this.infotitlelist");
-
-      this.infotitlelist.forEach((item) => {
-        let idArray = null;
-
-        if (item.preachform) {
-          if (item.endtime) {
-            item.preachformson = item.preachform;
-            idArray = item.preachform.split(",");
-          }
-
-          item.preachform = idArray.map((value) => {
-            // 鏌ユ壘id瀵瑰簲鐨勫璞�
-            const item = this.checkboxlist.find((item) => item.value == value);
-            // 濡傛灉鎵惧埌瀵瑰簲鐨刬d锛岃繑鍥瀕abel鍊硷紝鍚﹀垯杩斿洖null
-            return item ? item.label : null;
-          });
-        }
-      });
-      // 鍒濆鍖栧姞杞�
-      this.loadIndex = 0;
-      this.currentDisplayList = [];
-      this.$nextTick(() => {
-        this.loadMoreData();
-      });
-    },
-    loadMoreData() {
-      if (this.isLoading) return;
-      this.isLoading = true;
-
-      // 妯℃嫙寮傛鍔犺浇锛屽疄闄呭彲鑳芥槸鐩存帴鍒囩墖鏈湴鏁版嵁
-      setTimeout(() => {
-        console.log(this.infotitlelist, "this.infotitlelist");
-
-        const nextChunk = this.infotitlelist.slice(
-          this.loadIndex,
-          this.loadIndex + this.pageSize
-        );
-        this.currentDisplayList = this.currentDisplayList.concat(nextChunk);
-        this.loadIndex += this.pageSize;
-        this.isLoading = false;
-      }, 200);
-    },
-    handleScroll(event) {
-      const scrollContainer = event.target;
-      // 鍒ゆ柇鏄惁婊氬姩鍒板簳閮�
-      const isAtBottom =
-        scrollContainer.scrollTop + scrollContainer.clientHeight >=
-        scrollContainer.scrollHeight - 10;
-
-      if (
-        isAtBottom &&
-        !this.isLoading &&
-        this.loadIndex < this.infotitlelist.length
-      ) {
-        this.loadMoreData();
-      }
-    },
-    SeedetailsgGo(row) {
-      this.SeedetailsVisible = false;
-      this.infotitleVisible = false;
-
-      let type = "";
-      if (row.preachformson && row.preachformson.includes("3")) {
-        type = 1;
-      }
-      setTimeout(() => {
-        this.$router.push({
-          path: "/followvisit/record/detailpage/",
-          query: {
-            taskid: row.taskid,
-            patid: row.patid,
-            id: row.id,
-            Voicetype: type,
-            // visitCount: this.topqueryParams.visitCount,
-          },
-        });
-      }, 300);
-    },
-    // 娣诲姞/淇敼鏍囩
-    Maintenancetag() {
-      if (this.lstamendtag) {
-        toamendtag(this.addDateRange(this.tagform)).then((response) => {
-          console.log(response);
-          this.getList();
-        });
-      } else {
-        addapitag(this.addDateRange(this.tagform)).then((response) => {
-          console.log(response);
-          this.getList();
-        });
-      }
-      this.tagform = {
-        isupload: "",
-        tagname: "",
-        tagcategoryid: "",
-        tagdescription: "",
-        tagid: "",
-      };
-    },
-    routerErr(row) {
-      console.log(row, "璺宠浆寮傚父");
-      this.$router.push({
-        path: "/followvisit/discharge",
-        query: {
-          errtype: 1,
-          leavehospitaldistrictcode: row.leavehospitaldistrictcode,
-        },
-      });
-    },
-
-    // 琛ㄥ崟閲嶇疆
-    reset() {
-      this.form = {
-        userId: undefined,
-        deptId: undefined,
-        userName: undefined,
-        nickName: undefined,
-        password: undefined,
-        phonenumber: undefined,
-        email: undefined,
-        sex: undefined,
-        status: "0",
-        remark: undefined,
-        postIds: [],
-        roleIds: [],
-      };
-      this.resetForm("form");
-    },
-    // 鏍囩鐘舵�佷慨鏀�
-    handleStatusChange(row) {
-      console.log(row.isupload);
-      let text = row.isupload === "0" ? "鍚敤" : "鍋滅敤";
-      this.$modal
-        .confirm('纭瑕�"' + text + '""' + row.tagname + '"鏍囩鍚楋紵')
-        .then(function () {
-          return changetagcategory(row.tagid, row.isupload);
-        })
-        .then(() => {
-          this.$modal.msgSuccess(text + "鎴愬姛");
-        })
-        .catch(function () {
-          row.isupload = row.isupload === "0" ? "1" : "0";
-        });
-    },
-    /** 鎼滅储鎸夐挳鎿嶄綔 - 淇敼涓烘悳绱㈠綋鍓嶆縺娲荤殑tab鏁版嵁 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      if (!this.queryParams.dateRange) this.queryParams.dateRange = [];
-      if (this.queryParams.statisticaltype == 1) {
-        this.queryParams.deptcodes = [];
-      } else if (this.queryParams.statisticaltype == 2) {
-        this.queryParams.leavehospitaldistrictcodes = [];
-      }
-
-      this.queryParams.startTime = this.parseTime(
-        this.queryParams.dateRange[0]
-      );
-      this.queryParams.endTime = this.parseTime(this.queryParams.dateRange[1]);
-
-      // 鏍规嵁褰撳墠婵�娲荤殑tab鍔犺浇瀵瑰簲鏁版嵁
-      if (this.activeTab === "first") {
-        this.getFirstFollowUpList();
-      } else {
-        this.getSecondFollowUpList();
-      }
-    },
-
-    /** 閲嶇疆鎸夐挳鎿嶄綔 */
-    resetQuery() {
-      this.queryParams.dateRange = [];
-      this.queryParams.leavehospitaldistrictcodes = [];
-      this.handleQuery();
-    },
-    // 澶氶�夋閫変腑鏁版嵁
-    handleSelectionChange(selection) {
-      this.ids = selection.map((item) => item.tagid);
-      this.single = selection.length != 1;
-      this.multiple = !selection.length;
-    },
-
-    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete(row) {
-      console.log(row, "鍒犻櫎寮圭獥");
-      const tagids = row.tagid || this.ids;
-      console.log(tagids);
-      const tagname = row.tagname;
-      this.$modal
-        .confirm(
-          tagname
-            ? '鏄惁纭鍒犻櫎鏍囩鍚嶇О涓�"' + tagname + '"鐨勬暟鎹」锛�'
-            : "鏄惁纭鍒犻櫎閫変腑鐨勬暟鎹」锛�"
-        )
-        .then(function () {
-          return deletetag(tagids);
-        })
-        .then(() => {
-          this.getList();
-          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        })
-        .catch(() => {});
-    },
-    // 瀵煎嚭鏂规硶
-
-    async exportTable() {
-      try {
-        // 1. 鑾峰彇骞舵牸寮忓寲鏃ユ湡鑼冨洿
-        let dateRangeString = "";
-        let sheetNameSuffix = "";
-
-        if (
-          this.queryParams.dateRange &&
-          this.queryParams.dateRange.length === 2
-        ) {
-          const startDateStr = this.queryParams.dateRange[0];
-          const endDateStr = this.queryParams.dateRange[1];
-          const formatDateForDisplay = (dateTimeStr) => {
-            return dateTimeStr.split(" ")[0];
-          };
-          const startDateFormatted = formatDateForDisplay(startDateStr);
-          const endDateFormatted = formatDateForDisplay(endDateStr);
-          dateRangeString = `${startDateFormatted}鑷�${endDateFormatted}`;
-          sheetNameSuffix = `${startDateFormatted}鑷�${endDateFormatted}`;
-        } else {
-          const now = new Date();
-          const currentMonth = now.getMonth() + 1;
-          dateRangeString = `${currentMonth}鏈坄;
-          sheetNameSuffix = `${currentMonth}鏈坄;
-        }
-
-        // 2. 鏍规嵁褰撳墠婵�娲荤殑tab纭畾瀵煎嚭鐨勬暟鎹�
-        const isFirstFollowUp = this.activeTab === "first";
-        let excelName, worksheetName, dataToExport;
-
-        if (isFirstFollowUp) {
-          excelName = `棣栨鍑洪櫌闅忚缁熻琛╛${dateRangeString}.xlsx`;
-          worksheetName = `棣栨闅忚缁熻_${sheetNameSuffix}`;
-          dataToExport = this.firstFollowUpList;
-
-          if (!dataToExport || dataToExport.length === 0) {
-            this.$message.warning("鏆傛棤棣栨闅忚鏁版嵁鍙鍑�");
-            return false;
-          }
-        } else {
-          excelName = `鍐嶆鍑洪櫌闅忚缁熻琛╛${dateRangeString}.xlsx`;
-          worksheetName = `鍐嶆闅忚缁熻_${sheetNameSuffix}`;
-          dataToExport = this.secondFollowUpList;
-
-          if (!dataToExport || dataToExport.length === 0) {
-            this.$message.warning("鏆傛棤鍐嶆闅忚鏁版嵁鍙鍑�");
-            return false;
-          }
-        }
-
-        // 3. 鍒涘缓宸ヤ綔绨垮拰宸ヤ綔琛�
-        const workbook = new ExcelJS.Workbook();
-        const worksheet = workbook.addWorksheet(worksheetName);
-
-        // 4. 鏋勫缓琛ㄦ牸
-        if (isFirstFollowUp) {
-          this.buildFirstFollowUpExportSheet(
-            worksheet,
-            dataToExport,
-            sheetNameSuffix
-          );
-        } else {
-          this.buildSecondFollowUpExportSheet(
-            worksheet,
-            dataToExport,
-            sheetNameSuffix
-          );
-        }
-
-        // 5. 鐢熸垚骞朵笅杞芥枃浠�
-        const buffer = await workbook.xlsx.writeBuffer();
-        const blob = new Blob([buffer], {
-          type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
-        });
-        saveAs(blob, excelName);
-
-        this.$message.success("瀵煎嚭鎴愬姛");
-        return true;
-      } catch (error) {
-        console.error("瀵煎嚭澶辫触:", error);
-        this.$message.error(`瀵煎嚭澶辫触: ${error.message}`);
-        return false;
-      }
-    },
-    /** 鏋勫缓棣栨闅忚瀵煎嚭琛ㄦ牸 */
-    buildFirstFollowUpExportSheet(worksheet, data, sheetNameSuffix) {
-      const titleStyle = {
-        font: {
-          name: "寰蒋闆呴粦",
-          size: 16,
-          bold: true,
-          color: { argb: "FF000000" },
-        },
-        fill: {
-          type: "pattern",
-          pattern: "solid",
-          fgColor: { argb: "FFE6F3FF" },
-        },
-        alignment: { vertical: "middle", horizontal: "center", wrapText: true },
-        border: {
-          top: { style: "thin", color: { argb: "FFD0D0D0" } },
-          left: { style: "thin", color: { argb: "FFD0D0D0" } },
-          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
-          right: { style: "thin", color: { argb: "FFD0D0D0" } },
-        },
-      };
-
-      const headerStyle = {
-        font: {
-          name: "寰蒋闆呴粦",
-          size: 11,
-          bold: true,
-          color: { argb: "FF000000" },
-        },
-        fill: {
-          type: "pattern",
-          pattern: "solid",
-          fgColor: { argb: "FFF5F7FA" },
-        },
-        alignment: { vertical: "middle", horizontal: "center", wrapText: true },
-        border: {
-          top: { style: "thin", color: { argb: "FFD0D0D0" } },
-          left: { style: "thin", color: { argb: "FFD0D0D0" } },
-          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
-          right: { style: "thin", color: { argb: "FFD0D0D0" } },
-        },
-      };
-
-      const cellStyle = {
-        font: { name: "瀹嬩綋", size: 10, color: { argb: "FF000000" } },
-        alignment: { vertical: "middle", horizontal: "center" },
-        border: {
-          top: { style: "thin", color: { argb: "FFD0D0D0" } },
-          left: { style: "thin", color: { argb: "FFD0D0D0" } },
-          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
-          right: { style: "thin", color: { argb: "FFD0D0D0" } },
-        },
-      };
-
-      const summaryStyle = {
-        font: {
-          name: "瀹嬩綋",
-          size: 10,
-          bold: true,
-          color: { argb: "FF409EFF" },
-        },
-        fill: {
-          type: "pattern",
-          pattern: "solid",
-          fgColor: { argb: "FFF5F7FA" },
-        },
-        alignment: { vertical: "middle", horizontal: "center" },
-        border: {
-          top: { style: "thin", color: { argb: "FFD0D0D0" } },
-          left: { style: "thin", color: { argb: "FFD0D0D0" } },
-          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
-          right: { style: "thin", color: { argb: "FFD0D0D0" } },
-        },
-      };
-
-      // 1. 娣诲姞鎬绘爣棰樿
-      worksheet.mergeCells(1, 1, 1, 16); // 鍚堝苟A1鍒癙1
-      const titleCell = worksheet.getCell(1, 1);
-      titleCell.value = `棣栨鍑洪櫌闅忚缁熻琛╛${sheetNameSuffix}`;
-      titleCell.style = titleStyle;
-      worksheet.getRow(1).height = 35;
-
-      // 2. 鍒涘缓琛ㄥご
-      const secondRowHeaders = [
-        "", // A2 灞曞紑鍒楀崰浣�
-        "鍑洪櫌鐥呭尯",
-        "绉戝",
-        "鍑洪櫌浜烘",
-        "鏃犻渶闅忚浜烘",
-        "搴旈殢璁夸汉娆�", // B2 to F2
-        // 棣栨鍑洪櫌闅忚瀛愯〃澶�
-        "闇�闅忚",
-        "寰呴殢璁�",
-        "闅忚鎴愬姛",
-        "闅忚澶辫触",
-        "闅忚鐜�",
-        "鍙婃椂鐜�",
-        "浜哄伐",
-        "鐭俊",
-        "寰俊",
-      ];
-
-      // 娣诲姞绗簩琛�
-      secondRowHeaders.forEach((header, index) => {
-        const cell = worksheet.getCell(3, index + 1);
-        cell.value = header;
-        cell.style = headerStyle;
-      });
-
-      // 3. 鍚堝苟鍗曞厓鏍�
-      // 鍚堝苟 A2:A3, B2:B3, C2:C3, D2:D3, E2:E3, F2:F3
-      for (let i = 1; i <= 6; i++) {
-        worksheet.mergeCells(2, i, 3, i);
-        const cell = worksheet.getCell(2, i);
-        cell.style = headerStyle;
-      }
-
-      // 璁剧疆绗竴琛屽悎骞跺崟鍏冩牸鐨勫��
-      worksheet.getCell(2, 1).value = "";
-      worksheet.getCell(2, 2).value = "鍑洪櫌鐥呭尯";
-      worksheet.getCell(2, 3).value = "绉戝";
-      worksheet.getCell(2, 4).value = "鍑洪櫌浜烘";
-      worksheet.getCell(2, 5).value = "鏃犻渶闅忚浜烘";
-      worksheet.getCell(2, 6).value = "搴旈殢璁夸汉娆�";
-
-      // 4. 鍚堝苟"棣栨鍑洪櫌闅忚"鏍囬
-      worksheet.mergeCells(2, 7, 2, 15); // G2:O2
-      worksheet.getCell(2, 7).value = "棣栨鍑洪櫌闅忚";
-      worksheet.getCell(2, 7).style = headerStyle;
-
-      // 5. 璁剧疆琛岄珮
-      worksheet.getRow(2).height = 28;
-      worksheet.getRow(3).height = 25;
-
-      // 6. 娣诲姞鏁版嵁琛�
-      data.forEach((item, rowIndex) => {
-        const dataRow = worksheet.addRow(
-          [
-            "", // 灞曞紑鍒�
-            item.leavehospitaldistrictname || "",
-            item.deptname || "",
-            item.dischargeCount || 0,
-            item.nonFollowUp || 0,
-            item.followUpNeeded || 0,
-            // 棣栨鍑洪櫌闅忚鏁版嵁
-            item.needFollowUp || 0,
-            item.pendingFollowUp || 0,
-            item.followUpSuccess || 0,
-            item.followUpFail || 0,
-            item.followUpRate || "0%",
-            item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%",
-            item.manual || 0,
-            item.sms || 0,
-            item.weChat || 0,
-          ],
-          rowIndex + 4
-        );
-
-        // 搴旂敤鏁版嵁琛屾牱寮�
-        dataRow.eachCell((cell) => {
-          cell.style = cellStyle;
-        });
-        dataRow.height = 24;
-      });
-
-      // 7. 娣诲姞鍚堣琛�
-      const summaries = this.getFirstFollowUpSummaries(data);
-      const summaryRow = worksheet.addRow(summaries);
-      summaryRow.eachCell((cell, colNumber) => {
-        cell.style = summaryStyle;
-        if (colNumber === 1) {
-          cell.value = "鍚堣";
-        }
-      });
-      summaryRow.height = 28;
-
-      // 8. 璁剧疆鍒楀
-      worksheet.columns = [
-        { width: 8 }, // 灞曞紑鍒�
-        { width: 20 }, // 鍑洪櫌鐥呭尯
-        { width: 15 }, // 绉戝
-        { width: 12 }, // 鍑洪櫌浜烘
-        { width: 12 }, // 鏃犻渶闅忚浜烘
-        { width: 12 }, // 搴旈殢璁夸汉娆�
-        // 棣栨鍑洪櫌闅忚鍒�
-        { width: 10 }, // 闇�闅忚
-        { width: 10 }, // 寰呴殢璁�
-        { width: 10 }, // 闅忚鎴愬姛
-        { width: 10 }, // 闅忚澶辫触
-        { width: 12 }, // 闅忚鐜�
-        { width: 12 }, // 鍙婃椂鐜�
-        { width: 8 }, // 浜哄伐
-        { width: 8 }, // 鐭俊
-        { width: 8 }, // 寰俊
-      ];
-    },
-
-    /** 棣栨闅忚鏁版嵁鍚堣琛岃绠� */
-    getFirstFollowUpSummaries(data) {
-      const summaries = [
-        "鍚堣",
-        "/",
-        "/",
-        0,
-        0,
-        0,
-        0,
-        0,
-        0,
-        0,
-        "0%",
-        "0%",
-        0,
-        0,
-        0,
-      ];
-
-      data.forEach((item) => {
-        // 鏁板�煎瓧娈垫眰鍜�
-        summaries[3] += Number(item.dischargeCount) || 0;
-        summaries[4] += Number(item.nonFollowUp) || 0;
-        summaries[5] += Number(item.followUpNeeded) || 0;
-        summaries[6] += Number(item.needFollowUp) || 0;
-        summaries[7] += Number(item.pendingFollowUp) || 0;
-        summaries[8] += Number(item.followUpSuccess) || 0;
-        summaries[9] += Number(item.followUpFail) || 0;
-        summaries[12] += Number(item.manual) || 0;
-        summaries[13] += Number(item.sms) || 0;
-        summaries[14] += Number(item.weChat) || 0;
-      });
-
-      // 璁$畻鐧惧垎姣斿瓧娈电殑骞冲潎鍊�
-      const followUpRateValues = data
-        .map((item) => this.extractPercentageValue(item.followUpRate))
-        .filter((value) => value !== null);
-
-      const rateValues = data
-        .map((item) => this.extractPercentageValue(item.rate))
-        .filter((value) => value !== null);
-
-      if (followUpRateValues.length > 0) {
-        const avgFollowUpRate =
-          followUpRateValues.reduce((sum, val) => sum + val, 0) /
-          followUpRateValues.length;
-        summaries[10] = (avgFollowUpRate * 100).toFixed(2) + "%";
-      }
-
-      if (rateValues.length > 0) {
-        const avgRate =
-          rateValues.reduce((sum, val) => sum + val, 0) / rateValues.length;
-        summaries[11] = (avgRate * 100).toFixed(2) + "%";
-      }
-
-      // 鏍煎紡鍖栨暟瀛�
-      summaries[3] = this.formatNumber(summaries[3]);
-      summaries[4] = this.formatNumber(summaries[4]);
-      summaries[5] = this.formatNumber(summaries[5]);
-      summaries[6] = this.formatNumber(summaries[6]);
-      summaries[7] = this.formatNumber(summaries[7]);
-      summaries[8] = this.formatNumber(summaries[8]);
-      summaries[9] = this.formatNumber(summaries[9]);
-      summaries[12] = this.formatNumber(summaries[12]);
-      summaries[13] = this.formatNumber(summaries[13]);
-      summaries[14] = this.formatNumber(summaries[14]);
-
-      return summaries;
-    },
-
-    /** 鏋勫缓鍐嶆闅忚瀵煎嚭琛ㄦ牸 */
-    buildSecondFollowUpExportSheet(worksheet, data, sheetNameSuffix) {
-      const titleStyle = {
-        font: {
-          name: "寰蒋闆呴粦",
-          size: 16,
-          bold: true,
-          color: { argb: "FF000000" },
-        },
-        fill: {
-          type: "pattern",
-          pattern: "solid",
-          fgColor: { argb: "FFE6F3FF" },
-        },
-        alignment: { vertical: "middle", horizontal: "center", wrapText: true },
-        border: {
-          top: { style: "thin", color: { argb: "FFD0D0D0" } },
-          left: { style: "thin", color: { argb: "FFD0D0D0" } },
-          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
-          right: { style: "thin", color: { argb: "FFD0D0D0" } },
-        },
-      };
-
-      const headerStyle = {
-        font: {
-          name: "寰蒋闆呴粦",
-          size: 11,
-          bold: true,
-          color: { argb: "FF000000" },
-        },
-        fill: {
-          type: "pattern",
-          pattern: "solid",
-          fgColor: { argb: "FFF5F7FA" },
-        },
-        alignment: { vertical: "middle", horizontal: "center", wrapText: true },
-        border: {
-          top: { style: "thin", color: { argb: "FFD0D0D0" } },
-          left: { style: "thin", color: { argb: "FFD0D0D0" } },
-          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
-          right: { style: "thin", color: { argb: "FFD0D0D0" } },
-        },
-      };
-
-      const cellStyle = {
-        font: { name: "瀹嬩綋", size: 10, color: { argb: "FF000000" } },
-        alignment: { vertical: "middle", horizontal: "center" },
-        border: {
-          top: { style: "thin", color: { argb: "FFD0D0D0" } },
-          left: { style: "thin", color: { argb: "FFD0D0D0" } },
-          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
-          right: { style: "thin", color: { argb: "FFD0D0D0" } },
-        },
-      };
-
-      const summaryStyle = {
-        font: {
-          name: "瀹嬩綋",
-          size: 10,
-          bold: true,
-          color: { argb: "FF409EFF" },
-        },
-        fill: {
-          type: "pattern",
-          pattern: "solid",
-          fgColor: { argb: "FFF5F7FA" },
-        },
-        alignment: { vertical: "middle", horizontal: "center" },
-        border: {
-          top: { style: "thin", color: { argb: "FFD0D0D0" } },
-          left: { style: "thin", color: { argb: "FFD0D0D0" } },
-          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
-          right: { style: "thin", color: { argb: "FFD0D0D0" } },
-        },
-      };
-
-      // 1. 娣诲姞鎬绘爣棰樿
-      worksheet.mergeCells(1, 1, 1, 15); // 鍚堝苟A1鍒癘1
-      const titleCell = worksheet.getCell(1, 1);
-      titleCell.value = `鍐嶆鍑洪櫌闅忚缁熻琛╛${sheetNameSuffix}`;
-      titleCell.style = titleStyle;
-      worksheet.getRow(1).height = 35;
-
-      // 2. 鍒涘缓琛ㄥご
-      const secondRowHeaders = [
-        "", // A2 灞曞紑鍒楀崰浣�
-        "鍑洪櫌鐥呭尯",
-        "绉戝",
-        "鍑洪櫌浜烘",
-        "鏃犻渶闅忚浜烘",
-        "搴旈殢璁夸汉娆�", // B2 to F2
-        // 鍐嶆鍑洪櫌闅忚瀛愯〃澶�
-        "闇�闅忚",
-        "寰呴殢璁�",
-        "闅忚鎴愬姛",
-        "闅忚澶辫触",
-        "闅忚鐜�",
-        "浜哄伐",
-        "鐭俊",
-        "寰俊",
-      ];
-
-      // 娣诲姞绗簩琛�
-      secondRowHeaders.forEach((header, index) => {
-        const cell = worksheet.getCell(3, index + 1);
-        cell.value = header;
-        cell.style = headerStyle;
-      });
-
-      // 3. 鍚堝苟鍗曞厓鏍�
-      // 鍚堝苟 A2:A3, B2:B3, C2:C3, D2:D3, E2:E3, F2:F3
-      for (let i = 1; i <= 6; i++) {
-        worksheet.mergeCells(2, i, 3, i);
-        const cell = worksheet.getCell(2, i);
-        cell.style = headerStyle;
-      }
-
-      // 璁剧疆绗竴琛屽悎骞跺崟鍏冩牸鐨勫��
-      worksheet.getCell(2, 1).value = "";
-      worksheet.getCell(2, 2).value = "鍑洪櫌鐥呭尯";
-      worksheet.getCell(2, 3).value = "绉戝";
-      worksheet.getCell(2, 4).value = "鍑洪櫌浜烘";
-      worksheet.getCell(2, 5).value = "鏃犻渶闅忚浜烘";
-      worksheet.getCell(2, 6).value = "搴旈殢璁夸汉娆�";
-
-      // 4. 鍚堝苟"鍐嶆鍑洪櫌闅忚"鏍囬
-      worksheet.mergeCells(2, 7, 2, 14); // G2:N2
-      worksheet.getCell(2, 7).value = "鍐嶆鍑洪櫌闅忚";
-      worksheet.getCell(2, 7).style = headerStyle;
-
-      // 5. 璁剧疆琛岄珮
-      worksheet.getRow(2).height = 28;
-      worksheet.getRow(3).height = 25;
-
-      // 6. 娣诲姞鏁版嵁琛�
-      data.forEach((item, rowIndex) => {
-        const dataRow = worksheet.addRow(
-          [
-            "", // 灞曞紑鍒�
-            item.leavehospitaldistrictname || "",
-            item.deptname || "",
-            item.dischargeCount || 0,
-            item.nonFollowUp || 0,
-            item.followUpNeeded || 0,
-            // 鍐嶆鍑洪櫌闅忚鏁版嵁
-            item.needFollowUpAgain || 0,
-            item.pendingFollowUpAgain || 0,
-            item.followUpSuccessAgain || 0,
-            item.followUpFailAgain || 0,
-            item.followUpRateAgain || "0%",
-            item.manualAgain || 0,
-            item.smsAgain || 0,
-            item.weChatAgain || 0,
-          ],
-          rowIndex + 4
-        );
-
-        // 搴旂敤鏁版嵁琛屾牱寮�
-        dataRow.eachCell((cell) => {
-          cell.style = cellStyle;
-        });
-        dataRow.height = 24;
-      });
-
-      // 7. 娣诲姞鍚堣琛�
-      const summaries = this.getSecondFollowUpSummaries(data);
-      const summaryRow = worksheet.addRow(summaries);
-      summaryRow.eachCell((cell, colNumber) => {
-        cell.style = summaryStyle;
-        if (colNumber === 1) {
-          cell.value = "鍚堣";
-        }
-      });
-      summaryRow.height = 28;
-
-      // 8. 璁剧疆鍒楀
-      worksheet.columns = [
-        { width: 8 }, // 灞曞紑鍒�
-        { width: 20 }, // 鍑洪櫌鐥呭尯
-        { width: 15 }, // 绉戝
-        { width: 12 }, // 鍑洪櫌浜烘
-        { width: 12 }, // 鏃犻渶闅忚浜烘
-        { width: 12 }, // 搴旈殢璁夸汉娆�
-        // 鍐嶆鍑洪櫌闅忚鍒�
-        { width: 10 }, // 闇�闅忚
-        { width: 10 }, // 寰呴殢璁�
-        { width: 10 }, // 闅忚鎴愬姛
-        { width: 10 }, // 闅忚澶辫触
-        { width: 12 }, // 闅忚鐜�
-        { width: 8 }, // 浜哄伐
-        { width: 8 }, // 鐭俊
-        { width: 8 }, // 寰俊
-      ];
-    },
-
-    /** 鍐嶆闅忚鏁版嵁鍚堣琛岃绠� */
-    getSecondFollowUpSummaries(data) {
-      const summaries = ["鍚堣", "/", "/", 0, 0, 0, 0, 0, 0, 0, "0%", 0, 0, 0];
-
-      data.forEach((item) => {
-        // 鏁板�煎瓧娈垫眰鍜�
-        summaries[3] += Number(item.dischargeCount) || 0;
-        summaries[4] += Number(item.nonFollowUp) || 0;
-        summaries[5] += Number(item.followUpNeeded) || 0;
-        summaries[6] += Number(item.needFollowUpAgain) || 0;
-        summaries[7] += Number(item.pendingFollowUpAgain) || 0;
-        summaries[8] += Number(item.followUpSuccessAgain) || 0;
-        summaries[9] += Number(item.followUpFailAgain) || 0;
-        summaries[11] += Number(item.manualAgain) || 0;
-        summaries[12] += Number(item.smsAgain) || 0;
-        summaries[13] += Number(item.weChatAgain) || 0;
-      });
-
-      // 璁$畻闅忚鐜囩櫨鍒嗘瘮瀛楁鐨勫钩鍧囧��
-      const followUpRateAgainValues = data
-        .map((item) => this.extractPercentageValue(item.followUpRateAgain))
-        .filter((value) => value !== null);
-
-      if (followUpRateAgainValues.length > 0) {
-        const avgFollowUpRateAgain =
-          followUpRateAgainValues.reduce((sum, val) => sum + val, 0) /
-          followUpRateAgainValues.length;
-        summaries[10] = (avgFollowUpRateAgain * 100).toFixed(2) + "%";
-      }
-
-      // 鏍煎紡鍖栨暟瀛�
-      summaries[3] = this.formatNumber(summaries[3]);
-      summaries[4] = this.formatNumber(summaries[4]);
-      summaries[5] = this.formatNumber(summaries[5]);
-      summaries[6] = this.formatNumber(summaries[6]);
-      summaries[7] = this.formatNumber(summaries[7]);
-      summaries[8] = this.formatNumber(summaries[8]);
-      summaries[9] = this.formatNumber(summaries[9]);
-      summaries[11] = this.formatNumber(summaries[11]);
-      summaries[12] = this.formatNumber(summaries[12]);
-      summaries[13] = this.formatNumber(summaries[13]);
-
-      return summaries;
-    },
-
-    /** 鍐嶆闅忚琛ㄦ牸鐨勫悎璁¤璁$畻鏂规硶 */
-    getSummariesSecond(param) {
-      const { columns, data } = param;
-      const sums = [];
-
-      columns.forEach((column, index) => {
-        if (index === 0) {
-          sums[index] = "鍚堣";
-          return;
-        }
-        if (index === 1 || index === 2) {
-          sums[index] = "/";
-          return;
-        }
-
-        if (column.property === "followUpRateAgain") {
-          const percentageValues = data
-            .map((item) => {
-              const value = item[column.property];
-              if (!value || value === "-" || value === "0%") return null;
-              if (typeof value === "string" && value.includes("%")) {
-                const numValue = parseFloat(value.replace("%", "")) / 100;
-                return isNaN(numValue) ? null : numValue;
-              } else {
-                const numValue = parseFloat(value);
-                return isNaN(numValue) ? null : numValue;
-              }
-            })
-            .filter((value) => value !== null && value !== 0);
-
-          if (percentageValues.length > 0) {
-            const average =
-              percentageValues.reduce((sum, value) => sum + value, 0) /
-              percentageValues.length;
-            sums[index] = (average * 100).toFixed(2) + "%";
-          } else {
-            sums[index] = "0.00%";
-          }
-        } else {
-          const values = data.map((item) => {
-            const value = item[column.property];
-            if (value === "-" || value === "" || value === null) return 0;
-            return Number(value) || 0;
-          });
-
-          if (!values.every((value) => isNaN(value))) {
-            sums[index] = values.reduce((prev, curr) => prev + curr, 0);
-            sums[index] = this.formatNumber(sums[index]);
-          } else {
-            sums[index] = "-";
-          }
-        }
-      });
-
-      return sums;
-    },
-    /** 鍐嶆闅忚鍐呴儴琛ㄦ牸鍚堣琛岃绠楁柟娉� */
-    getInnerSummariesSecond(param) {
-      const { columns, data } = param;
-      const sums = [];
-
-      columns.forEach((column, index) => {
-        if (index === 0) {
-          sums[index] = "灏忚";
-          return;
-        }
-
-        if (column.property === "drname" || column.property === "deptname") {
-          sums[index] = "-";
-          return;
-        }
-
-        if (column.property === "followUpRateAgain") {
-          const percentageValues = data
-            .map((item) => {
-              const value = item[column.property];
-              if (!value || value === "-" || value === "0%") return null;
-              if (typeof value === "string" && value.includes("%")) {
-                const numValue = parseFloat(value.replace("%", "")) / 100;
-                return isNaN(numValue) ? null : numValue;
-              } else {
-                const numValue = parseFloat(value);
-                return isNaN(numValue) ? null : numValue;
-              }
-            })
-            .filter((value) => value !== null && value !== 0);
-
-          if (percentageValues.length > 0) {
-            const average =
-              percentageValues.reduce((sum, value) => sum + value, 0) /
-              percentageValues.length;
-            sums[index] = (average * 100).toFixed(2) + "%";
-          } else {
-            sums[index] = "0.00%";
-          }
-        } else {
-          const values = data.map((item) => {
-            const value = item[column.property];
-            if (value === "-" || value === "" || value === null) return 0;
-            return Number(value) || 0;
-          });
-
-          if (!values.every((value) => isNaN(value))) {
-            sums[index] = values.reduce((prev, curr) => prev + curr, 0);
-            sums[index] = this.formatNumber(sums[index]);
-          } else {
-            sums[index] = "-";
-          }
-        }
-      });
-
-      return sums;
-    },
-    /** 鍐嶆闅忚琛ㄦ牸鐨勮鐐瑰嚮灞曞紑 */
-    handleRowClickSecond(row) {
-      if (this.expandsSecond.includes(this.getRowKey(row))) {
-        this.expandsSecond = [];
-        return;
-      }
-
-      const params = {
-        ...this.queryParams,
-        deptcodes: this.queryParams.deptcodes.includes("all")
-          ? this.allDeptCodes
-          : this.queryParams.deptcodes,
-        leavehospitaldistrictcodes: [row.leavehospitaldistrictcode],
-        drcode: "1",
-        visitCount: 2, // 璁剧疆涓哄啀娆¢殢璁�
-      };
-
-      delete params.leavehospitaldistrictcodes.all;
-      delete params.deptcodes.all;
-
-      if (!row.doctorStats) {
-        this.loadingSecond = true;
-        getSfStatistics(params).then((res) => {
-          this.$set(row, "doctorStats", res.data);
-          this.expandsSecond = [this.getRowKey(row)];
-          this.loadingSecond = false;
-        });
-      } else {
-        this.expandsSecond = [this.getRowKey(row)];
-      }
-    },
-
-    /** 鍐嶆闅忚琛ㄦ牸鐨勫閫夋閫変腑鏁版嵁 */
-    handleSelectionChangeSecond(selection) {
-      this.idsSecond = selection.map((item) => item.tagid);
-      this.single = selection.length != 1;
-      this.multiple = !selection.length;
-    },
-    // 鏄剧ず鍥捐〃寮圭獥
-
-    showChartDialog() {
-      this.chartDialogVisible = true;
-      this.$nextTick(() => {
-        this.initPieChart();
-        this.initBarLineChart();
-      });
-    },
-    // 鍦╩ethods涓慨鏀圭粺璁℃柟娉�
-    showChartDialog() {
-      this.chartDialogVisible = true;
-      this.$nextTick(() => {
-        console.log(this.userList, "this.userList");
-
-        this.initCharts();
-      });
-    },
-
-    // 鏂板鍒濆鍖栧浘琛ㄦ柟娉�
-    initCharts() {
-      this.initPieChart();
-      this.initBarLineChart();
-    },
-
-    // 鍒濆鍖栭ゼ鍥�
-    initPieChart() {
-      const echarts = require("echarts");
-      const pieDom = document.getElementById("pieChart");
-      if (!pieDom) return;
-
-      if (this.pieChart) {
-        this.pieChart.dispose();
-      }
-
-      this.pieChart = echarts.init(pieDom);
-
-      // 璁$畻楗煎浘鏁版嵁
-      const followUpData = {
-        pending: 0,
-        success: 0,
-        fail: 0,
-      };
-
-      this.userList.forEach((item) => {
-        followUpData.pending += item.pendingFollowUp || 0;
-        followUpData.success += item.followUpSuccess || 0;
-        followUpData.fail += item.followUpFail || 0;
-      });
-
-      // 浣跨敤鏇寸編瑙傜殑棰滆壊鏂规
-      const pieOption = {
-        title: {
-          text: "闅忚鐘舵�佸垎甯�",
-          left: "center",
-          textStyle: {
-            color: "#333",
-            fontSize: 16,
-          },
-        },
-        tooltip: {
-          trigger: "item",
-          formatter: "{a} <br/>{b}: {c} ({d}%)",
-        },
-        legend: {
-          orient: "vertical",
-          left: "left",
-          data: ["寰呴殢璁�", "闅忚鎴愬姛", "闅忚澶辫触"],
-          textStyle: {
-            color: "#666",
-          },
-        },
-        color: ["#FF9D4D", "#36B37E", "#FF5C5C"], // 鏂扮殑閰嶈壊鏂规
-        series: [
-          {
-            name: "闅忚鐘舵��",
-            type: "pie",
-            radius: ["40%", "70%"],
-            avoidLabelOverlap: true,
-            itemStyle: {
-              borderRadius: 10,
-              borderColor: "#fff",
-              borderWidth: 2,
-            },
-            label: {
-              show: true,
-              formatter: "{b}: {c} ({d}%)",
-              color: "#333",
-            },
-            emphasis: {
-              label: {
-                show: true,
-                fontSize: "18",
-                fontWeight: "bold",
-              },
-              itemStyle: {
-                shadowBlur: 10,
-                shadowOffsetX: 0,
-                shadowColor: "rgba(0, 0, 0, 0.5)",
-              },
-            },
-            data: [
-              {
-                value: followUpData.pending,
-                name: "寰呴殢璁�",
-              },
-              {
-                value: followUpData.success,
-                name: "闅忚鎴愬姛",
-              },
-              {
-                value: followUpData.fail,
-                name: "闅忚澶辫触",
-              },
-            ],
-          },
-        ],
-      };
-
-      this.pieChart.setOption(pieOption);
-      window.addEventListener("resize", this.resizePieChart);
-    },
-
-    // 鍒濆鍖栨煴鐘舵姌绾垮浘
-    initBarLineChart() {
-      const echarts = require("echarts");
-      const barDom = document.getElementById("barLineChart");
-      if (!barDom) return;
-
-      if (this.barLineChart) {
-        this.barLineChart.dispose();
-      }
-
-      this.barLineChart = echarts.init(barDom);
-
-      // 鍑嗗鏁版嵁
-      const categories = this.userList.map(
-        (item) => item.leavehospitaldistrictname || item.deptname
-      );
-
-      const dischargeData = this.userList.map(
-        (item) => item.dischargeCount || 0
-      );
-      const followUpData = this.userList.map(
-        (item) => item.followUpNeeded || 0
-      );
-
-      // 鏂板涓ゆ潯鎶樼嚎鏁版嵁
-      const followUpRateData = this.userList.map((item) => {
-        if (!item.followUpRate) return 0;
-        // 鍘绘帀鐧惧垎鍙峰苟杞负鏁板瓧
-        const rateStr = String(item.followUpRate).replace("%", "");
-        return parseFloat(rateStr) || 0;
-      });
-
-      const timelyRateData = this.userList.map((item) =>
-        item.rate ? (Number(item.rate) * 100).toFixed(2) : 0
-      );
-
-      const option = {
-        title: {
-          text: "绉戝/鐥呭尯闅忚瓒嬪娍",
-          left: "center",
-          textStyle: {
-            color: "#333",
-            fontSize: 16,
-          },
-        },
-        tooltip: {
-          trigger: "axis",
-          axisPointer: {
-            type: "cross",
-            crossStyle: {
-              color: "#999",
-            },
-          },
-        },
-        legend: {
-          data: ["鍑洪櫌浜烘", "搴旈殢璁夸汉娆�", "闅忚鐜�(%)", "鍙婃椂鐜�(%)"],
-          top: "bottom",
-          textStyle: {
-            color: "#666",
-          },
-        },
-        color: ["#5470C6", "#91CC75", "#EE6666", "#9A60B4"], // 鏂板绱壊鐢ㄤ簬鍙婃椂鐜�
-        xAxis: {
-          type: "category",
-          data: categories,
-          axisLabel: {
-            interval: 0,
-            rotate: 30,
-            color: "#666",
-          },
-          axisLine: {
-            lineStyle: {
-              color: "#ddd",
-            },
-          },
-        },
-        yAxis: [
-          {
-            type: "value",
-            name: "浜烘",
-            min: 0,
-            axisLabel: {
-              color: "#666",
-            },
-            axisLine: {
-              lineStyle: {
-                color: "#ddd",
-              },
-            },
-            splitLine: {
-              lineStyle: {
-                color: "#f0f0f0",
-              },
-            },
-          },
-          {
-            type: "value",
-            name: "鐧惧垎姣�(%)",
-            min: 0,
-            max: 100,
-            axisLabel: {
-              color: "#666",
-              formatter: "{value}%",
-            },
-            axisLine: {
-              lineStyle: {
-                color: "#ddd",
-              },
-            },
-            splitLine: {
-              show: false,
-            },
-          },
-        ],
-        series: [
-          {
-            name: "鍑洪櫌浜烘",
-            type: "bar",
-            barWidth: "25%",
-            data: dischargeData,
-            itemStyle: {
-              borderRadius: [4, 4, 0, 0],
-            },
-          },
-          {
-            name: "搴旈殢璁夸汉娆�",
-            type: "bar",
-            barWidth: "25%",
-            data: followUpData,
-            itemStyle: {
-              borderRadius: [4, 4, 0, 0],
-            },
-          },
-          {
-            name: "闅忚鐜�(%)",
-            type: "line",
-            yAxisIndex: 1,
-            data: followUpRateData,
-            symbolSize: 8,
-            lineStyle: {
-              width: 3,
-            },
-            markLine: {
-              silent: true,
-              data: [
-                {
-                  yAxis: 80,
-                  lineStyle: {
-                    color: "#EE6666",
-                    type: "dashed",
-                  },
-                  // label: {
-                  //   position: 'end',
-                  //   formatter: '鐩爣80%'
-                  // }
-                },
-              ],
-            },
-          },
-          {
-            name: "鍙婃椂鐜�(%)",
-            type: "line",
-            yAxisIndex: 1,
-            data: timelyRateData,
-            symbolSize: 8,
-            lineStyle: {
-              width: 3,
-              type: "dotted", // 浣跨敤铏氱嚎鍖哄垎
-            },
-            markLine: {
-              silent: true,
-              data: [
-                {
-                  yAxis: 90,
-                  lineStyle: {
-                    color: "#9A60B4",
-                    type: "dashed",
-                  },
-                  // label: {
-                  //   position: 'end',
-                  //   formatter: '鐩爣90%'
-                  // }
-                },
-              ],
-            },
-          },
-        ],
-        grid: {
-          top: "15%",
-          left: "3%",
-          right: "4%",
-          bottom: "15%",
-          containLabel: true,
-        },
-      };
-
-      this.barLineChart.setOption(option);
-      window.addEventListener("resize", this.resizeBarLineChart);
-    },
-
-    // 鍥捐〃鍝嶅簲寮忚皟鏁存柟娉�
-    resizePieChart() {
-      if (this.pieChart) {
-        this.pieChart.resize();
-      }
-    },
-
-    resizeBarLineChart() {
-      if (this.barLineChart) {
-        this.barLineChart.resize();
-      }
-    },
-
-    // 鍦ㄧ粍浠堕攢姣佹椂娓呯悊
-    beforeDestroy() {
-      // 绉婚櫎浜嬩欢鐩戝惉
-      window.removeEventListener("resize", this.resizePieChart);
-      window.removeEventListener("resize", this.resizeBarLineChart);
-
-      // 閿�姣佸浘琛ㄥ疄渚�
-      if (this.pieChart) {
-        this.pieChart.dispose();
-        this.pieChart = null;
-      }
-      if (this.barLineChart) {
-        this.barLineChart.dispose();
-        this.barLineChart = null;
-      }
-    },
-  },
-};
-</script>
-
-<style lang="scss" scoped>
-::v-deep .el-tabs__header {
-  margin-bottom: 20px;
-}
-
-::v-deep .el-tabs__item {
-  font-size: 16px;
-  padding: 0 20px;
-  height: 40px;
-  line-height: 40px;
-}
-
-::v-deep .el-tabs__active-bar {
-  height: 3px;
-}
-
-/* Tab鍐呭鍖哄煙鏍峰紡 */
-.el-tab-pane {
-  .your-table-container {
-    margin-top: 10px;
-  }
-}
-
-.sidecolumn {
-  width: 180px;
-  min-height: 100vh;
-  text-align: center;
-  //   display: flex;
-  margin-top: 20px;
-  margin: 20px;
-  padding: 30px;
-  background: #edf1f7;
-  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);
-
-  .sidecolumn-top {
-    display: flex;
-    justify-content: space-between;
-
-    .top-wj {
-      font-size: 20px;
-    }
-
-    .top-tj {
-      font-size: 18px;
-
-      color: rgb(0, 89, 255);
-      cursor: pointer;
-    }
-  }
-
-  .center-ss {
-    margin-top: 30px;
-
-    .input-with-select {
-      height: 40px !important;
-    }
-  }
-
-  .bottom-fl {
-    margin-top: 30px;
-    display: center !important;
-  }
-}
-
-.qrcode-dialo {
-  text-align: center;
-  //   display: flex;
-  margin: 20px;
-  padding: 30px;
-  background: #edf1f7;
-  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);
-
-  .qrcode-text {
-    font-size: 20px;
-
-    span {
-      margin-left: 20px;
-    }
-  }
-
-  .qrcode-img {
-    width: 300px;
-    height: 400px;
-  }
-}
-
-::v-deep.el-tabs--left,
-.el-tabs--right {
-  overflow: hidden;
-  align-items: center;
-  display: flex;
-}
-
-::v-deep.el-input--medium .el-input__inner {
-  height: 40px !important;
-}
-
-::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
-  height: 40px;
-  width: 5px;
-  left: 0;
-}
-
-::v-deep.el-tabs--right .el-tabs__item.is-right {
-  display: block;
-  text-align: left;
-  font-size: 20px;
-}
-
-// 缇庡寲鍚堣琛屾牱寮�
-::v-deep .el-table__footer {
-  .el-table__cell {
-    background-color: #f5f7fa;
-    font-weight: 600;
-    color: #409eff;
-
-    .cell {
-      font-weight: 600;
-      color: #409eff;
-    }
-  }
-}
-
-// 鍐呴儴琛ㄦ牸鍚堣琛屾牱寮�
-::v-deep .inner-table .el-table__footer {
-  .el-table__cell {
-    background-color: #ecf5ff;
-    font-weight: 500;
-    color: #67c23a;
-
-    .cell {
-      font-weight: 500;
-      color: #67c23a;
-    }
-  }
-}
-
-// 鐧惧垎姣斿瓧娈电壒娈婃牱寮�
-.your-table-container
-  ::v-deep
-  .el-table__footer
-  .el-table__cell[data-field="followUpRate"]
-  .cell,
-.your-table-container
-  ::v-deep
-  .el-table__footer
-  .el-table__cell[data-field="rate"]
-  .cell,
-.your-table-container
-  ::v-deep
-  .el-table__footer
-  .el-table__cell[data-field="followUpRateAgain"]
-  .cell {
-  color: #e6a23c !important;
-  font-weight: 700 !important;
-}
-
-.leftvlue {
-  //   display: flex;
-  //   flex: 1;
-  // width: 80%;
-  // margin-top: 20px;
-  margin: 20px;
-  padding: 30px;
-  background: #ffff;
-  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);
-
-  .mulsz {
-    font-size: 20px;
-  }
-}
-
-/* 浣胯鏈夋墜鍨嬫寚閽� */
-.el-table__row {
-  cursor: pointer;
-}
-
-/* 鍐呭眰鍖荤敓琛ㄦ牸鏍峰紡 */
-.inner-table {
-  // 琛ㄥご鑳屾櫙鑹�
-  ::v-deep .el-table__header-wrapper {
-    background-color: #f0f7ff !important;
-
-    th {
-      background-color: #f0f7ff !important;
-    }
-  }
-
-  // 琛ㄦ牸琛岃儗鏅壊
-  ::v-deep .el-table__body-wrapper {
-    tr {
-      background-color: #f9fbfe !important;
-
-      &:hover {
-        background-color: #e6f1ff !important;
-      }
-    }
-  }
-
-  // 杈规棰滆壊
-  ::v-deep .el-table--border {
-    border-color: #d9e8ff !important;
-
-    td,
-    th {
-      border-color: #d9e8ff !important;
-    }
-  }
-
-  // 鏂戦┈绾规晥鏋�
-  ::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td {
-    background-color: #f5f9ff !important;
-  }
-}
-
-/* 灞曞紑琛屾牱寮� */
-.el-table__expanded-cell {
-  padding: 10px 0 !important;
-  background: #f8f8f8;
-}
-
-.document {
-  width: 100px;
-  height: 50px;
-}
-
-.data-list {
-  max-height: 800px;
-  overflow-y: auto;
-}
-
-.documentf {
-  display: flex;
-  justify-content: flex-end;
-}
-
-.button-text {
-  color: rgb(70, 204, 238);
-}
-
-.button-textck {
-  color: rgb(39, 167, 67);
-}
-
-.button-textxg {
-  color: rgb(35, 81, 233);
-}
-
-.button-textsc {
-  color: rgb(235, 23, 23);
-}
-</style>
diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
index 9171a12..9fdb102 100644
--- a/src/views/sfstatistics/percentage/index.vue
+++ b/src/views/sfstatistics/percentage/index.vue
@@ -70,6 +70,25 @@
           </el-select>
         </el-form-item>
 
+        <el-form-item label="浠诲姟" prop="taskIds">
+          <el-select
+            v-model="queryParams.taskIds"
+            multiple
+            filterable
+            clearable
+            collapse-tags
+            placeholder="璇烽�夋嫨浠诲姟"
+            style="width: 220px"
+          >
+            <el-option
+              v-for="item in taskList"
+              :key="item.taskid"
+              :label="item.taskName"
+              :value="item.taskid"
+            />
+          </el-select>
+        </el-form-item>
+
         <el-form-item label-width="200" label="搴旈殢璁挎椂闂磋寖鍥�" prop="userName">
           <el-date-picker
             v-model="queryParams.dateRange"
@@ -230,7 +249,7 @@
 import DetailDialog from "./components/DetailDialog.vue";
 import TimelyRateDialog from "./components/TimelyRateDialog.vue";
 import CombinedFollowUp from "./components/CombinedFollowUp.vue";
-import { getSfStatisticsHyperlink } from "@/api/AiCentre/index";
+import { getSfStatisticsHyperlink, getTasklist } from "@/api/AiCentre/index";
 
 export default {
   name: "Percentage",
@@ -254,8 +273,11 @@
       options: this.$store.getters.tasktypes,
       queryParams: {
         serviceType: [2],
-        dateRange: [],
-        dateRangecy: this.getLastMonthRange(),
+        dateRange:
+          localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌"
+            ? this.getLastMonthRange()
+            : [],
+        dateRangecy: '',
         statisticaltype:
           localStorage.getItem("orgname") == "缂欎簯鍘夸汉姘戝尰闄�" ||
           localStorage.getItem("orgname") == "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�"
@@ -263,6 +285,7 @@
             : 1,
         leavehospitaldistrictcodes: ["all"],
         deptcodes: ["all"],
+        taskIds: [],
       },
       pickerOptions: {
         shortcuts: [
@@ -297,6 +320,7 @@
       },
       flatArrayhospit: [],
       flatArraydept: [],
+      taskList: [],
       allDeptCodes: [],
       allWardCodes: [],
       showSearch: true,
@@ -332,6 +356,15 @@
   },
   created() {
     this.getDeptTree();
+    // 褰撳墠鏈烘瀯涓轰附姘村競涓尰闄㈡椂锛屽簲闅忚鏃堕棿鑼冨洿榛樿鏈�杩戜竴涓湀骞剁洿鎺ュ簲鐢�
+    if (localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌") {
+      this.queryParams.startTime = this.parseTime(
+        this.queryParams.dateRange[0]
+      );
+      this.queryParams.endTime = this.parseTime(
+        this.queryParams.dateRange[1]
+      );
+    }
     this.loadCurrentTabData();
   },
   methods: {
@@ -360,6 +393,11 @@
 
       this.flatArraydept.push({ label: "鍏ㄩ儴", value: "all" });
       this.flatArrayhospit.push({ label: "鍏ㄩ儴", value: "all" });
+
+      // 浠诲姟鍒楄〃锛堢敤浜庝换鍔$瓫閫夛級
+      getTasklist({ pageNum: 1, pageSize: 100 }).then((response) => {
+        this.taskList = response.rows || [];
+      });
     },
     // 娣诲姞鑾峰彇鏈�杩戜竴涓湀鏃堕棿鑼冨洿鐨勬柟娉�
     getLastMonthRange() {
@@ -432,6 +470,7 @@
     resetQuery() {
       this.queryParams.dateRange = [];
       this.queryParams.leavehospitaldistrictcodes = [];
+      this.queryParams.taskIds = [];
       this.handleQuery();
     },
 
diff --git a/src/views/system/user/index.vue b/src/views/system/user/index.vue
index 987b5f7..9c5693e 100644
--- a/src/views/system/user/index.vue
+++ b/src/views/system/user/index.vue
@@ -199,14 +199,39 @@
             v-if="columns[2].visible"
             :show-overflow-tooltip="true"
           />
-          <!-- <el-table-column
-            label="閮ㄩ棬"
+          <el-table-column
+            label="绉戝"
             align="center"
-            key="deptName"
-            prop="dept.deptName"
+            key="deptNames"
             v-if="columns[3].visible"
             :show-overflow-tooltip="true"
-          /> -->
+          >
+            <template slot-scope="scope">
+              <span>{{ scope.row._deptNames || "-" }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="鐥呭尯"
+            align="center"
+            key="wardNames"
+            v-if="columns[7].visible"
+            :show-overflow-tooltip="true"
+          >
+            <template slot-scope="scope">
+              <span>{{ scope.row._wardNames || "-" }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="闄㈠尯"
+            align="center"
+            key="campusName"
+            v-if="columns[8].visible && (orgname === '绗竴浜烘皯鍖婚櫌婀栨花闄㈠尯' || orgname === '绗竴浜烘皯鍖婚櫌鍚村北闄㈠尯' || orgname === '绗竴浜烘皯鍖婚櫌鍩庝笢闄㈠尯')"
+            :show-overflow-tooltip="true"
+          >
+            <template slot-scope="scope">
+              <span>{{ scope.row._campusName || "-" }}</span>
+            </template>
+          </el-table-column>
           <el-table-column
             label="鎵嬫満鍙风爜"
             align="center"
@@ -552,6 +577,7 @@
   deptTreeSelect,
 } from "@/api/system/user";
 import { getToken } from "@/utils/auth";
+import { getorganization } from "@/api/AiCentre/index";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 import { type } from "jquery";
@@ -572,6 +598,8 @@
       multiple: true,
       // 鏄剧ず鎼滅储鏉′欢
       showSearch: true,
+      // 褰撳墠鏈烘瀯鍚嶇О
+      orgname: localStorage.getItem("orgname") || "",
       // 鎬绘潯鏁�
       total: 0,
       // 鐢ㄦ埛琛ㄦ牸鏁版嵁
@@ -581,6 +609,12 @@
       // 閮ㄩ棬鏍戦�夐」
       deptOptionsks: undefined,
       deptOptionsbq: undefined,
+      // 绉戝缂栫爜 -> 鍚嶇О鏄犲皠
+      deptNameMap: {},
+      // 鐥呭尯缂栫爜 -> 鍚嶇О鏄犲皠
+      wardNameMap: {},
+      // 闄㈠尯缂栫爜 -> 鍚嶇О鏄犲皠
+      campusNameMap: {},
       // 鏄惁鏄剧ず寮瑰嚭灞�
       open: false,
       // 閮ㄩ棬鍚嶇О
@@ -636,10 +670,12 @@
         { key: 0, label: `鐢ㄦ埛缂栧彿`, visible: true },
         { key: 1, label: `鐢ㄦ埛宸ュ彿`, visible: true },
         { key: 2, label: `鐢ㄦ埛鏄电О`, visible: true },
-        { key: 3, label: `閮ㄩ棬`, visible: true },
+        { key: 3, label: `绉戝`, visible: true },
         { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
         { key: 5, label: `鐘舵�乣, visible: true },
         { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
+        { key: 7, label: `鐥呭尯`, visible: true },
+        { key: 8, label: `闄㈠尯`, visible: true },
       ],
 
       // 琛ㄥ崟鏍¢獙
@@ -689,7 +725,6 @@
     },
   },
   created() {
-    this.getList();
     this.getDeptTree();
     this.getConfigKey("sys.user.initPassword").then((response) => {
       this.initPassword = response.msg;
@@ -712,6 +747,7 @@
         (response) => {
           this.userList = response.rows;
           this.total = response.total;
+          this.enrichUserDept();
           this.loading = false;
         }
       );
@@ -719,17 +755,74 @@
     /** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */
     getDeptTree() {
       // 绉戝鍒楄〃
-      deptTreeSelect(1).then((response) => {
+      const ksPromise = deptTreeSelect(1).then((response) => {
         this.deptOptionsks = response.data;
+        this.deptNameMap = this.flattenDeptTree(response.data);
       });
       // 鐥呭尯鍒楄〃
-      deptTreeSelect(2).then((response) => {
+      const bqPromise = deptTreeSelect(2).then((response) => {
         this.deptOptionsbq = response.data;
+        this.wardNameMap = this.flattenDeptTree(response.data);
       });
       // 闄㈠尯鍒楄〃
-      //  deptTreeSelect().then((response) => {
-      //   this.deptOptions = response.data;
-      // });
+      const campusPromise = getorganization({ pageSize: 100 }).then((res) => {
+        if (res.code == 200) {
+          (res.rows || []).forEach((item) => {
+            this.campusNameMap[String(item.organizationID)] =
+              item.organizationName;
+          });
+        }
+      });
+      // 绉戝/鐥呭尯/闄㈠尯鏄犲皠灏辩华鍚庡啀鍔犺浇鍒楄〃锛屼繚璇侀灞忚兘鏄剧ず鍚嶇О
+      Promise.all([ksPromise, bqPromise, campusPromise]).then(() => {
+        this.getList();
+      });
+    },
+    /** 灏嗙瀹�/鐥呭尯鏍戞媿骞充负 { deptCode: label } 鏄犲皠 */
+    flattenDeptTree(nodes) {
+      const map = {};
+      const walk = (list) => {
+        (list || []).forEach((node) => {
+          if (node.deptCode) {
+            map[node.deptCode] = node.label;
+          }
+          if (node.children && node.children.length) {
+            walk(node.children);
+          }
+        });
+      };
+      walk(nodes);
+      return map;
+    },
+    /** 鎶� hospInfo/deptInfo 涓殑缂栫爜杞垚鍚嶇О锛屽啓鍏ヨ鐨勫睍绀哄瓧娈� */
+    enrichUserDept() {
+      (this.userList || []).forEach((row) => {
+        row._deptNames = this.mapCodesToNames(row.hospInfo, this.deptNameMap);
+        row._wardNames = this.mapCodesToNames(row.deptInfo, this.wardNameMap);
+        row._campusName = this.campusNameMap[String(row.campusid)] || "-";
+      });
+    },
+    /** 瑙f瀽缂栫爜 JSON 骞舵槧灏勪负鍚嶇О锛氱骇鑱旇矾寰勫悇灞傜敤 "/" 杩炴帴锛屽鏉$敤 "銆�" 杩炴帴 */
+    mapCodesToNames(jsonStr, nameMap) {
+      if (!jsonStr || !nameMap) return "";
+      let data = [];
+      try {
+        data = JSON.parse(jsonStr);
+      } catch (e) {
+        return "";
+      }
+      if (!Array.isArray(data)) data = [data];
+      return data
+        .map((item) => {
+          // 绾ц仈澶氶�夌殑鍊兼槸鏁存潯璺緞锛堟暟缁勶級锛屾棫鏁版嵁鍙兘鏄崟涓紪鐮�
+          const path = Array.isArray(item) ? item : [item];
+          return path
+            .map((code) => nameMap[code] || code)
+            .filter(Boolean)
+            .join(" / ");
+        })
+        .filter(Boolean)
+        .join("銆�");
     },
     // 绛涢�夎妭鐐�
     filterNode(value, data) {
diff --git "a/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.3.zip" "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.3.zip"
new file mode 100644
index 0000000..3c9172a
--- /dev/null
+++ "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.3.zip"
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.4.zip" "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.4.zip"
new file mode 100644
index 0000000..9191b66
--- /dev/null
+++ "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.4.zip"
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5 \0502\051.zip" "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5 \0502\051.zip"
new file mode 100644
index 0000000..5b63048
--- /dev/null
+++ "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5 \0502\051.zip"
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5.zip" "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5.zip"
new file mode 100644
index 0000000..8847582
--- /dev/null
+++ "b/\351\232\217\350\256\277\351\200\202\347\224\250\344\270\275\346\260\264\345\270\202\344\270\20011.5.zip"
Binary files differ

--
Gitblit v1.9.3