From 6e7f546cc37ed57e7e2eda4fdfc32fa2b3e0160c Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期二, 20 十月 2026 17:41:10 +0800
Subject: [PATCH] 测试完成

---
 src/views/patient/archives/generateConfig/index.vue             |  814 ++++++++++++++++++++++++++++
 src/views/sfstatistics/percentage/components/SecondFollowUp.vue |  290 ++++++---
 dist (2).zip                                                    |    0 
 vue.config.js                                                   |    4 
 随访通用10.19 (2).zip                                               |    0 
 src/api/smartor/specificArchiveGenerateConfig.js                |   42 +
 src/views/sfstatistics/percentage/components/FirstFollowUp.vue  |  333 +++++++----
 src/views/patient/propaganda/QuestionnaireTask.vue              |   41 +
 src/views/followvisit/record/detailpage/index.vue               |   78 ++
 src/views/patient/patient/behospitalized.vue                    |   23 
 src/api/AiCentre/EChartsdata.js                                 |    7 
 随访通用10.19.zip                                                   |    0 
 src/views/patient/propaganda/particty.vue                       |   41 +
 src/views/outsideChainwtnew.vue                                 |   36 +
 src/views/patient/follow/index.vue                              |   17 
 15 files changed, 1,466 insertions(+), 260 deletions(-)

diff --git "a/dist \0502\051.zip" "b/dist \0502\051.zip"
new file mode 100644
index 0000000..ba4aac3
--- /dev/null
+++ "b/dist \0502\051.zip"
Binary files differ
diff --git a/src/api/AiCentre/EChartsdata.js b/src/api/AiCentre/EChartsdata.js
index 68c6352..135dd6f 100644
--- a/src/api/AiCentre/EChartsdata.js
+++ b/src/api/AiCentre/EChartsdata.js
@@ -82,6 +82,13 @@
     method: "get",
   });
 }
+// 闂嵎寰俊鎺ㄩ��
+export function weChatSubTask(Id) {
+  return request({
+    url: "/smartor/serviceSubtask/weChatSubTask/" + Id,
+    method: "get",
+  });
+}
 // 鍙戦�佺煭淇�
 export function getCurrentUserServiceSubtaskCount(data) {
   return request({
diff --git a/src/api/smartor/specificArchiveGenerateConfig.js b/src/api/smartor/specificArchiveGenerateConfig.js
new file mode 100644
index 0000000..ff37aca
--- /dev/null
+++ b/src/api/smartor/specificArchiveGenerateConfig.js
@@ -0,0 +1,42 @@
+import request from '@/utils/request'
+
+/**
+ * 涓撶妗f鐢熸垚閰嶇疆
+ * 鏂囨。锛氥�婁笓绉戞。妗堢敓鎴愰厤缃帴鍙f枃妗c��2026-10-19锛堝叡 3 涓帴鍙o級
+ * 搴撹〃锛歱at_specific_archive_generate_config锛堜笓绉戞。妗堢敓鎴愰厤缃〃锛�
+ *
+ * 閫氱敤绾﹀畾锛�
+ *   1. 涓変釜鎺ュ彛鍧囦负 POST锛岃姹備綋 Content-Type: application/json銆�
+ *   2. deptCodes / icd10Codes 鍦ㄦ暟鎹簱涓庡疄浣撲腑鍧囦负 String锛岃姹傛椂椤讳紶
+ *      杞箟鍚庣殑 JSON 瀛楃涓诧紙濡� "[\"D001\",\"D002\"]"锛夛紝涓嶈兘鐩存帴浼� JSON 鏁扮粍銆�
+ *   3. 鍒楄〃鏌ヨ鍥哄畾杩囨护 del_flag = '0'锛屽凡鍒犻櫎閰嶇疆涓嶄細杩斿洖銆�
+ *   4. orgid / campusid 鐢卞悗绔寜鐧诲綍鐢ㄦ埛鑷姩娉ㄥ叆锛屽墠绔笉鐢ㄤ紶銆�
+ *   5. 鏃堕棿鑼冨洿绛涢�夊彧鑳介�氳繃 params.beginTime / params.endTime 浼狅紝鎸� create_time 杩囨护銆�
+ */
+
+// 鏌ヨ涓撶妗f鐢熸垚閰嶇疆鍒楄〃
+export function listSpecificArchiveGenerateConfig(query) {
+  return request({
+    url: '/smartor/specificArchiveGenerateConfig/selectPatSpecificArchiveGenerateConfigList',
+    method: 'post',
+    data: query
+  })
+}
+
+// 鏂板鎴栦慨鏀逛笓绉戞。妗堢敓鎴愰厤缃紙鏈� id 涓旇褰曞瓨鍦ㄥ垯鏇存柊锛屽惁鍒欐柊澧烇級
+export function saveSpecificArchiveGenerateConfig(data) {
+  return request({
+    url: '/smartor/specificArchiveGenerateConfig/insertOrUpdatePatSpecificArchiveGenerateConfig',
+    method: 'post',
+    data: data
+  })
+}
+
+// 鎵归噺鍒犻櫎涓撶妗f鐢熸垚閰嶇疆锛堟寜 id 鏁扮粍閫昏緫鍒犻櫎 del_flag = '1'锛�
+export function batchDeleteSpecificArchiveGenerateConfig(ids) {
+  return request({
+    url: '/smartor/specificArchiveGenerateConfig/batchDelete',
+    method: 'post',
+    data: Array.isArray(ids) ? ids : String(ids).split(',')
+  })
+}
diff --git a/src/views/followvisit/record/detailpage/index.vue b/src/views/followvisit/record/detailpage/index.vue
index af3f348..d52a2b9 100644
--- a/src/views/followvisit/record/detailpage/index.vue
+++ b/src/views/followvisit/record/detailpage/index.vue
@@ -408,9 +408,20 @@
                         type="primary"
                         round
                         @click="smsSubTask"
-                        v-if="orgname != '鐪佺珛鍚屽痉缈犺嫅闄㈠尯'"
+                        v-if="
+                          orgname != '鐪佺珛鍚屽痉缈犺嫅闄㈠尯' &&
+                          orgname != '涓芥按甯備腑鍖婚櫌'
+                        "
                       >
                         闂嵎鐭俊鎺ㄩ��
+                      </el-button>
+                      <el-button
+                        type="primary"
+                        round
+                        @click="weChatSubTask"
+                        v-if="orgname == '涓芥按甯備腑鍖婚櫌'"
+                      >
+                        闂嵎寰俊鎺ㄩ��
                       </el-button>
                     </span>
                   </div>
@@ -1169,9 +1180,9 @@
       title="鎮h�呭啀娆¢殢璁�"
       v-dialogDrags
       :visible.sync="dialogFormVisible"
-      width="700px"
+      width="900px"
     >
-      <el-form ref="zcform" :rules="zcrules" :model="form" label-width="80px">
+      <el-form ref="zcform" :rules="zcrules" :model="form" label-width="120px">
         <!-- 鍩虹鏈嶅姟淇℃伅 - 榛樿鎶樺彔 -->
         <el-collapse v-model="activeNames" @change="handleCollapseChange">
           <el-collapse-item title="鍩虹鏈嶅姟淇℃伅" name="basic">
@@ -1271,6 +1282,13 @@
 
           <!-- 涓嬫闅忚淇℃伅 - 榛樿灞曞紑 -->
           <el-collapse-item title="涓嬫闅忚" name="next">
+            <el-form-item label="鍐嶆闅忚浠诲姟">
+              <el-input
+                disabled
+                v-model="nextTaskName"
+                placeholder="鍐嶆闅忚浠诲姟"
+              ></el-input>
+            </el-form-item>
             <el-row>
               <el-col :span="12">
                 <el-form-item label="闅忚鏂瑰紡" prop="visitType">
@@ -1317,6 +1335,12 @@
             </el-form-item>
             <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>
           </el-collapse-item>
         </el-collapse>
@@ -1365,8 +1389,10 @@
   query360PatInfonh,
   sendMsg,
   smsSubTask,
+  weChatSubTask,
   getconfigKey,
 } from "@/api/AiCentre/index";
+import { getIvrtask } from "@/api/smartor/ivrtask";
 import {
   messagelistpatient,
   alterpatient,
@@ -1516,6 +1542,7 @@
       input: "浠婂ぉ韬綋杩樹笉閿�",
       radio: "2",
       taskname: "",
+      nextTaskName: "",
       activeName: "wj",
       voice: "",
       templateid: "",
@@ -1611,6 +1638,9 @@
             },
             trigger: "change",
           },
+        ],
+        doctorOpinion: [
+          { required: true, message: "璇疯緭鍏ュ尰鐢熷鐞嗘剰瑙�", trigger: "blur" },
         ],
       },
       userrules: {
@@ -2329,6 +2359,22 @@
           console.log(err);
         });
     },
