From 39c8b288ec8294e026459dfb1955f0bbc49ebb52 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期一, 19 十月 2026 11:10:40 +0800
Subject: [PATCH] 测试完成

---
 src/views/sfstatistics/percentage/components/CombinedFollowUp.vue | 1134 ++++++++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 950 insertions(+), 184 deletions(-)

diff --git a/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue b/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
index 540e2d0..ebdec78 100644
--- a/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
+++ b/src/views/sfstatistics/percentage/components/CombinedFollowUp.vue
@@ -26,8 +26,19 @@
             >
               <el-table-column label="" align="center" width="96" fixed="left">
                 <template slot="header">
-                  <div style="display: flex; justify-content: space-between; align-items: center;">
-                    <el-button type="primary" size="mini" icon="el-icon-download" @click="exportDoctorTable(props.row)">
+                  <div
+                    style="
+                      display: flex;
+                      justify-content: space-between;
+                      align-items: center;
+                    "
+                  >
+                    <el-button
+                      type="primary"
+                      size="mini"
+                      icon="el-icon-download"
+                      @click="exportDoctorTable(props.row)"
+                    >
                       瀵煎嚭
                     </el-button>
                   </div>
@@ -35,108 +46,317 @@
               </el-table-column>
 
               <el-table-column label="鍖荤敓濮撳悕" prop="drname" align="center" />
-              <el-table-column label="绉戝" prop="deptname" align="center" width="120" />
+              <el-table-column
+                label="绉戝"
+                prop="deptname"
+                align="center"
+                width="120"
+              />
 
               <!-- 鍩虹鍒� -->
-              <el-table-column label="鍑洪櫌浜烘" prop="dischargeCount" align="center">
+              <el-table-column
+                label="鍑洪櫌浜烘"
+                prop="dischargeCount"
+                align="center"
+              >
                 <template slot-scope="scope">
-                  <el-button type="text" @click="handleViewDetails(scope.row, 'dischargeCountInfo', '鍑洪櫌鎮h�呭垪琛�', '1')">
-                    <span class="button-zx">{{ scope.row.dischargeCount }}</span>
+                  <el-button
+                    type="text"
+                    @click="
+                      handleViewDetails(
+                        scope.row,
+                        'dischargeCountInfo',
+                        '鍑洪櫌鎮h�呭垪琛�',
+                        '1'
+                      )
+                    "
+                  >
+                    <span class="button-zx">{{
+                      scope.row.dischargeCount
+                    }}</span>
                   </el-button>
                 </template>
               </el-table-column>
 
               <!-- 棣栨闅忚锛堝尰鐢燂級 -->
-              <el-table-column label="棣栨鏃犻渶闅忚" prop="nonFollowUp" align="center">
+              <el-table-column
+                label="棣栨鏃犻渶闅忚"
+                prop="nonFollowUp"
+                align="center"
+              >
                 <template slot-scope="scope">
-                  <el-button type="text" @click="handleViewDetails(scope.row, 'nonFollowUpInfo', '棣栨鏃犻渶闅忚鍒楄〃', '1')">
+                  <el-button
+                    type="text"
+                    @click="
+                      handleViewDetails(
+                        scope.row,
+                        'nonFollowUpInfo',
+                        '棣栨鏃犻渶闅忚鍒楄〃',
+                        '1'
+                      )
+                    "
+                  >
                     <span class="button-zx">{{ scope.row.nonFollowUp }}</span>
                   </el-button>
                 </template>
               </el-table-column>
-              <el-table-column label="棣栨搴旈殢璁�" prop="followUpNeeded" align="center">
+              <el-table-column
+                label="棣栨搴旈殢璁�"
+                prop="followUpNeeded"
+                align="center"
+              >
                 <template slot-scope="scope">
-                  <el-button type="text" @click="handleViewDetails(scope.row, 'followUpNeededInfo', '棣栨搴旈殢璁垮垪琛�', '1')">
-                    <span class="button-zx">{{ scope.row.followUpNeeded }}</span>
+                  <el-button
+                    type="text"
+                    @click="
+                      handleViewDetails(
+                        scope.row,
+                        'followUpNeededInfo',
+                        '棣栨搴旈殢璁垮垪琛�',
+                        '1'
+                      )
+                    "
+                  >
+                    <span class="button-zx">{{
+                      scope.row.followUpNeeded
+                    }}</span>
                   </el-button>
                 </template>
               </el-table-column>
-              <el-table-column label="棣栨闇�闅忚" prop="needFollowUp" align="center">
+              <el-table-column
+                label="棣栨闇�闅忚"
+                prop="needFollowUp"
+                align="center"
+              >
                 <template slot-scope="scope">
-                  <el-button type="text" @click="handleViewDetails(scope.row, 'needFollowUpInfo', '棣栨闇�闅忚鍒楄〃', '1')">
+                  <el-button
+                    type="text"
+                    @click="
+                      handleViewDetails(
+                        scope.row,
+                        'needFollowUpInfo',
+                        '棣栨闇�闅忚鍒楄〃',
+                        '1'
+                      )
+                    "
+                  >
                     <span class="button-zx">{{ scope.row.needFollowUp }}</span>
                   </el-button>
                 </template>
               </el-table-column>
-              <el-table-column label="棣栨寰呴殢璁�" prop="pendingFollowUp" align="center">
+              <el-table-column
+                label="棣栨寰呴殢璁�"
+                prop="pendingFollowUp"
+                align="center"
+              >
                 <template slot-scope="scope">
-                  <el-button type="text" @click="handleViewDetails(scope.row, 'pendingFollowUpInfo', '棣栨寰呴殢璁垮垪琛�', '1')">
-                    <span class="button-zx">{{ scope.row.pendingFollowUp }}</span>
+                  <el-button
+                    type="text"
+                    @click="
+                      handleViewDetails(
+                        scope.row,
+                        'pendingFollowUpInfo',
+                        '棣栨寰呴殢璁垮垪琛�',
+                        '1'
+                      )
+                    "
+                  >
+                    <span class="button-zx">{{
+                      scope.row.pendingFollowUp
+                    }}</span>
                   </el-button>
                 </template>
               </el-table-column>
-              <el-table-column label="棣栨瀹屾垚" prop="followUpSuccess" align="center">
+              <el-table-column
+                label="棣栨瀹屾垚"
+                prop="followUpSuccess"
+                align="center"
+              >
                 <template slot-scope="scope">
-                  <el-button type="text" @click="handleViewDetails(scope.row, 'followUpSuccessInfo', '棣栨瀹屾垚鍒楄〃', '1')">
-                    <span class="button-zx">{{ scope.row.followUpSuccess }}</span>
+                  <el-button
+                    type="text"
+                    @click="
+                      handleViewDetails(
+                        scope.row,
+                        'followUpSuccessInfo',
+                        '棣栨瀹屾垚鍒楄〃',
+                        '1'
+                      )
+                    "
+                  >
+                    <span class="button-zx">{{
+                      scope.row.followUpSuccess
+                    }}</span>
                   </el-button>
                 </template>
               </el-table-column>
-              <el-table-column label="棣栨澶辫触" prop="followUpFail" align="center">
+              <el-table-column
+                label="棣栨澶辫触"
+                prop="followUpFail"
+                align="center"
+              >
                 <template slot-scope="scope">
-                  <el-button type="text" @click="handleViewDetails(scope.row, 'followUpFailInfo', '棣栨澶辫触鍒楄〃', '1')">
+                  <el-button
+                    type="text"
+                    @click="
+                      handleViewDetails(
+                        scope.row,
+                        'followUpFailInfo',
+                        '棣栨澶辫触鍒楄〃',
+                        '1'
+                      )
+                    "
+                  >
                     <span class="button-zx">{{ scope.row.followUpFail }}</span>
                   </el-button>
                 </template>
               </el-table-column>
-              <el-table-column v-if="orgname != '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'" label="棣栨鎴愬姛鐜�" prop="successRate" align="center" :render-header="Tooltipcgl">
+              <el-table-column
+                v-if="orgname != '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'"
+                label="棣栨鎴愬姛鐜�"
+                prop="successRate"
+                align="center"
+                :render-header="Tooltipcgl"
+              >
                 <template slot-scope="scope">
