From 17efc8b0fb7d3fa66eb8e22f32b81e3e14bcd7f6 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期二, 06 一月 2026 17:37:57 +0800
Subject: [PATCH] 测试完成

---
 src/views/index.vue                                |   43 ++
 src/api/system/user.js                             |   15 
 dist (2).zip                                       |    0 
 dist.zip                                           |    0 
 vue.config.js                                      |    4 
 SY-wl.zip                                          |    0 
 src/utils/sipService.js                            |   66 ++++-
 src/api/AiCentre/SingleTask.js                     |    8 
 src/views/sfstatistics/percentage/satisfaction.vue |   39 ++
 src/views/followvisit/record/index.vue             |   46 +++
 wailian.zip                                        |    0 
 src/views/sfstatistics/percentage/index.vue        |  427 ++++++++++++++++++++++++++++------
 lishui.zip                                         |    0 
 src/components/CallButton/index.vue                |   19 +
 src/views/patient/propaganda/particty.vue          |   22 +
 src/api/AiCentre/Followup.js                       |    8 
 src/views/followvisit/discharge/index.vue          |   14 
 17 files changed, 561 insertions(+), 150 deletions(-)

diff --git a/SY-wl.zip b/SY-wl.zip
new file mode 100644
index 0000000..9cc0fbd
--- /dev/null
+++ b/SY-wl.zip
Binary files differ
diff --git "a/dist \0502\051.zip" "b/dist \0502\051.zip"
new file mode 100644
index 0000000..07e29f2
--- /dev/null
+++ "b/dist \0502\051.zip"
Binary files differ
diff --git a/dist.zip b/dist.zip
new file mode 100644
index 0000000..d9e6eb7
--- /dev/null
+++ b/dist.zip
Binary files differ
diff --git a/lishui.zip b/lishui.zip
index 15edbb7..3b8c4f7 100644
--- a/lishui.zip
+++ b/lishui.zip
Binary files differ
diff --git a/src/api/AiCentre/Followup.js b/src/api/AiCentre/Followup.js
index b20b35a..991dd04 100644
--- a/src/api/AiCentre/Followup.js
+++ b/src/api/AiCentre/Followup.js
@@ -45,7 +45,13 @@
     // data: data,
   });
 }
-
+export function getTaskFollowupList(data) {
+  return request({
+    url: "/smartor/ivrTaskTemplate/list",
+    method: "post",
+    data: data,
+  });
+}
 // 鏂板闅忚妯℃澘鍒嗙被鏍�
 export function addFollowupclassify(data) {
   return request({
diff --git a/src/api/AiCentre/SingleTask.js b/src/api/AiCentre/SingleTask.js
index c8beb03..379812f 100644
--- a/src/api/AiCentre/SingleTask.js
+++ b/src/api/AiCentre/SingleTask.js
@@ -136,6 +136,14 @@
     method: "get",
   });
 }
+// 鑾峰彇璇煶浠诲姟妯℃澘璇︽儏
+export function selectInfoByCondition(data) {
+  return request({
+     url: "/smartor/ivrTaskTemplate/selectInfoByCondition",
+    method: "post",
+    data: data,
+  });
+}
 // 浠诲姟妯℃澘鏂板淇敼
 export function TaskTemplatecomit(data) {
   return request({
diff --git a/src/api/system/user.js b/src/api/system/user.js
index 79ab356..9365b90 100644
--- a/src/api/system/user.js
+++ b/src/api/system/user.js
@@ -94,17 +94,18 @@
     data: data,
   });
 }