+    weChatSubTask() {
+      this.$modal
+        .confirm("鏄惁鍚戞偅鑰呴�氳繃寰俊鎺ㄩ�侀棶鍗峰唴瀹癸紵")
+        .then(() => {
+          weChatSubTask(this.id).then((res) => {
+            if (String(res.code) === "200") {
+              this.$modal.msgSuccess(res.msg || "鍙戦�佹垚鍔�");
+            } else {
+              this.$modal.msgError(res.message || res.msg || "鍙戦�佸け璐�");
+            }
+          });
+        })
+        .catch((err) => {
+          console.log(err);
+        });
+    },
     handleConfirmReplace() {
       // 閬嶅巻鎵�鏈夐鐩紙tableDatatop锛�
       this.tableDatatop.forEach((item) => {
@@ -2589,6 +2635,7 @@
           console.log(this.form.templatename, "templatename");
 
           this.form.remark = this.form.remark || "";
+          this.form.doctorOpinion = this.form.doctorOpinion || "";
           this.logsheetlist = res.rows[0].serviceSubtaskList;
           this.templateid = this.form.templateid;
           this.selectedTag = this.form.excep;
@@ -2778,8 +2825,29 @@
       return tag ? tag.description : "";
     },
 
+    // 鑾峰彇鍐嶆闅忚浠诲姟淇℃伅锛堜笅娆¢殢璁块儴鍒嗗睍绀猴級
+    fetchNextTaskInfo() {
+      const taskid = this.form.taskid || this.taskid;
+      if (!taskid) {
+        this.nextTaskName = "";
+        return;
+      }
+      getIvrtask(taskid).then((r) => {
+        const task = r.data || {};
+        const nextid = task.nexttaskid;
+        if (nextid) {
+          getIvrtask(nextid).then((r2) => {
+            this.nextTaskName =
+              (r2.data && r2.data.taskName) || task.nexttaskname || "";
+          });
+        } else {
+          this.nextTaskName = task.nexttaskname || "";
+        }
+      });
+    },
     // 璋冭捣鍐嶆鍙戦��
     sendAgain() {
+      this.fetchNextTaskInfo();
       getTaskservelist({
         patid: this.patid,
         visitCount: 2,
@@ -3720,14 +3788,14 @@
   margin-top: 20px;
 }
 
-.el-input.is-disabled .el-input__inner {
+::v-deep .el-input.is-disabled .el-input__inner {
   background-color: #fff;
   border-color: #dcdfe6;
   color: #080808 !important;
   cursor: not-allowed;
 }
 
-.el-textarea.is-disabled .el-textarea__inner {
+::v-deep .el-textarea.is-disabled .el-textarea__inner {
   background-color: #fff;
   border-color: #dcdfe6;
   color: #080808 !important;
diff --git a/src/views/outsideChainwtnew.vue b/src/views/outsideChainwtnew.vue
index f37bec9..8b61ffa 100644
--- a/src/views/outsideChainwtnew.vue
+++ b/src/views/outsideChainwtnew.vue
@@ -417,6 +417,12 @@
       // 鍚庣绉侀挜
       privateKey:
         " MIIBUwIBADANBgkqhkiG9w0BAQEFAASCAT0wggE5AgEAAkEAtDOpbUQhcEoYy77agRhIHmAzs7H+KHJhN56gTTI9fWq23j77nI055MFV3oQQziIrNUTNaPpEQhZXBpI0+f9K9QIDAQABAkB3n0fcWfrcoMN/FU3VnrnZOEF6CzFNxkgU9P8y36QECWKZ9JhYQkNpKrMC9oXlN3VSaRigV7B+L/I/a0Rs1W+tAiEA4jx7xcXJ4y4BNwAmVHt6NNiEkzIwWnwC/0qsEu8NsOsCIQDL6MMn1D2uznC6OuOWpxDCkBh1JL1NzZTZeH2G+hj7nwIgKGAC9tjFnvWm4dn0/T7MIIJDpsFeP8fCAS2iZ/6hwuECIAS/eLvWr1EAsZNEh8QcQ8GkBU3E+ztyjAK8UX/xFt/VAiBf79/1tDErX4/DChecM8w3c3DhbBcjuE3fHZn7p6/UKg==",
+      // 婊℃剰搴�/寤夋磥棰樼殑榛樿閫夐」锛堜粎鍦ㄩ鐩湭濉啓鏃剁敓鏁堬級
+      defaultAnswers: [
+        { keyword: "鎮ㄥ鍖绘姢浜哄憳鐨勬弧鎰忓害涓�", answer: "浼�" },
+        { keyword: "鎮ㄥ鍖婚櫌鐜銆佽鏂界瓑鏁翠綋鐨勬弧鎰忓害涓�", answer: "浼�" },
+        { keyword: "鏄惁鏈夊尰鎶や汉鍛樹富鍔ㄧ储瑕佺孩鍖呫�侀敠鏃楁垨琛ㄦ壃淇�", answer: "鏃�" },
+      ],
       formData: {
         question1: "",
         question2: "",
@@ -611,6 +617,8 @@
                   item.scriptResult = item.scriptResult.split("&");
                 }
               });
+              // 榛樿鍕鹃�夋弧鎰忓害/寤夋磥棰橈紙宸蹭綔绛旂殑涓嶄細琚鐩栵級
+              this.applyDefaultAnswers(this.questionList);
               this.loading = false;
 
               return;
@@ -644,6 +652,8 @@
                 item.scriptResult = [];
               }
             });
+            // 榛樿鍕鹃�夋弧鎰忓害/寤夋磥棰�
+            this.applyDefaultAnswers(this.questionList);
             this.loading = false;
           }
         })
@@ -651,6 +661,32 @@
           this.loading = false;
         });
     },