-                  <span>{{ calculateSuccessRate(scope.row.followUpSuccess, scope.row.needFollowUp, scope.row.pendingFollowUp) }}</span>
+                  <span>{{
+                    calculateSuccessRate(
+                      scope.row.followUpSuccess,
+                      scope.row.needFollowUp,
+                      scope.row.pendingFollowUp
+                    )
+                  }}</span>
                 </template>
               </el-table-column>
 
               <!-- 鍐嶆闅忚锛堝尰鐢燂級 -->
-              <el-table-column label="鍐嶆闇�闅忚" prop="needFollowUpAgain" align="center">
+              <el-table-column
+                label="鍐嶆闇�闅忚"
+                prop="needFollowUpAgain"
+                align="center"
+              >
                 <template slot-scope="scope">
-                  <el-button type="text" @click="handleViewDetails(scope.row, 'needFollowUpAgainInfo', '鍐嶆闇�闅忚鍒楄〃', '1')">
-                    <span class="button-zx">{{ scope.row.needFollowUpAgain }}</span>
+                  <el-button
+                    type="text"
+                    @click="
+                      handleViewDetails(
+                        scope.row,
+                        'needFollowUpAgainInfo',
+                        '鍐嶆闇�闅忚鍒楄〃',
+                        '1'
+                      )
+                    "
+                  >
+                    <span class="button-zx">{{
+                      scope.row.needFollowUpAgain
+                    }}</span>
                   </el-button>
                 </template>
               </el-table-column>
-              <el-table-column label="鍐嶆寰呴殢璁�" prop="pendingFollowUpAgain" align="center">
+              <el-table-column
+                label="鍐嶆寰呴殢璁�"
+                prop="pendingFollowUpAgain"
+                align="center"
+              >
                 <template slot-scope="scope">
-                  <el-button type="text" @click="handleViewDetails(scope.row, 'pendingFollowUpAgainInfo', '鍐嶆寰呴殢璁垮垪琛�', '1')">
-                    <span class="button-zx">{{ scope.row.pendingFollowUpAgain }}</span>
+                  <el-button
+                    type="text"
+                    @click="
+                      handleViewDetails(
+                        scope.row,
+                        'pendingFollowUpAgainInfo',
+                        '鍐嶆寰呴殢璁垮垪琛�',
+                        '1'
+                      )
+                    "
+                  >
+                    <span class="button-zx">{{
+                      scope.row.pendingFollowUpAgain
+                    }}</span>
                   </el-button>
                 </template>
               </el-table-column>
-              <el-table-column label="鍐嶆瀹屾垚" prop="followUpSuccessAgain" align="center">
+              <el-table-column
+                label="鍐嶆瀹屾垚"
+                prop="followUpSuccessAgain"
+                align="center"
+              >
                 <template slot-scope="scope">
-                  <el-button type="text" @click="handleViewDetails(scope.row, 'followUpSuccessAgainInfo', '鍐嶆瀹屾垚鍒楄〃', '1')">
-                    <span class="button-zx">{{ scope.row.followUpSuccessAgain }}</span>
+                  <el-button
+                    type="text"
+                    @click="
+                      handleViewDetails(
+                        scope.row,
+                        'followUpSuccessAgainInfo',
+                        '鍐嶆瀹屾垚鍒楄〃',
+                        '1'
+                      )
+                    "
+                  >
+                    <span class="button-zx">{{
+                      scope.row.followUpSuccessAgain
+                    }}</span>
                   </el-button>
                 </template>
               </el-table-column>
-              <el-table-column label="鍐嶆澶辫触" prop="followUpFailAgain" align="center">
+              <el-table-column
+                label="鍐嶆澶辫触"
+                prop="followUpFailAgain"
+                align="center"
+              >
                 <template slot-scope="scope">
-                  <el-button type="text" @click="handleViewDetails(scope.row, 'followUpFailAgainInfo', '鍐嶆澶辫触鍒楄〃', '1')">
-                    <span class="button-zx">{{ scope.row.followUpFailAgain }}</span>
+                  <el-button
+                    type="text"
+                    @click="
+                      handleViewDetails(
+                        scope.row,
+                        'followUpFailAgainInfo',
+                        '鍐嶆澶辫触鍒楄〃',
+                        '1'
+                      )
+                    "
+                  >
+                    <span class="button-zx">{{
+                      scope.row.followUpFailAgain
+                    }}</span>
                   </el-button>
                 </template>
               </el-table-column>
-              <el-table-column v-if="orgname != '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'" label="鍐嶆鎴愬姛鐜�" prop="successRateAgain" align="center" :render-header="Tooltipcgl">
+              <el-table-column
+                v-if="orgname != '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'"
+                label="鍐嶆鎴愬姛鐜�"
+                prop="successRateAgain"
+                align="center"
+                :render-header="Tooltipcgl"
+              >
                 <template slot-scope="scope">
-                  <span>{{ calculateSuccessRate(scope.row.followUpSuccessAgain, scope.row.needFollowUpAgain, scope.row.pendingFollowUpAgain) }}</span>
+                  <span>{{
+                    calculateSuccessRate(
+                      scope.row.followUpSuccessAgain,
+                      scope.row.needFollowUpAgain,
+                      scope.row.pendingFollowUpAgain
+                    )
+                  }}</span>
                 </template>
               </el-table-column>
 
               <!-- 鏂板璁$畻鎸囨爣锛堝尰鐢燂級 -->
-              <el-table-column label="闅忚鐜�" align="center" prop="followUpRate" :render-header="TooltipFollowUpRate">
+              <el-table-column
+                label="闅忚鐜�"
+                align="center"
+                prop="followUpRate"
+                :render-header="TooltipFollowUpRate"
+              >
                 <template slot-scope="scope">
                   <span>{{ calculateFollowUpRate(scope.row) }}</span>
                 </template>
               </el-table-column>
-              <el-table-column label="鎺ㄩ�佺巼" align="center" prop="pushRate" :render-header="TooltipPushRate">
+              <el-table-column
+                label="鎺ㄩ�佺巼"
+                align="center"
+                prop="pushRate"
+                :render-header="TooltipPushRate"
+              >
                 <template slot-scope="scope">
                   <span>{{ calculatePushRate(scope.row) }}</span>
                 </template>
@@ -168,110 +388,280 @@
         <!-- 鍑洪櫌浜烘 -->
         <el-table-column label="鍑洪櫌浜烘" align="center" prop="dischargeCount">
           <template slot-scope="scope">
-            <el-button type="text" @click="handleViewDetails(scope.row, 'dischargeCountInfo', '鍑洪櫌鎮h�呭垪琛�')">
+            <el-button
+              type="text"
+              @click="
+                handleViewDetails(
+                  scope.row,
+                  'dischargeCountInfo',
+                  '鍑洪櫌鎮h�呭垪琛�'
+                )
+              "
+            >
               <span class="button-zx">{{ scope.row.dischargeCount }}</span>
             </el-button>
           </template>
         </el-table-column>