-// 婊℃剰搴︽槑缁嗘煡璇�
-export function getSfStatisticsJoydetails(data) {
+// 婊℃剰搴︾粺璁�
+export function getSfStatisticsJoy(data) {
   return request({
-    url: "/smartor/serviceSubtask/getSfStatisticsJoydetails",
+    url: "/smartor/serviceSubtask/getSfStatisticsCount",
     method: "post",
     data: data,
   });
-}// 婊℃剰搴︾粺璁�
-export function getSfStatisticsJoy(data) {
+}
+// 婊℃剰搴︾粺璁¤鎯�
+export function getSfStatisticsJoyInfo(data) {
   return request({
-    url: "/smartor/serviceSubtask/getSfStatisticsJoy",
+    url: "/smartor/serviceSubtask/getSfStatisticsCountDetails",
     method: "post",
     data: data,
   });
@@ -119,7 +120,7 @@
 }
 
 // 浠诲姟闅忚鐜囩粺璁¤〃鐨勪笅閽绘槑缁�
-// sendstate = 2 寰呴殢璁� 5 寰呴殢璁垮け璐�    
+// sendstate = 2 寰呴殢璁� 5 寰呴殢璁垮け璐�
 // preachform = 浠诲姟褰㈠紡(1,浜哄伐 2,绾歌川  3,鐢佃瘽  4,鐭俊  5.寰俊鍏紬鍙� 6.寰俊灏忕▼搴� 7.鏀粯瀹濆皬绋嬪簭  8.鏅鸿兘鏈哄櫒浜�  9.閽夐拤)
 export function querySubtaskList(data) {
   return request({
diff --git a/src/components/CallButton/index.vue b/src/components/CallButton/index.vue
index 4a08029..7c7798c 100644
--- a/src/components/CallButton/index.vue
+++ b/src/components/CallButton/index.vue
@@ -55,8 +55,9 @@
       sipStatus: "鏈繛鎺�",
       sipStatusClass: "status-disconnected",
       sipConfig: {
-        wsUrl: "wss://192.168.10.124:7443",
-        sipUri: "",
+        // 绉婚櫎纭紪鐮佺殑wsUrl鍜宒omain
+        wsUrl:'',
+        sipUri:'',
         password: "Smartor@2023",
         displayName: "Web 灏忛緳",
         // realm: "9.208.5.18:8090",
@@ -100,8 +101,9 @@
   },
 
   async mounted() {
-    if (localStorage.getItem("orgname")=='鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�') {
-      return
+    const orgName = localStorage.getItem("orgname");
+    if (orgName == "鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�") {
+      return;
     }
     await this.CallgetList();
     this.isRegistering = true; // 寮�濮嬫敞鍐�
@@ -191,8 +193,13 @@
         const res = await CallgetList();
         this.randomNum = res.data[0].tel;
         this.randomID = res.data[0].id;
-        // 姝g‘璁剧疆 sipUri
-        this.sipConfig.sipUri = `${this.randomNum}@192.168.10.124`;
+        // 鍔ㄦ�佽缃畇ipUri锛屽煙鍚嶉儴鍒嗕細鍦╯ipService涓姩鎬佸鐞�
+        const orgName = localStorage.getItem("orgname");
+        if (orgName == "涓芥按甯備腑鍖婚櫌") {
+          this.sipConfig.sipUri = `${this.randomNum}@192.168.10.124`;
+        } else if (orgName == "榫欐硥甯備汉姘戝尰闄�") {
+          this.sipConfig.sipUri = `${this.randomNum}@10.10.0.220`;
+        }
       } catch (error) {
         console.error("鑾峰彇鍒嗘満鍙峰け璐�:", error);
         // this.updateStatus("failed", "鑾峰彇鍒嗘満鍙峰け璐�");
diff --git a/src/utils/sipService.js b/src/utils/sipService.js
index 8f81f71..35ba077 100644
--- a/src/utils/sipService.js
+++ b/src/utils/sipService.js
@@ -1,6 +1,21 @@
 import JsSIP from "jssip";
 import { Notification, MessageBox, Message, Loading } from "element-ui";
-
+// 鍖婚櫌鏈烘瀯涓嶴IP鏈嶅姟鍣ㄦ槧灏勯厤缃�
+const HOSPITAL_CONFIG = {
+  涓芥按甯備腑鍖婚櫌: {
+    wsUrl: "wss://192.168.10.124:7443",
+    domain: "192.168.10.124",
+  },
+  榫欐硥甯備汉姘戝尰闄�: {
+    wsUrl: "wss://10.10.0.220:7443",
+    domain: "10.10.0.220",
+  },
+  // 鍙互缁х画娣诲姞鍏朵粬鍖婚櫌閰嶇疆
+  default: {
+    wsUrl: "wss://192.168.10.124:7443",
+    domain: "192.168.10.124",
+  },
+};
 class SipService {
   constructor() {
     this.ua = null;
@@ -10,17 +25,40 @@
     this.onIncomingCall = null;
     this.isRegistered = false; // 鏂板娉ㄥ唽鐘舵�佹爣蹇�
     this.registrationTime = null; // 鏂板娉ㄥ唽鎴愬姛鏃堕棿鎴�
+    this.currentConfig = null; // 瀛樺偍褰撳墠閰嶇疆
   }
-
-  init(config) {
+  // 鑾峰彇鍖婚櫌閰嶇疆鏂规硶
+  getHospitalConfig() {
+    const orgName=localStorage.getItem("orgname");
+    return HOSPITAL_CONFIG[orgName] || HOSPITAL_CONFIG.default;
+  }
+  init(baseConfig) {
     try {
-      this.updateStatus("connecting", "杩炴帴涓�;...");
+      // 鑾峰彇鏈烘瀯鍚嶇О锛屽鏋滄病鏈変紶鍏ュ垯浠巐ocalStorage璇诲彇
+      const orgName = baseConfig.orgName || localStorage.getItem("orgname");
+
+      // 鏍规嵁鏈烘瀯鍚嶇О鑾峰彇瀵瑰簲鐨勬湇鍔″櫒閰嶇疆
+      const hospitalConfig = this.getHospitalConfig(orgName);
+console.log(hospitalConfig,'88');
+
+      // 鍚堝苟閰嶇疆
+      this.currentConfig = {
+        ...baseConfig,
+        ...hospitalConfig,
+      };
+
+      console.log(
+        `褰撳墠鏈烘瀯: ${orgName}, 浣跨敤鏈嶅姟鍣�: ${this.currentConfig.domain}`
+      );
+
+      this.updateStatus("connecting", "杩炴帴涓�...");
+console.log(baseConfig.sipUri,'baseConfig.sipUri');
 
       this.ua = new JsSIP.UA({
-        sockets: [new JsSIP.WebSocketInterface(config.wsUrl)],
-        uri: config.sipUri,
-        password: config.password,
-        display_name: config.displayName,
+        sockets: [new JsSIP.WebSocketInterface(this.currentConfig.wsUrl)],
+        uri: baseConfig.sipUri, // 杩欓噷浣跨敤鍩虹鐨剆ipUri锛宒omain閮ㄥ垎浼氳鍔ㄦ�佹浛鎹�
+        password: baseConfig.password,
+        display_name: baseConfig.displayName,
         iceServers: [],
         register: true,
         sessionExpires: 1800,
@@ -78,7 +116,9 @@
       const remaining = minDelay - timeSinceRegistration;
       return {
         canCall: false,
-        reason: `娉ㄥ唽鎴愬姛锛岃祫婧愬姞杞戒腑璇风瓑寰� ${Math.ceil(remaining / 1000)} 绉掑悗鍐嶅懠鍙玚,
+        reason: `娉ㄥ唽鎴愬姛锛岃祫婧愬姞杞戒腑璇风瓑寰� ${Math.ceil(
+          remaining / 1000
+        )} 绉掑悗鍐嶅懠鍙玚,
       };
     }
 
@@ -99,7 +139,8 @@
         if (!this.ua.isRegistered()) {
           throw new Error("SIP鏈敞鍐岋紝鏃犳硶鍛煎彨");
         }
-
+        const targetUri = `sip:${targetNumber}@${this.currentConfig.domain}`;
+        console.log(`鍛煎彨鐩爣: ${targetUri}`);
         const options = {
           sessionTimers: true, // 鍚敤浼氳瘽璁℃椂鍣�
           sessionTimersExpires: 150,
@@ -122,10 +163,7 @@
           },
         };
 
-        this.currentSession = this.ua.call(
-          `sip:${targetNumber}@192.168.10.124`,
-          options
-        );
+        this.currentSession = this.ua.call(targetUri, options);
 
         this.setupPeerConnection(this.currentSession);
         this.setupAudio(this.currentSession);
diff --git a/src/views/followvisit/discharge/index.vue b/src/views/followvisit/discharge/index.vue
index 700d638..b2cd766 100644
--- a/src/views/followvisit/discharge/index.vue
+++ b/src/views/followvisit/discharge/index.vue
@@ -1382,13 +1382,13 @@
         this.topqueryParams.leavehospitaldistrictcodes =
           store.getters.belongWards.map((obj) => obj.districtCode);
       }
-      // if (this.endOut == 0) {
-        // this.topqueryParams.endSendDateTime = this.formatDateToYYYYMMDDHHMMSS(
-        //   this.getEndOfDay()
-        // );
-      // } else {
-      //   this.topqueryParams.endSendDateTime = null;
-      // }
+      if (this.endOut == 0) {
+        this.topqueryParams.endSendDateTime = this.formatDateToYYYYMMDDHHMMSS(
+          this.getEndOfDay()
+        );
+      } else {
+        this.topqueryParams.endSendDateTime = null;
+      }
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
diff --git a/src/views/followvisit/record/index.vue b/src/views/followvisit/record/index.vue
index c4f4ee9..a787132 100644
--- a/src/views/followvisit/record/index.vue
+++ b/src/views/followvisit/record/index.vue
@@ -107,6 +107,17 @@
             @change="handleChange"
           ></el-cascader>
         </el-form-item>
+         <el-form-item label="鏃ユ湡闄愬埗" prop="status">
+          <el-select v-model="endOut" placeholder="璇烽�夋嫨">
+            <el-option
+              v-for="item in endOuts"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
+            </el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="璇婃柇鍚嶇О" prop="leavediagname">
           <el-input
             v-model="topqueryParams.leavediagname"
@@ -847,7 +858,17 @@
       },
       value: [],
       list: [],
-
+  endOut: localStorage.getItem("orgname") == "涓芥按甯備腑鍖婚櫌" ? 0 : 1, //0 鍑洪櫌鏃堕棿(姝e簭)    1 鍑洪櫌鏃堕棿(鍊掑簭)   2 鍙戦�佹椂闂�(姝e簭)    3 鍙戦�佹椂闂�(鍊掑簭)  7搴旈殢璁挎棩鏈�(鍊掑簭) 搴旈殢璁挎棩鏈�(姝e簭)
+      endOuts: [
+        {
+          value: 0,
+          label: "鎴鑷冲綋鏃ユ湇鍔�",
+        },
+        {
+          value: 1,
+          label: "鍏ㄩ儴鏈嶅姟",
+        },
+      ],
       sourcetype: [
         {
           value: 1,
@@ -1042,6 +1063,13 @@
         this.topqueryParams.leavehospitaldistrictcodes =
           store.getters.belongWards.map((obj) => obj.districtCode);
       }
+        if (this.endOut == 0) {
+        this.topqueryParams.endSendDateTime = this.formatDateToYYYYMMDDHHMMSS(
+          this.getEndOfDay()
+        );
+      } else {
+        this.topqueryParams.endSendDateTime = null;
+      }
       // 鎺ュ彈寮傚父璺宠浆
       if (this.errtype) {
         this.topqueryParams.leavehospitaldistrictcodes.push(
@@ -1098,6 +1126,7 @@
         this.total = response.total;
       });
     },
+
     //鎮h��360璺宠浆
     gettoken360(sfzh, drcode, drname) {
       // this.$modal.msgWarning('360鍔熻兘鏆傛湭寮�閫�');
@@ -1113,6 +1142,21 @@
         }
       });
     },
+    getEndOfDay() {
+      const date = new Date(); // 鍒涘缓涓�涓〃绀哄綋鍓嶆椂闂寸殑Date瀵硅薄
+      date.setHours(23, 59, 59, 0); // 灏嗘椂闂磋缃负23:59:59.000
+      return date;
+    },
+     formatDateToYYYYMMDDHHMMSS(date) {
+      const year = date.getFullYear();
+      const month = String(date.getMonth() + 1).padStart(2, "0"); // 鏈堜唤琛ラ浂
+      const day = String(date.getDate()).padStart(2, "0"); // 鏃ユ湡琛ラ浂
+      const hours = String(date.getHours()).padStart(2, "0");
+      const minutes = String(date.getMinutes()).padStart(2, "0");
+      const seconds = String(date.getSeconds()).padStart(2, "0");
+
+      return `${year}-${month}-${day}`;
+    },
     buidegetTasklist(type) {
       if (this.topqueryParams.searchscope == 3) {
         this.topqueryParams.leaveldeptcodes = store.getters.belongDepts.map(
diff --git a/src/views/index.vue b/src/views/index.vue
index 927419c..5697f38 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -3,7 +3,7 @@
     <div class="home" style="margin-top: 40px; margin-left: 20px">
       <!-- 澶撮儴涓や釜 -->
       <el-row :gutter="20">
-        <el-col :span="11">
+        <el-col :span="8">
           <!-- 灏辫瘖缁熻鐩掑瓙 -->
           <div class="grid-content bg-purple headerBox bgc1">
             <div class="title">
@@ -45,7 +45,7 @@
             </el-row>
           </div>
         </el-col>
-        <el-col :span="9">
+        <el-col :span="12">
           <div class="grid-content bg-purple headerBox bgc2">
             <div class="title">
               鍑洪櫌鏈嶅姟
@@ -60,7 +60,8 @@
               <span>{{ endatd }} ~ {{ statd }}</span>
             </div>
             <el-row :gutter="20">
-              <el-col :span="10">
+              <!-- 鍑洪櫌灏辫瘖閲� -->
+              <el-col :span="6">
                 <div class="home-user-task-stats">
                   <p style="color: red">{{ DischargeData.rc }}</p>
                 </div>
@@ -68,12 +69,31 @@
                   <p>鍑洪櫌灏辫瘖閲忥紙浜烘锛�</p>
                 </div>
               </el-col>
-              <el-col :span="10">
+              <!-- 棣栨鏈嶅姟 -->
+              <el-col :span="6">
                 <div class="home-user-task-stats">
-                  <p style="color: red">{{ DischargeData.rs }}</p>
-                  <div class="text-color2">
-                    <p>鍑洪櫌鏈嶅姟閲忥紙浜烘锛�</p>
-                  </div>
+                  <p style="color: #67c23a">{{ DischargeData.scsf }}</p>
+                </div>
+                <div class="text-color2" style="color: #67c23a">
+                  <p>棣栨鏈嶅姟锛堜汉娆★級</p>
+                </div>
+              </el-col>
+              <!-- 鍐嶆鏈嶅姟 -->
+              <el-col :span="6">
+                <div class="home-user-task-stats">
+                  <p style="color: #e6a23c">{{ DischargeData.zcsf }}</p>
+                </div>
+                <div class="text-color2" style="color: #e6a23c">
+                  <p>鍐嶆鏈嶅姟锛堜汉娆★級</p>
+                </div>
+              </el-col>
+              <!-- 涓撶梾鏈嶅姟 -->
+              <el-col :span="6">
+                <div class="home-user-task-stats">
+                  <p style="color: #409eff">{{ DischargeData.zbsf }}</p>
+                </div>
+                <div class="text-color2" style="color: #409eff">
+                  <p>涓撶梾鏈嶅姟锛堜汉娆★級</p>
                 </div>
               </el-col>
             </el-row>
@@ -336,8 +356,11 @@
         骞�: "year",
       },
       DischargeData: {
-        rs: "",
-        rc: "",
+        rc: "", // 鍑洪櫌灏辫瘖閲忥紙鎬讳汉娆★級
+        rs: "", // 鍑洪櫌鏈嶅姟閲忥紙鎬讳汉娆★級
+        scsf: 0, // 鏂板锛氶娆℃湇鍔′汉娆�
+        zcsf: 0, // 鏂板锛氬啀娆℃湇鍔′汉娆�
+        zbsf: 0, // 鏂板锛氫笓鐥呮湇鍔′汉娆�
       },
       OutpatientData: {
         rs: "",
diff --git a/src/views/patient/propaganda/particty.vue b/src/views/patient/propaganda/particty.vue
index 7a0530c..255a030 100644
--- a/src/views/patient/propaganda/particty.vue
+++ b/src/views/patient/propaganda/particty.vue
@@ -743,7 +743,7 @@
                     <el-radio
                       v-for="(
                         items, index
-                      ) in item.ivrTaskScriptTargetoptionList"
+                      ) in item.ivrLibaScriptTargetoptionList"
                       :key="index"
                       :label="index"
                       >{{ items.targetvalue }}</el-radio
@@ -765,7 +765,7 @@
                     <el-checkbox
                       v-for="(
                         items, index
-                      ) in item.ivrTaskScriptTargetoptionList"
+                      ) in item.ivrLibaScriptTargetoptionList"
                       :key="index"
                       :label="index"
                     >
@@ -904,6 +904,7 @@
   getbaseopera,
   getFollowuplist,
   getvFollowup,
+  selectInfoByCondition,
   Taskparticty,
   deleteTaskparticty,
   getTaskInfo,
@@ -1610,13 +1611,18 @@
           // 鐤剧梾
           this.getillness(this.form.libtemplateid);
 
-          getvFollowup({ id: this.form.libtemplateid }).then((res) => {
+          selectInfoByCondition({id:this.form.templateid} ).then((res) => {
             if (res.code == 200) {
               this.previewtf = true;
               this.previewtftype = 1;
-              this.questionList = res.data.ivrLibaTemplateScriptVOList;
-              this.objyl.ivrLibaTemplateScriptVOList =
-                res.data.ivrLibaTemplateScriptVOList;
+              this.questionList = res.data.ivrTaskTemplateScriptVOList;
+              this.questionList.forEach((item) => {
+                item.qremark = [];
+                item.ivrLibaScriptTargetoptionList =
+                  item.ivrTaskScriptTargetoptionList;
+              });
+              this.objyl.ivrLibaScriptTargetoptionList =
+                res.data.ivrTaskScriptTargetoptionList;
             } else {
             }
           });
@@ -2201,7 +2207,7 @@
         this.objyl.suitway = this.objyl.suitway.join(",");
       }
       this.objyl.ivrLibaTemplateScriptVOList.forEach((item) => {
-        item.ivrTaskScriptTargetoptionList = item.ivrTaskScriptTargetoptionList;
+        item.ivrTaskScriptTargetoptionList = item.ivrLibaScriptTargetoptionList;
       });
       this.objyl.ivrTaskTemplateScriptVOList =
         this.objyl.ivrLibaTemplateScriptVOList;
@@ -2319,7 +2325,7 @@
             this.objyl.isoperation = 1;
             this.objyl.ivrLibaTemplateScriptVOList.forEach((item) => {
               item.ivrTaskScriptTargetoptionList =
-                item.ivrTaskScriptTargetoptionList;
+                item.ivrLibaScriptTargetoptionList;
             });
             this.objyl.ivrTaskTemplateScriptVOList =
               this.objyl.ivrLibaTemplateScriptVOList;
diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
index f8a028c..34a7bdb 100644
--- a/src/views/sfstatistics/percentage/index.vue
+++ b/src/views/sfstatistics/percentage/index.vue
@@ -88,8 +88,9 @@
                   range-separator="鑷�"
                   start-placeholder="寮�濮嬫棩鏈�"
                   end-placeholder="缁撴潫鏃ユ湡"
-                  :default-time="['00:00:00', '23:59:59']">
+                  :default-time="['00:00:00', '23:59:59']"
                 >
+                  >
                 </el-date-picker>
               </el-form-item>
 
@@ -401,6 +402,21 @@
                     key="pendingFollowUp"
                     prop="pendingFollowUp"
                   >
+                    <template slot-scope="scope">
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="
+                          viewDetails(
+                            scope.row.pendingFollowUpInfo,
+                            scope.row.leavehospitaldistrictname + '寰呴殢璁垮垪琛�'
+                          )
+                        "
+                        ><span class="button-zx">{{
+                          scope.row.pendingFollowUp
+                        }}</span></el-button
+                      >
+                    </template>
                   </el-table-column>
                   <el-table-column
                     label="闅忚鎴愬姛"
@@ -415,6 +431,21 @@
                     key="followUpFail"
                     prop="followUpFail"
                   >
+                    <template slot-scope="scope">
+                      <el-button
+                        size="medium"
+                        type="text"
+                        @click="
+                          viewDetails(
+                            scope.row.followUpFailInfo,
+                            scope.row.leavehospitaldistrictname + '闅忚澶辫触鍒楄〃'
+                          )
+                        "
+                        ><span class="button-zx">{{
+                          scope.row.followUpFail
+                        }}</span></el-button
+                      >
+                    </template>
                   </el-table-column>
                   <el-table-column
                     label="闅忚鐜�"
@@ -855,6 +886,198 @@
         </div>
       </div>
     </el-dialog>
+    <!-- 鍚勭被璇︽儏 -->
+    <el-dialog
+      :title="infotitle"
+      :visible.sync="infotitleVisible"
+      v-loading="infotitloading"
+      width="70%"
+      :close-on-click-modal="false"
+    >
+      <div class="examine-jic">
+        <div class="jic-value">
+          <el-row :gutter="20">
+            <!-- 閫夋嫨鎮h�呭垪琛� -->
+            <el-table :data="infotitlelist" height="660" style="width: 100%">
+              <el-table-column
+                prop="sendname"
+                align="center"
+                label="濮撳悕"
+                width="100"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="taskName"
+                align="center"
+                width="200"
+                show-overflow-tooltip
+                label="浠诲姟鍚嶇О"
+              >
+              </el-table-column>
+              <el-table-column
+                prop="sendstate"
+                align="center"
+                width="200"
+                label="浠诲姟鐘舵��"
+              >
+                <template slot-scope="scope">
+                  <div v-if="scope.row.sendstate == 1">
+                    <el-tag type="primary" :disable-transitions="false"
+                      >琛ㄥ崟宸查鍙�</el-tag
+                    >
+                  </div>
+                  <div v-if="scope.row.sendstate == 2">
+                    <el-tag type="primary" :disable-transitions="false"
+                      >寰呴殢璁�</el-tag
+                    >
+                  </div>
+                  <div v-if="scope.row.sendstate == 3">
+                    <el-tag type="success" :disable-transitions="false"
+                      >琛ㄥ崟宸插彂閫�</el-tag
+                    >
+                  </div>
+                  <div v-if="scope.row.sendstate == 4">
+                    <el-tag type="info" :disable-transitions="false"
+                      >涓嶆墽琛�</el-tag
+                    >
+                  </div>
+                  <div v-if="scope.row.sendstate == 5">
+                    <el-tag type="danger" :disable-transitions="false"
+                      >鍙戦�佸け璐�</el-tag
+                    >
+                  </div>
+                  <div v-if="scope.row.sendstate == 6">
+                    <el-tag type="success" :disable-transitions="false"
+                      >宸插畬鎴�</el-tag
+                    >
+                  </div>
+                </template>
+              </el-table-column>
+              <el-table-column
+                prop="visitTime"
+                align="center"
+                label="搴旈殢璁挎椂闂�"
+                width="200"
+                show-overflow-tooltip
+              >
+              </el-table-column>
+              <el-table-column
+                prop="finishtime"
+                align="center"
+                label="闅忚瀹屾垚鏃堕棿"
+                width="200"
+                show-overflow-tooltip
+              >
+              </el-table-column>
+              <el-table-column
+                label="鍑洪櫌鏃ユ湡"
+                width="200"
+                align="center"
+                key="endtime"
+                prop="endtime"
+              >
+                <template slot-scope="scope">
+                  <span>{{ formatTime(scope.row.endtime) }}</span>
+                </template></el-table-column
+              >
+              <el-table-column
+                label="璐d换鎶ゅ+"
+                width="120"
+                align="center"
+                key="nurseName"
+                prop="nurseName"
+              />
+              <el-table-column
+                label="涓绘不鍖荤敓"
+                width="120"
+                align="center"
+                key="drname"
+                prop="drname"
+              />
+
+              <el-table-column
+                label="缁撴灉鐘舵��"
+                align="center"
+                key="excep"
+                prop="excep"
+                width="120"
+              >
+                <template slot-scope="scope">
+                  <dict-tag
+                    :options="dict.type.sys_yujing"
+                    :value="scope.row.excep"
+                  />
+                </template>
+              </el-table-column>
+              <el-table-column
+                label="澶勭悊鎰忚"
+                align="center"
+                key="suggest"
+                prop="suggest"
+                width="120"
+              >
+                <template slot-scope="scope">
+                  <dict-tag
+                    :options="dict.type.sys_suggest"
+                    :value="scope.row.suggest"
+                  />
+                </template>
+              </el-table-column>
+
+              <el-table-column
+                prop="templatename"
+                align="center"
+                label="鏈嶅姟妯℃澘"
+                width="200"
+                show-overflow-tooltip
+              >
+              </el-table-column>
+              <el-table-column
+                prop="remark"
+                align="center"
+                label="鏈嶅姟璁板綍"
+                width="200"
+                show-overflow-tooltip
+              >
+              </el-table-column>
+
+              <el-table-column
+                prop="bankcardno"
+                align="center"
+                label="鍛煎彨鐘舵��"
+                width="210"
+              >
+              </el-table-column>
+              <el-table-column
+                label="鎿嶄綔"
+                fixed="right"
+                align="center"
+                width="200"
+                class-name="small-padding fixed-width"
+              >
+                <template slot-scope="scope">
+                  <el-button
+                    size="medium"
+                    type="text"
+                    @click="SeedetailsgGo(scope.row)"
+                    ><span class="button-zx"
+                      ><i class="el-icon-s-order"></i>鏌ョ湅</span
+                    ></el-button
+                  >
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-row>
+          <pagination
+            v-show="patienttotal > 0 && this.patientqueryParams.allhosp != 6"
+            :total="patienttotal"
+            :page.sync="patientqueryParams.pn"
+            :limit.sync="patientqueryParams.ps"
+            @pagination="Seedetails"
+          />
+        </div>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -907,10 +1130,14 @@
       activeName: "first", //渚ц竟閫夋嫨
       orgname: "",
       expands: [],
+      infotitlelist: [],
       // 閬僵灞�
       loading: false,
       Seedloading: false,
       chartDialogVisible: false,
+      infotitleVisible: false,
+      infotitloading: false,
+      infotitle: "",
       pieChart: null,
       barLineChart: null,
       // 閫変腑鏁扮粍
@@ -1330,6 +1557,11 @@
         this.Seedloading = false;
       });
     },
+    viewDetails(row, title) {
+      this.infotitleVisible = true;
+      this.infotitle = title;
+      this.infotitlelist = row;
+    },
     SeedetailsgGo(row) {
       this.SeedetailsVisible = false;
       let type = "";
@@ -1478,8 +1710,32 @@
         const excelName = `${currentMonth}鏈堝嚭闄㈤殢璁跨粺璁¤〃.xlsx`;
         // 鍒涘缓鏂扮殑宸ヤ綔绨垮拰宸ヤ綔琛�
         const workbook = new ExcelJS.Workbook();
-        const worksheet = workbook.addWorksheet("闅忚缁熻");
-
+        const worksheet = workbook.addWorksheet(`${currentMonth}鏈堝嚭闄㈤殢璁跨粺璁¤〃`);
+// 瀹氫箟鏍峰紡锛堟柊澧炴�绘爣棰樻牱寮忥級
+    const titleStyle = {
+      font: {
+        name: "寰蒋闆呴粦",
+        size: 16,
+        bold: true,
+        color: { argb: "FF000000" },
+      },
+      fill: {
+        type: "pattern",
+        pattern: "solid",
+        fgColor: { argb: "FFE6F3FF" },
+      },
+      alignment: {
+        vertical: "middle",
+        horizontal: "center",
+        wrapText: true,
+      },
+      border: {
+        top: { style: "thin", color: { argb: "FFD0D0D0" } },
+        left: { style: "thin", color: { argb: "FFD0D0D0" } },
+        bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
+        right: { style: "thin", color: { argb: "FFD0D0D0" } },
+      },
+    };
         // 瀹氫箟鏍峰紡
         const headerStyle = {
           font: {
@@ -1547,7 +1803,12 @@
             right: { style: "thin", color: { argb: "FFD0D0D0" } },
           },
         };
-
+// 1. 娣诲姞鎬绘爣棰樿锛堢涓�琛岋級
+    worksheet.mergeCells(1, 1, 1, 23); // 鍚堝苟A1鍒癢1鐨勬墍鏈夊垪[1,4](@ref)
+    const titleCell = worksheet.getCell(1, 1);
+    titleCell.value = `${currentMonth}鏈堝嚭闄㈤殢璁跨粺璁¤〃`; // 浣跨敤鏂囦欢鍚嶄綔涓烘�绘爣棰�
+    titleCell.style = titleStyle;
+    worksheet.getRow(1).height = 35; // 璁剧疆鎬绘爣棰樿楂�
         // 1. 棣栧厛锛屽垱寤哄苟璁剧疆绗簩琛岋紙瀛愯〃澶达級鐨勬墍鏈夊崟鍏冩牸
         const secondRowHeaders = [
           "", // A2 灞曞紑鍒楀崰浣嶏紙鍏跺�煎皢鐢辩涓�琛屽悎骞跺悗鐨勪富鍗曞厓鏍煎喅瀹氾級
@@ -1577,96 +1838,96 @@
           "寰俊",
         ];
 
-        // 娣诲姞绗簩琛屽苟璁剧疆鏍峰紡
-        secondRowHeaders.forEach((header, index) => {
-          // 娉ㄦ剰锛氬垪绱㈠紩浠�1寮�濮嬶紝瀵瑰簲A鍒楁槸1锛孊鍒楁槸2锛屼互姝ょ被鎺ㄣ��
-          const cell = worksheet.getCell(2, index + 1);
-          cell.value = header;
-          cell.style = headerStyle;
-        });
+        // 娣诲姞绗簩琛岋紙鍘熺涓�琛屼笅绉伙級
+    secondRowHeaders.forEach((header, index) => {
+      const cell = worksheet.getCell(3, index + 1); // 鏀逛负绗�3琛�
+      cell.value = header;
+      cell.style = headerStyle;
+    });
 
-        // 2. 鐒跺悗锛屽垱寤虹涓�琛岀殑涓绘爣棰樺崟鍏冩牸骞惰缃牱寮忥紝绱ф帴鐫�杩涜绾靛悜鍚堝苟
-        // 鍚堝苟 A1:A2 骞惰缃��
-        worksheet.mergeCells(1, 1, 2, 1); // 鍚堝苟 A1 鍒� A2
-        worksheet.getCell(1, 1).value = ""; // 璁剧疆涓诲崟鍏冩牸(A1)鐨勫��
-        worksheet.getCell(1, 1).style = headerStyle; // 璁剧疆涓诲崟鍏冩牸鏍峰紡
+    // 3. 璋冩暣鍘熷悎骞跺崟鍏冩牸浣嶇疆锛堝師绗�1琛屽悎骞跺崟鍏冩牸涓嬬Щ鍒扮2琛岋級
+    // 鍚堝苟 A2:A3
+    worksheet.mergeCells(2, 1, 3, 1);
+    worksheet.getCell(2, 1).value = "";
+    worksheet.getCell(2, 1).style = headerStyle;
 
-        // 鍚堝苟 B1:B2 骞惰缃��
-        worksheet.mergeCells(1, 2, 2, 2); // 鍚堝苟 B1 鍒� B2
-        worksheet.getCell(1, 2).value = "鍑洪櫌鐥呭尯";
-        worksheet.getCell(1, 2).style = headerStyle;
+    // 鍚堝苟 B2:B3
+    worksheet.mergeCells(2, 2, 3, 2);
+    worksheet.getCell(2, 2).value = "鍑洪櫌鐥呭尯";
+    worksheet.getCell(2, 2).style = headerStyle;
 
-        // 鍚堝苟 C1:C2 骞惰缃��
-        worksheet.mergeCells(1, 3, 2, 3); // 鍚堝苟 C1 鍒� C2
-        worksheet.getCell(1, 3).value = "绉戝";
-        worksheet.getCell(1, 3).style = headerStyle;
+    // 鍚堝苟 C2:C3
+    worksheet.mergeCells(2, 3, 3, 3);
+    worksheet.getCell(2, 3).value = "绉戝";
+    worksheet.getCell(2, 3).style = headerStyle;
 
-        // 鍚堝苟 D1:D2 骞惰缃��
-        worksheet.mergeCells(1, 4, 2, 4); // 鍚堝苟 D1 鍒� D2
-        worksheet.getCell(1, 4).value = "鍑洪櫌浜烘";
-        worksheet.getCell(1, 4).style = headerStyle;
+    // 鍚堝苟 D2:D3
+    worksheet.mergeCells(2, 4, 3, 4);
+    worksheet.getCell(2, 4).value = "鍑洪櫌浜烘";
+    worksheet.getCell(2, 4).style = headerStyle;
 
-        // 鍚堝苟 E1:E2 骞惰缃��
-        worksheet.mergeCells(1, 5, 2, 5); // 鍚堝苟 E1 鍒� E2
-        worksheet.getCell(1, 5).value = "鏃犻渶闅忚浜烘";
-        worksheet.getCell(1, 5).style = headerStyle;
+    // 鍚堝苟 E2:E3
+    worksheet.mergeCells(2, 5, 3, 5);
+    worksheet.getCell(2, 5).value = "鏃犻渶闅忚浜烘";
+    worksheet.getCell(2, 5).style = headerStyle;
 
-        // 鍚堝苟 F1:F2 骞惰缃��
-        worksheet.mergeCells(1, 6, 2, 6); // 鍚堝苟 F1 鍒� F2
-        worksheet.getCell(1, 6).value = "搴旈殢璁夸汉娆�";
-        worksheet.getCell(1, 6).style = headerStyle;
+    // 鍚堝苟 F2:F3
+    worksheet.mergeCells(2, 6, 3, 6);
+    worksheet.getCell(2, 6).value = "搴旈殢璁夸汉娆�";
+    worksheet.getCell(2, 6).style = headerStyle;
 
-        // 3. 璁剧疆绗竴琛岀殑妯悜鍚堝苟鏍囬锛堣繖浜涗繚鎸佷笉鍙橈紝鍥犱负鍙秹鍙婄涓�琛岋級
-        // 棣栨鍑洪櫌闅忚锛堝悎骞禛1鍒癘1锛�
-        worksheet.mergeCells("G1:O1");
-        worksheet.getCell("G1").value = "棣栨鍑洪櫌闅忚";
-        worksheet.getCell("G1").style = headerStyle;
+    // 4. 璋冩暣妯悜鍚堝苟鏍囬浣嶇疆锛堜笅绉诲埌绗�2琛岋級
+    // 棣栨鍑洪櫌闅忚锛堝悎骞禛2:O2锛�
+    worksheet.mergeCells(2, 7, 2, 15); // G2:O2
+    worksheet.getCell(2, 7).value = "棣栨鍑洪櫌闅忚";
+    worksheet.getCell(2, 7).style = headerStyle;
 
-        // 鍐嶆鍑洪櫌闅忚锛堝悎骞禤1鍒癢1锛�
-        worksheet.mergeCells("P1:W1");
-        worksheet.getCell("P1").value = "鍐嶆鍑洪櫌闅忚";
-        worksheet.getCell("P1").style = headerStyle;
+    // 鍐嶆鍑洪櫌闅忚锛堝悎骞禤2:W2锛�
+    worksheet.mergeCells(2, 16, 2, 23); // P2:W2
+    worksheet.getCell(2, 16).value = "鍐嶆鍑洪櫌闅忚";
+    worksheet.getCell(2, 16).style = headerStyle;
 
-        // 4. 璁剧疆琛岄珮锛堝彲閫夛紝浣嗗缓璁缃級
-        worksheet.getRow(1).height = 28; // 绗竴琛岃楂�
-        worksheet.getRow(2).height = 25; // 绗簩琛岃楂�
+    // 5. 璁剧疆琛岄珮
+    worksheet.getRow(1).height = 35; // 鎬绘爣棰樿楂�
+    worksheet.getRow(2).height = 28; // 鍘熺涓�琛屼笅绉�
+    worksheet.getRow(3).height = 25; // 鍘熺浜岃涓嬬Щ
 
-        // 娣诲姞鏁版嵁琛�
-        this.userList.forEach((item, rowIndex) => {
-          const dataRow = worksheet.addRow([
-            "", // 灞曞紑鍒�
-            item.leavehospitaldistrictname || "",
-            item.deptname || "",
-            item.dischargeCount || 0,
-            item.nonFollowUp || 0,
-            item.followUpNeeded || 0,
-            // 棣栨鍑洪櫌闅忚鏁版嵁
-            item.needFollowUp || 0,
-            item.pendingFollowUp || 0,
-            item.followUpSuccess || 0,
-            item.followUpFail || 0,
-            item.followUpRate || "0%",
-            item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%",
-            item.manual || 0,
-            item.sms || 0,
-            item.weChat || 0,
-            // 鍐嶆鍑洪櫌闅忚鏁版嵁
-            item.needFollowUpAgain || 0,
-            item.pendingFollowUpAgain || 0,
-            item.followUpSuccessAgain || 0,
-            item.followUpFailAgain || 0,
-            item.followUpRateAgain || "0%",
-            item.manualAgain || 0,
-            item.smsAgain || 0,
-            item.weChatAgain || 0,
-          ]);
+    // 6. 娣诲姞鏁版嵁琛岋紙娉ㄦ剰琛岀储寮曢渶瑕�+1锛屽洜涓轰笂闈㈡彃鍏ヤ簡涓�琛岋級
+    this.userList.forEach((item, rowIndex) => {
+      const dataRow = worksheet.addRow([
+        "", // 灞曞紑鍒�
+        item.leavehospitaldistrictname || "",
+        item.deptname || "",
+        item.dischargeCount || 0,
+        item.nonFollowUp || 0,
+        item.followUpNeeded || 0,
+        // 棣栨鍑洪櫌闅忚鏁版嵁
+        item.needFollowUp || 0,
+        item.pendingFollowUp || 0,
+        item.followUpSuccess || 0,
+        item.followUpFail || 0,
+        item.followUpRate || "0%",
+        item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%",
+        item.manual || 0,
+        item.sms || 0,
+        item.weChat || 0,
+        // 鍐嶆鍑洪櫌闅忚鏁版嵁
+        item.needFollowUpAgain || 0,
+        item.pendingFollowUpAgain || 0,
+        item.followUpSuccessAgain || 0,
+        item.followUpFailAgain || 0,
+        item.followUpRateAgain || "0%",
+        item.manualAgain || 0,
+        item.smsAgain || 0,
+        item.weChatAgain || 0,
+      ], rowIndex + 4); // 浠庣4琛屽紑濮嬫坊鍔犳暟鎹紙鍘熺3琛岋級
 
-          // 搴旂敤鏁版嵁琛屾牱寮�
-          dataRow.eachCell((cell) => {
-            cell.style = cellStyle;
-          });
-          dataRow.height = 24;
-        });
+      // 搴旂敤鏁版嵁琛屾牱寮�
+      dataRow.eachCell((cell) => {
+        cell.style = cellStyle;
+      });
+      dataRow.height = 24;
+    });
 
         // 娣诲姞鍚堣琛�
         const summaries = this.getSummaries({
diff --git a/src/views/sfstatistics/percentage/satisfaction.vue b/src/views/sfstatistics/percentage/satisfaction.vue
index 75de5a7..21bf1be 100644
--- a/src/views/sfstatistics/percentage/satisfaction.vue
+++ b/src/views/sfstatistics/percentage/satisfaction.vue
@@ -61,7 +61,7 @@
                 </el-select>
               </el-form-item>
 
-              <el-form-item label="缁熻棰樼洰" prop="userName">
+              <el-form-item label="鏈嶅姟绫诲瀷" prop="userName">
                 <el-select
                   v-model="queryParams.serviceType"
                   multiple
@@ -224,10 +224,8 @@
               >
                 <template slot-scope="scope">
                   <span class="button-zx"
-                      >{{
-                        (Number(scope.row.joyTotal) * 100).toFixed(2)
-                      }}%</span
-                    >
+                    >{{ (Number(scope.row.joyTotal) * 100).toFixed(2) }}%</span
+                  >
                 </template>
               </el-table-column>
               <el-table-column
@@ -250,13 +248,13 @@
               </el-table-column>
             </el-table>
 
-            <!-- <pagination
+            <pagination
               v-show="total > 0"
               :total="total"
               :page.sync="queryParams.pageNum"
               :limit.sync="queryParams.pageSize"
               @pagination="getList"
-            /> -->
+            />
           </el-col>
         </el-row>
       </div>
@@ -510,7 +508,7 @@
       </div>
     </el-dialog>
     <!-- 鍗曠瀹ょ粺璁¤鎯� -->
-     <el-dialog :visible.sync="topicVisible" width="45%">
+    <el-dialog :visible.sync="topicVisible" width="45%">
       <div class="topicdia">
         <div class="top-text">{{ topicvalue.name }}</div>
         <div class="top-mintext">闅忚瀹屾垚鏁皗{ topicvalue.number }}</div>
@@ -549,8 +547,8 @@
 } from "@/api/system/label";
 import store from "@/store";
 import {
-  getSfStatisticsJoydetails,
   getSfStatisticsJoy,
+  getSfStatisticsJoyInfo,
   selectTimelyRate,
 } from "@/api/system/user";
 
@@ -641,7 +639,7 @@
           type: 1,
         },
       ],
-        tableData: [
+      tableData: [
         {
           date: "濂�",
           name: 12,
@@ -752,6 +750,7 @@
     getList() {
       // 澶勭悊鏌ヨ鍙傛暟
       const params = {
+        configKey: "joyCount",
         ...this.queryParams,
         // 濡傛灉閫夋嫨浜�"鍏ㄩ儴"锛屽垯浼犳墍鏈夌梾鍖�/绉戝浠g爜
         leavehospitaldistrictcodes:
@@ -768,7 +767,7 @@
       delete params.deptcodes.all;
       getSfStatisticsJoy(params).then((response) => {
         console.log(response);
-        // this.total = response.total;
+        this.total = response.total;
         this.userList = response.data;
       });
     },
@@ -887,7 +886,25 @@
     // 璋冭捣璇︽儏
     getinfo(row) {
       this.topicVisible = true;
+      // 澶勭悊鏌ヨ鍙傛暟
+      const params = {
+        configKey: "joyCount",
+        ...this.queryParams,
+      };
+      if (this.queryParams.statisticaltype == 1) {
+        params.leavehospitaldistrictcodes = [row.leavehospitaldistrictcode];
+      } else {
+        params.deptcodes = [row.deptcode];
+      }
 
+      // 绉婚櫎鍙兘瀛樺湪鐨�"all"鍊�
+      delete params.leavehospitaldistrictcodes.all;
+      delete params.deptcodes.all;
+      getSfStatisticsJoyInfo(params).then((response) => {
+        console.log(response);
+        this.total = response.total;
+        this.userList = response.data;
+      });
     },
     // 娣诲姞/淇敼鏍囩
     Maintenancetag() {
diff --git a/vue.config.js b/vue.config.js
index 4d566cb..b35d7e1 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -36,10 +36,10 @@
       // detail: https://cli.vuejs.org/config/#devserver-proxy
       [process.env.VUE_APP_BASE_API]: {
         // target: `https://www.health-y.cn/lssf`,
-        target: `http://192.168.100.10:8096`,
+        // target: `http://192.168.100.10:8096`,
         // target: `http://192.168.100.10:8094`,//鐪佺珛鍚屽痉
         // target: `http://192.168.100.10:8095`,//鏂板崕
-        // target:`http://localhost:8095`,
+        target:`http://localhost:8095`,
         // target:`http://35z1t16164.qicp.vip`,
         // target: `http://192.168.100.111:8095`,
         // target: `http://192.168.101.166:8093`,
diff --git a/wailian.zip b/wailian.zip
new file mode 100644
index 0000000..5df2f74
--- /dev/null
+++ b/wailian.zip
Binary files differ

--
Gitblit v1.9.3