+    // 缁欐寚瀹氶鐩缃粯璁ら�夐」锛堜粎鍦ㄦ湭濉啓鏃剁敓鏁堬級
+    applyDefaultAnswers(list) {
+      if (!Array.isArray(list)) return;
+      list.forEach((item) => {
+        if (item.scriptType != 1) return;
+        // 宸叉湁绛旀鏃朵笉瑕嗙洊
+        if (
+          item.scriptResult !== undefined &&
+          item.scriptResult !== null &&
+          item.scriptResult !== ""
+        ) {
+          return;
+        }
+        const content = (item.scriptContent || "").trim();
+        const matched = this.defaultAnswers.find((d) =>
+          content.includes(d.keyword)
+        );
+        if (!matched) return;
+        const option = (item.svyTaskTemplateTargetoptions || []).find(
+          (o) => (o.optioncontent || "").trim() === matched.answer
+        );
+        if (option) {
+          item.scriptResult = option.optioncontent;
+        }
+      });
+    },
     // 鍔犲瘑鍑芥暟
     encrypt(txt) {
       const encryptor = new JSEncrypt();
diff --git a/src/views/patient/archives/generateConfig/index.vue b/src/views/patient/archives/generateConfig/index.vue
new file mode 100644
index 0000000..6570053
--- /dev/null
+++ b/src/views/patient/archives/generateConfig/index.vue
@@ -0,0 +1,814 @@
+<template>
+  <div class="generateConfig-management">
+    <div class="main-content">
+      <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="88px"
+          >
+            <el-form-item label="閮ㄩ棬绫诲瀷" prop="deptType">
+              <el-select
+                v-model="queryParams.deptType"
+                placeholder="璇烽�夋嫨閮ㄩ棬绫诲瀷"
+                clearable
+                style="width: 160px"
+              >
+                <el-option
+                  v-for="item in DEPT_TYPE_OPTIONS"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+
+            <el-form-item label="閮ㄩ棬鍒嗙被" prop="deptCategory">
+              <el-select
+                v-model="queryParams.deptCategory"
+                placeholder="璇烽�夋嫨閮ㄩ棬鍒嗙被"
+                clearable
+                style="width: 160px"
+              >
+                <el-option
+                  v-for="item in DEPT_CATEGORY_OPTIONS"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+
+            <el-form-item label="妗f绫诲瀷" prop="archiveType">
+              <el-select
+                v-model="queryParams.archiveType"
+                placeholder="璇烽�夋嫨妗f绫诲瀷"
+                clearable
+                style="width: 160px"
+              >
+                <el-option
+                  v-for="item in queryArchiveTypeOptions"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-select>
+            </el-form-item>
+
+            <el-form-item label="鍒涘缓鏃堕棿">
+              <el-date-picker
+                v-model="dateRange"
+                type="daterange"
+                value-format="yyyy-MM-dd"
+                range-separator="鑷�"
+                start-placeholder="寮�濮嬫棩鏈�"
+                end-placeholder="缁撴潫鏃ユ湡"
+                style="width: 240px"
+              />
+            </el-form-item>
+
+            <el-form-item>
+              <el-button
+                type="primary"
+                icon="el-icon-search"
+                size="medium"
+                @click="handleQuery"
+                >鎼滅储</el-button
+              >
+              <el-button
+                icon="el-icon-refresh"
+                size="medium"
+                @click="resetQuery"
+                >閲嶇疆</el-button
+              >
+            </el-form-item>
+          </el-form>
+
+          <el-divider></el-divider>
+
+          <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+              <el-button
+                type="primary"
+                plain
+                icon="el-icon-plus"
+                size="medium"
+                @click="handleAdd"
+                >鏂板</el-button
+              >
+            </el-col>
+            <el-col :span="1.5">
+              <el-button
+                type="danger"
+                plain
+                icon="el-icon-delete"
+                size="medium"
+                :disabled="multiple"
+                @click="handleDelete"
+                >鍒犻櫎</el-button
+              >
+            </el-col>
+          </el-row>
+
+          <el-table
+            v-loading="loading"
+            :data="configList"
+            :border="true"
+            @selection-change="handleSelectionChange"
+          >
+            <el-table-column type="selection" width="50" align="center" />
+
+            <el-table-column label="閮ㄩ棬绫诲瀷" align="center" width="100">
+              <template slot-scope="scope">
+                <el-tag
+                  :type="scope.row.deptType === '1' ? 'primary' : 'warning'"
+                  size="small"
+                >
+                  {{ deptTypeLabel(scope.row.deptType) }}
+                </el-tag>
+              </template>
+            </el-table-column>
+
+            <el-table-column label="閮ㄩ棬鍒嗙被" align="center" width="100">
+              <template slot-scope="scope">
+                <el-tag size="small">
+                  {{ deptCategoryLabel(scope.row.deptCategory) }}
+                </el-tag>
+              </template>
+            </el-table-column>
+
+            <el-table-column
+              label="妗f绫诲瀷"
+              align="center"
+              width="140"
+              :show-overflow-tooltip="true"
+            >
+              <template slot-scope="scope">
+                {{ archiveTypeLabel(scope.row) }}
+              </template>
+            </el-table-column>
+
+            <el-table-column
+              label="绉戝/鐥呭尯"
+              align="center"
+              min-width="180"
+              :show-overflow-tooltip="true"
+            >
+              <template slot-scope="scope">
+                <span v-if="formatDeptCodes(scope.row)">
+                  {{ formatDeptCodes(scope.row) }}
+                </span>
+                <span v-else style="color: #c0c4cc">鈥�</span>
+              </template>
+            </el-table-column>
+
+            <el-table-column
+              label="璇婃柇缂栫爜"
+              align="center"
+              min-width="160"
+              :show-overflow-tooltip="true"
+            >
+              <template slot-scope="scope">
+                <span v-if="formatIcd10Codes(scope.row)">
+                  {{ formatIcd10Codes(scope.row) }}
+                </span>
+                <span v-else style="color: #c0c4cc">鈥�</span>
+              </template>
+            </el-table-column>
+
+            <el-table-column
+              label="澶囨敞"
+              align="center"
+              prop="remark"
+              min-width="160"
+              :show-overflow-tooltip="true"
+            />
+
+            <el-table-column
+              label="鍒涘缓鏃堕棿"
+              align="center"
+              prop="createTime"
+              width="160"
+            />
+
+            <el-table-column
+              label="鎿嶄綔"
+              fixed="right"
+              align="center"
+              width="160"
+              class-name="small-padding fixed-width"
+            >
+              <template slot-scope="scope">
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="handleUpdate(scope.row)"
+                >
+                  <span class="button-textxg">
+                    <i class="el-icon-edit"></i>淇敼
+                  </span>
+                </el-button>
+                <el-button
+                  size="medium"
+                  type="text"
+                  @click="handleDelete(scope.row)"
+                >
+                  <span class="button-textsc">
+                    <i class="el-icon-delete"></i>鍒犻櫎
+                  </span>
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+
+          <pagination
+            v-show="total > 0"
+            :total="total"
+            :page.sync="queryParams.pageNum"
+            :limit.sync="queryParams.pageSize"
+            @pagination="getList"
+          />
+        </el-col>
+      </el-row>
+    </div>
+
+    <!-- 娣诲姞/淇敼閰嶇疆寮规 -->
+    <el-dialog
+      :title="dialogTitle"
+      :visible.sync="dialogVisible"
+      width="45%"
+      :close-on-click-modal="false"
+      @close="cancelForm"
+    >
+      <el-form
+        :model="form"
+        :rules="rules"
+        ref="formRef"
+        label-width="100px"
+        size="medium"
+      >
+        <el-form-item label="閮ㄩ棬绫诲瀷" prop="deptType">
+          <el-radio-group v-model="form.deptType" @change="handleDeptTypeChange">
+            <el-radio
+              v-for="item in DEPT_TYPE_OPTIONS"
+              :key="item.value"
+              :label="item.value"
+            >
+              {{ item.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+
+        <el-form-item label="閮ㄩ棬鍒嗙被" prop="deptCategory">
+          <el-select
+            v-model="form.deptCategory"
+            placeholder="璇烽�夋嫨閮ㄩ棬鍒嗙被"
+            clearable
+            style="width: 100%"
+            @change="handleDeptCategoryChange"
+          >
+            <el-option
+              v-for="item in DEPT_CATEGORY_OPTIONS"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="妗f绫诲瀷" prop="archiveType">
+          <el-select
+            v-model="form.archiveType"
+            placeholder="璇峰厛閫夋嫨閮ㄩ棬鍒嗙被"
+            clearable
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in currentArchiveTypeOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="绉戝/鐥呭尯" prop="deptCodes">
+          <el-select
+            v-model="form.deptCodes"
+            multiple
+            filterable
+            clearable
+            :placeholder="
+              form.deptType === '2' ? '璇烽�夋嫨鐥呭尯' : '璇烽�夋嫨绉戝'
+            "
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in currentDeptOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+          <div class="form-tip">鎸夋墍閫夐儴闂ㄧ被鍨嬭嚜鍔ㄥ垏鎹㈢瀹� / 鐥呭尯閫夐」</div>
+        </el-form-item>
+
+        <el-form-item label="璇婃柇缂栫爜" prop="icdList">
+          <div style="margin-bottom: 8px">
+            <el-button type="warning" size="small" @click="openIcdDialog"
+              >娣诲姞鐤剧梾璇婃柇</el-button
+            >
+          </div>
+          <el-tag
+            v-for="item in form.icdList"
+            :key="item.icdid"
+            type="warning"
+            closable
+            :disable-transitions="false"
+            @close="removeIcd(item)"
+          >
+            {{ item.icdname }}
+          </el-tag>
+          <div class="form-tip">浠庣柧鐥呰瘖鏂〃涓�夋嫨锛屾寜 ICD10 缂栫爜鍖归厤鎮h��</div>
+        </el-form-item>
+
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input
+            v-model="form.remark"
+            type="textarea"
+            :rows="3"
+            placeholder="璇疯緭鍏ュ娉�"
+            maxlength="500"
+            show-word-limit
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="cancelForm">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitForm" :loading="submitLoading"
+          >纭� 瀹�</el-button
+        >
+      </div>
+    </el-dialog>
+
+    <!-- 鐤剧梾璇婃柇琛ㄩ�夋嫨寮规锛堜笌浠诲姟閰嶇疆銆岄�傜敤鐤剧梾閫夋嫨銆嶄竴鑷达級 -->
+    <Optional-Form
+      ref="icdDialog"
+      :dialogVisiblepatient="icdDialogVisible"
+      :overallCase="form.icdList"
+      @addoption="icdDialogVisible = false"
+      @kkoption="icdDialogVisible = true"
+    />
+  </div>
+</template>
+
+<script>
+import {
+  listSpecificArchiveGenerateConfig,
+  saveSpecificArchiveGenerateConfig,
+  batchDeleteSpecificArchiveGenerateConfig,
+} from "@/api/smartor/specificArchiveGenerateConfig";
+import { getillnesslist } from "@/api/AiCentre/index";
+import OptionalForm from "@/components/OptionalForm";
+
+// 閮ㄩ棬绫诲瀷锛�1 绉戝锛�2 鐥呭尯
+const DEPT_TYPE_OPTIONS = [
+  { value: "1", label: "绉戝" },
+  { value: "2", label: "鐥呭尯" },
+];
+
+// 閮ㄩ棬鍒嗙被锛�1 濡囩锛�2 鍎跨
+const DEPT_CATEGORY_OPTIONS = [
+  { value: "1", label: "濡囩" },
+  { value: "2", label: "鍎跨" },
+];
+
+// 妗f绫诲瀷锛堟寜閮ㄩ棬鍒嗙被鍖哄垎锛屽绉戜笌鍎跨鍚勮嚜浠� 1 寮�濮嬬紪鍙凤級
+const ARCHIVE_TYPE_OPTIONS = {
+  "1": [
+    { value: "1", label: "鏃╁瓡鍏崇埍" },
+    { value: "2", label: "鍥寸粷缁忔湡MHI" },
+  ],
+  "2": [
+    { value: "1", label: "钀ュ吇鎬х柧鐥�" },
+    { value: "2", label: "瀛︿範鍥伴毦" },
+    { value: "3", label: "楂樺嵄鍎夸笓妗�" },
+  ],
+};
+
+export default {
+  name: "GenerateConfig",
+  components: { OptionalForm },
+  data() {
+    // 绉戝/鐥呭尯缂栫爜 涓� 璇婃柇缂栫爜 鑷冲皯濉啓涓�椤癸紝鍚﹀垯璇ヨ鍒欐棤娉曞尮閰嶄换浣曟偅鑰�
+    const validateDeptOrIcd = (rule, value, callback) => {
+      const codes = (this.form.deptCodes || []).length;
+      const icd = (this.form.icdList || []).length;
+      if (!codes && !icd) {
+        callback(new Error("绉戝/鐥呭尯鍜岃瘖鏂紪鐮佽嚦灏戝~鍐欎竴椤�"));
+      } else {
+        callback();
+      }
+    };
+
+    return {
+      // 甯搁噺
+      DEPT_TYPE_OPTIONS,
+      DEPT_CATEGORY_OPTIONS,
+
+      // 閬僵灞�
+      loading: false,
+      // 鎻愪氦鎸夐挳 loading
+      submitLoading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 琛ㄦ牸鏁版嵁
+      configList: [],
+      // 寮规鏍囬
+      dialogTitle: "",
+      // 寮规鍙鎬�
+      dialogVisible: false,
+      // 鍒涘缓鏃堕棿鑼冨洿
+      dateRange: [],
+      // 璇婃柇缂栫爜閫夋嫨寮规
+      icdDialogVisible: false,
+      // ICD10 缂栫爜 -> 鍚嶇О鏄犲皠锛堢敤浜庡洖鏄句笌鍒楄〃鍚嶇О灞曠ず锛�
+      icdCodeMap: {},
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        deptType: "",
+        deptCategory: "",
+        archiveType: "",
+      },
+      // 琛ㄥ崟
+      form: {
+        id: "",
+        deptType: "1",
+        deptCategory: "",
+        archiveType: "",
+        deptCodes: [],
+        icdList: [],
+        remark: "",
+      },
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        deptType: [
+          { required: true, message: "璇烽�夋嫨閮ㄩ棬绫诲瀷", trigger: "change" },
+        ],
+        deptCategory: [
+          { required: true, message: "璇烽�夋嫨閮ㄩ棬鍒嗙被", trigger: "change" },
+        ],
+        archiveType: [
+          { required: true, message: "璇烽�夋嫨妗f绫诲瀷", trigger: "change" },
+        ],
+        deptCodes: [{ validator: validateDeptOrIcd, trigger: "change" }],
+        icdList: [{ validator: validateDeptOrIcd, trigger: "change" }],
+      },
+    };
+  },
+  computed: {
+    // 绉戝閫夐」锛堜粠 store getters 鑾峰彇锛�
+    departmentOptions() {
+      return (this.$store.getters.belongDepts || []).map((dept) => ({
+        label: dept.deptName,
+        value: dept.deptCode,
+      }));
+    },
+    // 鐥呭尯閫夐」锛堜粠 store getters 鑾峰彇锛�
+    wardOptions() {
+      console.log(this.$store.getters.belongWards);
+
+      return (this.$store.getters.belongWards || []).map((ward) => ({
+        label: ward.districtName,
+        value: ward.districtCode,
+      }));
+    },
+    // 琛ㄥ崟閲屾寜閮ㄩ棬绫诲瀷鍒囨崲鐨勭瀹�/鐥呭尯閫夐」
+    currentDeptOptions() {
+      console.log(this.wardOptions);
+      console.log(this.departmentOptions);
+
+      return this.form.deptType == "2" ? this.wardOptions : this.departmentOptions;
+    },
+    // 琛ㄥ崟閲屾寜閮ㄩ棬鍒嗙被鍒囨崲鐨勬。妗堢被鍨嬮�夐」
+    currentArchiveTypeOptions() {
+      return ARCHIVE_TYPE_OPTIONS[this.form.deptCategory] || [];
+    },
+    // 鏌ヨ鏉′欢閲岀殑妗f绫诲瀷閫夐」锛堜笉鍖哄垎鍒嗙被锛屽叏閲忓悎骞跺幓閲嶏級
+    queryArchiveTypeOptions() {
+      const all = Object.keys(ARCHIVE_TYPE_OPTIONS).reduce((acc, k) => {
+        return acc.concat(ARCHIVE_TYPE_OPTIONS[k]);
+      }, []);
+      const seen = {};
+      return all.filter((item) => {
+        if (seen[item.value]) return false;
+        seen[item.value] = true;
+        return true;
+      });
+    },
+  },
+  created() {
+    this.getList();
+    this.loadIcdList();
+  },
+  methods: {
+    /** 鏌ヨ鍒楄〃 */
+    getList() {
+      this.loading = true;
+      const query = { ...this.queryParams };
+      if (this.dateRange && this.dateRange.length === 2) {
+        query.params = {
+          beginTime: this.dateRange[0],
+          endTime: this.dateRange[1],
+        };
+      }
+      listSpecificArchiveGenerateConfig(query)
+        .then((response) => {
+          this.configList = response.rows;
+          this.total = response.total;
+        })
+        .finally(() => {
+          this.loading = false;
+        });
+    },
+
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.dateRange = [];
+      this.handleQuery();
+    },
+
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.id);
+      this.multiple = !selection.length;
+    },
+
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.resetFormData();
+      this.dialogTitle = "鏂板涓撶妗f鐢熸垚閰嶇疆";
+      this.dialogVisible = true;
+    },
+
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.resetFormData();
+      this.dialogTitle = "淇敼涓撶妗f鐢熸垚閰嶇疆";
+      this.dialogVisible = true;
+      this.form = {
+        id: row.id,
+        deptType: row.deptType || "1",
+        deptCategory: row.deptCategory || "",
+        archiveType: row.archiveType || "",
+        deptCodes: this.parseJsonArray(row.deptCodes),
+        icdList: this.resolveIcdCodes(row.icd10Codes),
+        remark: row.remark || "",
+      };
+    },
+
+    /** 閮ㄩ棬绫诲瀷鍙樺寲锛氬垏鎹㈢瀹�/鐥呭尯閫夐」锛屾竻绌哄凡閫夌紪鐮� */
+    handleDeptTypeChange() {
+      this.form.deptCodes = [];
+    },
+
+    /** 閮ㄩ棬鍒嗙被鍙樺寲锛氬垏鎹㈡。妗堢被鍨嬮�夐」锛屾竻绌哄凡閫夋。妗堢被鍨� */
+    handleDeptCategoryChange() {
+      this.form.archiveType = "";
+    },
+
+    /** 鍔犺浇 ICD10 瀛楀吀锛岀敤浜庤瘖鏂紪鐮佸洖鏄句笌鍒楄〃鍚嶇О灞曠ず */
+    loadIcdList() {
+      getillnesslist({ pageNum: 1, pageSize: 1000 }).then((res) => {
+        const map = {};
+        (res.rows || []).forEach((item) => {
+          map[item.icdcode] = {
+            icdid: item.icdid,
+            icdname: item.icdname,
+            icdcode: item.icdcode,
+          };
+        });
+        this.icdCodeMap = map;
+      });
+    },
+
+    /** 鎵撳紑鐤剧梾璇婃柇琛ㄩ�夋嫨寮规 */
+    openIcdDialog() {
+      this.$refs.icdDialog && this.$refs.icdDialog.handleAddpatient();
+    },
+
+    /** 绉婚櫎宸查�夎瘖鏂� */
+    removeIcd(item) {
+      this.form.icdList = this.form.icdList.filter(
+        (d) => d.icdid !== item.icdid
+      );
+    },
+
+    /** 鍚庣 JSON 缂栫爜鏁扮粍 -> 璇婃柇瀵硅薄鏁扮粍锛堢敤浜庡洖鏄撅級 */
+    resolveIcdCodes(val) {
+      const codes = this.parseJsonArray(val);
+      return codes.map((code) =>
+        this.icdCodeMap[code]
+          ? { ...this.icdCodeMap[code] }
+          : { icdid: code, icdname: code, icdcode: code }
+      );
+    },
+
+    /** 鎻愪氦琛ㄥ崟 */
+    submitForm() {
+      this.$refs.formRef.validate((valid) => {
+        if (!valid) return;
+        this.submitLoading = true;
+        const data = {
+          id: this.form.id || undefined,
+          deptType: this.form.deptType,
+          deptCategory: this.form.deptCategory,
+          archiveType: this.form.archiveType,
+          remark: this.form.remark || "",
+        };
+        // 鍚庣瑕佹眰 deptCodes / icd10Codes 浼犺浆涔夊悗鐨� JSON 瀛楃涓诧紱
+        // 娉ㄦ剰锛氭洿鏂版椂浼� null 鐨勫瓧娈典笉鍙備笌鏇存柊锛堜繚鎸佸師鍊硷級锛�
+        // 鍥犳娓呯┖鏃堕』浼犵┖ JSON 鏁扮粍 "[]" 鎵嶈兘鐪熸娓呮帀銆�
+        data.deptCodes =
+          this.form.deptCodes && this.form.deptCodes.length
+            ? JSON.stringify(this.form.deptCodes)
+            : "[]";
+        data.icd10Codes =
+          this.form.icdList && this.form.icdList.length
+            ? JSON.stringify(this.form.icdList.map((d) => d.icdcode))
+            : "[]";
+
+        saveSpecificArchiveGenerateConfig(data)
+          .then((response) => {
+            if (response.code === 200) {
+              this.$modal.msgSuccess("鎿嶄綔鎴愬姛");
+              this.dialogVisible = false;
+              this.getList();
+            } else {
+              this.$modal.msgError(response.msg || "鎿嶄綔澶辫触");
+            }
+          })
+          .finally(() => {
+            this.submitLoading = false;
+          });
+      });
+    },
+
+    /** 鍙栨秷琛ㄥ崟 */
+    cancelForm() {
+      this.dialogVisible = false;
+      this.resetFormData();
+      this.$nextTick(() => {
+        if (this.$refs.formRef) {
+          this.$refs.formRef.clearValidate();
+        }
+      });
+    },
+
+    /** 閲嶇疆琛ㄥ崟鏁版嵁 */
+    resetFormData() {
+      this.form = {
+        id: "",
+        deptType: "1",
+        deptCategory: "",
+        archiveType: "",
+        deptCodes: [],
+        icdList: [],
+        remark: "",
+      };
+    },
+
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const ids = row && row.id != null ? [row.id] : this.ids;
+      if (!ids.length) return;
+      this.$modal
+        .confirm("鏄惁纭鍒犻櫎閫変腑鐨勪笓绉戞。妗堢敓鎴愰厤缃暟鎹」锛�")
+        .then(() => {
+          return batchDeleteSpecificArchiveGenerateConfig(ids);
+        })
+        .then((response) => {
+          if (response.code === 200) {
+            this.getList();
+            this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          } else {
+            this.$modal.msgError(response.msg || "鍒犻櫎澶辫触");
+          }
+        })
+        .catch(() => {});
+    },
+
+    /** 閮ㄩ棬绫诲瀷 label */
+    deptTypeLabel(val) {
+      const item = DEPT_TYPE_OPTIONS.find((o) => o.value === String(val));
+      return item ? item.label : val || "鈥�";
+    },
+
+    /** 閮ㄩ棬鍒嗙被 label */
+    deptCategoryLabel(val) {
+      const item = DEPT_CATEGORY_OPTIONS.find((o) => o.value === String(val));
+      return item ? item.label : val || "鈥�";
+    },
+
+    /** 妗f绫诲瀷 label锛堜緷璧栭儴闂ㄥ垎绫伙級 */
+    archiveTypeLabel(row) {
+      const opts = ARCHIVE_TYPE_OPTIONS[String(row.deptCategory)] || [];
+      const item = opts.find((o) => o.value === String(row.archiveType));
+      return item ? item.label : row.archiveType || "鈥�";
+    },
+
+    /** 绉戝/鐥呭尯缂栫爜 -> 鍚嶇О */
+    formatDeptCodes(row) {
+      const codes = this.parseJsonArray(row.deptCodes);
+      if (!codes.length) return "";
+      const source =
+        String(row.deptType) === "2" ? this.wardOptions : this.departmentOptions;
+      const map = {};
+      source.forEach((o) => (map[o.value] = o.label));
+      return codes.map((c) => map[c] || c).join("銆�");
+    },
+
+    /** 璇婃柇缂栫爜 -> 鍚嶇О鎷兼帴锛堝瓧鍏哥己澶辨椂鍥為��鏄剧ず缂栫爜锛� */
+    formatIcd10Codes(row) {
+      const codes = this.parseJsonArray(row.icd10Codes);
+      return codes
+        .map((c) => {
+          const item = this.icdCodeMap[c];
+          return item ? item.icdname : c;
+        })
+        .join("銆�");
+    },
+
+    /** 瑙f瀽鍚庣杩斿洖鐨� JSON 瀛楃涓诧紙deptCodes / icd10Codes锛� */
+    parseJsonArray(val) {
+      if (!val) return [];
+      if (Array.isArray(val)) return val;
+      try {
+        const arr = JSON.parse(val);
+        return Array.isArray(arr) ? arr : [];
+      } catch (e) {
+        return [];
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.generateConfig-management {
+  padding: 20px;
+}
+
+.main-content {
+  padding: 30px;
+  background: #fff;
+  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);
+}
+
+.mb8 {
+  margin-bottom: 8px;
+}
+
+.form-tip {
+  width: 100%;
+  font-size: 12px;
+  color: #909399;
+  line-height: 1.5;
+  margin-top: 4px;
+}
+
+.dialog-footer {
+  text-align: right;
+}
+
+// 鎸夐挳鏂囧瓧棰滆壊
+.button-textxg {
+  color: rgb(35, 81, 233);
+}
+
+.button-textsc {
+  color: rgb(235, 23, 23);
+}
+</style>
diff --git a/src/views/patient/follow/index.vue b/src/views/patient/follow/index.vue
index 1970d37..ffe4cdf 100644
--- a/src/views/patient/follow/index.vue
+++ b/src/views/patient/follow/index.vue
@@ -29,6 +29,18 @@
               @keyup.enter.native="handleQuery"
             />
           </el-form-item>
+          <el-form-item label="寤烘。鏃ユ湡">
+            <el-date-picker
+              v-model="dateRange"
+              style="width: 240px"
+              value-format="yyyy-MM-dd HH:mm:ss"
+              type="datetimerange"
+              range-separator="-"
+              start-placeholder="寮�濮嬫椂闂�"
+              end-placeholder="缁撴潫鏃堕棿"
+              :default-time="['00:00:00', '23:59:59']"
+            ></el-date-picker>
+          </el-form-item>
 
           <!-- <el-form-item label="鎮h�呰寖鍥�" prop="tagId">
             <el-select
@@ -362,6 +374,8 @@
         status: undefined,
         tagIds: undefined,
         telcode: undefined,
+        createTime: undefined,
+        endTime: undefined,
       },
       // 琛ㄥ崟鏍¢獙
       rules: {},