-             <el-table-column label="鏃犻渶闅忚" align="center" prop="nonFollowUp">
-            <template slot-scope="scope">
-              <el-button type="text" @click="handleViewDetails(scope.row, 'nonFollowUpInfo', '棣栨鏃犻渶闅忚鍒楄〃')">
-                <span class="button-zx">{{ scope.row.nonFollowUp }}</span>
-              </el-button>
-            </template>
-          </el-table-column>
-          <el-table-column label="搴旈殢璁�" align="center" prop="followUpNeeded">
-            <template slot-scope="scope">
-              <el-button type="text" @click="handleViewDetails(scope.row, 'followUpNeededInfo', '棣栨搴旈殢璁垮垪琛�')">
-                <span class="button-zx">{{ scope.row.followUpNeeded }}</span>
-              </el-button>
-            </template>
-          </el-table-column>
+        <el-table-column label="鏃犻渶闅忚" align="center" prop="nonFollowUp">
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              @click="
+                handleViewDetails(
+                  scope.row,
+                  'nonFollowUpInfo',
+                  '棣栨鏃犻渶闅忚鍒楄〃'
+                )
+              "
+            >
+              <span class="button-zx">{{ scope.row.nonFollowUp }}</span>
+            </el-button>
+          </template>
+        </el-table-column>
+        <el-table-column label="搴旈殢璁�" align="center" prop="followUpNeeded">
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              @click="
+                handleViewDetails(
+                  scope.row,
+                  'followUpNeededInfo',
+                  '棣栨搴旈殢璁垮垪琛�'
+                )
+              "
+            >
+              <span class="button-zx">{{ scope.row.followUpNeeded }}</span>
+            </el-button>
+          </template>
+        </el-table-column>
 
         <!-- ===== 棣栨闅忚 ===== -->
         <el-table-column align="center" label="棣栨闅忚">
-
           <el-table-column label="闇�闅忚" align="center" prop="needFollowUp">
             <template slot-scope="scope">
-              <el-button type="text" @click="handleViewDetails(scope.row, 'needFollowUpInfo', '棣栨闇�闅忚鍒楄〃')">
+              <el-button
+                type="text"
+                @click="
+                  handleViewDetails(
+                    scope.row,
+                    'needFollowUpInfo',
+                    '棣栨闇�闅忚鍒楄〃'
+                  )
+                "
+              >
                 <span class="button-zx">{{ scope.row.needFollowUp }}</span>
               </el-button>
             </template>
           </el-table-column>
           <el-table-column label="寰呴殢璁�" align="center" prop="pendingFollowUp">
             <template slot-scope="scope">
-              <el-button type="text" @click="handleViewDetails(scope.row, 'pendingFollowUpInfo', '棣栨寰呴殢璁垮垪琛�')">
+              <el-button
+                type="text"
+                @click="
+                  handleViewDetails(
+                    scope.row,
+                    'pendingFollowUpInfo',
+                    '棣栨寰呴殢璁垮垪琛�'
+                  )
+                "
+              >
                 <span class="button-zx">{{ scope.row.pendingFollowUp }}</span>
               </el-button>
             </template>
           </el-table-column>
           <el-table-column label="瀹屾垚" align="center" prop="followUpSuccess">
             <template slot-scope="scope">
-              <el-button type="text" @click="handleViewDetails(scope.row, 'followUpSuccessInfo', '棣栨瀹屾垚鍒楄〃')">
+              <el-button
+                type="text"
+                @click="
+                  handleViewDetails(
+                    scope.row,
+                    'followUpSuccessInfo',
+                    '棣栨瀹屾垚鍒楄〃'
+                  )
+                "
+              >
                 <span class="button-zx">{{ scope.row.followUpSuccess }}</span>
               </el-button>
             </template>
           </el-table-column>
           <el-table-column label="澶辫触" align="center" prop="followUpFail">
             <template slot-scope="scope">
-              <el-button type="text" @click="handleViewDetails(scope.row, 'followUpFailInfo', '棣栨澶辫触鍒楄〃')">
+              <el-button
+                type="text"
+                @click="
+                  handleViewDetails(
+                    scope.row,
+                    'followUpFailInfo',
+                    '棣栨澶辫触鍒楄〃'
+                  )
+                "
+              >
                 <span class="button-zx">{{ scope.row.followUpFail }}</span>
               </el-button>
             </template>
           </el-table-column>
-          <el-table-column v-if="orgname != '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'" label="鎴愬姛鐜�" align="center" prop="successRate" :render-header="Tooltipcgl">
+          <el-table-column
+            v-if="orgname != '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'"
+            label="鎴愬姛鐜�"
+            align="center"
+            prop="successRate"
+            :render-header="Tooltipcgl"
+          >
             <template slot-scope="scope">
-              <span>{{ calculateSuccessRate(scope.row.followUpSuccess, scope.row.needFollowUp, scope.row.pendingFollowUp) }}</span>
+              <span>{{
+                calculateSuccessRate(
+                  scope.row.followUpSuccess,
+                  scope.row.needFollowUp,
+                  scope.row.pendingFollowUp
+                )
+              }}</span>
             </template>
           </el-table-column>
         </el-table-column>
 
         <!-- ===== 鍐嶆闅忚 ===== -->
         <el-table-column align="center" label="鍐嶆闅忚">
-          <el-table-column label="闇�闅忚" align="center" prop="needFollowUpAgain">
+          <el-table-column
+            label="闇�闅忚"
+            align="center"
+            prop="needFollowUpAgain"
+          >
             <template slot-scope="scope">
-              <el-button type="text" @click="handleViewDetails(scope.row, 'needFollowUpAgainInfo', '鍐嶆闇�闅忚鍒楄〃')">
+              <el-button
+                type="text"
+                @click="
+                  handleViewDetails(
+                    scope.row,
+                    'needFollowUpAgainInfo',
+                    '鍐嶆闇�闅忚鍒楄〃'
+                  )
+                "
+              >
                 <span class="button-zx">{{ scope.row.needFollowUpAgain }}</span>
               </el-button>
             </template>
           </el-table-column>
-          <el-table-column label="寰呴殢璁�" align="center" prop="pendingFollowUpAgain">
+          <el-table-column
+            label="寰呴殢璁�"
+            align="center"
+            prop="pendingFollowUpAgain"
+          >
             <template slot-scope="scope">
-              <el-button type="text" @click="handleViewDetails(scope.row, 'pendingFollowUpAgainInfo', '鍐嶆寰呴殢璁垮垪琛�')">
-                <span class="button-zx">{{ scope.row.pendingFollowUpAgain }}</span>
+              <el-button
+                type="text"
+                @click="
+                  handleViewDetails(
+                    scope.row,
+                    'pendingFollowUpAgainInfo',
+                    '鍐嶆寰呴殢璁垮垪琛�'
+                  )
+                "
+              >
+                <span class="button-zx">{{
+                  scope.row.pendingFollowUpAgain
+                }}</span>
               </el-button>
             </template>
           </el-table-column>
-          <el-table-column label="瀹屾垚" align="center" prop="followUpSuccessAgain">
+          <el-table-column
+            label="瀹屾垚"
+            align="center"
+            prop="followUpSuccessAgain"
+          >
             <template slot-scope="scope">
-              <el-button type="text" @click="handleViewDetails(scope.row, 'followUpSuccessAgainInfo', '鍐嶆瀹屾垚鍒楄〃')">
-                <span class="button-zx">{{ scope.row.followUpSuccessAgain }}</span>
+              <el-button
+                type="text"
+                @click="
+                  handleViewDetails(
+                    scope.row,
+                    'followUpSuccessAgainInfo',
+                    '鍐嶆瀹屾垚鍒楄〃'
+                  )
+                "
+              >
+                <span class="button-zx">{{
+                  scope.row.followUpSuccessAgain
+                }}</span>
               </el-button>
             </template>
           </el-table-column>
           <el-table-column label="澶辫触" align="center" prop="followUpFailAgain">
             <template slot-scope="scope">
-              <el-button type="text" @click="handleViewDetails(scope.row, 'followUpFailAgainInfo', '鍐嶆澶辫触鍒楄〃')">
+              <el-button
+                type="text"
+                @click="
+                  handleViewDetails(
+                    scope.row,
+                    'followUpFailAgainInfo',
+                    '鍐嶆澶辫触鍒楄〃'
+                  )
+                "
+              >
                 <span class="button-zx">{{ scope.row.followUpFailAgain }}</span>
               </el-button>
             </template>
           </el-table-column>
-          <el-table-column v-if="orgname != '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'" label="鎴愬姛鐜�" align="center" prop="successRateAgain" :render-header="Tooltipcgl">
+          <el-table-column
+            v-if="orgname != '鏅畞鐣叉棌鑷不鍘夸汉姘戝尰闄�'"
+            label="鎴愬姛鐜�"
+            align="center"
+            prop="successRateAgain"
+            :render-header="Tooltipcgl"
+          >
             <template slot-scope="scope">
