From ffa22cc18c75c0a73a3fd987e2b62fbf55316db2 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期四, 25 六月 2026 15:22:46 +0800
Subject: [PATCH] 测试完成

---
 vue.config.js                                               |    4 
 src/components/Assistant/index.vue                          |  164 ++++
 src/store/modules/sms.js                                    |   61 +
 src/views/followvisit/record/TracingInfo/index.vue          |    2 
 src/views/patient/patient/index.vue                         |   28 
 src/views/patient/propaganda/QuestionnaireTask.vue          |  122 ++
 src/views/knowledge/questionnaire/smsConfig/index.vue       | 1037 ++++++++++++++++++++++++++++
 随访通用.zip                                                    |    0 
 src/views/followvisit/record/detailpage/index.vue           |  245 ++++--
 src/components/CallButton/index.vue                         |   36 
 src/components/StatisticsCards/index.vue                    |   76 +
 src/views/outsideChainwtnew.vue                             |   61 +
 src/views/Satisfaction/sfstatistics/IndicatorStatistics.vue |    2 
 src/views/followvisit/tasklist/index.vue                    |   27 
 dist (2).zip                                                |    0 
 src/store/modules/user.js                                   |    6 
 src/store/index.js                                          |    4 
 src/utils/sipService.js                                     |   24 
 src/views/followvisit/operation/index.vue                   |   52 
 src/views/followvisit/record/detailpage/index copy.vue      |    2 
 随访外链.zip                                                    |    0 
 src/views/followvisit/record/physical/index.vue             |    2 
 src/views/sfstatistics/percentage/index.vue                 |    2 
 src/views/knowledge/questionnaire/index.vue                 |    2 
 src/views/Satisfaction/sfstatistics/index.vue               |   16 
 src/views/patient/propaganda/particty.vue                   |  153 +++-
 src/views/followvisit/discharge/index.vue                   |   18 
 src/views/repositoryai/templateku/index.vue                 |    2 
 随访外链通用.zip                                                  |    0 
 29 files changed, 1,852 insertions(+), 296 deletions(-)

diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip" "b/dist \0502\051.zip"
similarity index 94%
rename from "\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip"
rename to "dist \0502\051.zip"
index a02a0dc..db4bc7e 100644
--- "a/\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip"
+++ "b/dist \0502\051.zip"
Binary files differ
diff --git a/src/components/Assistant/index.vue b/src/components/Assistant/index.vue
index 2ee2946..e7c16a4 100644
--- a/src/components/Assistant/index.vue
+++ b/src/components/Assistant/index.vue
@@ -152,17 +152,76 @@
                   d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"
                 />
               </svg>
+              <!-- 鉁� 鏂板鐭俊鍥炬爣 -->
+              <svg
+                v-else-if="action.icon === 'IconMessageSquare'"
+                viewBox="0 0 24 24"
+                fill="none"
+                stroke="currentColor"
+                stroke-width="2"
+              >
+                <rect x="3" y="3" width="18" height="18" rx="2" ry="2" />
+                <line x1="8" y1="9" x2="16" y2="9" />
+                <line x1="8" y1="13" x2="14" y2="13" />
+                <line x1="8" y1="17" x2="12" y2="17" />
+              </svg>
             </div>
             <div class="action-label">{{ action.label }}</div>
           </div>
         </div>
       </div>
     </transition>
+    <!-- 鐭俊鍙戦�佸璇濇 -->
+    <el-dialog
+      title="鐭俊鍙戦��"
+      :visible.sync="smsDialogVisible"
+      width="500px"
+      :close-on-click-modal="false"
+      append-to-body
+    >
+      <el-form ref="smsForm" :model="smsForm" label-width="100px">
+        <el-form-item label="鎮h�呭悕绉�">
+          <el-input v-model="smsForm.sendname" readonly></el-input>
+        </el-form-item>
+        <el-form-item label="骞撮緞">
+          <el-input v-model="smsForm.age" readonly></el-input>
+        </el-form-item>
+        <el-form-item label="鐢佃瘽">
+          <el-input v-model="smsForm.telcode" readonly></el-input>
+        </el-form-item>
+        <el-form-item label="绉戝">
+          <el-input v-model="smsForm.deptname" readonly></el-input>
+        </el-form-item>
+        <el-form-item label="鐥呭尯">
+          <el-input
+            v-model="smsForm.leavehospitaldistrictname"
+            readonly
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="鐭俊鍐呭">
+          <el-input
+            type="textarea"
+            :rows="4"
+            v-model="smsContent"
+            placeholder="璇疯緭鍏ョ煭淇″唴瀹�..."
+            maxlength="500"
+            show-word-limit
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="smsDialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="sendSms" :loading="smsLoading">
+          纭鍙戦��
+        </el-button>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
 <script>
 import { getCurrentUserServiceSubtaskCount } from "@/api/AiCentre/index";
+import { sendMsg } from "@/api/AiCentre/index";
 export default {
   name: "FloatBall",
 
@@ -210,6 +269,17 @@
       hideTimer: null,
       updateTime: "",
       roles: null,
+      // 鐭俊鍙戦�佸璇濇
+      // smsDialogVisible: false,
+      smsLoading: false, // 鉁� 鏂板鍔犺浇鐘舵��
+      smsContent: "",
+      smsForm: {
+        sendname: "",
+        age: "",
+        telcode: "",
+        deptname: "",
+        leavehospitaldistrictname: "",
+      },
       // 缁熻鏁版嵁
       statsItems: [
         {
@@ -269,12 +339,12 @@
           icon: "IconPhone",
           url: "/followvisit/particty?type=1&serviceType=2",
         },
-        // {
-        //   id: 'chat',
-        //   label: '鍦ㄧ嚎鑱婂ぉ',
-        //   icon: 'IconMessageCircle',
-        //   url: '/chat'
-        // }
+        {
+          id: "sendSms", // 鉁� 鏂板鐭俊鍙戦��
+          label: "鐭俊鍙戦��",
+          icon: "IconMessageSquare",
+          action: "openSmsDialog", // 鏍囪涓哄脊妗嗘搷浣�
+        },
       ],
     };
   },
@@ -283,8 +353,35 @@
     totalUnread() {
       return this.statsItems.reduce((sum, item) => sum + item.unread, 0);
     },
+    // 鉁� Vuex 鍙屽悜缁戝畾
+    smsDialogVisible: {
+      get() {
+        return this.$store.state.sms.smsDialogVisible;
+      },
+      set(val) {
+        if (!val) {
+          this.$store.dispatch("sms/closeSmsDialog");
+        }
+      },
+    },
   },
+  watch: {
+    // 鉁� 鐩戝惉 Vuex 瀵硅瘽妗嗙姸鎬�
+    "$store.state.sms.smsDialogVisible"(val) {
+      if (val) {
+        const patientData = this.$store.state.sms.patientData;
+        this.smsForm = { ...patientData };
+        this.smsContent = this.$store.state.sms.smsTemplate || "";
 
+        // 灞曞紑鎮诞鐞�
+        if (!this.isExpanded) {
+          this.isExpanded = true;
+          this.isHidden = false;
+          clearTimeout(this.hideTimer);
+        }
+      }
+    },
+  },
   mounted() {
     this.roles = this.$store.state.user.roles;
     this.loadPosition();
@@ -424,6 +521,15 @@
     },
 
     handleActionClick(action) {
+      // 濡傛灉鏄煭淇″彂閫佹搷浣滐紝鎵撳紑瀵硅瘽妗�
+      console.log(action);
+
+      if (action.action === "openSmsDialog") {
+        this.openSmsDialog();
+        return;
+      }
+
+      // 鍘熸湁閫昏緫淇濇寔涓嶅彉
       console.log(this.roles, "this.roles");
       if (
         action.url &&
@@ -435,7 +541,53 @@
         this.$modal.msgError("闈炵鐞嗗憳鐢ㄦ埛鏆傛棤鍒涘缓浠诲姟鏉冮檺");
       }
     },
+    // 鎵撳紑鐭俊鍙戦�佸璇濇
+    openSmsDialog() {
+      // 浠庢偓娴悆鍐呴儴鎵撳紑鏃讹紝娓呯┖琛ㄥ崟锛堝洜涓烘病鏈夐�変腑鎮h�咃級
+      this.$store.dispatch("sms/openSmsDialog", {
+        name: "",
+        age: "",
+        phone: "",
+        deptName: "",
+        wardName: "",
+        smsTemplate: "",
+      });
+    },
 