@@ -446,10 +460,13 @@
     /** 鎼滅储鎸夐挳鎿嶄綔 */
     handleQuery() {
       this.queryParams.pageNum = 1;
+      this.queryParams.createTime = this.dateRange[0];
+      this.queryParams.endTime = this.dateRange[1];
       this.getList();
     },
     /** 閲嶇疆鎸夐挳鎿嶄綔 */
     resetQuery() {
+      this.dateRange = [];
       (this.queryParams = {
         pageNum: 1,
         pageSize: 10,
diff --git a/src/views/patient/patient/behospitalized.vue b/src/views/patient/patient/behospitalized.vue
index 555eb68..f1f22c6 100644
--- a/src/views/patient/patient/behospitalized.vue
+++ b/src/views/patient/patient/behospitalized.vue
@@ -819,13 +819,34 @@
     /** 鏌ヨ鎮h�呭垪琛� */
     getList() {
       this.loading = true;
-      listpatient(this.queryParams).then((response) => {
+      listpatient(this.buildListQueryParams()).then((response) => {
         console.log(response);
         this.userList = response.rows;
         this.total = response.total;
         this.loading = false;
       });
     },
+    /**
+     * 缁勮 listpatient 鍏ュ弬锛�
+     * cry = 0 涓旂櫥褰曟満鏋勪负銆岀渷绔嬪悓寰风繝鑻戦櫌鍖� / 鍗楀崕澶у闄勫睘绗竴鍖婚櫌銆嶆椂锛�
+     * 绉戝/鐥呭尯瀛楁 leaveldeptcodes銆乴eavehospitaldistrictcodes 闇�鎹㈡垚
+     * deptcodeList銆乭ospitaldistrictcodeList銆�
+     */
+    buildListQueryParams() {
+      const params = { ...this.queryParams };
+      const orgname = localStorage.getItem("orgname");
+      const needRename =
+        params.cry === 0 &&
+        (orgname === "鐪佺珛鍚屽痉缈犺嫅闄㈠尯" ||
+          orgname === "鍗楀崕澶у闄勫睘绗竴鍖婚櫌");
+      if (needRename) {
+        params.deptcodeList = params.leaveldeptcodes;
+        params.hospitaldistrictcodeList = params.leavehospitaldistrictcodes;
+        delete params.leaveldeptcodes;
+        delete params.leavehospitaldistrictcodes;
+      }
+      return params;
+    },
     /** 琛ㄦ牸琛屾牱寮� */
     tableRowClassName({ row, rowIndex }) {
       if (rowIndex % 2 === 0) {
diff --git a/src/views/patient/propaganda/QuestionnaireTask.vue b/src/views/patient/propaganda/QuestionnaireTask.vue
index ec22748..4235af7 100644
--- a/src/views/patient/propaganda/QuestionnaireTask.vue
+++ b/src/views/patient/propaganda/QuestionnaireTask.vue
@@ -347,7 +347,7 @@
                       <el-input
                         style="width: 300px"
                         :disabled="true"
-                        v-model="nextTaskName"
+                        v-model="nexttaskname"
                         placeholder="璇风偣鍑诲彸渚ч�夋嫨浠诲姟"
                       />
                       <el-button
@@ -956,6 +956,30 @@
                   </el-table>
                 </el-row>
               </div>
+            </div>
+          </div>
+          <div class="examine-jic">
+            <div class="headline">
+              <div>浜屾闅忚浠诲姟閰嶇疆</div>
+            </div>
+            <div class="jic-value">
+              <el-form label-width="125px">
+                <el-form-item label="浜屾闅忚浠诲姟">
+                  <el-input
+                    style="width: 300px"
+                    :disabled="true"
+                    v-model="nexttaskname"
+                    placeholder="璇风偣鍑诲彸渚ч�夋嫨浠诲姟"
+                  />
+                  <el-button
+                    style="margin-left: 10px"
+                    type="primary"
+                    icon="el-icon-edit"
+                    circle
+                    @click="openNextTaskDialog"
+                  ></el-button>
+                </el-form-item>
+              </el-form>
             </div>
           </div>
         </div>
@@ -1661,6 +1685,7 @@
         patTaskRelevances: [],
         nexttaskflag: "0",
         nexttaskid: null,
+        nexttaskname: "",
         sendType: 1,
         longTask: 0,
         templatename: "",
@@ -1738,7 +1763,7 @@
       nextTaskList: [],
       nextTaskTotal: 0,
       nextTaskQuery: { pageNum: 1, pageSize: 10, taskName: "" },
-      nextTaskName: "",
+      nexttaskname: "",
       // 妯℃澘鎼滅储
       templateOptions: [],
       templateLoading: false,
@@ -1906,6 +1931,7 @@
         patTaskRelevances: [],
         nexttaskflag: "0",
         nexttaskid: null,
+        nexttaskname: "",
         sendType: 1,
         sendDay: 5,
         templatename: "",
@@ -1937,10 +1963,11 @@
             this.form = res.data;
             // 鍥炴樉鍐嶆闅忚鍏宠仈浠诲姟
             if (this.form.nexttaskflag == null) this.form.nexttaskflag = "0";
-            this.nextTaskName = "";
+            this.nexttaskname = "";
             if (this.form.nexttaskid) {
               getIvrtask(this.form.nexttaskid).then((r) => {
-                this.nextTaskName = (r.data && r.data.taskName) || "";
+                this.nexttaskname = (r.data && r.data.taskName) || "";
+                this.form.nexttaskname = (r.data && r.data.taskName) || "";
               });
             }
             // 濡傛灉杩斿洖浜� serviceTaskScheduleVO锛岃В鏋愭槑缁嗕腑鐨� content
@@ -2047,7 +2074,8 @@
       this.time4 = "";
       this.form.nexttaskflag = "0";
       this.form.nexttaskid = null;
-      this.nextTaskName = "";
+      this.form.nexttaskname = "";
+      this.nexttaskname = "";
       // 閲嶇疆浠诲姟缁�
       this.form.serviceTaskScheduleVO = {
         scheduleStyle: 0,
@@ -2431,7 +2459,8 @@
     },
     selectNextTask(row) {
       this.form.nexttaskid = row.taskid;
-      this.nextTaskName = row.taskName;
+      this.form.nexttaskname = row.taskName;
+      this.nexttaskname = row.taskName;
       this.nextTaskDialogVisible = false;
     },
 
diff --git a/src/views/patient/propaganda/particty.vue b/src/views/patient/propaganda/particty.vue
index d8d60eb..16482f9 100644
--- a/src/views/patient/propaganda/particty.vue
+++ b/src/views/patient/propaganda/particty.vue
@@ -345,7 +345,7 @@
                       <el-input
                         style="width: 300px"
                         :disabled="true"
-                        v-model="nextTaskName"
+                        v-model="nexttaskname"
                         placeholder="璇风偣鍑诲彸渚ч�夋嫨浠诲姟"
                       />
                       <el-button
@@ -955,6 +955,30 @@
                   </el-table>
                 </el-row>
               </div>
+            </div>
+          </div>
+          <div class="examine-jic">
+            <div class="headline">
+              <div>浜屾闅忚浠诲姟閰嶇疆</div>
+            </div>
+            <div class="jic-value">
+              <el-form label-width="125px">
+                <el-form-item label="浜屾闅忚浠诲姟">
+                  <el-input
+                    style="width: 300px"
+                    :disabled="true"
+                    v-model="nexttaskname"
+                    placeholder="璇风偣鍑诲彸渚ч�夋嫨浠诲姟"
+                  />
+                  <el-button
+                    style="margin-left: 10px"
+                    type="primary"
+                    icon="el-icon-edit"
+                    circle
+                    @click="openNextTaskDialog"
+                  ></el-button>
+                </el-form-item>
+              </el-form>
             </div>
           </div>
         </div>
@@ -1672,6 +1696,7 @@
         patTaskRelevances: [],
         nexttaskflag: "0",
         nexttaskid: null,
+        nexttaskname: "",
         sendType: 3,
         longTask: 0,
         templatename: "",
@@ -1752,7 +1777,7 @@
       nextTaskList: [],
       nextTaskTotal: 0,
       nextTaskQuery: { pageNum: 1, pageSize: 10, taskName: "" },
-      nextTaskName: "",
+      nexttaskname: "",
       // 妯℃澘鎼滅储
       templateOptions: [],
       templateLoading: false,
@@ -1930,6 +1955,7 @@
         patTaskRelevances: [],
         nexttaskflag: "0",
         nexttaskid: null,
+        nexttaskname: "",
         sendType: 1,
         sendDay: 5,
         templatename: "",
@@ -1961,10 +1987,11 @@
             this.form = res.data;
             // 鍥炴樉鍐嶆闅忚鍏宠仈浠诲姟
             if (this.form.nexttaskflag == null) this.form.nexttaskflag = "0";
-            this.nextTaskName = "";
+            this.nexttaskname = "";
             if (this.form.nexttaskid) {
               getIvrtask(this.form.nexttaskid).then((r) => {
-                this.nextTaskName = (r.data && r.data.taskName) || "";
+                this.nexttaskname = (r.data && r.data.taskName) || "";
+                this.form.nexttaskname = (r.data && r.data.taskName) || "";
               });
             }
             // 濡傛灉杩斿洖浜� serviceTaskScheduleVO锛屽垯瑙f瀽鏄庣粏涓殑 content
@@ -2073,7 +2100,8 @@
       this.time4 = "";
       this.form.nexttaskflag = "0";
       this.form.nexttaskid = null;
-      this.nextTaskName = "";
+      this.form.nexttaskname = "";
+      this.nexttaskname = "";
       // 閲嶇疆浠诲姟缁�
       this.form.serviceTaskScheduleVO = {
         scheduleStyle: 0,
@@ -2454,7 +2482,8 @@
     },
     selectNextTask(row) {
       this.form.nexttaskid = row.taskid;
-      this.nextTaskName = row.taskName;
+      this.form.nexttaskname = row.taskName;
+      this.nexttaskname = row.taskName;
       this.nextTaskDialogVisible = false;
     },
 
diff --git a/src/views/sfstatistics/percentage/components/FirstFollowUp.vue b/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
index 70425f2..0b65267 100644
--- a/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/FirstFollowUp.vue
@@ -597,8 +597,8 @@
             <el-table-column
               label="鍙戦�佸畬鎴�"
               align="center"
-              key="manualSuccess"
-              prop="manualSuccess"
+              key="manual"
+              prop="manual"
               :render-header="Tooltipfswc"
             >
               <template slot-scope="scope">
@@ -608,20 +608,20 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'manualSuccessInfo',
+                      'manualInfo',
                       '鍙戦�佸畬鎴愪汉宸ラ殢璁垮垪琛�'
                     )
                   "
                 >
-                  <span class="button-zx">{{ scope.row.manualSuccess }}</span>
+                  <span class="button-zx">{{ scope.row.manual }}</span>
                 </el-button>
               </template>
             </el-table-column>
             <el-table-column
               label="鏈�缁堝畬鎴�"
               align="center"
-              key="manualAgainSuccess"
-              prop="manualAgainSuccess"
+              key="manualSuccess"
+              prop="manualSuccess"
               :render-header="Tooltipzzwc"
             >
               <template slot-scope="scope">
@@ -631,13 +631,13 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'manualAgainSuccessInfo',
+                      'manualSuccessInfo',
                       '鏈�缁堝畬鎴愪汉宸ラ殢璁垮垪琛�'
                     )
                   "
                 >
                   <span class="button-zx">{{
-                    scope.row.manualAgainSuccess
+                    scope.row.manualSuccess
                   }}</span>
                 </el-button>
               </template>
@@ -651,8 +651,8 @@
             <el-table-column
               label="鍙戦�佸畬鎴�"
               align="center"
-              key="voiceSuccess"
-              prop="voiceSuccess"
+              key="voice"
+              prop="voice"
               :render-header="Tooltipfswc"
             >
               <template slot-scope="scope">
@@ -662,20 +662,20 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'voiceSuccessInfo',
+                      'voiceInfo',
                       '鍙戦�佸畬鎴愯闊抽殢璁垮垪琛�'
                     )
                   "
                 >
-                  <span class="button-zx">{{ scope.row.voiceSuccess }}</span>
+                  <span class="button-zx">{{ scope.row.voice }}</span>
                 </el-button>
               </template>
             </el-table-column>
             <el-table-column
               label="鏈�缁堝畬鎴�"
               align="center"
-              key="voiceAgainSuccess"
-              prop="voiceAgainSuccess"
+              key="voiceSuccess"
+              prop="voiceSuccess"
               :render-header="Tooltipzzwc"
             >
               <template slot-scope="scope">
@@ -685,13 +685,13 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'voiceAgainSuccessInfo',
+                      'voiceSuccessInfo',
                       '鏈�缁堝畬鎴愯闊抽殢璁垮垪琛�'
                     )
                   "
                 >
                   <span class="button-zx">{{
-                    scope.row.voiceAgainSuccess
+                    scope.row.voiceSuccess
                   }}</span>
                 </el-button>
               </template>
@@ -705,8 +705,8 @@
             <el-table-column
               label="鍙戦�佸畬鎴�"
               align="center"
-              key="smsSuccess"
-              prop="smsSuccess"
+              key="sms"
+              prop="sms"
               :render-header="Tooltipfswc"
             >
               <template slot-scope="scope">
@@ -716,20 +716,20 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'smsSuccessInfo',
+                      'smsInfo',
                       '鍙戦�佸畬鎴愮煭淇¢殢璁垮垪琛�'
                     )
                   "
                 >
-                  <span class="button-zx">{{ scope.row.smsSuccess }}</span>
+                  <span class="button-zx">{{ scope.row.sms }}</span>
                 </el-button>
               </template>
             </el-table-column>
             <el-table-column
               label="鏈�缁堝畬鎴�"
               align="center"
-              key="smsAgainSuccess"
-              prop="smsAgainSuccess"
+              key="smsSuccess"
+              prop="smsSuccess"
               :render-header="Tooltipzzwc"
             >
               <template slot-scope="scope">
@@ -739,13 +739,13 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'smsAgainSuccessInfo',
+                      'smsSuccessInfo',
                       '鏈�缁堝畬鎴愮煭淇¢殢璁垮垪琛�'
                     )
                   "
                 >
                   <span class="button-zx">{{
-                    scope.row.smsAgainSuccess
+                    scope.row.smsSuccess
                   }}</span>
                 </el-button>
               </template>
@@ -759,8 +759,8 @@
             <el-table-column
               label="鍙戦�佸畬鎴�"
               align="center"
-              key="weChatSuccess"
-              prop="weChatSuccess"
+              key="weChat"
+              prop="weChat"
               :render-header="Tooltipfswc"
             >
               <template slot-scope="scope">
@@ -770,20 +770,20 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'wechatSuccessInfo',
+                      'weChatInfo',
                       '鍙戦�佸畬鎴愬井淇¢殢璁垮垪琛�'
                     )
                   "
                 >