-              <span>{{ calculateSuccessRate(scope.row.followUpSuccessAgain, scope.row.needFollowUpAgain, scope.row.pendingFollowUpAgain) }}</span>
+              <span>{{
+                calculateSuccessRate(
+                  scope.row.followUpSuccessAgain,
+                  scope.row.needFollowUpAgain,
+                  scope.row.pendingFollowUpAgain
+                )
+              }}</span>
             </template>
           </el-table-column>
         </el-table-column>
 
         <!-- ===== 鏂板璁$畻鎸囨爣 ===== -->
-        <el-table-column label="闅忚鐜�" align="center" prop="followUpRate" :render-header="TooltipFollowUpRate">
+        <el-table-column
+          label="闅忚鐜�"
+          align="center"
+          prop="followUpRate"
+          :render-header="TooltipFollowUpRate"
+        >
           <template slot-scope="scope">
             <span>{{ calculateFollowUpRate(scope.row) }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="鎺ㄩ�佺巼" align="center" prop="pushRate" :render-header="TooltipPushRate">
+        <el-table-column
+          label="鎺ㄩ�佺巼"
+          align="center"
+          prop="pushRate"
+          :render-header="TooltipPushRate"
+        >
           <template slot-scope="scope">
             <span>{{ calculatePushRate(scope.row) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column
+          label="宸叉嫧閫�"
+          align="center"
+          prop="manuallyCalled"
+          :render-header="TooltipPushRate"
+        >
+          <template slot-scope="scope">
+            <el-button
+              type="text"
+              @click="
+                handleViewDetails(
+                  scope.row,
+                  'manuallyCalledInfo',
+                  '宸叉嫧閫氬垪琛�',
+                  '1'
+                )
+              "
+            >
+              <span class="button-zx">{{ scope.row.manuallyCalled }}</span>
+            </el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -325,9 +715,10 @@
       const params = {
         ...this.queryParams,
         // 涓嶄紶 visitCount锛屽悗绔繑鍥炲寘鍚娆″拰鍐嶆鐨勬暟鎹�
-        leavehospitaldistrictcodes: this.queryParams.leavehospitaldistrictcodes.includes("all")
-          ? this.getAllWardCodes()
-          : this.queryParams.leavehospitaldistrictcodes,
+        leavehospitaldistrictcodes:
+          this.queryParams.leavehospitaldistrictcodes.includes("all")
+            ? this.getAllWardCodes()
+            : this.queryParams.leavehospitaldistrictcodes,
         deptcodes: this.queryParams.deptcodes.includes("all")
           ? this.getAllDeptCodes()
           : this.queryParams.deptcodes,
@@ -351,20 +742,64 @@
     },
 
     getAllWardCodes() {
-      return this.flatArrayhospit.filter((item) => item.value !== "all").map((item) => item.value);
+      return this.flatArrayhospit
+        .filter((item) => item.value !== "all")
+        .map((item) => item.value);
     },
     getAllDeptCodes() {
-      return this.flatArraydept.filter((item) => item.value !== "all").map((item) => item.value);
+      return this.flatArraydept
+        .filter((item) => item.value !== "all")
+        .map((item) => item.value);
     },
 
     // ===================== 鎺掑簭 =====================
     customSort(data) {
       const order = [
-        "涓�", "浜�", "涓�", "鍥�", "浜�", "鍏�", "涓�", "鍏�", "涔�", "鍗�",
-        "鍗佷竴", "鍗佷簩", "鍗佷笁", "鍗佸洓", "鍗佷簲", "鍗佸叚", "鍗佷竷", "鍗佸叓", "鍗佷節", "浜屽崄",
-        "浜屽崄涓�", "浜屽崄浜�", "浜屽崄涓�", "浜屽崄鍥�", "浜屽崄浜�", "浜屽崄鍏�", "浜屽崄涓�", "浜屽崄鍏�", "浜屽崄涔�", "涓夊崄",
-        "涓夊崄涓�", "涓夊崄浜�", "涓夊崄涓�", "涓夊崄鍥�", "涓夊崄浜�", "涓夊崄鍏�", "涓夊崄涓�", "涓夊崄鍏�", "涓夊崄涔�", "鍥涘崄",
-        "鍥涘崄涓�", "鍥涘崄浜�", "鍥涘崄涓�", "鍥涘崄鍥�", "鍥涘崄浜�",
+        "涓�",
+        "浜�",
+        "涓�",
+        "鍥�",
+        "浜�",
+        "鍏�",
+        "涓�",
+        "鍏�",
+        "涔�",
+        "鍗�",
+        "鍗佷竴",
+        "鍗佷簩",
+        "鍗佷笁",
+        "鍗佸洓",
+        "鍗佷簲",
+        "鍗佸叚",
+        "鍗佷竷",
+        "鍗佸叓",
+        "鍗佷節",
+        "浜屽崄",
+        "浜屽崄涓�",
+        "浜屽崄浜�",
+        "浜屽崄涓�",
+        "浜屽崄鍥�",
+        "浜屽崄浜�",
+        "浜屽崄鍏�",
+        "浜屽崄涓�",
+        "浜屽崄鍏�",
+        "浜屽崄涔�",
+        "涓夊崄",
+        "涓夊崄涓�",
+        "涓夊崄浜�",
+        "涓夊崄涓�",
+        "涓夊崄鍥�",
+        "涓夊崄浜�",
+        "涓夊崄鍏�",
+        "涓夊崄涓�",
+        "涓夊崄鍏�",
+        "涓夊崄涔�",
+        "鍥涘崄",
+        "鍥涘崄涓�",
+        "鍥涘崄浜�",
+        "鍥涘崄涓�",
+        "鍥涘崄鍥�",
+        "鍥涘崄浜�",
       ];
       return data.sort((a, b) => {
         const getIndex = (name) => {
@@ -383,7 +818,9 @@
         const indexA = getIndex(a.leavehospitaldistrictname);
         const indexB = getIndex(b.leavehospitaldistrictname);
         if (indexA === -1 && indexB === -1) {
-          return (a.leavehospitaldistrictname || "").localeCompare(b.leavehospitaldistrictname || "");
+          return (a.leavehospitaldistrictname || "").localeCompare(
+            b.leavehospitaldistrictname || ""
+          );
         }
         if (indexA === -1) return 1;
         if (indexB === -1) return -1;
@@ -396,22 +833,60 @@
       const a = aRow.leavehospitaldistrictname;
       const b = bRow.leavehospitaldistrictname;
       const chineseNumMap = {
-        涓�: 1, 浜�: 2, 涓�: 3, 鍥�: 4, 浜�: 5,
-        鍏�: 6, 涓�: 7, 鍏�: 8, 涔�: 9, 鍗�: 10,
-        鍗佷竴: 11, 鍗佷簩: 12, 鍗佷笁: 13, 鍗佸洓: 14, 鍗佷簲: 15,
-        鍗佸叚: 16, 鍗佷竷: 17, 鍗佸叓: 18, 鍗佷節: 19, 浜屽崄: 20,
-        浜屽崄涓�: 21, 浜屽崄浜�: 22, 浜屽崄涓�: 23, 浜屽崄鍥�: 24, 浜屽崄浜�: 25,
-        浜屽崄鍏�: 26, 浜屽崄涓�: 27, 浜屽崄鍏�: 28, 浜屽崄涔�: 29, 涓夊崄: 30,
-        涓夊崄涓�: 31, 涓夊崄浜�: 32, 涓夊崄涓�: 33, 涓夊崄鍥�: 34, 涓夊崄浜�: 35,
-        涓夊崄鍏�: 36, 涓夊崄涓�: 37, 涓夊崄鍏�: 38, 涓夊崄涔�: 39, 鍥涘崄: 40,
-        鍥涘崄涓�: 41, 鍥涘崄浜�: 42, 鍥涘崄涓�: 43, 鍥涘崄鍥�: 44, 鍥涘崄浜�: 45,
+        涓�: 1,
+        浜�: 2,
+        涓�: 3,
+        鍥�: 4,
+        浜�: 5,
+        鍏�: 6,
+        涓�: 7,
+        鍏�: 8,
+        涔�: 9,
+        鍗�: 10,
+        鍗佷竴: 11,
+        鍗佷簩: 12,
+        鍗佷笁: 13,
+        鍗佸洓: 14,
+        鍗佷簲: 15,
+        鍗佸叚: 16,
+        鍗佷竷: 17,
+        鍗佸叓: 18,
+        鍗佷節: 19,
+        浜屽崄: 20,
+        浜屽崄涓�: 21,
+        浜屽崄浜�: 22,
+        浜屽崄涓�: 23,
+        浜屽崄鍥�: 24,
+        浜屽崄浜�: 25,
+        浜屽崄鍏�: 26,
+        浜屽崄涓�: 27,
+        浜屽崄鍏�: 28,
+        浜屽崄涔�: 29,
+        涓夊崄: 30,
+        涓夊崄涓�: 31,
+        涓夊崄浜�: 32,
+        涓夊崄涓�: 33,
+        涓夊崄鍥�: 34,
+        涓夊崄浜�: 35,
+        涓夊崄鍏�: 36,
+        涓夊崄涓�: 37,
+        涓夊崄鍏�: 38,
+        涓夊崄涔�: 39,
+        鍥涘崄: 40,
+        鍥涘崄涓�: 41,
+        鍥涘崄浜�: 42,
+        鍥涘崄涓�: 43,
+        鍥涘崄鍥�: 44,
+        鍥涘崄浜�: 45,
       };
       const getNumberFromText = (text) => {
         if (!text || typeof text !== "string") return -1;
         const match = text.match(/^([涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+)/);
         if (match && match[1]) {
           const chineseNum = match[1];
-          return chineseNumMap[chineseNum] !== undefined ? chineseNumMap[chineseNum] : -1;
+          return chineseNumMap[chineseNum] !== undefined
+            ? chineseNumMap[chineseNum]
+            : -1;
         }
         const arabicMatch = text.match(/^(\d+)/);
         if (arabicMatch && arabicMatch[1]) {
@@ -430,7 +905,9 @@
 
     // ===================== 琛屽睍寮� =====================
     getRowKey(row) {
-      return row.statisticaltype === 1 ? row.leavehospitaldistrictcode : row.deptcode;
+      return row.statisticaltype === 1
+        ? row.leavehospitaldistrictcode
+        : row.deptcode;
     },
 
     handleRowClick(row) {
@@ -496,7 +973,7 @@
       const nonFollowUp = Number(row.nonFollowUp) || 0;
       const followUpNeeded = Number(row.followUpNeeded) || 0;
       const denominator = followUpNeeded + nonFollowUp;
-      console.log(successAgain,nonFollowUp,followUpNeeded);
+      console.log(successAgain, nonFollowUp, followUpNeeded);
 
       if (denominator <= 0) return "0.00%";
       return ((successAgain / denominator) * 100).toFixed(2) + "%";
@@ -522,13 +999,27 @@
           // 鍥犱负璁$畻澶嶆潅锛岃繖閲岀畝鍖栦负 "-"
           sums[index] = "-";
         } else if (prop === "followUpRate") {
-          const values = data.map((row) => parseFloat(this.calculateFollowUpRate(row).replace("%", ""))).filter(v => !isNaN(v));
+          const values = data
+            .map((row) =>
+              parseFloat(this.calculateFollowUpRate(row).replace("%", ""))
+            )
+            .filter((v) => !isNaN(v));
           if (values.length === 0) sums[index] = "0.00%";
-          else sums[index] = (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2) + "%";
+          else
+            sums[index] =
+              (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2) +
+              "%";
         } else if (prop === "pushRate") {
-          const values = data.map((row) => parseFloat(this.calculatePushRate(row).replace("%", ""))).filter(v => !isNaN(v));
+          const values = data
+            .map((row) =>
+              parseFloat(this.calculatePushRate(row).replace("%", ""))
+            )
+            .filter((v) => !isNaN(v));
           if (values.length === 0) sums[index] = "0.00%";
-          else sums[index] = (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2) + "%";
+          else
+            sums[index] =
+              (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2) +
+              "%";
         } else {
           // 鏁板瓧鍒楁眰鍜�
           const values = data.map((item) => Number(item[prop]) || 0);
@@ -556,11 +1047,25 @@
         if (prop === "successRate" || prop === "successRateAgain") {
           sums[index] = "-";
         } else if (prop === "followUpRate") {
-          const values = data.map((row) => parseFloat(this.calculateFollowUpRate(row).replace("%", ""))).filter(v => !isNaN(v));
-          sums[index] = values.length ? (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2) + "%" : "0.00%";
+          const values = data
+            .map((row) =>
+              parseFloat(this.calculateFollowUpRate(row).replace("%", ""))
+            )
+            .filter((v) => !isNaN(v));
+          sums[index] = values.length
+            ? (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2) +
+              "%"
+            : "0.00%";
         } else if (prop === "pushRate") {
-          const values = data.map((row) => parseFloat(this.calculatePushRate(row).replace("%", ""))).filter(v => !isNaN(v));
-          sums[index] = values.length ? (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2) + "%" : "0.00%";
+          const values = data
+            .map((row) =>
+              parseFloat(this.calculatePushRate(row).replace("%", ""))
+            )
+            .filter((v) => !isNaN(v));
+          sums[index] = values.length
+            ? (values.reduce((a, b) => a + b, 0) / values.length).toFixed(2) +
+              "%"
+            : "0.00%";
         } else {
           const values = data.map((item) => Number(item[prop]) || 0);
           sums[index] = values.reduce((a, b) => a + b, 0);
@@ -577,7 +1082,9 @@
 
     // ===================== 鐐瑰嚮閽诲彇 =====================
     handleViewDetails(row, infoKey, titleSuffix, type) {
-      const title = `${row.leavehospitaldistrictname || row.deptname}${titleSuffix}`;
+      const title = `${
+        row.leavehospitaldistrictname || row.deptname
+      }${titleSuffix}`;
       this.$emit("view-details", row, infoKey, title, type);
     },
 
@@ -598,7 +1105,10 @@
       try {
         let dateRangeString = "";
         const isLishuiHospital = this.orgname === "涓芥按甯備腑鍖婚櫌";
-        if (this.queryParams.dateRange && this.queryParams.dateRange.length === 2) {
+        if (
+          this.queryParams.dateRange &&
+          this.queryParams.dateRange.length === 2
+        ) {
           const start = this.queryParams.dateRange[0];
           const end = this.queryParams.dateRange[1];
           if (isLishuiHospital) {
@@ -612,11 +1122,15 @@
           }
         } else {
           const now = new Date();
-          dateRangeString = isLishuiHospital ? `${now.getFullYear()}骞�${now.getMonth() + 1}鏈坄 : `${now.getMonth() + 1}鏈坄;
+          dateRangeString = isLishuiHospital
+            ? `${now.getFullYear()}骞�${now.getMonth() + 1}鏈坄
+            : `${now.getMonth() + 1}鏈坄;
         }
 
         const serviceTypeLabel = this.getServiceTypeLabel();
-        const serviceTypeSuffix = serviceTypeLabel ? `_${serviceTypeLabel}` : "";
+        const serviceTypeSuffix = serviceTypeLabel
+          ? `_${serviceTypeLabel}`
+          : "";
         const excelName = `缁煎悎闅忚缁熻琛�${serviceTypeSuffix}_${dateRangeString}.xlsx`;
         if (!this.tableData || this.tableData.length === 0) {
           this.$message.warning("鏆傛棤鏁版嵁鍙鍑�");
@@ -645,29 +1159,59 @@
       const titleStyle = {
         font: { name: "寰蒋闆呴粦", size: 16, bold: true },
         alignment: { horizontal: "center", vertical: "middle" },
-        fill: { type: "pattern", pattern: "solid", fgColor: { argb: "FFE6F3FF" } },
-        border: { top: { style: "thin" }, left: { style: "thin" }, bottom: { style: "thin" }, right: { style: "thin" } },
+        fill: {
+          type: "pattern",
+          pattern: "solid",
+          fgColor: { argb: "FFE6F3FF" },
+        },
+        border: {
+          top: { style: "thin" },
+          left: { style: "thin" },
+          bottom: { style: "thin" },
+          right: { style: "thin" },
+        },
       };
       const headerStyle = {
         font: { name: "寰蒋闆呴粦", size: 11, bold: true },
-        fill: { type: "pattern", pattern: "solid", fgColor: { argb: "FFF5F7FA" } },
+        fill: {
+          type: "pattern",
+          pattern: "solid",
+          fgColor: { argb: "FFF5F7FA" },
+        },
         alignment: { horizontal: "center", vertical: "middle", wrapText: true },
-        border: { top: { style: "thin" }, left: { style: "thin" }, bottom: { style: "thin" }, right: { style: "thin" } },
+        border: {
+          top: { style: "thin" },
+          left: { style: "thin" },
+          bottom: { style: "thin" },
+          right: { style: "thin" },
+        },
       };
       const cellStyle = {
         font: { name: "瀹嬩綋", size: 10 },
         alignment: { horizontal: "center", vertical: "middle" },
-        border: { top: { style: "thin" }, left: { style: "thin" }, bottom: { style: "thin" }, right: { style: "thin" } },
+        border: {
+          top: { style: "thin" },
+          left: { style: "thin" },
+          bottom: { style: "thin" },
+          right: { style: "thin" },
+        },
       };
       const summaryStyle = {
         ...cellStyle,
         font: { ...cellStyle.font, bold: true, color: { argb: "FF409EFF" } },
-        fill: { type: "pattern", pattern: "solid", fgColor: { argb: "FFF5F7FA" } },
+        fill: {
+          type: "pattern",
+          pattern: "solid",
+          fgColor: { argb: "FFF5F7FA" },
+        },
       };
 
       // 鏍囬琛�
       worksheet.mergeCells(1, 1, 1, 20);
-      worksheet.getCell(1, 1).value = `缁煎悎闅忚缁熻琛�${serviceTypeSuffix}_${dateRangeString}`;
+      worksheet.getCell(
+        1,
+        1
+      ).value = `缁煎悎闅忚缁熻琛�${serviceTypeSuffix}_${dateRangeString}`;
       worksheet.getCell(1, 1).style = titleStyle;
       worksheet.getRow(1).height = 35;
 
@@ -679,7 +1223,8 @@
 
       // 鐥呭尯/绉戝
       worksheet.mergeCells(2, 2, 3, 2);
-      worksheet.getCell(2, 2).value = this.queryParams.statisticaltype == 1 ? "鍑洪櫌鐥呭尯" : "绉戝";
+      worksheet.getCell(2, 2).value =
+        this.queryParams.statisticaltype == 1 ? "鍑洪櫌鐥呭尯" : "绉戝";
       worksheet.getCell(2, 2).style = headerStyle;
 
       // 鍑洪櫌浜烘
@@ -691,7 +1236,15 @@
       worksheet.mergeCells(2, 4, 2, 10);
       worksheet.getCell(2, 4).value = "棣栨闅忚";
       worksheet.getCell(2, 4).style = headerStyle;
-      const firstCols = ["鏃犻渶闅忚", "搴旈殢璁�", "闇�闅忚", "寰呴殢璁�", "瀹屾垚", "澶辫触", "鎴愬姛鐜�"];
+      const firstCols = [
+        "鏃犻渶闅忚",
+        "搴旈殢璁�",
+        "闇�闅忚",
+        "寰呴殢璁�",
+        "瀹屾垚",
+        "澶辫触",
+        "鎴愬姛鐜�",
+      ];
       firstCols.forEach((label, idx) => {
         const col = 4 + idx;
         worksheet.getCell(3, col).value = label;
@@ -729,66 +1282,144 @@
           item.pendingFollowUp || 0,
           item.followUpSuccess || 0,
           item.followUpFail || 0,
-          this.calculateSuccessRate(item.followUpSuccess, item.needFollowUp, item.pendingFollowUp),
+          this.calculateSuccessRate(
+            item.followUpSuccess,
+            item.needFollowUp,
+            item.pendingFollowUp
+          ),
           item.needFollowUpAgain || 0,
           item.pendingFollowUpAgain || 0,
           item.followUpSuccessAgain || 0,
           item.followUpFailAgain || 0,
-          this.calculateSuccessRate(item.followUpSuccessAgain, item.needFollowUpAgain, item.pendingFollowUpAgain),
+          this.calculateSuccessRate(
+            item.followUpSuccessAgain,
+            item.needFollowUpAgain,
+            item.pendingFollowUpAgain
+          ),
           this.calculateFollowUpRate(item),
           this.calculatePushRate(item),
         ];
         const row = worksheet.addRow(rowData);
-        row.eachCell((cell) => { cell.style = cellStyle; });
+        row.eachCell((cell) => {
+          cell.style = cellStyle;
+        });
         row.height = 24;
       });
 
       // 鍚堣琛�
       const summaries = this.getExportSummaries();
       const summaryRow = worksheet.addRow(summaries);
-      summaryRow.eachCell((cell) => { cell.style = summaryStyle; });
+      summaryRow.eachCell((cell) => {
+        cell.style = summaryStyle;
+      });
 
       // 鍒楀
       worksheet.columns = [
         { width: 8 },
         { width: 20 },
         { width: 12 },
-        { width: 12 }, { width: 12 }, { width: 12 }, { width: 12 }, { width: 12 }, { width: 12 }, { width: 12 },
-        { width: 12 }, { width: 12 }, { width: 12 }, { width: 12 }, { width: 12 },
-        { width: 12 }, { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
+        { width: 12 },
       ];
     },
 
     getExportSummaries() {
       // 鎻愬彇鏁版嵁锛岃绠楀悎璁¤
       const data = this.tableData;
-      const sums = ["鍚堣", "/", 0, 0, 0, 0, 0, 0, 0, "0%", 0, 0, 0, 0, "0%", "0%", "0%"];
+      const sums = [
+        "鍚堣",
+        "/",
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        "0%",
+        0,
+        0,
+        0,
+        0,
+        "0%",
+        "0%",
+        "0%",
+      ];
       // 鏁板瓧鍒楃储寮�
       const numIndices = [2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13];
-      data.forEach(row => {
-        numIndices.forEach(idx => {
+      data.forEach((row) => {
+        numIndices.forEach((idx) => {
           const val = Number(row[this.getFieldByIndex(idx)]) || 0;
           sums[idx] += val;
         });
       });
       // 鏍煎紡鍖栨暟瀛�
-      numIndices.forEach(idx => { sums[idx] = this.formatNumber(sums[idx]); });
+      numIndices.forEach((idx) => {
+        sums[idx] = this.formatNumber(sums[idx]);
+      });
       // 璁$畻涓や釜鐧惧垎姣斿垪鐨勫钩鍧囧��
-      const followUpRates = data.map(row => parseFloat(this.calculateFollowUpRate(row).replace("%", ""))).filter(v => !isNaN(v));
-      const pushRates = data.map(row => parseFloat(this.calculatePushRate(row).replace("%", ""))).filter(v => !isNaN(v));
-      sums[15] = followUpRates.length ? (followUpRates.reduce((a,b)=>a+b,0)/followUpRates.length).toFixed(2)+"%" : "0.00%";
-      sums[16] = pushRates.length ? (pushRates.reduce((a,b)=>a+b,0)/pushRates.length).toFixed(2)+"%" : "0.00%";
+      const followUpRates = data
+        .map((row) =>
+          parseFloat(this.calculateFollowUpRate(row).replace("%", ""))
+        )
+        .filter((v) => !isNaN(v));
+      const pushRates = data
+        .map((row) => parseFloat(this.calculatePushRate(row).replace("%", "")))
+        .filter((v) => !isNaN(v));
+      sums[15] = followUpRates.length
+        ? (
+            followUpRates.reduce((a, b) => a + b, 0) / followUpRates.length
+          ).toFixed(2) + "%"
+        : "0.00%";
+      sums[16] = pushRates.length
+        ? (pushRates.reduce((a, b) => a + b, 0) / pushRates.length).toFixed(2) +
+          "%"
+        : "0.00%";
       // 鎴愬姛鐜囩殑鍚堣鐢ㄦ暣浣撴硶璁$畻
-      const totalSuccess = data.reduce((s, row) => s + (Number(row.followUpSuccess)||0), 0);
-      const totalNeed = data.reduce((s, row) => s + (Number(row.needFollowUp)||0), 0);
-      const totalPending = data.reduce((s, row) => s + (Number(row.pendingFollowUp)||0), 0);
+      const totalSuccess = data.reduce(
+        (s, row) => s + (Number(row.followUpSuccess) || 0),
+        0
+      );
+      const totalNeed = data.reduce(
+        (s, row) => s + (Number(row.needFollowUp) || 0),
+        0
+      );
+      const totalPending = data.reduce(
+        (s, row) => s + (Number(row.pendingFollowUp) || 0),
+        0
+      );
       const denom = totalNeed - totalPending;
-      sums[9] = denom > 0 ? ((totalSuccess/denom)*100).toFixed(2)+"%" : "0.00%";
-      const totalSuccessAgain = data.reduce((s, row) => s + (Number(row.followUpSuccessAgain)||0), 0);
-      const totalNeedAgain = data.reduce((s, row) => s + (Number(row.needFollowUpAgain)||0), 0);
-      const totalPendingAgain = data.reduce((s, row) => s + (Number(row.pendingFollowUpAgain)||0), 0);
+      sums[9] =
+        denom > 0 ? ((totalSuccess / denom) * 100).toFixed(2) + "%" : "0.00%";
+      const totalSuccessAgain = data.reduce(
+        (s, row) => s + (Number(row.followUpSuccessAgain) || 0),
+        0
+      );
+      const totalNeedAgain = data.reduce(
+        (s, row) => s + (Number(row.needFollowUpAgain) || 0),
+        0
+      );
+      const totalPendingAgain = data.reduce(
+        (s, row) => s + (Number(row.pendingFollowUpAgain) || 0),
+        0
+      );
       const denomAgain = totalNeedAgain - totalPendingAgain;
-      sums[14] = denomAgain > 0 ? ((totalSuccessAgain/denomAgain)*100).toFixed(2)+"%" : "0.00%";
+      sums[14] =
+        denomAgain > 0
+          ? ((totalSuccessAgain / denomAgain) * 100).toFixed(2) + "%"
+          : "0.00%";
       return sums;
     },
 
@@ -813,9 +1444,13 @@
     // ===================== 瀵煎嚭鍖荤敓瀛愯〃 =====================
     async exportDoctorTable(row) {
       try {
-        const areaName = row.leavehospitaldistrictname || row.deptname || "鏈煡鐥呭尯";
+        const areaName =
+          row.leavehospitaldistrictname || row.deptname || "鏈煡鐥呭尯";
         let dateRangeString = "";
-        if (this.queryParams.dateRange && this.queryParams.dateRange.length === 2) {
+        if (
+          this.queryParams.dateRange &&
+          this.queryParams.dateRange.length === 2
+        ) {
           const start = this.queryParams.dateRange[0].split(" ")[0];
           const end = this.queryParams.dateRange[1].split(" ")[0];
           dateRangeString = `${start}鑷�${end}`;
@@ -832,7 +1467,12 @@
         const worksheet = workbook.addWorksheet(sheetName);
         this.buildDoctorExportSheet(worksheet, row.doctorStats, areaName);
         const buffer = await workbook.xlsx.writeBuffer();
-        saveAs(new Blob([buffer], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" }), fileName);
+        saveAs(
+          new Blob([buffer], {
+            type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+          }),
+          fileName
+        );
         this.$message.success("鍖荤敓缁煎悎闅忚鍒楄〃瀵煎嚭鎴愬姛");
       } catch (err) {
         console.error(err);
@@ -841,19 +1481,39 @@
     },
 
     buildDoctorExportSheet(worksheet, data, areaName) {
-      const titleStyle = { font: { name: "寰蒋闆呴粦", size: 16, bold: true }, alignment: { horizontal: "center", vertical: "middle" } };
+      const titleStyle = {
+        font: { name: "寰蒋闆呴粦", size: 16, bold: true },
+        alignment: { horizontal: "center", vertical: "middle" },
+      };
       const headerStyle = {
         font: { name: "寰蒋闆呴粦", size: 11, bold: true },
-        fill: { type: "pattern", pattern: "solid", fgColor: { argb: "FFF5F7FA" } },
+        fill: {
+          type: "pattern",
+          pattern: "solid",
+          fgColor: { argb: "FFF5F7FA" },
+        },
         alignment: { horizontal: "center", vertical: "middle", wrapText: true },
-        border: { top: { style: "thin" }, left: { style: "thin" }, bottom: { style: "thin" }, right: { style: "thin" } },
+        border: {
+          top: { style: "thin" },
+          left: { style: "thin" },
+          bottom: { style: "thin" },
+          right: { style: "thin" },
+        },
       };
       const cellStyle = {
         font: { name: "瀹嬩綋", size: 10 },
         alignment: { horizontal: "center", vertical: "middle" },
-        border: { top: { style: "thin" }, left: { style: "thin" }, bottom: { style: "thin" }, right: { style: "thin" } },
+        border: {
+          top: { style: "thin" },
+          left: { style: "thin" },
+          bottom: { style: "thin" },
+          right: { style: "thin" },
+        },
       };
-      const summaryStyle = { ...cellStyle, font: { ...cellStyle.font, bold: true } };
+      const summaryStyle = {
+        ...cellStyle,
+        font: { ...cellStyle.font, bold: true },
+      };
 
       worksheet.mergeCells(1, 1, 1, 17);
       worksheet.getCell(1, 1).value = `${areaName}鍖荤敓缁煎悎闅忚鍒楄〃`;
@@ -861,16 +1521,31 @@
       worksheet.getRow(1).height = 30;
 
       const headers = [
-        "鍖荤敓濮撳悕", "绉戝", "鍑洪櫌浜烘",
-        "棣栨鏃犻渶闅忚", "棣栨搴旈殢璁�", "棣栨闇�闅忚", "棣栨寰呴殢璁�", "棣栨瀹屾垚", "棣栨澶辫触", "棣栨鎴愬姛鐜�",
-        "鍐嶆闇�闅忚", "鍐嶆寰呴殢璁�", "鍐嶆瀹屾垚", "鍐嶆澶辫触", "鍐嶆鎴愬姛鐜�",
-        "闅忚鐜�", "鎺ㄩ�佺巼"
+        "鍖荤敓濮撳悕",
+        "绉戝",
+        "鍑洪櫌浜烘",
+        "棣栨鏃犻渶闅忚",
+        "棣栨搴旈殢璁�",
+        "棣栨闇�闅忚",
+        "棣栨寰呴殢璁�",
+        "棣栨瀹屾垚",
+        "棣栨澶辫触",
+        "棣栨鎴愬姛鐜�",
+        "鍐嶆闇�闅忚",
+        "鍐嶆寰呴殢璁�",
+        "鍐嶆瀹屾垚",
+        "鍐嶆澶辫触",
+        "鍐嶆鎴愬姛鐜�",
+        "闅忚鐜�",
+        "鎺ㄩ�佺巼",
       ];
       const headerRow = worksheet.addRow(headers);
-      headerRow.eachCell((cell) => { cell.style = headerStyle; });
+      headerRow.eachCell((cell) => {
+        cell.style = headerStyle;
+      });
       worksheet.getRow(2).height = 25;
 
-      data.forEach(item => {
+      data.forEach((item) => {
         const row = worksheet.addRow([
           item.drname,
           item.deptname,
@@ -881,22 +1556,34 @@
           item.pendingFollowUp,
           item.followUpSuccess,
           item.followUpFail,
-          this.calculateSuccessRate(item.followUpSuccess, item.needFollowUp, item.pendingFollowUp),
+          this.calculateSuccessRate(
+            item.followUpSuccess,
+            item.needFollowUp,
+            item.pendingFollowUp
+          ),
           item.needFollowUpAgain,
           item.pendingFollowUpAgain,
           item.followUpSuccessAgain,
           item.followUpFailAgain,
-          this.calculateSuccessRate(item.followUpSuccessAgain, item.needFollowUpAgain, item.pendingFollowUpAgain),
+          this.calculateSuccessRate(
+            item.followUpSuccessAgain,
+            item.needFollowUpAgain,
+            item.pendingFollowUpAgain
+          ),
           this.calculateFollowUpRate(item),
           this.calculatePushRate(item),
         ]);
-        row.eachCell((cell) => { cell.style = cellStyle; });
+        row.eachCell((cell) => {
+          cell.style = cellStyle;
+        });
         row.height = 24;
       });
 
       // 灏忚
       const summaryRow = worksheet.addRow(this.getDoctorExportSummary(data));
-      summaryRow.eachCell((cell) => { cell.style = summaryStyle; });
+      summaryRow.eachCell((cell) => {
+        cell.style = summaryStyle;
+      });
 
       worksheet.columns = Array(17).fill({ width: 12 });
       worksheet.columns[0].width = 15;
@@ -904,49 +1591,128 @@
     },
 
     getDoctorExportSummary(data) {
-      const sums = ["灏忚", "-", 0, 0, 0, 0, 0, 0, 0, "0%", 0, 0, 0, 0, "0%", "0%", "0%"];
+      const sums = [
+        "灏忚",
+        "-",
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        "0%",
+        0,
+        0,
+        0,
+        0,
+        "0%",
+        "0%",
+        "0%",
+      ];
       const numIndices = [2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13];
-      data.forEach(row => {
-        numIndices.forEach(idx => {
+      data.forEach((row) => {
+        numIndices.forEach((idx) => {
           const val = Number(row[this.getFieldByIndex(idx)]) || 0;
           sums[idx] += val;
         });
       });
-      numIndices.forEach(idx => { sums[idx] = this.formatNumber(sums[idx]); });
+      numIndices.forEach((idx) => {
+        sums[idx] = this.formatNumber(sums[idx]);
+      });
       // 骞冲潎鍊�
-      const followUpRates = data.map(row => parseFloat(this.calculateFollowUpRate(row).replace("%", ""))).filter(v => !isNaN(v));
-      const pushRates = data.map(row => parseFloat(this.calculatePushRate(row).replace("%", ""))).filter(v => !isNaN(v));
-      sums[15] = followUpRates.length ? (followUpRates.reduce((a,b)=>a+b,0)/followUpRates.length).toFixed(2)+"%" : "0.00%";
-      sums[16] = pushRates.length ? (pushRates.reduce((a,b)=>a+b,0)/pushRates.length).toFixed(2)+"%" : "0.00%";
+      const followUpRates = data
+        .map((row) =>
+          parseFloat(this.calculateFollowUpRate(row).replace("%", ""))
+        )
+        .filter((v) => !isNaN(v));
+      const pushRates = data
+        .map((row) => parseFloat(this.calculatePushRate(row).replace("%", "")))
+        .filter((v) => !isNaN(v));
+      sums[15] = followUpRates.length
+        ? (
+            followUpRates.reduce((a, b) => a + b, 0) / followUpRates.length
+          ).toFixed(2) + "%"
+        : "0.00%";
+      sums[16] = pushRates.length
+        ? (pushRates.reduce((a, b) => a + b, 0) / pushRates.length).toFixed(2) +
+          "%"
+        : "0.00%";
       // 鎴愬姛鐜囨暣浣撴硶
-      const totalSuccess = data.reduce((s, row) => s + (Number(row.followUpSuccess)||0), 0);
-      const totalNeed = data.reduce((s, row) => s + (Number(row.needFollowUp)||0), 0);
-      const totalPending = data.reduce((s, row) => s + (Number(row.pendingFollowUp)||0), 0);
+      const totalSuccess = data.reduce(
+        (s, row) => s + (Number(row.followUpSuccess) || 0),
+        0
+      );
+      const totalNeed = data.reduce(
+        (s, row) => s + (Number(row.needFollowUp) || 0),
+        0
+      );
+      const totalPending = data.reduce(
+        (s, row) => s + (Number(row.pendingFollowUp) || 0),
+        0
+      );
       const denom = totalNeed - totalPending;
-      sums[9] = denom > 0 ? ((totalSuccess/denom)*100).toFixed(2)+"%" : "0.00%";
-      const totalSuccessAgain = data.reduce((s, row) => s + (Number(row.followUpSuccessAgain)||0), 0);
-      const totalNeedAgain = data.reduce((s, row) => s + (Number(row.needFollowUpAgain)||0), 0);
-      const totalPendingAgain = data.reduce((s, row) => s + (Number(row.pendingFollowUpAgain)||0), 0);
+      sums[9] =
+        denom > 0 ? ((totalSuccess / denom) * 100).toFixed(2) + "%" : "0.00%";
+      const totalSuccessAgain = data.reduce(
+        (s, row) => s + (Number(row.followUpSuccessAgain) || 0),
+        0
+      );
+      const totalNeedAgain = data.reduce(
+        (s, row) => s + (Number(row.needFollowUpAgain) || 0),
+        0
+      );
+      const totalPendingAgain = data.reduce(
+        (s, row) => s + (Number(row.pendingFollowUpAgain) || 0),
+        0
+      );
       const denomAgain = totalNeedAgain - totalPendingAgain;
-      sums[14] = denomAgain > 0 ? ((totalSuccessAgain/denomAgain)*100).toFixed(2)+"%" : "0.00%";
+      sums[14] =
+        denomAgain > 0
+          ? ((totalSuccessAgain / denomAgain) * 100).toFixed(2) + "%"
+          : "0.00%";
       return sums;
     },
 
     // ===================== Tooltips =====================
     Tooltipcgl(h, { column }) {
-      return h("el-tooltip", {
-        props: { content: "闅忚鎴愬姛/(闇�闅忚-寰呴殢璁�)", placement: "top", effect: "dark" },
-      }, [h("span", column.label)]);
+      return h(
+        "el-tooltip",
+        {
+          props: {
+            content: "闅忚鎴愬姛/(闇�闅忚-寰呴殢璁�)",
+            placement: "top",
+            effect: "dark",
+          },
+        },
+        [h("span", column.label)]
+      );
     },
     TooltipFollowUpRate(h, { column }) {
-      return h("el-tooltip", {
-        props: { content: "(棣栨瀹屾垚+棣栨鏃犻渶闅忚)/(棣栨搴旈殢璁�+棣栨鏃犻渶闅忚)", placement: "top", effect: "dark" },
-      }, [h("span", column.label)]);
+      return h(
+        "el-tooltip",
+        {
+          props: {
+            content: "(棣栨瀹屾垚+棣栨鏃犻渶闅忚)/(棣栨搴旈殢璁�+棣栨鏃犻渶闅忚)",
+            placement: "top",
+            effect: "dark",
+          },
+        },
+        [h("span", column.label)]
+      );
     },
     TooltipPushRate(h, { column }) {
-      return h("el-tooltip", {
-        props: { content: "鍐嶆瀹屾垚/(棣栨搴旈殢璁�+棣栨鏃犻渶闅忚)", placement: "top", effect: "dark" },
-      }, [h("span", column.label)]);
+      return h(
+        "el-tooltip",
+        {
+          props: {
+            content: "鍐嶆瀹屾垚/(棣栨搴旈殢璁�+棣栨鏃犻渶闅忚)",
+            placement: "top",
+            effect: "dark",
+          },
+        },
+        [h("span", column.label)]
+      );
     },
   },
 };

--
Gitblit v1.9.3