+    // 鍙戦�佺煭淇�
+    async sendSms() {
+      if (!this.smsContent.trim()) {
+        this.$modal.msgError("璇疯緭鍏ョ煭淇″唴瀹�");
+        return;
+      }
+
+      if (!this.smsForm.telcode) {
+        this.$modal.msgError("鎮h�呯數璇濅笉鑳戒负绌�");
+        return;
+      }
+
+      this.smsLoading = true;
+      try {
+        const res = await sendMsg({
+          phone: this.smsForm.telcode,
+          content: this.smsContent,
+        });
+
+        if (res.code === 200) {
+          this.$modal.msgSuccess("鐭俊鍙戦�佹垚鍔�");
+          // 鉁� 閫氳繃 Vuex 鍏抽棴瀵硅瘽妗�
+          this.$store.dispatch("sms/closeSmsDialog");
+          this.smsContent = "";
+        } else {
+          this.$modal.msgError(res.msg || "鍙戦�佸け璐�");
+        }
+      } catch (error) {
+        console.error("鍙戦�佺煭淇″け璐�:", error);
+        this.$modal.msgError("鍙戦�佸け璐ワ紝璇风◢鍚庨噸璇�");
+      } finally {
+        this.smsLoading = false;
+      }
+    },
     async updateStats() {
       try {
         // 杩欓噷鍙互鏇挎崲涓哄疄闄呯殑 API 璋冪敤
diff --git a/src/components/CallButton/index.vue b/src/components/CallButton/index.vue
index d95fb2f..83186de 100644
--- a/src/components/CallButton/index.vue
+++ b/src/components/CallButton/index.vue
@@ -162,7 +162,10 @@
           // 澶勭悊鍚勭鐘舵��
           if (status.type === "registered") {
             this.handleRegistered();
-          } else if (status.type === "failed" || status.type === "disconnected") {
+          } else if (
+            status.type === "failed" ||
+            status.type === "disconnected"
+          ) {
             this.handleDisconnected();
           } else if (status.type === "connecting") {
             this.handleConnecting();
@@ -172,7 +175,8 @@
         // 鐩戝惉閫氳瘽鐘舵�佸彉鍖�
         sipService.onCallStatusChange = (status) => {
           this.callStatus = status.type;
-          this.isCalling = status.type === "calling" || status.type === "connected";
+          this.isCalling =
+            status.type === "calling" || status.type === "connected";
           this.updateLastActivityTime(); // 閫氳瘽鐘舵�佸彉鍖栨椂鏇存柊娲诲姩鏃堕棿
 
           this.$emit("call-status-change", status);
@@ -180,7 +184,6 @@
 
         // 璁剧疆瓒呮椂澶勭悊
         this.setupRegistrationTimeout();
-
       } catch (error) {
         console.error("SIP鏈嶅姟鍒濆鍖栧け璐�:", error);
         this.handleDisconnected();
@@ -272,7 +275,10 @@
       }
 
       this.reconnectCount++;
-      const delay = Math.min(this.reconnectDelay * Math.pow(1.5, this.reconnectCount - 1), 30000);
+      const delay = Math.min(
+        this.reconnectDelay * Math.pow(1.5, this.reconnectCount - 1),
+        30000
+      );
 
       console.log(`璁″垝鍦�${delay}ms鍚庨噸杩烇紝绗�${this.reconnectCount}娆″皾璇昤);
 
@@ -295,12 +301,11 @@
         this.cleanupSipConnection();
 
         // 绛夊緟涓�娈垫椂闂�
-        await new Promise(resolve => setTimeout(resolve, 1000));
+        await new Promise((resolve) => setTimeout(resolve, 1000));
 
         // 閲嶆柊鍒濆鍖�
         await this.CallgetList(); // 閲嶆柊鑾峰彇鍒嗘満鍙�
         this.initSipService();
-
       } catch (error) {
         console.error("閲嶈繛澶辫触:", error);
         this.isReconnecting = false;
@@ -338,7 +343,7 @@
 
     async startCall() {
       if (!this.phoneNumber) {
-        this.$message.error("璇疯緭鍏ョ數璇濆彿鐮�");
+        this.$message.warning("璇疯緭鍏ョ數璇濆彿鐮�");
         return;
       }
 
@@ -357,6 +362,15 @@
       } catch (error) {
         console.error("鍛煎彨澶辫触1:", error);
 
+        if (
+          error.message.includes("Canceled") ||
+          error.message.includes("鏈敞鍐�")
+        ) {
+          console.warn("鍛煎彨鍥犻〉闈㈢寮�鎴栨湭娉ㄥ唽鑰屽彇娑堬紝涓嶉噸璇�");
+          this.callStatus = "ended";
+          this.isCalling = false;
+          return;
+        }
         try {
           // 灏濊瘯鍔�0鍐嶆鍛煎彨
           const { canCall, reason } = sipService.canMakeCall();
@@ -371,7 +385,7 @@
         } catch (error) {
           this.callStatus = "ended";
           this.isCalling = false;
-          this.$message.error("鍛煎彨澶辫触锛岃妫�鏌ョ綉缁滄垨鍙风爜");
+          this.$message.warning("褰撳墠鍛煎彨鍗犵嚎涓紝璇风◢鍚庡啀鎷�");
         }
       }
     },
@@ -451,7 +465,11 @@
     },
   },
   beforeUnmount() {
-    this.cleanupResources();
+    if (this.isCalling) {
+      this.endCall(); // 鍐呴儴璁剧疆浜� isManualEnd
+    }
+    // 鍏朵粬娓呯悊锛堝瀹氭椂鍣級...
+    this.cleanupResources(); // 浣嗘敞鎰忎笉瑕侀噸澶嶆竻鐞嗗畾鏃跺櫒锛屽彲浼樺寲鍒ゆ柇
   },
 };
 </script>
diff --git a/src/components/StatisticsCards/index.vue b/src/components/StatisticsCards/index.vue
index 4ffa324..3f44f00 100644
--- a/src/components/StatisticsCards/index.vue
+++ b/src/components/StatisticsCards/index.vue
@@ -6,8 +6,8 @@
         :key="index"
         :xs="12"
         :sm="8"
-        :md="colSpan"
-        :lg="colSpan"
+        :md="dynamicColSpan"
+        :lg="dynamicColSpan"
       >
         <el-tooltip
           :content="getTooltipContent(item.name)"
@@ -20,15 +20,16 @@
             :body-style="item.router ? 'cursor: pointer' : 'cursor: default'"
             :class="getCardClass(item.name)"
           >
-            <div
-              class="card-content"
-              @click="handleCardClick(item)"
-            >
+            <div class="card-content" @click="handleCardClick(item)">
               <div class="card-label">
                 <span class="label-text">{{ item.name }}</span>
               </div>
               <div class="card-value">
-                {{ item.value !== undefined && item.value !== null ? item.value : 0 }}
+                {{
+                  item.value !== undefined && item.value !== null
+                    ? item.value
+                    : 0
+                }}
               </div>
             </div>
           </el-card>
@@ -44,28 +45,28 @@
   props: {
     cardlist: {
       type: Array,
-      default: () => []
+      default: () => [],
     },
     colSpan: {
       type: Number,
-      default: 4
+      default: 4,
     },
     showExtra: {
       type: Boolean,
-      default: true
+      default: true,
     },
     ycvalue: {
       type: Number,
-      default: 0
+      default: 0,
     },
     jgvalue: {
       type: Number,
-      default: 0
+      default: 0,
     },
     showWarningCondition: {
       type: Boolean,
-      default: false
-    }
+      default: false,
+    },
   },
   computed: {
     mergedCardList() {
@@ -74,43 +75,52 @@
       if (this.showExtra) {
         list.push({
           name: "寮傚父",
-          value: this.ycvalue
+          value: this.ycvalue,
         });
       }
 
       if (this.showWarningCondition) {
         list.push({
           name: "璀﹀憡",
-          value: this.jgvalue
+          value: this.jgvalue,
         });
       }
 
       return list;
-    }
+    },
+    // 鍔ㄦ�佽绠楁瘡鍒楀崰鐨勬爡鏍兼暟
+    dynamicColSpan() {
+      const totalCards = this.mergedCardList.length;
+
+      if (totalCards <= 4) return 6; // 涓�琛�4涓�
+      if (totalCards <= 6) return 4; // 涓�琛�6涓�
+      if (totalCards <= 8) return 3; // 涓�琛�8涓�
+      return 2; // 涓�琛�12涓�
+    },
   },
   methods: {
     getCardClass(name) {
       const classMap = {
-        "鎮h�呮湇鍔℃�婚噺": "total-card",
-        "鏃犻渶闅忚": "no-follow-card",
-        "闇�闅忚": "need-follow-card",
-        "寰呴殢璁�": "pending-card",
-        "宸插畬鎴�": "completed-card",
-        "寮傚父": "error-card",
-        "璀﹀憡": "warning-card"
+        鎮h�呮湇鍔℃�婚噺: "total-card",
+        鏃犻渶闅忚: "no-follow-card",
+        闇�闅忚: "need-follow-card",
+        寰呴殢璁�: "pending-card",
+        宸插畬鎴�: "completed-card",
+        寮傚父: "error-card",
+        璀﹀憡: "warning-card",
       };
       return classMap[name] || "default-card";
     },
 
     getTooltipContent(name) {
       const tooltips = {
-        "鎮h�呮湇鍔℃�婚噺": "鎮h�呮湇鍔℃�婚噺 = 鏃犻渶闅忚 + 闇�闅忚",
-        "鏃犻渶闅忚": "鏃犻渶闅忚锛氫笉闇�瑕佽繘琛岄殢璁跨殑鎮h�呮暟閲�",
-        "闇�闅忚": "闇�闅忚 = 寰呴殢璁� + 宸插畬鎴�",
-        "寰呴殢璁�": "寰呴殢璁匡細绛夊緟杩涜闅忚鐨勬偅鑰呮暟閲�",
-        "宸插畬鎴�": "宸插畬鎴愶細宸插畬鎴愰殢璁跨殑鎮h�呮暟閲�",
-        "寮傚父": "寮傚父鏁版嵁缁熻",
-        "璀﹀憡": "璀﹀憡鏁版嵁缁熻"
+        鎮h�呮湇鍔℃�婚噺: "鎮h�呮湇鍔℃�婚噺 = 鏃犻渶闅忚 + 闇�闅忚",
+        鏃犻渶闅忚: "鏃犻渶闅忚锛氫笉闇�瑕佽繘琛岄殢璁跨殑鎮h�呮暟閲�",
+        闇�闅忚: "闇�闅忚 = 寰呴殢璁� + 宸插畬鎴�",
+        寰呴殢璁�: "寰呴殢璁匡細绛夊緟杩涜闅忚鐨勬偅鑰呮暟閲�",
+        宸插畬鎴�: "宸插畬鎴愶細宸插畬鎴愰殢璁跨殑鎮h�呮暟閲�",
+        寮傚父: "寮傚父鏁版嵁缁熻",
+        璀﹀憡: "璀﹀憡鏁版嵁缁熻",
       };
       return tooltips[name] || "";
     },
@@ -120,8 +130,8 @@
         this.$router.push(item.router);
       }
       this.$emit("card-click", item);
-    }
-  }
+    },
+  },
 };
 </script>
 
diff --git a/src/store/index.js b/src/store/index.js
index 3f85e32..7dcb6ff 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -7,6 +7,7 @@
 import tagsView from './modules/tagsView'
 import permission from './modules/permission'
 import settings from './modules/settings'
+import sms from './modules/sms'
 import getters from './getters'
 
 Vue.use(Vuex)
@@ -19,7 +20,8 @@
     regular,
     tagsView,
     permission,
-    settings
+    settings,
+    sms
   },
   getters
 })
diff --git a/src/store/modules/sms.js b/src/store/modules/sms.js
new file mode 100644
index 0000000..915146f
--- /dev/null
+++ b/src/store/modules/sms.js
@@ -0,0 +1,61 @@
+// src/store/modules/sms.js
+const state = {
+  // 鐭俊瀵硅瘽妗嗘槸鍚﹀彲瑙�
+  smsDialogVisible: false,
+  // 鎮h�呮暟鎹�
+  patientData: {
+    sendname: '',
+    age: '',
+    telcode: '',
+    deptname: '',
+    leavehospitaldistrictname: '',
+  },
+  // 鐭俊妯℃澘
+  smsTemplate: '',
+};
+
+const mutations = {
+  // 鎵撳紑鐭俊瀵硅瘽妗�
+  OPEN_SMS_DIALOG(state, patientData) {
+    console.log(11);
+
+    state.smsDialogVisible = true;
+    if (patientData) {
+      state.patientData = {
+        sendname: patientData.name || '',
+        age: patientData.age || '',
+        telcode: patientData.phone || '',
+        deptname: patientData.deptName || '',
+        leavehospitaldistrictname: patientData.wardName || '',
+      };
+      state.smsTemplate = patientData.smsTemplate || '';
+    }
+  },
+  // 鍏抽棴鐭俊瀵硅瘽妗�
+  CLOSE_SMS_DIALOG(state) {
+    state.smsDialogVisible = false;
+    state.smsTemplate = '';
+  },
+  // 鏇存柊鐭俊鍐呭
+  UPDATE_SMS_CONTENT(state, content) {
+    state.smsTemplate = content;
+  },
+};
+
+const actions = {
+  // 鎵撳紑鐭俊瀵硅瘽妗�
+  openSmsDialog({ commit }, patientData) {
+    commit('OPEN_SMS_DIALOG', patientData);
+  },
+  // 鍏抽棴鐭俊瀵硅瘽妗�
+  closeSmsDialog({ commit }) {
+    commit('CLOSE_SMS_DIALOG');
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index af87801..907f097 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -251,6 +251,12 @@
               localStorage.setItem("deptCode", "");
               localStorage.setItem("YongHuID", "");
               localStorage.setItem("YongHuXM", "");
+            } else if (orgid == "47226007033110211A5201") {
+              localStorage.setItem("orgname", "涓芥按甯傜浜屼汉姘戝尰闄�");
+              localStorage.setItem("ZuHuID", "");
+              localStorage.setItem("deptCode", "");
+              localStorage.setItem("YongHuID", "");
+              localStorage.setItem("YongHuXM", "");
             }
             resolve();
           })
diff --git a/src/utils/sipService.js b/src/utils/sipService.js
index 5641a20..7d952c6 100644
--- a/src/utils/sipService.js
+++ b/src/utils/sipService.js
@@ -11,7 +11,7 @@
     wsUrl: "wss://10.10.0.220:7443",
     domain: "10.10.0.220",
   },
-   绗竴浜烘皯鍖婚櫌婀栨花闄㈠尯: {
+  绗竴浜烘皯鍖婚櫌婀栨花闄㈠尯: {
     wsUrl: "wss://192.169.129.198:7443",
     domain: "192.169.129.198",
   },
@@ -35,6 +35,7 @@
     this.isRegistered = false; // 鏂板娉ㄥ唽鐘舵�佹爣蹇�
     this.registrationTime = null; // 鏂板娉ㄥ唽鎴愬姛鏃堕棿鎴�
     this.currentConfig = null; // 瀛樺偍褰撳墠閰嶇疆
+    this.isManualEnd = false;
   }
   // 鑾峰彇鍖婚櫌閰嶇疆鏂规硶
   getHospitalConfig() {
@@ -136,7 +137,7 @@
   makeCall(targetNumber) {
     const { canCall, reason } = this.canMakeCall();
     if (!canCall) {
-      Message.error(reason);
+      Message.info(reason);
       return Promise.reject(new Error(reason));
     }
     return new Promise((resolve, reject) => {
@@ -162,6 +163,10 @@
           eventHandlers: {
             progress: () => this.updateCallStatus("calling", "鍛煎彨涓�..."),
             failed: (e) => {
+              if (this.isManualEnd) {
+                console.log("涓诲姩鎸傛柇锛屽拷鐣ュけ璐ヤ簨浠�");
+                return;
+              }
               this.handleCallFailure(e, reject);
             },
             ended: () => this.updateCallStatus("ended", "閫氳瘽缁撴潫"),
@@ -417,13 +422,16 @@
     });
   }
 
-  endCall() {
-    if (this.currentSession) {
-      this.currentSession.terminate();
-      this.updateCallStatus("ended", "閫氳瘽宸茬粨鏉�");
-      this.currentSession = null;
-    }
+endCall() {
+  if (this.currentSession) {
+    this.isManualEnd = true;
+    this.currentSession.terminate();
+    this.updateCallStatus('ended', '閫氳瘽宸茬粨鏉�');
+    this.currentSession = null;
+    // 寤惰繜閲嶇疆鏍囧織锛岄伩鍏嶅奖鍝嶅悗缁簨浠�
+    setTimeout(() => { this.isManualEnd = false; }, 100);
   }
+}
 
   updateStatus(type, text) {
     console.log(`SIP鐘舵�佹洿鏂�: ${type} - ${text}`);
diff --git a/src/views/Satisfaction/sfstatistics/IndicatorStatistics.vue b/src/views/Satisfaction/sfstatistics/IndicatorStatistics.vue
index 1f6e0fc..19a9c36 100644
--- a/src/views/Satisfaction/sfstatistics/IndicatorStatistics.vue
+++ b/src/views/Satisfaction/sfstatistics/IndicatorStatistics.vue
@@ -25,7 +25,7 @@
 import SatisfactionStatistics from "./components/SatisfactionStatistics.vue";
 
 export default {
-  name: "StatisticsMain",
+  name: "Satisfaction",
   components: {
     FollowupStatistics,
     SatisfactionStatistics,
diff --git a/src/views/Satisfaction/sfstatistics/index.vue b/src/views/Satisfaction/sfstatistics/index.vue
index 6042306..40a875d 100644
--- a/src/views/Satisfaction/sfstatistics/index.vue
+++ b/src/views/Satisfaction/sfstatistics/index.vue
@@ -19,25 +19,25 @@
 </template>
 
 <script>
-import FollowupStatistics from './components/FollowupStatistics.vue';
-import SatisfactionStatistics from './components/SatisfactionStatistics.vue';
+import FollowupStatistics from "./components/FollowupStatistics.vue";
+import SatisfactionStatistics from "./components/SatisfactionStatistics.vue";
 
 export default {
-  name: 'StatisticsMain',
+  name: "Satisfaction",
   components: {
     FollowupStatistics,
-    SatisfactionStatistics
+    SatisfactionStatistics,
   },
   data() {
     return {
-      activeTab: 'followup'
+      activeTab: "followup",
     };
   },
   methods: {
     handleTabChange(tab) {
-      console.log('鍒囨崲鍒�:', tab.name);
-    }
-  }
+      console.log("鍒囨崲鍒�:", tab.name);
+    },
+  },
 };
 </script>
 
diff --git a/src/views/followvisit/discharge/index.vue b/src/views/followvisit/discharge/index.vue
index dfe664f..0e25341 100644
--- a/src/views/followvisit/discharge/index.vue
+++ b/src/views/followvisit/discharge/index.vue
@@ -486,7 +486,6 @@
           prop="nurseName"
         />
         <el-table-column
-          v-if="orgname != '涓芥按甯備腑鍖婚櫌'"
           label="缁忕鍖荤敓"
           align="center"
           key="managementDoctor"
@@ -1096,7 +1095,7 @@
       dynamicTags: ["閫夐」涓�", "閫夐」浜�", "閫夐」涓�"], //閫夐」
       inputVisible: false,
       Labelchange: false,
-      ycvalue: "",
+      ycvalue: 0,
       jgvalue: "",
       yfsvalue: "",
       inputValue: "",
@@ -1205,7 +1204,8 @@
         btstatus: "",
       },
       // endOut: 1,
-      endOut: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 0 : 1, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
+      endOut:
+        localStorage.getItem("orgname") == "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�" ? 0 : 1, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
       endOuts: [
         {
           value: 0,
@@ -1362,10 +1362,9 @@
     // 鐩戝惉璺敱鍙傛暟鍙樺寲
     "$route.query": {
       handler(newQuery, oldQuery) {
-        if (newQuery.errtype !== oldQuery.errtype) {
+        if (newQuery?.errtype !== oldQuery?.errtype) {
           console.log(22);
-
-          this.loadData(); // 閲嶆柊鍔犺浇鏁版嵁
+          this.loadData();
         }
       },
       immediate: true,
@@ -1478,7 +1477,7 @@
             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.ycvalue = Number(response.rows[0].yc) || 0
           this.jgvalue = response.rows[0].jg;
           this.cardlist[2].value = response.rows[0].xsf || 0;
           this.cardlist[3].value = response.rows[0].dsf || 0;
@@ -1589,7 +1588,7 @@
           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.ycvalue = Number(response.rows[0].yc) || 0
         this.jgvalue = response.rows[0].jg;
         this.cardlist[3].value = response.rows[0].fssb;
         this.cardlist[4].value = response.rows[0].dsf;
@@ -1761,6 +1760,8 @@
       this.handleQuery(1);
     },
     handleSelectionChange(rows) {
+      console.log(rows, 911);
+
       this.selectedRows = rows.map((row) => {
         // 鍒濆鍖栬瘎鍒嗗瓧娈�
         return {
@@ -2080,6 +2081,7 @@
       const originalPageSize = this.topqueryParams.pageSize;
       this.topqueryParams.pageNum = null;
       this.topqueryParams.pageSize = null;
+      this.topqueryParams.subIdList = this.selectedRows.map((item) => item.id);
       this.download(
         "smartor/serviceSubtask/patItemExport",
         {
diff --git a/src/views/followvisit/operation/index.vue b/src/views/followvisit/operation/index.vue
index 5742599..d0d9125 100644
--- a/src/views/followvisit/operation/index.vue
+++ b/src/views/followvisit/operation/index.vue
@@ -1,6 +1,12 @@
 <template>
   <div class="app-container">
-    <div class="leftvlue" style="margin-bottom: 20px">
+    <statistics-cards
+      :cardlist="cardlist"
+      :ycvalue="ycvalue"
+      :jgvalue="jgvalue"
+      :show-warning-condition="orgname == '鐪佺珛鍚屽痉缈犺嫅闄㈠尯'"
+    />
+    <!-- <div class="leftvlue" style="margin-bottom: 20px">
       <el-row :gutter="10">
         <el-col :span="2.5" v-for="(item, index) in cardlist" :key="index">
           <el-card
@@ -80,7 +86,7 @@
           </div>
         </el-col>
       </el-row>
-    </div>
+    </div> -->
     <el-row :gutter="20">
       <!--鐢ㄦ埛鏁版嵁-->
       <el-form
@@ -327,7 +333,7 @@
           :show-overflow-tooltip="true"
         >
         </el-table-column>
-            <!-- <el-table-column
+        <!-- <el-table-column
           label="浠诲姟鐘舵��"
           align="center"
           key="sendstate"
@@ -383,7 +389,7 @@
           width="120"
         >
           <template slot-scope="scope">
-             <el-tooltip
+            <el-tooltip
               class="item"
               effect="dark"
               :content="scope.row.remark"
@@ -429,7 +435,7 @@
             />
           </template>
         </el-table-column>
-         <el-table-column
+        <el-table-column
           label="浠诲姟鐘舵��"
           align="center"
           key="sendstate"
@@ -943,22 +949,22 @@
             </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-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>
@@ -1133,13 +1139,15 @@
 } from "@/api/AiCentre/index";
 import { alterpatient, particularpatient } from "@/api/patient/homepage";
 import Treeselect from "@riophae/vue-treeselect";
+import StatisticsCards from "@/components/StatisticsCards";
+
 import store from "@/store";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 
 export default {
   name: "Discharge",
   dicts: ["sys_normal_disable", "sys_user_sex", "sys_yujing", "sys_suggest"],
-  components: { Treeselect },
+  components: { Treeselect, StatisticsCards },
   data() {
     return {
       // 閬僵灞�
diff --git a/src/views/followvisit/record/TracingInfo/index.vue b/src/views/followvisit/record/TracingInfo/index.vue
index c3dc4b5..14ea6af 100644
--- a/src/views/followvisit/record/TracingInfo/index.vue
+++ b/src/views/followvisit/record/TracingInfo/index.vue
@@ -1924,7 +1924,7 @@
           const targetDate = new Date(this.form.visitTime); // 鐩爣鏃ユ湡
           const now = new Date(); // 褰撳墠鏃堕棿
           if (now < targetDate && this.form.sendstate == 2) {
-            this.$confirm("褰撳墠鏈嶅姟鏈埌鍙戦�佹椂闂磋璋ㄦ厧淇敼", "鎻愮ず", {
+            this.$confirm("褰撳墠鏈嶅姟鏈埌闅忚鏃堕棿璇疯皑鎱庝慨鏀�", "鎻愮ず", {
               confirmButtonText: "纭畾",
               cancelButtonText: "鍙栨秷",
               type: "warning",
diff --git a/src/views/followvisit/record/detailpage/index copy.vue b/src/views/followvisit/record/detailpage/index copy.vue
index 1424ea3..de1d155 100644
--- a/src/views/followvisit/record/detailpage/index copy.vue
+++ b/src/views/followvisit/record/detailpage/index copy.vue
@@ -2117,7 +2117,7 @@
           const targetDate = new Date(this.form.visitTime); // 鐩爣鏃ユ湡
           const now = new Date(); // 褰撳墠鏃堕棿
           if (now < targetDate && this.form.sendstate == 2) {
-            this.$confirm("褰撳墠鏈嶅姟鏈埌鍙戦�佹椂闂磋璋ㄦ厧淇敼", "鎻愮ず", {
+            this.$confirm("褰撳墠鏈嶅姟鏈埌闅忚鏃堕棿璇疯皑鎱庝慨鏀�", "鎻愮ず", {
               confirmButtonText: "纭畾",
               cancelButtonText: "鍙栨秷",
               type: "warning",
diff --git a/src/views/followvisit/record/detailpage/index.vue b/src/views/followvisit/record/detailpage/index.vue
index 1dfa1a7..6bc4606 100644
--- a/src/views/followvisit/record/detailpage/index.vue
+++ b/src/views/followvisit/record/detailpage/index.vue
@@ -107,6 +107,7 @@
                 effect="dark"
                 :content="scope.row.remark"
                 placement="top-start"
+                popper-class="statistics-tooltip"
               >
                 <div v-if="scope.row.sendstateView == 1">
                   <el-tag type="primary" :disable-transitions="false"
@@ -114,22 +115,12 @@
                   >
                 </div>
                 <div v-if="scope.row.sendstateView == 2">
-                  <el-tag type="primary" :disable-transitions="false"
-                    >闅忚涓�</el-tag
-                  >
-                </div>
-                <div v-if="scope.row.sendstateView == 3">
-                  <el-tag type="warning" :disable-transitions="false"
-                    >鏈畬鎴�</el-tag
-                  >
-                </div>
-                <div v-if="scope.row.sendstateView == 4">
                   <el-tag type="success" :disable-transitions="false"
                     >宸插畬鎴�</el-tag
                   >
                 </div>
-                <div v-if="scope.row.sendstateView == 5">
-                  <el-tag type="danger" :disable-transitions="false"
+                <div v-if="scope.row.sendstateView == 3">
+                  <el-tag type="warning" :disable-transitions="false"
                     >鏃犻渶闅忚</el-tag
                   >
                 </div>
@@ -144,7 +135,7 @@
             show-overflow-tooltip
           >
           </el-table-column>
-            <el-table-column
+          <el-table-column
             v-if="orgname == '鍗楀崕澶у闄勫睘绗竴鍖婚櫌'"
             label="鍏ラ櫌鏃ユ湡"
             width="200"
@@ -182,7 +173,58 @@
             key="drname"
             prop="drname"
           />
-
+          <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"
@@ -279,7 +321,12 @@
         <div class="call-container">
           <div
             style="display: flex"
-            v-if="orgname == '鍗楀崕澶у闄勫睘绗竴鍖婚櫌' && !Voicetype"
+            v-if="
+              (orgname == '鍗楀崕澶у闄勫睘绗竴鍖婚櫌' ||
+                orgname == '涓芥按甯傜浜屼汉姘戝尰闄�' ||
+                orgname == '缂欎簯鍘夸汉姘戝尰闄�') &&
+              !Voicetype
+            "
           >
             <template-selector
               v-model="form.templateid"
@@ -998,34 +1045,21 @@
       <!-- 娉ㄦ剰杩欓噷浣跨敤浜� smsDialogVisible 浠ュ尯鍒嗗凡鏈夌殑 dialogFormVisible -->
       <el-form ref="smsForm" :model="form" label-width="80px">
         <el-form-item label="鎮h�呭悕绉�">
-          <el-input
-            style="width: 400px"
-            disabled
-            v-model="form.sendname"
-          ></el-input>
+          <el-input style="width: 400px" v-model="form.sendname"></el-input>
         </el-form-item>
         <el-form-item label="骞撮緞">
-          <el-input style="width: 400px" disabled v-model="form.age"></el-input>
+          <el-input style="width: 400px" v-model="form.age"></el-input>
         </el-form-item>
         <el-form-item label="鐢佃瘽">
-          <el-input
-            style="width: 400px"
-            disabled
-            v-model="userform.telcode"
-          ></el-input>
+          <el-input style="width: 400px" v-model="userform.telcode"></el-input>
           <!-- 娉ㄦ剰杩欓噷鍙兘浣跨敤 userform.telcode -->
         </el-form-item>
         <el-form-item label="绉戝">
-          <el-input
-            style="width: 400px"
-            disabled
-            v-model="form.deptname"
-          ></el-input>
+          <el-input style="width: 400px" v-model="form.deptname"></el-input>
         </el-form-item>
         <el-form-item label="鐥呭尯">
           <el-input
             style="width: 400px"
-            disabled
             v-model="form.leavehospitaldistrictname"
           ></el-input>
         </el-form-item>
@@ -1670,7 +1704,6 @@
     },
     getconfigKey() {
       getconfigKey("default.value.icon").then((res) => {
-
         if (res.msg) {
           if (
             this.getAssignArr(res.msg).includes(this.$store.state.user.name) ||
@@ -2000,29 +2033,29 @@
             this.Torouter();
             return;
           }
-          this.$modal
-            .confirm(
-              '浠诲姟淇濆瓨鎴愬姛鏄惁閽堝鎮h�咃細"' +
-                this.userform.name +
-                '"鍐嶆闅忚锛�',
-              "纭",
-              {
-                confirmButtonText: "纭畾",
-                cancelButtonText: "鍙栨秷",
-                showCancelButton: true,
-                dangerouslyUseHTMLString: true,
-                confirmButtonClass: "custom-confirm-button", // 鑷畾涔夌‘璁ゆ寜閽殑绫诲悕
-                cancelButtonClass: "custom-cancel-button", // 鑷畾涔夊彇娑堟寜閽殑绫诲悕
-              }
-            )
-            .then(() => {
-              document.querySelector("#app").scrollTo(0, 0);
-              this.formtidy();
-              this.dialogFormVisible = true;
-            })
-            .catch(() => {
-              this.Torouter();
-            });
+          // this.$modal
+          //   .confirm(
+          //     '浠诲姟淇濆瓨鎴愬姛鏄惁閽堝鎮h�咃細"' +
+          //       this.userform.name +
+          //       '"鍐嶆闅忚锛�',
+          //     "纭",
+          //     {
+          //       confirmButtonText: "纭畾",
+          //       cancelButtonText: "鍙栨秷",
+          //       showCancelButton: true,
+          //       dangerouslyUseHTMLString: true,
+          //       confirmButtonClass: "custom-confirm-button", // 鑷畾涔夌‘璁ゆ寜閽殑绫诲悕
+          //       cancelButtonClass: "custom-cancel-button", // 鑷畾涔夊彇娑堟寜閽殑绫诲悕
+          //     }
+          //   )
+          //   .then(() => {
+          //     document.querySelector("#app").scrollTo(0, 0);
+          //     this.formtidy();
+          //     this.dialogFormVisible = true;
+          //   })
+          //   .catch(() => {
+          //     this.Torouter();
+          //   });
         }
       });
     },
@@ -2266,29 +2299,31 @@
       savequestiondetail(obj).then((res) => {
         if (res.code == 200) {
           this.$modal.msgSuccess("鏈嶅姟淇濆瓨鎴愬姛");
-          this.$modal
-            .confirm(
-              '浠诲姟淇濆瓨鎴愬姛鏄惁閽堝鎮h�咃細"' +
-                this.userform.name +
-                '"鍐嶆闅忚锛�',
-              "纭",
-              {
-                confirmButtonText: "纭畾",
-                cancelButtonText: "鍙栨秷",
-                showCancelButton: true,
-                dangerouslyUseHTMLString: true,
-                confirmButtonClass: "custom-confirm-button", // 鑷畾涔夌‘璁ゆ寜閽殑绫诲悕
-                cancelButtonClass: "custom-cancel-button", // 鑷畾涔夊彇娑堟寜閽殑绫诲悕
-              }
-            )
-            .then(() => {
-              document.querySelector("#app").scrollTo(0, 0);
-              this.formtidy();
-              this.dialogFormVisible = true;
-            })
-            .catch(() => {
-              this.Torouter();
-            });
+          this.Torouter();
+
+          //   this.$modal
+          //     .confirm(
+          //       '浠诲姟淇濆瓨鎴愬姛鏄惁閽堝鎮h�咃細"' +
+          //         this.userform.name +
+          //         '"鍐嶆闅忚锛�',
+          //       "纭",
+          //       {
+          //         confirmButtonText: "纭畾",
+          //         cancelButtonText: "鍙栨秷",
+          //         showCancelButton: true,
+          //         dangerouslyUseHTMLString: true,
+          //         confirmButtonClass: "custom-confirm-button", // 鑷畾涔夌‘璁ゆ寜閽殑绫诲悕
+          //         cancelButtonClass: "custom-cancel-button", // 鑷畾涔夊彇娑堟寜閽殑绫诲悕
+          //       }
+          //     )
+          //     .then(() => {
+          //       document.querySelector("#app").scrollTo(0, 0);
+          //       this.formtidy();
+          //       this.dialogFormVisible = true;
+          //     })
+          //     .catch(() => {
+          //       this.Torouter();
+          //     });
         }
       });
     },
@@ -2336,7 +2371,7 @@
           console.log(targetDate, "鐩爣鏃ユ湡");
 
           if (now < targetDate && this.form.sendstate == 2) {
-            this.$confirm("褰撳墠鏈嶅姟鏈埌鍙戦�佹椂闂磋璋ㄦ厧淇敼", "鎻愮ず", {
+            this.$confirm("褰撳墠鏈嶅姟鏈埌闅忚鏃堕棿璇疯皑鎱庝慨鏀�", "鎻愮ず", {
               confirmButtonText: "纭畾",
               cancelButtonText: "鍙栨秷",
               type: "warning",
@@ -2391,6 +2426,7 @@
           objson = res.rows[0].serviceSubtaskList[0];
           objson.suggest = son;
           objson.remark = this.form.remark;
+          objson.sendstate = this.serviceStates;
           objson.taskSituation = this.form.taskSituation;
           Editsingletaskson(objson).then((res) => {
             if (res.code) {
@@ -2432,13 +2468,14 @@
       });
     },
     alterpatient(sendstate) {
-      alterpatient(this.userform).then((res) => {
-        if (res.code == 200) {
-          this.$modal.msgSuccess("鍩虹淇℃伅淇濆瓨鎴愬姛");
-        } else {
-          this.$modal.msgError("鍩虹淇℃伅淇敼澶辫触");
-        }
-      });
+      this.Editsingletasksonyic(this.serviceStates)
+      // alterpatient(this.userform).then((res) => {
+      //   if (res.code == 200) {
+      //     this.$modal.msgSuccess("鍩虹淇℃伅淇濆瓨鎴愬姛");
+      //   } else {
+      //     this.$modal.msgError("鍩虹淇℃伅淇敼澶辫触");
+      //   }
+      // });
     },
     // 寮傚父鍒楁覆鏌�
     tableRowClassName({ row, rowIndex }) {
@@ -2830,14 +2867,38 @@
   //   console.log(11);
   // },
   beforeRouteLeave(to, from, next) {
-    this.$refs.callButton.cleanupResources();
-    if (this.$refs.CallCenterLs) {
-      console.log(1);
+  const callButton = this.$refs.callButton;
 
+  // 濡傛灉瀛樺湪鍛煎彨缁勪欢涓旀鍦ㄩ�氳瘽涓�
+  if (callButton && callButton.isCalling) {
+    this.$confirm('褰撳墠姝e湪閫氳瘽涓紝纭畾瑕佺寮�姝ら〉闈㈠悧锛�', '鎻愮ず', {
+      confirmButtonText: '鎸傛柇骞剁寮�',
+      cancelButtonText: '缁х画閫氳瘽',
+      type: 'warning'
+    })
+      .then(() => {
+        // 鐢ㄦ埛纭绂诲紑锛屼富鍔ㄦ寕鏂苟娓呯悊
+        callButton.cleanupResources();
+        if (this.$refs.CallCenterLs) {
+          this.$refs.CallCenterLs.handleSeatLogout();
+        }
+        next();
+      })
+      .catch(() => {
+        // 鐢ㄦ埛鍙栨秷锛岄樆姝㈣矾鐢辫烦杞�
+        next(false);
+      });
+  } else {
+    // 鏈�氳瘽鎴栧懠鍙粍浠朵笉瀛樺湪锛屾甯告竻鐞�
+    if (callButton) {
+      callButton.cleanupResources();
+    }
+    if (this.$refs.CallCenterLs) {
       this.$refs.CallCenterLs.handleSeatLogout();
     }
-    next(); // 纭繚璋冪敤 nex
-  },
+    next();
+  }
+}
   // beforeRouteUpdate() {
   //   console.log(33);
   // },
diff --git a/src/views/followvisit/record/physical/index.vue b/src/views/followvisit/record/physical/index.vue
index a1b67fa..60763f8 100644
--- a/src/views/followvisit/record/physical/index.vue
+++ b/src/views/followvisit/record/physical/index.vue
@@ -1040,7 +1040,7 @@
           const now = new Date(); // 褰撳墠鏃堕棿
           this.form.endtime = this.formatTime(this.form.endtime);
           if (now < targetDate && this.form.sendstate == 2) {
-            this.$confirm("褰撳墠鏈嶅姟鏈埌鍙戦�佹椂闂磋璋ㄦ厧淇敼", "鎻愮ず", {
+            this.$confirm("褰撳墠鏈嶅姟鏈埌闅忚鏃堕棿璇疯皑鎱庝慨鏀�", "鎻愮ず", {
               confirmButtonText: "纭畾",
               cancelButtonText: "鍙栨秷",
               type: "warning",
diff --git a/src/views/followvisit/tasklist/index.vue b/src/views/followvisit/tasklist/index.vue
index 3fb13fe..aafd22e 100644
--- a/src/views/followvisit/tasklist/index.vue
+++ b/src/views/followvisit/tasklist/index.vue
@@ -1003,17 +1003,22 @@
 
     // 鏆傚仠
     stop(row) {
-      console.log(row);
-      if (row.sendState == 2) {
-        this.TaskOperation.taskId = row.taskid;
-        this.TaskOperation.sendState = 3;
-        this.TaskOperation.sendType = "";
-        this.TaskOperation.taskType = row.type;
-        TaskTemplateSendExecution(this.TaskOperation).then((res) => {
-          this.$modal.msgSuccess("浠诲姟宸叉殏鍋�");
-          this.getList();
-        });
-      }
+      this.$modal
+        .confirm('鏄惁纭鏆傚仠"' + row.taskName + '"锛�')
+        .then(function () {
+          if (row.sendState == 2) {
+            this.TaskOperation.taskId = row.taskid;
+            this.TaskOperation.sendState = 3;
+            this.TaskOperation.sendType = "";
+            this.TaskOperation.taskType = row.type;
+            TaskTemplateSendExecution(this.TaskOperation).then((res) => {
+              this.$modal.msgSuccess("浠诲姟宸叉殏鍋�");
+              this.getList();
+            });
+          }
+        })
+
+        .catch(() => {});
     },
 
     /** 鎻愪氦鎸夐挳 */
diff --git a/src/views/knowledge/questionnaire/index.vue b/src/views/knowledge/questionnaire/index.vue
index d6ecc7f..23a1a19 100644
--- a/src/views/knowledge/questionnaire/index.vue
+++ b/src/views/knowledge/questionnaire/index.vue
@@ -478,7 +478,7 @@
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
 export default {
-  name: "questionnaire",
+  name: "Questionnaire",
   components: { Treeselect },
   data() {
     return {
diff --git a/src/views/knowledge/questionnaire/smsConfig/index.vue b/src/views/knowledge/questionnaire/smsConfig/index.vue
new file mode 100644
index 0000000..a6207bd
--- /dev/null
+++ b/src/views/knowledge/questionnaire/smsConfig/index.vue
@@ -0,0 +1,1037 @@
+<template>
+  <div class="smsConfig-management">
+    <!-- 宸︿晶鏍� -->
+    <div class="sidecolumn">
+      <div class="sidecolumn-top">
+        <div class="top-wj">妯℃澘鍒嗙被</div>
+        <div class="top-tj" @click="Newcategory">+娣诲姞</div>
+      </div>
+      <div class="center-ss">
+        <el-input
+          placeholder="璇疯緭鍏ュ唴瀹�"
+          v-model="sidecolumnval"
+          class="input-with-select"
+          size="medium"
+        >
+        </el-input>
+      </div>
+      <div class="head-container" style="margin-top: 20px">
+        <el-tree
+          :data="deptOptions"
+          :props="defaultProps"
+          :expand-on-click-node="false"
+          :filter-node-method="filterNode"
+          ref="tree"
+          node-key="id"
+          default-expand-all
+          highlight-current
+          @node-click="handleNodeClick"
+        >
+          <span class="custom-tree-node" slot-scope="{ node, data }">
+            <span class="tree-node-label">{{ node.label }}</span>
+            <span v-if="data.id > 0">
+              <el-button
+                type="text"
+                icon="el-icon-delete"
+                circle
+                size="mini"
+                @click="() => remove(node, data)"
+              >
+              </el-button>
+            </span>
+            <span v-if="data.id > 0">
+              <el-button
+                type="text"
+                circle
+                size="mini"
+                @click="() => altertag(node, data)"
+              >
+                <span class="button-textxg">
+                  <i class="el-icon-edit-outline"></i>
+                </span>
+              </el-button>
+            </span>
+          </span>
+        </el-tree>
+      </div>
+    </div>
+
+    <!-- 鍙充晶鏁版嵁 -->
+    <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="templetname">
+                <el-input
+                  v-model="queryParams.templetname"
+                  placeholder="璇疯緭鍏ユā鏉垮悕绉�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleQuery"
+                />
+              </el-form-item>
+
+              <el-form-item label="鐭俊绛惧悕" prop="signature">
+                <el-input
+                  v-model="queryParams.signature"
+                  placeholder="璇疯緭鍏ョ煭淇$鍚�"
+                  clearable
+                  style="width: 200px"
+                  @keyup.enter.native="handleQuery"
+                />
+              </el-form-item>
+
+              <el-form-item label="鍚敤鐘舵��" prop="isenable">
+                <el-select
+                  v-model="queryParams.isenable"
+                  placeholder="璇烽�夋嫨鐘舵��"
+                  clearable
+                  style="width: 200px"
+                >
+                  <el-option
+                    v-for="item in statusOptions"
+                    :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"
+                >鎼滅储</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="userList"
+              :border="true"
+              @selection-change="handleSelectionChange"
+            >
+              <el-table-column type="selection" width="50" align="center" />
+
+              <el-table-column
+                label="妯℃澘鍚嶇О"
+                align="center"
+                key="templetname"
+                prop="templetname"
+                width="160"
+                :show-overflow-tooltip="true"
+              />
+
+              <el-table-column
+                label="鐭俊绛惧悕"
+                align="center"
+                key="signature"
+                prop="signature"
+                width="120"
+              />
+
+              <el-table-column
+                label="妯℃澘鍐呭"
+                align="center"
+                key="templetcontent"
+                prop="templetcontent"
+                width="280"
+                :show-overflow-tooltip="true"
+              />
+
+              <el-table-column
+                label="妯℃澘绫诲瀷"
+                align="center"
+                key="templettype"
+                prop="templettype"
+                width="120"
+              >
+                <template slot-scope="scope">
+                  <dict-tag :options="typeOptions" :value="scope.row.templettype" />
+                </template>
+              </el-table-column>
+
+              <el-table-column
+                label="鍚敤鐘舵��"
+                align="center"
+                key="isenable"
+                prop="isenable"
+                width="100"
+              >
+                <template slot-scope="scope">
+                  <dict-tag :options="statusOptions" :value="scope.row.isenable" />
+                </template>
+              </el-table-column>
+
+              <el-table-column
+                label="澶囨敞"
+                align="center"
+                key="remark"
+                prop="remark"
+                width="180"
+                :show-overflow-tooltip="true"
+              />
+
+              <el-table-column
+                label="鍒涘缓鏃堕棿"
+                align="center"
+                key="createTime"
+                prop="createTime"
+                width="160"
+              />
+
+              <el-table-column
+                label="鎿嶄綔"
+                fixed="right"
+                align="center"
+                width="240"
+                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="handlePreview(scope.row)"
+                  >
+                    <span class="button-text">
+                      <i class="el-icon-view"></i>棰勮
+                    </span>
+                  </el-button>
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="handleDelete(scope.row)"
+                  >
+                    <span class="button-textsc">
+                      <i class="el-icon-edit"></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>
+    </div>
+
+    <!-- 娣诲姞/淇敼鐭俊妯℃澘寮规 -->
+    <el-dialog
+      :title="dialogTitle"
+      :visible.sync="dialogVisible"
+      width="45%"
+      :close-on-click-modal="false"
+    >
+      <el-form
+        :model="form"
+        :rules="rules"
+        ref="formRef"
+        label-width="100px"
+        size="medium"
+      >
+        <el-form-item label="妯℃澘鍒嗙被" prop="categoryid">
+          <el-select
+            v-model="form.categoryid"
+            placeholder="璇烽�夋嫨妯℃澘鍒嗙被"
+            clearable
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in categoryOptions"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="妯℃澘鍚嶇О" prop="templetname">
+          <el-input
+            v-model="form.templetname"
+            placeholder="璇疯緭鍏ユā鏉垮悕绉�"
+            maxlength="50"
+          />
+        </el-form-item>
+
+        <el-form-item label="鐭俊绛惧悕" prop="signature">
+          <el-input
+            v-model="form.signature"
+            placeholder="璇疯緭鍏ョ煭淇$鍚嶏紙濡傦細銆愪附姘翠汉姘戝尰闄€�戯級"
+            maxlength="20"
+          />
+        </el-form-item>
+
+        <el-form-item label="妯℃澘鍐呭" prop="templetcontent">
+          <el-input
+            v-model="form.templetcontent"
+            type="textarea"
+            :rows="5"
+            placeholder="璇疯緭鍏ョ煭淇℃ā鏉垮唴瀹�"
+            maxlength="500"
+            show-word-limit
+          />
+        </el-form-item>
+
+        <el-form-item label="妯℃澘绫诲瀷" prop="templettype">
+          <el-select
+            v-model="form.templettype"
+            placeholder="璇烽�夋嫨妯℃澘绫诲瀷"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in typeOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+
+        <el-form-item label="鍚敤鐘舵��" prop="isenable">
+          <el-radio-group v-model="form.isenable">
+            <el-radio
+              v-for="item in statusOptions"
+              :key="item.value"
+              :label="item.value"
+            >{{ item.label }}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input
+            v-model="form.remark"
+            type="textarea"
+            :rows="3"
+            placeholder="璇疯緭鍏ュ娉ㄤ俊鎭�"
+            maxlength="200"
+            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>
+
+    <!-- 妯℃澘棰勮寮规 -->
+    <el-dialog
+      title="鐭俊妯℃澘棰勮"
+      :visible.sync="previewVisible"
+      width="40%"
+    >
+      <div class="preview-box">
+        <div class="preview-item">
+          <div class="preview-label">妯℃澘鍚嶇О锛�</div>
+          <div class="preview-value">{{ previewData.templetname }}</div>
+        </div>
+        <div class="preview-item">
+          <div class="preview-label">鐭俊绛惧悕锛�</div>
+          <div class="preview-value">{{ previewData.signature }}</div>
+        </div>
+        <div class="preview-item">
+          <div class="preview-label">妯℃澘绫诲瀷锛�</div>
+          <div class="preview-value">
+            <dict-tag :options="typeOptions" :value="previewData.templettype" />
+          </div>
+        </div>
+        <div class="preview-item">
+          <div class="preview-label">鍚敤鐘舵�侊細</div>
+          <div class="preview-value">
+            <dict-tag :options="statusOptions" :value="previewData.isenable" />
+          </div>
+        </div>
+        <el-divider></el-divider>
+        <div class="preview-content">
+          <div class="preview-content-label">鐭俊鍐呭棰勮锛�</div>
+          <div class="preview-content-box">
+            {{ previewData.templetcontent || '鏆傛棤鍐呭' }}
+          </div>
+        </div>
+        <div class="preview-item" v-if="previewData.remark">
+          <div class="preview-label">澶囨敞锛�</div>
+          <div class="preview-value">{{ previewData.remark }}</div>
+        </div>
+      </div>
+    </el-dialog>
+
+    <!-- 娣诲姞绫诲埆寮规 -->
+    <el-dialog title="绫诲埆缂栬緫" width="30%" :visible.sync="dialogFormVisible">
+      <div style="text-align: center; margin-bottom: 20px">
+        <el-radio-group v-model="radio">
+          <el-radio-button label="涓诲垎绫�"></el-radio-button>
+          <el-radio-button label="瀛愬垎绫�"></el-radio-button>
+        </el-radio-group>
+      </div>
+      <el-divider></el-divider>
+      <el-form :model="classifyform">
+        <el-form-item label="璇烽�夋嫨妯℃澘澶х被" v-if="radio == '瀛愬垎绫�'">
+          <el-select v-model="classifyform.pid" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in deptOptions"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="璇疯緭鍏ョ被鍒悕绉�">
+          <el-input v-model="classifyform.name" autocomplete="off"></el-input>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="getDeptTree()">鍙� 娑�</el-button>
+        <el-button type="primary" @click="submitsidecolumn">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import store from "@/store";
+import {
+  listSmstemplet,
+  getSmstemplet,
+  addSmstemplet,
+  updateSmstemplet,
+  delSmstemplet,
+} from "@/api/smartor/smstemplet";
+
+export default {
+  name: "SmsConfig",
+  data() {
+    return {
+      // 閬僵灞�
+      loading: false,
+      // 鎻愪氦鎸夐挳loading
+      submitLoading: false,
+      // 閫変腑鏁扮粍
+      ids: [],
+      // 闈炲崟涓鐢�
+      single: true,
+      // 闈炲涓鐢�
+      multiple: true,
+      // 鏄剧ず鎼滅储鏉′欢
+      showSearch: true,
+      // 鎬绘潯鏁�
+      total: 0,
+      // 琛ㄦ牸鏁版嵁
+      userList: [],
+      // 寮规鏍囬
+      dialogTitle: "",
+      // 寮规鍙鎬�
+      dialogVisible: false,
+      // 棰勮寮规
+      previewVisible: false,
+      // 棰勮鏁版嵁
+      previewData: {},
+      // 绫诲埆寮规
+      dialogFormVisible: false,
+      // 绫诲埆form
+      classifyform: {},
+      // 涓�/瀛愬垎绫�
+      radio: "涓诲垎绫�",
+      // 绫诲埆鎼滅储
+      sidecolumnval: "",
+      // 鏍戞暟鎹�
+      deptOptions: [],
+      // 鍒嗙被涓嬫媺閫夐」
+      categoryOptions: [],
+      // 鏍憄rops
+      defaultProps: {
+        children: "children",
+        label: "name",
+      },
+      // 鐘舵�侀�夐」
+      statusOptions: [
+        { label: "鍚敤", value: "0" },
+        { label: "鍋滅敤", value: "1" },
+      ],
+      // 绫诲瀷閫夐」
+      typeOptions: [
+        { label: "楠岃瘉鐮�", value: "0" },
+        { label: "閫氱煡", value: "1" },
+        { label: "钀ラ攢", value: "2" },
+        { label: "闅忚", value: "3" },
+      ],
+      // 鏌ヨ鍙傛暟
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      // 琛ㄥ崟
+      form: {},
+      // 琛ㄥ崟鏍¢獙
+      rules: {
+        templetname: [
+          { required: true, message: "璇疯緭鍏ユā鏉垮悕绉�", trigger: "blur" },
+        ],
+        templetcontent: [
+          { required: true, message: "璇疯緭鍏ユā鏉垮唴瀹�", trigger: "blur" },
+        ],
+        signature: [
+          { required: true, message: "璇疯緭鍏ョ煭淇$鍚�", trigger: "blur" },
+        ],
+        isenable: [
+          { required: true, message: "璇烽�夋嫨鍚敤鐘舵��", trigger: "change" },
+        ],
+      },
+    };
+  },
+  watch: {
+    // 鐩戝惉绫诲埆鎼滅储
+    sidecolumnval(val) {
+      this.$refs.tree.filter(val);
+    },
+  },
+  created() {
+    this.getList();
+    this.getDeptTree();
+  },
+  methods: {
+    /** 鏌ヨ鍒楄〃 */
+    getList() {
+      this.loading = true;
+      listSmstemplet(this.queryParams).then((response) => {
+        this.userList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+
+    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+
+    /** 閲嶇疆鎸夐挳鎿嶄綔 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+
+    // 澶氶�夋閫変腑鏁版嵁
+    handleSelectionChange(selection) {
+      this.ids = selection.map((item) => item.templetid);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
+    },
+
+    /** 鏂板鎸夐挳鎿嶄綔 */
+    handleAdd() {
+      this.dialogTitle = "鏂板鐭俊妯℃澘";
+      this.dialogVisible = true;
+      this.form = {
+        isenable: "0",
+        templettype: "1",
+      };
+      // 濡傛灉鏈夋爲閫変腑鍒嗙被锛岄粯璁ゅ甫鍏�
+      if (this.queryParams.categoryid) {
+        this.form.categoryid = this.queryParams.categoryid;
+      }
+      this.$nextTick(() => {
+        if (this.$refs.formRef) {
+          this.$refs.formRef.clearValidate();
+        }
+      });
+    },
+
+    /** 淇敼鎸夐挳鎿嶄綔 */
+    handleUpdate(row) {
+      this.dialogTitle = "淇敼鐭俊妯℃澘";
+      this.dialogVisible = true;
+      const templetid = row.templetid || this.ids[0];
+      getSmstemplet(templetid).then((response) => {
+        this.form = response.data;
+        this.$nextTick(() => {
+          if (this.$refs.formRef) {
+            this.$refs.formRef.clearValidate();
+          }
+        });
+      });
+    },
+
+    /** 棰勮鎸夐挳鎿嶄綔 */
+    handlePreview(row) {
+      this.previewVisible = true;
+      const templetid = row.templetid;
+      getSmstemplet(templetid).then((response) => {
+        this.previewData = response.data;
+      });
+    },
+
+    /** 鎻愪氦琛ㄥ崟 */
+    submitForm() {
+      this.$refs.formRef.validate((valid) => {
+        if (valid) {
+          this.submitLoading = true;
+          if (this.form.templetid) {
+            // 淇敼
+            updateSmstemplet(this.form)
+              .then(() => {
+                this.$modal.msgSuccess("淇敼鎴愬姛");
+                this.dialogVisible = false;
+                this.getList();
+              })
+              .finally(() => {
+                this.submitLoading = false;
+              });
+          } else {
+            // 鏂板
+            addSmstemplet(this.form)
+              .then(() => {
+                this.$modal.msgSuccess("鏂板鎴愬姛");
+                this.dialogVisible = false;
+                this.getList();
+              })
+              .finally(() => {
+                this.submitLoading = false;
+              });
+          }
+        }
+      });
+    },
+
+    /** 鍙栨秷琛ㄥ崟 */
+    cancelForm() {
+      this.dialogVisible = false;
+      this.form = {};
+      this.$nextTick(() => {
+        if (this.$refs.formRef) {
+          this.$refs.formRef.clearValidate();
+        }
+      });
+    },
+
+    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
+    handleDelete(row) {
+      const templetids = row.templetid || this.ids.join(",");
+      this.$modal
+        .confirm('鏄惁纭鍒犻櫎妯℃澘缂栧彿涓�"' + templetids + '"鐨勬暟鎹」锛�')
+        .then(function () {
+          return delSmstemplet(templetids);
+        })
+        .then(() => {
+          this.getList();
+          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+        })
+        .catch(() => {});
+    },
+
+    // 琛ㄥ崟閲嶇疆
+    reset() {
+      this.form = {
+        templetid: undefined,
+        templetname: undefined,
+        signature: undefined,
+        templetcontent: undefined,
+        templettype: "1",
+        isenable: "0",
+        categoryid: undefined,
+        remark: undefined,
+      };
+      this.resetForm("form");
+    },
+
+    /** 鏌ヨ鍒嗙被鏍� */
+    getDeptTree() {
+      // 妯℃嫙鍒嗙被鏍戞暟鎹� - 瀹為檯椤圭洰涓簲鏇挎崲涓虹湡瀹濧PI
+      this.deptOptions = [
+        {
+          id: 1,
+          name: "闅忚鐭俊",
+          children: [
+            { id: 11, name: "鍑洪櫌闅忚" },
+            { id: 12, name: "澶嶈瘖鎻愰啋" },
+            { id: 13, name: "鍋ュ悍瀹f暀" },
+          ],
+        },
+        {
+          id: 2,
+          name: "閫氱煡鐭俊",
+          children: [
+            { id: 21, name: "棰勭害閫氱煡" },
+            { id: 22, name: "鎶ュ憡閫氱煡" },
+          ],
+        },
+        {
+          id: 3,
+          name: "楠岃瘉鐮�",
+          children: [
+            { id: 31, name: "鐧诲綍楠岃瘉" },
+            { id: 32, name: "娉ㄥ唽楠岃瘉" },
+          ],
+        },
+      ];
+      this.categoryOptions = this.flattenTree(this.deptOptions);
+    },
+
+    /** 鎵佸钩鍖栨爲鏁版嵁鐢ㄤ簬涓嬫媺閫夋嫨 */
+    flattenTree(tree) {
+      let result = [];
+      tree.forEach((item) => {
+        result.push({ id: item.id, name: item.name });
+        if (item.children && item.children.length) {
+          result = result.concat(item.children);
+        }
+      });
+      return result;
+    },
+
+    /** 绛涢�夎妭鐐� */
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.name.indexOf(value) !== -1;
+    },
+
+    /** 鐐瑰嚮鏍戣妭鐐� */
+    handleNodeClick(data) {
+      if (data.children && data.children.length) return;
+      this.queryParams.categoryid = data.id;
+      this.getList();
+    },
+
+    // 鍒嗙被鏍�-----------------------
+    /** 鏂板缓鍒嗙被 */
+    Newcategory() {
+      this.classifyform = {};
+      this.radio = "涓诲垎绫�";
+      this.dialogFormVisible = true;
+    },
+
+    /** 淇敼鍒嗙被 */
+    altertag(node, data) {
+      this.dialogFormVisible = true;
+      if (data.children && data.children.length) {
+        this.radio = "涓诲垎绫�";
+      } else {
+        this.radio = "瀛愬垎绫�";
+      }
+      this.classifyform = { ...data };
+    },
+
+    /** 鎻愪氦鍒嗙被 */
+    submitsidecolumn() {
+      if (this.classifyform.id) {
+        // 淇敼鍒嗙被 - 瀹為檯椤圭洰涓簲鏇挎崲涓虹湡瀹濧PI
+        const index = this.deptOptions.findIndex(
+          (obj) => obj.id === this.classifyform.id
+        );
+        if (index > -1) {
+          this.deptOptions[index].name = this.classifyform.name;
+          this.$set(this.deptOptions, index, this.deptOptions[index]);
+        }
+        this.$modal.msgSuccess("淇敼鎴愬姛");
+        this.dialogFormVisible = false;
+        return;
+      }
+
+      if (this.radio === "涓诲垎绫�" && this.classifyform.name) {
+        // 鏂板涓诲垎绫�
+        const newId = Math.max(...this.deptOptions.map((d) => d.id), 0) + 1;
+        this.deptOptions.push({
+          id: newId,
+          name: this.classifyform.name,
+          children: [],
+        });
+        this.$modal.msgSuccess("鏂板鎴愬姛");
+        this.dialogFormVisible = false;
+      } else if (
+        this.radio === "瀛愬垎绫�" &&
+        this.classifyform.pid &&
+        this.classifyform.name
+      ) {
+        // 鏂板瀛愬垎绫�
+        const parent = this.deptOptions.find(
+          (obj) => obj.id === this.classifyform.pid
+        );
+        if (parent) {
+          const newChildId =
+            Math.max(...parent.children.map((c) => c.id), parent.id * 10) + 1;
+          parent.children.push({
+            id: newChildId,
+            name: this.classifyform.name,
+          });
+        }
+        this.$modal.msgSuccess("鏂板鎴愬姛");
+        this.dialogFormVisible = false;
+      } else {
+        this.$modal.msgError("璇峰~鍐欏畬鏁翠俊鎭�");
+      }
+      this.classifyform = {};
+    },
+
+    /** 鍒犻櫎鍒嗙被 */
+    remove(node, data) {
+      if (data.children && data.children.length) {
+        this.$modal
+          .confirm(
+            '鏄惁纭鍒犻櫎涓�绾у垎绫�"' + data.name + '"锛熷垹闄ゅ悗鍏朵笅鍒嗙被灏嗘棤娉曚娇鐢�'
+          )
+          .then(() => {
+            const index = this.deptOptions.findIndex(
+              (obj) => obj.id === data.id
+            );
+            if (index > -1) {
+              this.deptOptions.splice(index, 1);
+            }
+            this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          })
+          .catch(() => {});
+      } else {
+        this.$modal
+          .confirm('鏄惁纭鍒犻櫎鍒嗙被椤逛负"' + data.name + '"鐨勬暟鎹」锛�')
+          .then(() => {
+            this.deptOptions.forEach((parent) => {
+              const idx = parent.children.findIndex(
+                (child) => child.id === data.id
+              );
+              if (idx > -1) {
+                parent.children.splice(idx, 1);
+              }
+            });
+            this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+          })
+          .catch(() => {});
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.smsConfig-management {
+  display: flex;
+}
+
+.sidecolumn {
+  width: 380px;
+  min-height: 100vh;
+  text-align: center;
+  margin-top: 20px;
+  margin: 20px;
+  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);
+
+  .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;
+    }
+  }
+
+  /* 鏍稿績锛氳缃浐瀹氬搴︼紝瓒呭嚭閮ㄥ垎鏄剧ず鐪佺暐鍙� */
+  .tree-node-label {
+    display: inline-block;
+    max-width: 160px;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    vertical-align: bottom;
+  }
+
+  /* 鍙�夛細榧犳爣鎮仠鏃跺彇娑堥檺鍒讹紝鏄剧ず鍏ㄦ枃 */
+  .custom-tree-node:hover .tree-node-label {
+    max-width: none;
+    white-space: normal;
+    overflow: visible;
+  }
+
+  .center-ss {
+    margin-top: 30px;
+    .input-with-select {
+      height: 40px !important;
+    }
+  }
+
+  .bottom-fl {
+    margin-top: 30px;
+    display: center !important;
+  }
+}
+
+.leftvlue {
+  width: 80%;
+  margin-top: 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;
+  }
+}
+
+// 棰勮寮规鏍峰紡
+.preview-box {
+  padding: 10px 20px;
+
+  .preview-item {
+    display: flex;
+    align-items: center;
+    margin-bottom: 15px;
+    font-size: 15px;
+
+    .preview-label {
+      width: 100px;
+      text-align: right;
+      color: #606266;
+      font-weight: 500;
+    }
+
+    .preview-value {
+      flex: 1;
+      margin-left: 10px;
+      color: #303133;
+    }
+  }
+
+  .preview-content {
+    margin-bottom: 15px;
+
+    .preview-content-label {
+      color: #606266;
+      font-weight: 500;
+      margin-bottom: 10px;
+      font-size: 15px;
+    }
+
+    .preview-content-box {
+      padding: 15px;
+      background: #f5f7fa;
+      border: 1px solid #dcdfe6;
+      border-radius: 4px;
+      min-height: 60px;
+      line-height: 1.8;
+      color: #303133;
+      word-break: break-all;
+    }
+  }
+}
+
+// 娣卞害閫夋嫨鍣�
+::v-deep .el-input--medium .el-input__inner {
+  height: 40px !important;
+}
+
+::v-deep .el-tree-node__content {
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  -webkit-box-align: center;
+  -ms-flex-align: center;
+  align-items: center;
+  height: 46px;
+  font-size: 20px;
+  cursor: pointer;
+}
+
+::v-deep .el-tree {
+  position: relative;
+  cursor: default;
+  border-radius: 5px;
+  background: #eff8fe;
+  color: #606266;
+  border: 1px solid #bbe1fa;
+  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
+    0 0 6px 0 rgba(0, 0, 0, 0.04);
+}
+
+::v-deep
+  .el-tree--highlight-current
+  .el-tree-node.is-current
+  > .el-tree-node__content {
+  background-color: #7799fb;
+  color: #fff;
+}
+
+::v-deep .el-button--mini.is-circle {
+  padding: 7px;
+  margin: 0;
+  color: red;
+}
+
+// 鎸夐挳鏂囧瓧棰滆壊
+.button-text {
+  color: rgb(70, 204, 238);
+}
+
+.button-textxg {
+  color: rgb(35, 81, 233);
+}
+
+.button-textsc {
+  color: rgb(235, 23, 23);
+}
+</style>
diff --git a/src/views/outsideChainwtnew.vue b/src/views/outsideChainwtnew.vue
index ffcee9d..32cd4e8 100644
--- a/src/views/outsideChainwtnew.vue
+++ b/src/views/outsideChainwtnew.vue
@@ -23,7 +23,9 @@
                   : "浜茬埍鐨勬偅鑰�-瀹跺睘锛屾垜浠槸鍖婚櫌鐨勫尰鎶や汉鍛橈紝涓轰簡鏇村ソ鍦颁簡瑙f偍鐨勫悍澶嶆儏鍐碉紝璇锋偍鎶戒竴鐐瑰疂璐垫椂闂达紝瀹屾垚杩欎唤闅忚闂嵎銆�"
               }}
             </div>
-            <div v-if="orgname" class="questionnaire-signature">鈥斺�斺�攞{ orgname }}</div>
+            <div v-if="orgname" class="questionnaire-signature">
+              鈥斺�斺�攞{ orgname }}
+            </div>
           </div>
 
           <el-divider class="custom-divider"></el-divider>
@@ -327,6 +329,7 @@
         <div class="completion-content">
           <div class="completion-icon">鉁�</div>
           <h2 class="completion-title">鎰熻阿鎮ㄧ殑閰嶅悎!</h2>
+          <h2 class="completion-title">绁濇偍鍋ュ悍蹇箰!</h2>
           <p class="completion-message">
             {{
               jsy
@@ -506,7 +509,15 @@
             res.data.param3,
             res.data.param5
           );
-          this.orgname = res.data.orgname;
+          if (
+            res.data.orgname == "鐪佺珛鍚屽痉缈犺嫅闄㈠尯" ||
+            res.data.orgname == "鐪佺珛鍚屽痉涔嬫睙闄㈠尯" ||
+            res.data.orgname == "鐪佺珛鍚屽痉闂叉灄闄㈠尯"
+          ) {
+            this.orgname = "娴欐睙鐪佺珛鍚屽痉鍖婚櫌";
+          } else {
+            this.orgname = res.data.orgname;
+          }
 
           this.param6 = res.data.param6;
         }
@@ -895,7 +906,7 @@
 
 .questionnaire-description {
   font-size: 16px;
-  color: #5a6c84;
+  color: #303a47;
   line-height: 1.8;
   max-width: 720px;
   margin: 0;
@@ -904,8 +915,8 @@
   text-indent: 2em; /* 棣栬缂╄繘 */
 }
 .questionnaire-signature {
-  font-size: 15px;
-  color: #8a9bb5; /* 姣旀鏂囬鑹茬◢娴咃紝浣撶幇闄勫睘鎰� */
+  font-size: 16px;
+  color: #303a47;
   text-align: right; /* 鍙冲榻� */
   max-width: 720px;
   margin: 8px 0 0 auto; /* 涓婅竟璺�8px锛屽彸杈归潬榻� */
@@ -972,11 +983,21 @@
 
 .question-stem {
   display: grid;
-  grid-template-columns: auto 1fr auto; /* 棰樺彿鑷�傚簲锛屾枃鏈崰婊″墿浣欑┖闂达紝棰樺瀷鏍囩鑷�傚簲 */
+  grid-template-columns: auto 1fr auto;
   gap: 3px;
-  align-items: center;
+  align-items: start; /* 鏀逛负 start 閬垮厤灞呬腑瀵艰嚧鐨勮瑙夐棶棰� */
   margin-bottom: 20px;
   font-size: 18px;
+}
+
+.question-text {
+  line-height: 1.5;
+  color: #2c3e50;
+  font-weight: 500;
+  word-wrap: break-word;
+  overflow-wrap: break-word;
+  white-space: normal; /* 纭繚鍏佽鎹㈣ */
+  min-width: 0; /* 闃叉 grid 椤规孩鍑� */
 }
 
 .question-number {
@@ -985,14 +1006,14 @@
   min-width: 16px;
 }
 
-.question-text {
-  line-height: 1.5;
-  color: #2c3e50;
-  font-weight: 500;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
+// .question-text {
+//   line-height: 1.5;
+//   color: #2c3e50;
+//   font-weight: 500;
+//   overflow: hidden;
+//   text-overflow: ellipsis;
+//   white-space: nowrap;
+// }
 
 .question-type-tag {
   color: #3ba2f7;
@@ -1162,11 +1183,11 @@
     font-size: 16px;
   }
 
-  .question-stem {
-    font-size: 16px;
-    flex-direction: column;
-    align-items: flex-start;
-  }
+  // .question-stem {
+  //   font-size: 16px;
+  //   flex-direction: column;
+  //   align-items: flex-start;
+  // }
 
   .question-type-tag {
     margin-left: 0;
diff --git a/src/views/patient/patient/index.vue b/src/views/patient/patient/index.vue
index c6b5bc0..ce272ca 100644
--- a/src/views/patient/patient/index.vue
+++ b/src/views/patient/patient/index.vue
@@ -182,7 +182,7 @@
                   >鍒犻櫎</el-button
                 >
               </el-col>
-              <el-col :span="1.5">
+              <!-- <el-col :span="1.5">
                 <el-button
                   type="primary"
                   icon="el-icon-s-promotion"
@@ -190,7 +190,7 @@
                   @click="distribute"
                   >鍚戜换鍔℃淳鍙戞偅鑰�</el-button
                 >
-              </el-col>
+              </el-col> -->
               <el-col :span="6">
                 <div class="documentf">
                   <div class="document">
@@ -376,14 +376,14 @@
                       ><i class="el-icon-edit"></i>鎮h�呰繃婊�</span
                     ></el-button
                   >
-                  <!-- <el-button
+                  <el-button
                     size="medium"
                     type="text"
                     @click="Distributionservice(scope.row)"
-                    ><span class="button-textxg"
-                      ><i class="el-icon-menu"></i>鏈嶅姟</span
+                    ><span class="button-textdx"
+                      ><i class="el-icon-s-promotion"></i>鐭俊鍙戦��</span
                     ></el-button
-                  > -->
+                  >
                   <!-- <el-button
                     size="medium"
                     type="text"
@@ -1261,8 +1261,17 @@
         this.loading = false;
       });
     },
-    Distributionservice(row) {
-      this.serviceVisible = true;
+    Distributionservice(patient) {
+      this.$store.dispatch("sms/openSmsDialog", {
+        name: patient.name,
+        age: patient.age,
+        phone: patient.telcode,
+        deptName: patient.deptName,
+        wardName: patient.wardName,
+        smsTemplate: `灏婃暚鐨�${patient.name}锛屾偍濂斤紒`,
+      });
+
+      this.$message.success(`宸插噯澶囧悜 ${patient.name} 鍙戦�佺煭淇);
     },
     RiskMarker(row) {
       this.RiskVisible = true;
@@ -1671,6 +1680,9 @@
 .button-textxga {
   color: #de7897;
 }
+.button-textdx {
+  color: #569655;
+}
 .button-textxg {
   color: #de7897;
 }
diff --git a/src/views/patient/propaganda/QuestionnaireTask.vue b/src/views/patient/propaganda/QuestionnaireTask.vue
index 6c4256a..f5cfbd4 100644
--- a/src/views/patient/propaganda/QuestionnaireTask.vue
+++ b/src/views/patient/propaganda/QuestionnaireTask.vue
@@ -370,27 +370,103 @@
                   </el-row>
                 </el-row>
                 <el-row v-if="form.appltype == 4">
-                  <el-col :span="20"
-                    ><el-form-item label="閫傜敤鎵嬫湳" prop="region">
-                      <el-select
-                        v-model="form.oplevelcode"
-                        style="width: 400px"
-                        @remove-tag="removeopera"
-                        size="medium"
-                        :remote-method="remoteopcode"
-                        filterable
-                        remote
-                        placeholder="璇烽�夋嫨鎵嬫湳"
+                  <el-form-item label="閫傜敤鎵嬫湳" prop="region">
+                    <el-select
+                      v-model="form.oplevelcode"
+                      style="width: 400px"
+                      @remove-tag="removeopera"
+                      size="medium"
+                      :remote-method="remoteopcode"
+                      filterable
+                      remote
+                      placeholder="璇烽�夋嫨鎵嬫湳"
+                    >
+                      <el-option
+                        class="ruleFormaa"
+                        v-for="item in baseoperaList"
+                        :label="item.label"
+                        :value="item.value"
                       >
-                        <el-option
-                          class="ruleFormaa"
-                          v-for="item in baseoperaList"
-                          :label="item.label"
-                          :value="item.value"
+                      </el-option>
+                    </el-select>
+                  </el-form-item>
+                  <div
+                    style="
+                      margin-bottom: 20px;
+                      padding: 8px 12px;
+                      background-color: #f0f9ff;
+                      border-left: 4px solid #409eff;
+                    "
+                  >
+                    <p
+                      style="
+                        margin: 0;
+                        color: #606266;
+                        font-size: 13px;
+                        line-height: 1.4;
+                      "
+                    >
+                      <i
+                        class="el-icon-info"
+                        style="color: #409eff; margin-right: 6px"
+                      ></i>
+                      閽堝鍚屼竴鎵嬫湳绫诲瀷鍦ㄥ绉戝/鐥呭尯涓嬪瓨鍦ㄧ殑鎯呭喌锛屽彲閫夋嫨鎬ч厤缃浐瀹氱瀹�/鐥呭尯
+                    </p>
+                  </div>
+                  <!-- 鏂板锛氭墜鏈叧鑱斾笅鐨勭瀹ら厤缃紙鍗曢�夛級 -->
+                  <el-row :gutter="20" style="margin-top: 20px">
+                    <el-col :span="12">
+                      <el-form-item label="鍏宠仈绉戝" prop="diseaseDept">
+                        <el-select
+                          v-model="diseaseDept"
+                          style="width: 100%"
+                          clearable
+                          filterable
+                          placeholder="璇烽�夋嫨绉戝锛堝彲閫夛級"
+                          value-key="deptCode"
+                          @change="handleDiseaseDeptChange"
                         >
-                        </el-option>
-                      </el-select> </el-form-item
-                  ></el-col>
+                          <el-option
+                            v-for="item in belongDepts"
+                            :key="item.deptCode"
+                            :label="item.deptName"
+                            :value="item"
+                          ></el-option>
+                        </el-select>
+                        <div v-if="diseaseDept" class="selected-info">
+                          宸查�夋嫨: {{ diseaseDept.deptName }} ({{
+                            diseaseDept.deptCode
+                          }})
+                        </div>
+                      </el-form-item>
+                    </el-col>
+
+                    <el-col :span="12">
+                      <el-form-item label="鍏宠仈鐥呭尯" prop="diseaseWard">
+                        <el-select
+                          v-model="diseaseWard"
+                          style="width: 100%"
+                          clearable
+                          filterable
+                          placeholder="璇烽�夋嫨鐥呭尯锛堝彲閫夛級"
+                          value-key="districtCode"
+                          @change="handleDiseaseWardChange"
+                        >
+                          <el-option
+                            v-for="item in belongWards"
+                            :key="item.districtCode"
+                            :label="item.districtName"
+                            :value="item"
+                          ></el-option>
+                        </el-select>
+                        <div v-if="diseaseWard" class="selected-info">
+                          宸查�夋嫨: {{ diseaseWard.districtName }} ({{
+                            diseaseWard.districtCode
+                          }})
+                        </div>
+                      </el-form-item>
+                    </el-col>
+                  </el-row>
                 </el-row>
                 <el-row>
                   <el-col :span="12"
@@ -1097,8 +1173,8 @@
       // 鏃堕棿澶勭悊
       daytime: [], //鏃ユ湡
       applydaytime: [], //璁$畻鏃ユ湡
-      diseaseDept: null, // 鐤剧梾鍏宠仈涓嬬殑绉戝锛堝瓨鍌ㄦ暣涓璞★級
-      diseaseWard: null, // 鐤剧梾鍏宠仈涓嬬殑鐥呭尯锛堝瓨鍌ㄦ暣涓璞★級
+      diseaseDept: null, // 鐤剧梾鎴栨墜鏈叧鑱斾笅鐨勭瀹わ紙瀛樺偍鏁翠釜瀵硅薄锛�
+      diseaseWard: null, // 鐤剧梾鎴栨墜鏈叧鑱斾笅鐨勭梾鍖猴紙瀛樺偍鏁翠釜瀵硅薄锛�
       diseaseDepts: "",
       diseaseWards: "",
       time1: "", //涓婂崍鏃堕棿娈�
@@ -1551,12 +1627,12 @@
         }
 
         // 鏍¢獙锛氱柧鐥呭叧鑱旂瀹ゆ垨鐥呭尯
-        if (this.form.appltype == 3) {
+        if (this.form.appltype == 3 || this.form.appltype == 4) {
           const hasDept = this.diseaseDept?.deptCode;
           const hasWard = this.diseaseWard?.districtCode;
 
           if (!hasDept && !hasWard) {
-            this.$modal.msgError("褰撳墠鐤剧梾闇�鍏宠仈绉戝鎴栫梾鍖�");
+            this.$modal.msgError("闇�鍏宠仈绉戝鎴栫梾鍖�");
             this.submitLoading = false;
             return;
           }
diff --git a/src/views/patient/propaganda/particty.vue b/src/views/patient/propaganda/particty.vue
index 2d36270..09e1d13 100644
--- a/src/views/patient/propaganda/particty.vue
+++ b/src/views/patient/propaganda/particty.vue
@@ -389,29 +389,103 @@
                   </el-row>
                 </el-row>
                 <el-row v-if="form.appltype == 4">
-                  <el-col :span="20"
-                    ><el-form-item label="閫傜敤鎵嬫湳" prop="region">
-                      <el-select
-                        v-model="operationcodes"
-                        style="width: 400px"
-                        @remove-tag="removeopera"
-                        :remote-method="remoteopcode"
-                        size="medium"
-                        multiple
-                        filterable
-                        remote
-                        placeholder="璇烽�夋嫨鎵嬫湳"
+                  <el-form-item label="閫傜敤鎵嬫湳" prop="region">
+                    <el-select
+                      v-model="form.oplevelcode"
+                      style="width: 400px"
+                      @remove-tag="removeopera"
+                      size="medium"
+                      :remote-method="remoteopcode"
+                      filterable
+                      remote
+                      placeholder="璇烽�夋嫨鎵嬫湳"
+                    >
+                      <el-option
+                        class="ruleFormaa"
+                        v-for="item in baseoperaList"
+                        :label="item.label"
+                        :value="item.value"
                       >
-                        <el-option
-                          class="ruleFormaa"
-                          v-for="item in baseoperaList"
-                          :key="item.icdcode"
-                          :label="item.icdname"
-                          :value="item.icdcode"
+                      </el-option>
+                    </el-select>
+                  </el-form-item>
+                  <div
+                    style="
+                      margin-bottom: 20px;
+                      padding: 8px 12px;
+                      background-color: #f0f9ff;
+                      border-left: 4px solid #409eff;
+                    "
+                  >
+                    <p
+                      style="
+                        margin: 0;
+                        color: #606266;
+                        font-size: 13px;
+                        line-height: 1.4;
+                      "
+                    >
+                      <i
+                        class="el-icon-info"
+                        style="color: #409eff; margin-right: 6px"
+                      ></i>
+                      閽堝鍚屼竴鎵嬫湳绫诲瀷鍦ㄥ绉戝/鐥呭尯涓嬪瓨鍦ㄧ殑鎯呭喌锛屽彲閫夋嫨鎬ч厤缃浐瀹氱瀹�/鐥呭尯
+                    </p>
+                  </div>
+                  <!-- 鏂板锛氭墜鏈叧鑱斾笅鐨勭瀹ら厤缃紙鍗曢�夛級 -->
+                  <el-row :gutter="20" style="margin-top: 20px">
+                    <el-col :span="12">
+                      <el-form-item label="鍏宠仈绉戝" prop="diseaseDept">
+                        <el-select
+                          v-model="diseaseDept"
+                          style="width: 100%"
+                          clearable
+                          filterable
+                          placeholder="璇烽�夋嫨绉戝锛堝彲閫夛級"
+                          value-key="deptCode"
+                          @change="handleDiseaseDeptChange"
                         >
-                        </el-option>
-                      </el-select> </el-form-item
-                  ></el-col>
+                          <el-option
+                            v-for="item in belongDepts"
+                            :key="item.deptCode"
+                            :label="item.deptName"
+                            :value="item"
+                          ></el-option>
+                        </el-select>
+                        <div v-if="diseaseDept" class="selected-info">
+                          宸查�夋嫨: {{ diseaseDept.deptName }} ({{
+                            diseaseDept.deptCode
+                          }})
+                        </div>
+                      </el-form-item>
+                    </el-col>
+
+                    <el-col :span="12">
+                      <el-form-item label="鍏宠仈鐥呭尯" prop="diseaseWard">
+                        <el-select
+                          v-model="diseaseWard"
+                          style="width: 100%"
+                          clearable
+                          filterable
+                          placeholder="璇烽�夋嫨鐥呭尯锛堝彲閫夛級"
+                          value-key="districtCode"
+                          @change="handleDiseaseWardChange"
+                        >
+                          <el-option
+                            v-for="item in belongWards"
+                            :key="item.districtCode"
+                            :label="item.districtName"
+                            :value="item"
+                          ></el-option>
+                        </el-select>
+                        <div v-if="diseaseWard" class="selected-info">
+                          宸查�夋嫨: {{ diseaseWard.districtName }} ({{
+                            diseaseWard.districtCode
+                          }})
+                        </div>
+                      </el-form-item>
+                    </el-col>
+                  </el-row>
                 </el-row>
                 <el-row>
                   <el-col :span="12"
@@ -1039,7 +1113,10 @@
       questionList: [],
       skip: false,
       donorchargeList: [],
-      baseoperaList: [],
+      baseoperaList: [ { value: "1", label: "涓�绾ф墜鏈�" },
+        { value: "2", label: "浜岀骇鎵嬫湳" },
+        { value: "3", label: "涓夌骇鎵嬫湳" },
+        { value: "4", label: "鍥涚骇鎵嬫湳" },],
       selectedOrder: [],
       diseaseDept: null, // 鐤剧梾鍏宠仈涓嬬殑绉戝锛堝瓨鍌ㄦ暣涓璞★級
       diseaseWard: null, // 鐤剧梾鍏宠仈涓嬬殑鐥呭尯锛堝瓨鍌ㄦ暣涓璞★級
@@ -1588,7 +1665,7 @@
         }
 
         // 2. 鐤剧梾鍏宠仈绉戝鎴栫梾鍖烘牎楠�
-        if (this.form.appltype == 3) {
+        if (this.form.appltype == 3 || this.form.appltype == 4) {
           const hasDept = this.diseaseDept?.deptCode;
           const hasWard = this.diseaseWard?.districtCode;
 
@@ -2204,24 +2281,24 @@
       }).then((row) => {
         this.donorchargeList = res.rows;
       });
-      getbaseopera({
-        pageNum: 1,
-        pageSize: 1000,
-      }).then((row) => {
-        this.baseoperaList = res.rows;
-      });
+      // getbaseopera({
+      //   pageNum: 1,
+      //   pageSize: 1000,
+      // }).then((row) => {
+      //   this.baseoperaList = res.rows;
+      // });
     },
     // 鎵嬫湳鏌ヨ
     remoteopcode(name) {
-      if (name) {
-        getbaseopera({
-          pageNum: 1,
-          pageSize: 1000,
-          opdesc: name,
-        }).then((res) => {
-          this.baseoperaList = res.rows;
-        });
-      }
+      // if (name) {
+      //   getbaseopera({
+      //     pageNum: 1,
+      //     pageSize: 1000,
+      //     opdesc: name,
+      //   }).then((res) => {
+      //     this.baseoperaList = res.rows;
+      //   });
+      // }
     },
 
     // 浠诲姟绉戝鍒犻櫎瑙﹀彂
diff --git a/src/views/repositoryai/templateku/index.vue b/src/views/repositoryai/templateku/index.vue
index 32a155a..80cacd4 100644
--- a/src/views/repositoryai/templateku/index.vue
+++ b/src/views/repositoryai/templateku/index.vue
@@ -499,7 +499,7 @@
 } from "@/api/AiCentre/index";
 import { listDept } from "@/api/system/dept";
 export default {
-  name: "templateku",
+  name: "Templateku",
   data() {
     return {
       topactiveName: "Local", //椤堕儴閫夋嫨
diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
index 356a03e..713e2a2 100644
--- a/src/views/sfstatistics/percentage/index.vue
+++ b/src/views/sfstatistics/percentage/index.vue
@@ -204,7 +204,7 @@
 import { getSfStatisticsHyperlink } from "@/api/AiCentre/index";
 
 export default {
-  name: "FollowUpStatistics",
+  name: "Percentage",
   components: {
     FirstFollowUp,
     SecondFollowUp,
diff --git a/vue.config.js b/vue.config.js
index 252f723..b58c628 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -37,13 +37,13 @@
       [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:8094`,//鐪佺珛鍚屽痉
+        // 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: `http://192.168.191.181:8095`,
         changeOrigin: true,
         pathRewrite: {
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip" "b/\351\232\217\350\256\277\345\244\226\351\223\276.zip"
similarity index 90%
copy from "\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip"
copy to "\351\232\217\350\256\277\345\244\226\351\223\276.zip"
index a02a0dc..c0df10a 100644
--- "a/\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip"
+++ "b/\351\232\217\350\256\277\345\244\226\351\223\276.zip"
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip" "b/\351\232\217\350\256\277\345\244\226\351\223\276\351\200\232\347\224\250.zip"
similarity index 90%
copy from "\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip"
copy to "\351\232\217\350\256\277\345\244\226\351\223\276\351\200\232\347\224\250.zip"
index a02a0dc..2b288ef 100644
--- "a/\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip"
+++ "b/\351\232\217\350\256\277\345\244\226\351\223\276\351\200\232\347\224\250.zip"
Binary files differ
diff --git "a/\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip" "b/\351\232\217\350\256\277\351\200\232\347\224\250.zip"
similarity index 89%
copy from "\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip"
copy to "\351\232\217\350\256\277\351\200\232\347\224\250.zip"
index a02a0dc..e14bfbe 100644
--- "a/\351\232\217\350\256\277\351\200\232\347\224\250\357\274\210\351\234\200\345\220\214\346\255\245\346\234\200\346\226\260\347\212\266\346\200\201\357\274\211.zip"
+++ "b/\351\232\217\350\256\277\351\200\232\347\224\250.zip"
Binary files differ

--
Gitblit v1.9.3