-                  <span class="button-zx">{{ scope.row.weChatSuccess }}</span>
+                  <span class="button-zx">{{ scope.row.weChat }}</span>
                 </el-button>
               </template>
             </el-table-column>
             <el-table-column
               label="鏈�缁堝畬鎴�"
               align="center"
-              key="weChatAgainSuccess"
-              prop="weChatAgainSuccess"
+              key="weChatSuccess"
+              prop="weChatSuccess"
               :render-header="Tooltipzzwc"
             >
               <template slot-scope="scope">
@@ -793,13 +793,13 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'wechatAgainSuccessInfo',
+                      'weChatSuccessInfo',
                       '鏈�缁堝畬鎴愬井淇¢殢璁垮垪琛�'
                     )
                   "
                 >
                   <span class="button-zx">{{
-                    scope.row.weChatAgainSuccess
+                    scope.row.weChatSuccess
                   }}</span>
                 </el-button>
               </template>
@@ -1835,91 +1835,156 @@
           right: { style: "thin", color: { argb: "FFD0D0D0" } },
         },
       };
-      const titleText = `${serviceTypeName}缁熻琛╛${sheetNameSuffix}`;
-      // 娣诲姞鏍囬琛�
-      worksheet.mergeCells(1, 1, 1, 16);
-      const titleCell = worksheet.getCell(1, 1);
-      titleCell.value = titleText; // 浣跨敤鍔ㄦ�佹爣棰�
-      titleCell.style = titleStyle;
-      worksheet.getRow(1).height = 35;
+      // 鏄惁涓虹洰鏍囧尰闄紙浜哄伐/璇煶/鐭俊/寰俊 鎸� 鍙戦�佸畬鎴�/鏈�缁堝畬鎴� 鍒嗙骇灞曠ず锛�
+      const graded = this.isTargetHospital;
 
-      // 琛ㄥご
-      const secondRowHeaders = [
+      const baseHeaders = [
         "",
         "鍑洪櫌鐥呭尯",
         "绉戝",
         "鍑洪櫌浜烘",
         "鏃犻渶闅忚浜烘",
         "搴旈殢璁夸汉娆�",
+      ];
+      const coreHeaders = [
         "闇�闅忚",
         "寰呴殢璁�",
         "闅忚鎴愬姛",
         "闅忚澶辫触",
-        "鎴愬姛鐜�", // 鏂板
-        "闅忚鐜�", // 鍘熶綅缃悗绉�
-        "鍙婃椂鐜�", // 鍙婃椂鐜囧悗绉�
-        "浜哄伐",
-        "璇煶", // 淇锛氬簲璇ユ槸璇煶
-        "鐭俊", // 鐭俊
-        "寰俊", // 寰俊
+        "鎴愬姛鐜�",
+        "闅忚鐜�",
+        "鍙婃椂鐜�",
       ];
+      const methodGroups = this.getMethodColumns();
 
-      secondRowHeaders.forEach((header, index) => {
-        const cell = worksheet.getCell(3, index + 1);
-        cell.value = header;
-        cell.style = headerStyle;
-      });
+      const baseCount = baseHeaders.length; // 6
+      const coreCount = coreHeaders.length; // 7
+      const methodLeafCount = methodGroups.reduce(
+        (sum, g) => sum + g.fields.length,
+        0
+      ); // 8 鎴� 4
+      const totalCols = baseCount + coreCount + methodLeafCount; // 21 鎴� 17
+      const coreStartCol = baseCount + 1; // 7
+      const methodStartCol = baseCount + coreCount + 1; // 14
 
-      // 鍚堝苟鍗曞厓鏍�
-      for (let i = 1; i <= 6; i++) {
-        worksheet.mergeCells(2, i, 3, i);
-        const cell = worksheet.getCell(2, i);
-        cell.style = headerStyle;
+      const titleText = `${serviceTypeName}缁熻琛╛${sheetNameSuffix}`;
+      // 娣诲姞鏍囬琛�
+      worksheet.mergeCells(1, 1, 1, totalCols);
+      const titleCell = worksheet.getCell(1, 1);
+      titleCell.value = titleText;
+      titleCell.style = titleStyle;
+      worksheet.getRow(1).height = 35;
+
+      if (graded) {
+        // 琛ㄥご鍗� 3 琛岋紙绗�2/3/4琛岋級锛屾暟鎹粠绗�5琛屽紑濮�
+        const headerEndRow = 4;
+
+        // 绗�2琛岋細鍩虹鍒楃旱鍚戝悎骞� + 闅忚鍒嗙粍妯悜鍚堝苟
+        for (let i = 1; i <= baseCount; i++) {
+          worksheet.mergeCells(2, i, headerEndRow, i);
+          const cell = worksheet.getCell(2, i);
+          cell.value = baseHeaders[i - 1];
+          cell.style = headerStyle;
+        }
+        worksheet.mergeCells(2, coreStartCol, 2, totalCols);
+        worksheet.getCell(2, coreStartCol).value = serviceTypeName;
+        worksheet.getCell(2, coreStartCol).style = headerStyle;
+
+        // 绗�3琛岋細闅忚鏍稿績鍒楃旱鍚戝悎骞� + 闅忚鏂瑰紡鍒嗙粍妯悜鍚堝苟
+        for (let k = 0; k < coreCount; k++) {
+          const col = coreStartCol + k;
+          worksheet.mergeCells(3, col, headerEndRow, col);
+          const cell = worksheet.getCell(3, col);
+          cell.value = coreHeaders[k];
+          cell.style = headerStyle;
+        }
+        let mc = methodStartCol;
+        methodGroups.forEach((g) => {
+          if (g.fields.length > 1) {
+            worksheet.mergeCells(3, mc, 3, mc + g.fields.length - 1);
+          }
+          const cell = worksheet.getCell(3, mc);
+          cell.value = g.label;
+          cell.style = headerStyle;
+          mc += g.fields.length;
+        });
+
+        // 绗�4琛岋細闅忚鏂瑰紡瀛愬垪锛堝彂閫佸畬鎴�/鏈�缁堝畬鎴愶級
+        mc = methodStartCol;
+        methodGroups.forEach((g) => {
+          g.fields.forEach((field, idx) => {
+            const cell = worksheet.getCell(4, mc + idx);
+            cell.value = g.sub[idx];
+            cell.style = headerStyle;
+          });
+          mc += g.fields.length;
+        });
+
+        worksheet.getRow(2).height = 28;
+        worksheet.getRow(3).height = 24;
+        worksheet.getRow(4).height = 24;
+      } else {
+        // 琛ㄥご鍗� 2 琛岋紙绗�2/3琛岋級锛屾暟鎹粠绗�4琛屽紑濮�
+        const headerEndRow = 3;
+
+        for (let i = 1; i <= baseCount; i++) {
+          worksheet.mergeCells(2, i, headerEndRow, i);
+          const cell = worksheet.getCell(2, i);
+          cell.value = baseHeaders[i - 1];
+          cell.style = headerStyle;
+        }
+        worksheet.mergeCells(2, coreStartCol, 2, totalCols);
+        worksheet.getCell(2, coreStartCol).value = serviceTypeName;
+        worksheet.getCell(2, coreStartCol).style = headerStyle;
+
+        // 绗�3琛岋細闅忚鏍稿績鍒� + 闅忚鏂瑰紡鍒�
+        for (let k = 0; k < coreCount; k++) {
+          const cell = worksheet.getCell(3, coreStartCol + k);
+          cell.value = coreHeaders[k];
+          cell.style = headerStyle;
+        }
+        let mc = methodStartCol;
+        methodGroups.forEach((g) => {
+          const cell = worksheet.getCell(3, mc);
+          cell.value = g.label;
+          cell.style = headerStyle;
+          mc += 1;
+        });
+
+        worksheet.getRow(2).height = 28;
+        worksheet.getRow(3).height = 25;
       }
 
-      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 = "搴旈殢璁夸汉娆�";
-
-      worksheet.mergeCells(2, 7, 2, 16); // 浠�7鍚堝苟鍒�16锛堝師鏉ユ槸7-15锛�
-      worksheet.getCell(2, 7).value = serviceTypeName; // 鎴栭�傚綋鎴彇
-      worksheet.getCell(2, 7).style = headerStyle;
-
-      worksheet.getRow(2).height = 28;
-      worksheet.getRow(3).height = 25;
-
       // 鏁版嵁琛�
+      const dataStartRow = graded ? 5 : 4;
       this.tableData.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,
-            // 鎴愬姛鐜� - 闇�瑕佸姩鎬佽绠�
-            this.calculateSuccessRate(
-              item.followUpSuccess,
-              item.needFollowUp,
-              item.pendingFollowUp
-            ),
-            item.followUpRate || "0%", // 闅忚鐜�
-            item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%", // 鍙婃椂鐜�
-            item.manual || 0,
-            item.voice || 0, // 璇煶
-            item.sms || 0, // 鐭俊
-            item.weChat || 0, // 寰俊
-          ],
-          rowIndex + 4
-        );
+        const rowValues = [
+          "",
+          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,
+          // 鎴愬姛鐜� - 闇�瑕佸姩鎬佽绠�
+          this.calculateSuccessRate(
+            item.followUpSuccess,
+            item.needFollowUp,
+            item.pendingFollowUp
+          ),
+          item.followUpRate || "0%", // 闅忚鐜�
+          item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%", // 鍙婃椂鐜�
+        ];
+        methodGroups.forEach((g) => {
+          g.fields.forEach((field) => {
+            rowValues.push(item[field] || 0);
+          });
+        });
+
+        const dataRow = worksheet.addRow(rowValues, rowIndex + dataStartRow);
         dataRow.eachCell((cell) => {
           cell.style = cellStyle;
         });
@@ -1938,24 +2003,27 @@
       summaryRow.height = 28;
 
       // 鍒楀
-      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: 12 }, // 鍙婃椂鐜�
-        { width: 8 }, // 浜哄伐
-        { width: 8 }, // 璇煶
-        { width: 8 }, // 鐭俊
-        { width: 8 }, // 寰俊
+      const widths = [8, 20, 15, 12, 12, 12, 10, 10, 10, 10, 12, 12, 12];
+      methodGroups.forEach((g) => {
+        g.fields.forEach(() => widths.push(8));
+      });
+      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: ["鍙戦�佸畬鎴�", "鏈�缁堝畬鎴�"] },
+        ];
+      }
+      return [
+        { label: "浜哄伐", fields: ["manual"], sub: ["浜哄伐"] },
+        { label: "璇煶", fields: ["voice"], sub: ["璇煶"] },
+        { label: "鐭俊", fields: ["sms"], sub: ["鐭俊"] },
+        { label: "寰俊", fields: ["weChat"], sub: ["寰俊"] },
       ];
     },
 
@@ -1974,11 +2042,14 @@
         "0%", // 10: 鎴愬姛鐜�
         "0%", // 11: 闅忚鐜�
         "0%", // 12: 鍙婃椂鐜�
-        0, // 13: manual
-        0, // 14: voice
-        0, // 15: sms
-        0, // 16: weChat
       ];
+
+      const methodFields = this.getMethodColumns().reduce(
+        (arr, g) => arr.concat(g.fields),
+        []
+      );
+      const methodStartIndex = 13;
+      methodFields.forEach(() => summaries.push(0));
 
       this.tableData.forEach((item) => {
         summaries[3] += Number(item.dischargeCount) || 0;
@@ -1988,10 +2059,9 @@
         summaries[7] += Number(item.pendingFollowUp) || 0;
         summaries[8] += Number(item.followUpSuccess) || 0;
         summaries[9] += Number(item.followUpFail) || 0;
-        summaries[13] += Number(item.manual) || 0;
-        summaries[14] += Number(item.voice) || 0;
-        summaries[15] += Number(item.sms) || 0;
-        summaries[16] += Number(item.weChat) || 0;
+        methodFields.forEach((field, i) => {
+          summaries[methodStartIndex + i] += Number(item[field]) || 0;
+        });
       });
 
       // 鎴愬姛鐜囪绠�
@@ -2030,7 +2100,10 @@
       }
 
       // 鏍煎紡鍖栨暟瀛�
-      [3, 4, 5, 6, 7, 8, 9, 13, 14, 15, 16].forEach((index) => {
+      const numericIndices = [3, 4, 5, 6, 7, 8, 9].concat(
+        methodFields.map((_, i) => methodStartIndex + i)
+      );
+      numericIndices.forEach((index) => {
         summaries[index] = this.formatNumber(summaries[index]);
       });
 
@@ -2064,14 +2137,14 @@
       }
       // 鍑洪櫌鏃堕棿鑼冨洿
       if (queryParams.hospitalEndTime) {
-        this.patientqueryParams.hospitalstarttime =
+        this.patientqueryParams.hospitalStartTime =
           queryParams.hospitalStartTime;
-        this.patientqueryParams.hospitalendtime = queryParams.hospitalEndTime;
+        this.patientqueryParams.hospitalEndTime = queryParams.hospitalEndTime;
       } else {
-        this.patientqueryParams.hospitalstarttime = this.parseTime(
+        this.patientqueryParams.hospitalStartTime = this.parseTime(
           queryParams.dateRangecy[0]
         );
-        this.patientqueryParams.hospitalendtime = this.parseTime(
+        this.patientqueryParams.hospitalEndTime = this.parseTime(
           queryParams.dateRangecy[1]
         );
       }
diff --git a/src/views/sfstatistics/percentage/components/SecondFollowUp.vue b/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
index d3abd40..6646e88 100644
--- a/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/SecondFollowUp.vue
@@ -561,8 +561,8 @@
             <el-table-column
               label="鍙戦�佸畬鎴�"
               align="center"
-              key="manualSuccess"
-              prop="manualSuccess"
+              key="manualAgain"
+              prop="manualAgain"
               :render-header="Tooltipfswc"
             >
               <template slot-scope="scope">
@@ -572,12 +572,12 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'manualSuccessInfo',
+                      'manualAgainInfo',
                       '鍙戦�佸畬鎴愪汉宸ラ殢璁垮垪琛�'
                     )
                   "
                 >
-                  <span class="button-zx">{{ scope.row.manualSuccess }}</span>
+                  <span class="button-zx">{{ scope.row.manualAgain }}</span>
                 </el-button>
               </template>
             </el-table-column>
@@ -615,8 +615,8 @@
             <el-table-column
               label="鍙戦�佸畬鎴�"
               align="center"
-              key="voiceSuccess"
-              prop="voiceSuccess"
+              key="voiceAgain"
+              prop="voiceAgain"
               :render-header="Tooltipfswc"
             >
               <template slot-scope="scope">
@@ -626,12 +626,12 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'voiceSuccessInfo',
+                      'voiceAgainInfo',
                       '鍙戦�佸畬鎴愯闊抽殢璁垮垪琛�'
                     )
                   "
                 >
-                  <span class="button-zx">{{ scope.row.voiceSuccess }}</span>
+                  <span class="button-zx">{{ scope.row.voiceAgain }}</span>
                 </el-button>
               </template>
             </el-table-column>
@@ -669,8 +669,8 @@
             <el-table-column
               label="鍙戦�佸畬鎴�"
               align="center"
-              key="smsSuccess"
-              prop="smsSuccess"
+              key="smsAgain"
+              prop="smsAgain"
               :render-header="Tooltipfswc"
             >
               <template slot-scope="scope">
@@ -680,12 +680,12 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'smsSuccessInfo',
+                      'smsAgainInfo',
                       '鍙戦�佸畬鎴愮煭淇¢殢璁垮垪琛�'
                     )
                   "
                 >
-                  <span class="button-zx">{{ scope.row.smsSuccess }}</span>
+                  <span class="button-zx">{{ scope.row.smsAgain }}</span>
                 </el-button>
               </template>
             </el-table-column>
@@ -723,8 +723,8 @@
             <el-table-column
               label="鍙戦�佸畬鎴�"
               align="center"
-              key="weChatSuccess"
-              prop="weChatSuccess"
+              key="weChatAgain"
+              prop="weChatAgain"
               :render-header="Tooltipfswc"
             >
               <template slot-scope="scope">
@@ -734,12 +734,12 @@
                   @click="
                     handleViewDetails(
                       scope.row,
-                      'wechatSuccessInfo',
+                      'weChatAgainInfo',
                       '鍙戦�佸畬鎴愬井淇¢殢璁垮垪琛�'
                     )
                   "
                 >
-                  <span class="button-zx">{{ scope.row.weChatSuccess }}</span>
+                  <span class="button-zx">{{ scope.row.weChatAgain }}</span>
                 </el-button>
               </template>
             </el-table-column>
@@ -1745,92 +1745,154 @@
         },
       };
 
-      const titleText = `鍐嶆${serviceTypeName}缁熻琛╛${sheetNameSuffix}`;
-      // 娣诲姞鏍囬琛�
-      worksheet.mergeCells(1, 1, 1, 16);
-      const titleCell = worksheet.getCell(1, 1);
-      titleCell.value = titleText; // 浣跨敤鍔ㄦ�佹爣棰�
-      titleCell.style = titleStyle;
-      worksheet.getRow(1).height = 35;
+      // 鏄惁涓虹洰鏍囧尰闄紙浜哄伐/璇煶/鐭俊/寰俊 鎸� 鍙戦�佸畬鎴�/鏈�缁堝畬鎴� 鍒嗙骇灞曠ず锛�
+      const graded = this.isTargetHospital;
 
-      // 琛ㄥご
-      // 琛ㄥご闇�瑕佸鍔犳垚鍔熺巼鍒�
-      const secondRowHeaders = [
+      const baseHeaders = [
         "",
         "鍑洪櫌鐥呭尯",
         "绉戝",
         "鍑洪櫌浜烘",
         "鏃犻渶闅忚浜烘",
         "搴旈殢璁夸汉娆�",
+      ];
+      const coreHeaders = [
         "闇�闅忚",
         "寰呴殢璁�",
         "闅忚鎴愬姛",
         "闅忚澶辫触",
-        "鎴愬姛鐜�", // 鎴愬姛鐜囧簲璇ュ湪闅忚澶辫触鍚庨潰
-        "闅忚鐜�", // 闅忚鐜囧湪鎴愬姛鐜囧悗闈�
-        "浜哄伐",
-        "璇煶", // 淇锛氬簲璇ユ槸璇煶锛屼笉鏄煭淇�
-        "鐭俊", // 鐭俊
-        "寰俊", // 寰俊
+        "鎴愬姛鐜�",
+        "闅忚鐜�",
       ];
+      const methodGroups = this.getMethodColumns();
 
-      secondRowHeaders.forEach((header, index) => {
-        const cell = worksheet.getCell(3, index + 1);
-        cell.value = header;
-        cell.style = headerStyle;
-      });
+      const baseCount = baseHeaders.length; // 6
+      const coreCount = coreHeaders.length; // 6
+      const methodLeafCount = methodGroups.reduce(
+        (sum, g) => sum + g.fields.length,
+        0
+      ); // 8 鎴� 4
+      const totalCols = baseCount + coreCount + methodLeafCount; // 20 鎴� 16
+      const coreStartCol = baseCount + 1; // 7
+      const methodStartCol = baseCount + coreCount + 1; // 13
 
-      // 鏇存柊鍚堝苟鍗曞厓鏍肩殑鑼冨洿
-      for (let i = 1; i <= 6; i++) {
-        worksheet.mergeCells(2, i, 3, i);
-        const cell = worksheet.getCell(2, i);
-        cell.style = headerStyle;
+      const titleText = `鍐嶆${serviceTypeName}缁熻琛╛${sheetNameSuffix}`;
+      // 娣诲姞鏍囬琛�
+      worksheet.mergeCells(1, 1, 1, totalCols);
+      const titleCell = worksheet.getCell(1, 1);
+      titleCell.value = titleText;
+      titleCell.style = titleStyle;
+      worksheet.getRow(1).height = 35;
+
+      if (graded) {
+        // 琛ㄥご鍗� 3 琛岋紙绗�2/3/4琛岋級锛屾暟鎹粠绗�5琛屽紑濮�
+        const headerEndRow = 4;
+
+        // 绗�2琛岋細鍩虹鍒楃旱鍚戝悎骞� + 闅忚鍒嗙粍妯悜鍚堝苟
+        for (let i = 1; i <= baseCount; i++) {
+          worksheet.mergeCells(2, i, headerEndRow, i);
+          const cell = worksheet.getCell(2, i);
+          cell.value = baseHeaders[i - 1];
+          cell.style = headerStyle;
+        }
+        worksheet.mergeCells(2, coreStartCol, 2, totalCols);
+        worksheet.getCell(2, coreStartCol).value = "鍐嶆鍑洪櫌闅忚";
+        worksheet.getCell(2, coreStartCol).style = headerStyle;
+
+        // 绗�3琛岋細闅忚鏍稿績鍒楃旱鍚戝悎骞� + 闅忚鏂瑰紡鍒嗙粍妯悜鍚堝苟
+        for (let k = 0; k < coreCount; k++) {
+          const col = coreStartCol + k;
+          worksheet.mergeCells(3, col, headerEndRow, col);
+          const cell = worksheet.getCell(3, col);
+          cell.value = coreHeaders[k];
+          cell.style = headerStyle;
+        }
+        let mc = methodStartCol;
+        methodGroups.forEach((g) => {
+          if (g.fields.length > 1) {
+            worksheet.mergeCells(3, mc, 3, mc + g.fields.length - 1);
+          }
+          const cell = worksheet.getCell(3, mc);
+          cell.value = g.label;
+          cell.style = headerStyle;
+          mc += g.fields.length;
+        });
+
+        // 绗�4琛岋細闅忚鏂瑰紡瀛愬垪锛堝彂閫佸畬鎴�/鏈�缁堝畬鎴愶級
+        mc = methodStartCol;
+        methodGroups.forEach((g) => {
+          g.fields.forEach((field, idx) => {
+            const cell = worksheet.getCell(4, mc + idx);
+            cell.value = g.sub[idx];
+            cell.style = headerStyle;
+          });
+          mc += g.fields.length;
+        });
+
+        worksheet.getRow(2).height = 28;
+        worksheet.getRow(3).height = 24;
+        worksheet.getRow(4).height = 24;
+      } else {
+        // 琛ㄥご鍗� 2 琛岋紙绗�2/3琛岋級锛屾暟鎹粠绗�4琛屽紑濮�
+        const headerEndRow = 3;
+
+        for (let i = 1; i <= baseCount; i++) {
+          worksheet.mergeCells(2, i, headerEndRow, i);
+          const cell = worksheet.getCell(2, i);
+          cell.value = baseHeaders[i - 1];
+          cell.style = headerStyle;
+        }
+        worksheet.mergeCells(2, coreStartCol, 2, totalCols);
+        worksheet.getCell(2, coreStartCol).value = "鍐嶆鍑洪櫌闅忚";
+        worksheet.getCell(2, coreStartCol).style = headerStyle;
+
+        // 绗�3琛岋細闅忚鏍稿績鍒� + 闅忚鏂瑰紡鍒�
+        for (let k = 0; k < coreCount; k++) {
+          const cell = worksheet.getCell(3, coreStartCol + k);
+          cell.value = coreHeaders[k];
+          cell.style = headerStyle;
+        }
+        let mc = methodStartCol;
+        methodGroups.forEach((g) => {
+          const cell = worksheet.getCell(3, mc);
+          cell.value = g.label;
+          cell.style = headerStyle;
+          mc += 1;
+        });
+
+        worksheet.getRow(2).height = 28;
+        worksheet.getRow(3).height = 25;
       }
 
-      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 = "搴旈殢璁夸汉娆�";
-
-      // 娉ㄦ剰锛氱敱浜庡鍔犱簡鎴愬姛鐜囧垪锛屽悎骞跺垪鏁拌澧炲姞
-      worksheet.mergeCells(2, 7, 2, 16); // 浠�7鍚堝苟鍒�16锛堝師鏉ユ槸7-14锛�
-      worksheet.getCell(2, 7).value = "鍐嶆鍑洪櫌闅忚";
-      worksheet.getCell(2, 7).style = headerStyle;
-
-      worksheet.getRow(2).height = 28;
-      worksheet.getRow(3).height = 25;
-
       // 鏁版嵁琛�
+      const dataStartRow = graded ? 5 : 4;
       this.tableData.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,
-            // 鎴愬姛鐜� - 闇�瑕佸姩鎬佽绠�
-            this.calculateSuccessRate(
-              item.followUpSuccessAgain,
-              item.needFollowUpAgain,
-              item.pendingFollowUpAgain
-            ),
-            item.followUpRateAgain || "0%", // 闅忚鐜�
-            item.manualAgain || 0,
-            item.voiceAgain || 0,
-            item.smsAgain || 0,
-            item.weChatAgain || 0,
-          ],
-          rowIndex + 4
-        );
+        const rowValues = [
+          "",
+          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,
+          // 鎴愬姛鐜� - 闇�瑕佸姩鎬佽绠�
+          this.calculateSuccessRate(
+            item.followUpSuccessAgain,
+            item.needFollowUpAgain,
+            item.pendingFollowUpAgain
+          ),
+          item.followUpRateAgain || "0%", // 闅忚鐜�
+        ];
+        methodGroups.forEach((g) => {
+          g.fields.forEach((field) => {
+            rowValues.push(item[field] || 0);
+          });
+        });
 
+        const dataRow = worksheet.addRow(rowValues, rowIndex + dataStartRow);
         dataRow.eachCell((cell) => {
           cell.style = cellStyle;
         });
@@ -1849,24 +1911,27 @@
       summaryRow.height = 28;
 
       // 鍒楀
-      // 淇鍒楀
-      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 }, // 鐭俊
-        { width: 8 }, // 寰俊
+      const widths = [8, 20, 15, 12, 12, 12, 10, 10, 10, 10, 12, 12];
+      methodGroups.forEach((g) => {
+        g.fields.forEach(() => widths.push(8));
+      });
+      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: ["鍙戦�佸畬鎴�", "鏈�缁堝畬鎴�"] },
+        ];
+      }
+      return [
+        { label: "浜哄伐", fields: ["manualAgain"], sub: ["浜哄伐"] },
+        { label: "璇煶", fields: ["voiceAgain"], sub: ["璇煶"] },
+        { label: "鐭俊", fields: ["smsAgain"], sub: ["鐭俊"] },
+        { label: "寰俊", fields: ["weChatAgain"], sub: ["寰俊"] },
       ];
     },
 
@@ -1884,11 +1949,14 @@
         0, // 9: followUpFailAgain
         "0%", // 10: 鎴愬姛鐜�
         "0%", // 11: 闅忚鐜�
-        0, // 12: manualAgain
-        0, // 13: voiceAgain
-        0, // 14: smsAgain
-        0, // 15: weChatAgain
       ];
+
+      const methodFields = this.getMethodColumns().reduce(
+        (arr, g) => arr.concat(g.fields),
+        []
+      );
+      const methodStartIndex = 12;
+      methodFields.forEach(() => summaries.push(0));
 
       this.tableData.forEach((item) => {
         summaries[3] += Number(item.dischargeCount) || 0;
@@ -1898,10 +1966,9 @@
         summaries[7] += Number(item.pendingFollowUpAgain) || 0;
         summaries[8] += Number(item.followUpSuccessAgain) || 0;
         summaries[9] += Number(item.followUpFailAgain) || 0;
-        summaries[12] += Number(item.manualAgain) || 0;
-        summaries[13] += Number(item.voiceAgain) || 0;
-        summaries[14] += Number(item.smsAgain) || 0;
-        summaries[15] += Number(item.weChatAgain) || 0;
+        methodFields.forEach((field, i) => {
+          summaries[methodStartIndex + i] += Number(item[field]) || 0;
+        });
       });
 
       // 鎴愬姛鐜囪绠�
@@ -1929,7 +1996,10 @@
       }
 
       // 鏍煎紡鍖栨暟瀛�
-      [3, 4, 5, 6, 7, 8, 9, 12, 13, 14, 15].forEach((index) => {
+      const numericIndices = [3, 4, 5, 6, 7, 8, 9].concat(
+        methodFields.map((_, i) => methodStartIndex + i)
+      );
+      numericIndices.forEach((index) => {
         summaries[index] = this.formatNumber(summaries[index]);
       });
 
diff --git a/vue.config.js b/vue.config.js
index 414e500..fd08b34 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -36,14 +36,14 @@
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
         // target: `https://www.health-y.cn/lssf`,
-        // target: `http://192.168.100.10:8096`,
+        target: `http://192.168.100.10:8096`,
         // target: `http://192.168.100.10:8094`,//鐪佺珛鍚屽痉
         // target: `http://192.168.100.10:8095`,//鏂板崕
         // target: `http://192.168.100.10:8098`,//甯備竴
         // target:`http://localhost:8095`,
         // target:`http://35z1t16164.qicp.vip`,
         // target: `http://192.168.100.172:8095`,
-        target: `http://192.168.100.10:8089`,//鍗楀崕
+        // target: `http://192.168.100.10:8089`,//鍗楀崕
         // target: `https://9.208.38.93:8092/`,
         changeOrigin: true,
         pathRewrite: {
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\25010.19 \0502\051.zip" "b/\351\232\217\350\256\277\351\200\232\347\224\25010.19 \0502\051.zip"
new file mode 100644
index 0000000..a87e91c
--- /dev/null
+++ "b/\351\232\217\350\256\277\351\200\232\347\224\25010.19 \0502\051.zip"
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\25010.19.zip" "b/\351\232\217\350\256\277\351\200\232\347\224\25010.19.zip"
new file mode 100644
index 0000000..3004d60
--- /dev/null
+++ "b/\351\232\217\350\256\277\351\200\232\347\224\25010.19.zip"
Binary files differ

--
Gitblit v1.9.3