From a78c4c8208a4a05dd54781443c08336f142a2dd6 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期五, 10 四月 2026 10:57:49 +0800
Subject: [PATCH] 测试完成

---
 src/views/sfstatistics/percentage/index.vue | 3159 +++++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 2,515 insertions(+), 644 deletions(-)

diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
index bb119e0..9483d21 100644
--- a/src/views/sfstatistics/percentage/index.vue
+++ b/src/views/sfstatistics/percentage/index.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
@@ -83,11 +83,12 @@
               >
                 <el-date-picker
                   v-model="queryParams.dateRange"
-                  value-format="yyyy-MM-dd"
+                  value-format="yyyy-MM-dd HH:mm:ss"
                   type="daterange"
                   range-separator="鑷�"
                   start-placeholder="寮�濮嬫棩鏈�"
                   end-placeholder="缁撴潫鏃ユ湡"
+                  :default-time="['00:00:00', '23:59:59']"
                 >
                 </el-date-picker>
               </el-form-item>
@@ -107,59 +108,191 @@
                   >閲嶇疆</el-button
                 >
               </el-form-item>
-              <el-col :span="19">
-                <el-button
-                  type="warning"
-                  plain
-                  icon="el-icon-download"
-                  size="medium"
-                  @click="handleExport"
-                  >瀵煎嚭</el-button
-                >
-                <el-button
-                  type="primary"
-                  plain
-                  icon="el-icon-data-line"
-                  size="medium"
-                  @click="showChartDialog"
-                  >缁熻瓒嬪娍鍥�</el-button
-                >
-              </el-col>
+              <el-button
+                type="warning"
+                plain
+                icon="el-icon-download"
+                size="medium"
+                @click="exportTable"
+                >瀵煎嚭</el-button
+              >
+              <el-button
+                type="primary"
+                plain
+                icon="el-icon-data-line"
+                size="medium"
+                @click="showChartDialog"
+                >缁熻瓒嬪娍鍥�</el-button
+              >
             </el-form>
-            <el-table
-              v-loading="loading"
-              :data="userList"
-              :border="true"
-              @selection-change="handleSelectionChange"
-              @row-click="handleRowClick"
-              @expand-change="handleRowClick"
-              :row-key="getRowKey"
-              :expand-row-keys="expands"
-            >
-              <!-- 灞曞紑琛岀澶村垪 -->
-              <el-table-column type="expand">
-                <template slot-scope="props">
+
+            <!-- 鏂板锛歍ab鏍囩椤� -->
+            <el-tabs v-model="activeTab" @tab-click="handleTabClick">
+              <el-tab-pane label="棣栨闅忚" name="first">
+                <div class="your-table-container">
                   <el-table
-                    :data="props.row.doctorStats"
-                    border
-                    style="width: 95%; margin: 0 auto"
-                    class="inner-table"
+                    ref="exportTable"
+                    id="exportTableid"
+                    v-loading="loading"
+                    :data="firstFollowUpList"
+                    :border="true"
+                    @selection-change="handleSelectionChange"
+                    @expand-change="handleRowClick"
+                    :row-key="getRowKey"
+                    show-summary
+                    :summary-method="getSummaries"
+                    :expand-row-keys="expands"
                   >
+                    <!-- 灞曞紑琛岀澶村垪 -->
+                    <el-table-column type="expand">
+                      <template slot-scope="props">
+                        <el-table
+                          :data="props.row.doctorStats"
+                          border
+                          style="width: 95%; margin: 0 auto"
+                          class="inner-table"
+                          show-summary
+                          :summary-method="getInnerSummaries"
+                        >
+                          <el-table-column
+                            label="鍖荤敓濮撳悕"
+                            prop="drname"
+                            align="center"
+                          />
+                          <el-table-column
+                            label="绉戝"
+                            width="120"
+                            prop="deptname"
+                            align="center"
+                          />
+                          <el-table-column
+                            label="鍑洪櫌浜烘"
+                            prop="dischargeCount"
+                            align="center"
+                          />
+                          <el-table-column
+                            label="鍑洪櫌浜烘"
+                            align="center"
+                            key="dischargeCount"
+                            prop="dischargeCount"
+                          >
+                          </el-table-column>
+
+                          <el-table-column
+                            label="鏃犻渶闅忚浜烘"
+                            align="center"
+                            width="100"
+                            key="nonFollowUp"
+                            prop="nonFollowUp"
+                          >
+                          </el-table-column>
+                          <el-table-column
+                            label="搴旈殢璁夸汉娆�"
+                            align="center"
+                            width="100"
+                            key="followUpNeeded"
+                            prop="followUpNeeded"
+                          >
+                          </el-table-column>
+                          <el-table-column align="center" label="棣栨鍑洪櫌闅忚">
+                            <el-table-column
+                              label="闇�闅忚"
+                              align="center"
+                              key="needFollowUp"
+                              prop="needFollowUp"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="寰呴殢璁�"
+                              align="center"
+                              key="pendingFollowUp"
+                              prop="pendingFollowUp"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="闅忚鎴愬姛"
+                              align="center"
+                              key="followUpSuccess"
+                              prop="followUpSuccess"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="闅忚澶辫触"
+                              align="center"
+                              key="followUpFail"
+                              prop="followUpFail"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="闅忚鐜�"
+                              align="center"
+                              width="120"
+                              key="followUpRate"
+                              prop="followUpRate"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              v-if="orgname != '涓芥按甯備腑鍖婚櫌'"
+                              label="鍙婃椂鐜�"
+                              align="center"
+                              width="120"
+                              key="rate"
+                              prop="rate"
+                            >
+                              <template slot-scope="scope">
+                                <el-button
+                                  size="medium"
+                                  type="text"
+                                  @click="Seedetails(scope.row)"
+                                  ><span class="button-zx"
+                                    >{{
+                                      (Number(scope.row.rate) * 100).toFixed(2)
+                                    }}%</span
+                                  ></el-button
+                                >
+                              </template>
+                            </el-table-column>
+                            <el-table-column
+                              label="浜哄伐"
+                              align="center"
+                              key="manual"
+                              prop="manual"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="鐭俊"
+                              align="center"
+                              key="sms"
+                              prop="sms"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="寰俊"
+                              align="center"
+                              key="weChat"
+                              prop="weChat"
+                            >
+                            </el-table-column>
+                          </el-table-column>
+                        </el-table>
+                      </template>
+                    </el-table-column>
                     <el-table-column
-                      label="鍖荤敓濮撳悕"
-                      prop="drname"
+                      label="鍑洪櫌鐥呭尯"
                       align="center"
+                      sortable
+                      key="leavehospitaldistrictname"
+                      prop="leavehospitaldistrictname"
+                      width="150"
+                      :show-overflow-tooltip="true"
+                      :sort-method="sortChineseNumber"
                     />
                     <el-table-column
                       label="绉戝"
-                      width="120"
+                      align="center"
+                      key="deptname"
                       prop="deptname"
-                      align="center"
-                    />
-                    <el-table-column
-                      label="鍑洪櫌浜烘"
-                      prop="dischargeCount"
-                      align="center"
+                      :show-overflow-tooltip="true"
                     />
                     <el-table-column
                       label="鍑洪櫌浜烘"
@@ -187,11 +320,27 @@
                     </el-table-column>
                     <el-table-column align="center" label="棣栨鍑洪櫌闅忚">
                       <el-table-column
-                        label="搴旈殢璁�"
+                        label="闇�闅忚"
                         align="center"
                         key="needFollowUp"
                         prop="needFollowUp"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.needFollowUpInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '闇�闅忚鍒楄〃'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.needFollowUp
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
                       <el-table-column
                         label="寰呴殢璁�"
@@ -199,6 +348,22 @@
                         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="闅忚鎴愬姛"
@@ -206,6 +371,22 @@
                         key="followUpSuccess"
                         prop="followUpSuccess"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.followUpSuccessInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '闅忚鎴愬姛鍒楄〃'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.followUpSuccess
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
                       <el-table-column
                         label="闅忚澶辫触"
@@ -213,6 +394,22 @@
                         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="闅忚鐜�"
@@ -221,15 +418,9 @@
                         key="followUpRate"
                         prop="followUpRate"
                       >
-                        <!-- <template slot-scope="scope">
-                    <span
-                      >{{
-                        (Number(scope.row.followUpRate) * 100).toFixed(2)
-                      }}%</span
-                    >
-                  </template> -->
                       </el-table-column>
                       <el-table-column
+                        v-if="orgname != '涓芥按甯備腑鍖婚櫌'"
                         label="鍙婃椂鐜�"
                         align="center"
                         width="120"
@@ -255,6 +446,22 @@
                         key="manual"
                         prop="manual"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.manualInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '浜哄伐闅忚鍒楄〃'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.manual
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
                       <el-table-column
                         label="鐭俊"
@@ -262,6 +469,22 @@
                         key="sms"
                         prop="sms"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.smsInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '鐭俊闅忚鍒楄〃'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.sms
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
                       <el-table-column
                         label="寰俊"
@@ -269,15 +492,276 @@
                         key="weChat"
                         prop="weChat"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.weChatInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '寰俊闅忚鍒楄〃'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.weChat
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
+                    </el-table-column>
+
+                    <!-- 闅忚鎯呭喌鍒楋紙浠呬附姘村競涓尰闄㈡樉绀猴級 -->
+                    <el-table-column
+                      v-if="orgname == '涓芥按甯備腑鍖婚櫌'"
+                      align="center"
+                      label="闅忚鎯呭喌"
+                    >
+                      <el-table-column
+                        label="姝e父璇煶"
+                        align="center"
+                        width="100"
+                        key="taskSituation1"
+                        prop="taskSituation1"
+                      >
+                      </el-table-column
+                      ><el-table-column
+                        label="鎮h�呮嫆鎺ユ垨鎷掕"
+                        align="center"
+                        width="100"
+                        key="taskSituation2"
+                        prop="taskSituation2"
+                      >
+                      </el-table-column
+                      ><el-table-column
+                        label="闈㈣鎴栬�呮帴璇�"
+                        align="center"
+                        width="100"
+                        key="taskSituation3"
+                        prop="taskSituation3"
+                      >
+                      </el-table-column
+                      ><el-table-column
+                        label="寰俊闅忚"
+                        align="center"
+                        width="100"
+                        key="taskSituation4"
+                        prop="taskSituation4"
+                      >
+                      </el-table-column
+                      ><el-table-column
+                        label="闅忚鐢佃瘽涓嶆纭�"
+                        align="center"
+                        width="100"
+                        key="taskSituation5"
+                        prop="taskSituation5"
+                      >
+                      </el-table-column
+                      ><el-table-column
+                        label="鍏朵粬鎯呭喌涓嶅疁闅忚"
+                        align="center"
+                        width="100"
+                        key="taskSituation6"
+                        prop="taskSituation6"
+                      >
+                      </el-table-column>
+                    </el-table-column>
+                  </el-table>
+                </div>
+              </el-tab-pane>
+
+              <el-tab-pane label="鍐嶆闅忚" name="second">
+                <div class="your-table-container">
+                  <el-table
+                    ref="exportTableSecond"
+                    id="exportTableidSecond"
+                    v-loading="loadingSecond"
+                    :data="secondFollowUpList"
+                    :border="true"
+                    @selection-change="handleSelectionChangeSecond"
+                    @expand-change="handleRowClickSecond"
+                    :row-key="getRowKey"
+                    show-summary
+                    :summary-method="getSummariesSecond"
+                    :expand-row-keys="expandsSecond"
+                  >
+                    <!-- 灞曞紑琛岀澶村垪 -->
+                    <el-table-column type="expand">
+                      <template slot-scope="props">
+                        <el-table
+                          :data="props.row.doctorStats"
+                          border
+                          style="width: 95%; margin: 0 auto"
+                          class="inner-table"
+                          show-summary
+                          :summary-method="getInnerSummariesSecond"
+                        >
+                          <el-table-column
+                            label="鍖荤敓濮撳悕"
+                            prop="drname"
+                            align="center"
+                          />
+                          <el-table-column
+                            label="绉戝"
+                            width="120"
+                            prop="deptname"
+                            align="center"
+                          />
+                          <el-table-column
+                            label="鍑洪櫌浜烘"
+                            prop="dischargeCount"
+                            align="center"
+                          />
+                          <el-table-column
+                            label="鍑洪櫌浜烘"
+                            align="center"
+                            key="dischargeCount"
+                            prop="dischargeCount"
+                          >
+                          </el-table-column>
+
+                          <el-table-column
+                            label="鏃犻渶闅忚浜烘"
+                            align="center"
+                            width="100"
+                            key="nonFollowUp"
+                            prop="nonFollowUp"
+                          >
+                          </el-table-column>
+                          <el-table-column
+                            label="搴旈殢璁夸汉娆�"
+                            align="center"
+                            width="100"
+                            key="followUpNeeded"
+                            prop="followUpNeeded"
+                          >
+                          </el-table-column>
+                          <el-table-column align="center" label="鍐嶆鍑洪櫌闅忚">
+                            <el-table-column
+                              label="闇�闅忚"
+                              align="center"
+                              key="needFollowUpAgain"
+                              prop="needFollowUpAgain"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="寰呴殢璁�"
+                              align="center"
+                              key="pendingFollowUpAgain"
+                              prop="pendingFollowUpAgain"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="闅忚鎴愬姛"
+                              align="center"
+                              key="followUpSuccessAgain"
+                              prop="followUpSuccessAgain"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="闅忚澶辫触"
+                              align="center"
+                              key="followUpFailAgain"
+                              prop="followUpFailAgain"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="闅忚鐜�"
+                              align="center"
+                              width="120"
+                              key="followUpRateAgain"
+                              prop="followUpRateAgain"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="浜哄伐"
+                              align="center"
+                              key="manualAgain"
+                              prop="manualAgain"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="鐭俊"
+                              align="center"
+                              key="smsAgain"
+                              prop="smsAgain"
+                            >
+                            </el-table-column>
+                            <el-table-column
+                              label="寰俊"
+                              align="center"
+                              key="weChatAgain"
+                              prop="weChatAgain"
+                            >
+                            </el-table-column>
+                          </el-table-column>
+                        </el-table>
+                      </template>
+                    </el-table-column>
+                    <el-table-column
+                      label="鍑洪櫌鐥呭尯"
+                      align="center"
+                      sortable
+                      key="leavehospitaldistrictname"
+                      prop="leavehospitaldistrictname"
+                      width="150"
+                      :show-overflow-tooltip="true"
+                      :sort-method="sortChineseNumber"
+                    />
+                    <el-table-column
+                      label="绉戝"
+                      align="center"
+                      key="deptname"
+                      prop="deptname"
+                      :show-overflow-tooltip="true"
+                    />
+                    <el-table-column
+                      label="鍑洪櫌浜烘"
+                      align="center"
+                      key="dischargeCount"
+                      prop="dischargeCount"
+                    >
+                    </el-table-column>
+
+                    <el-table-column
+                      label="鏃犻渶闅忚浜烘"
+                      align="center"
+                      width="100"
+                      key="nonFollowUp"
+                      prop="nonFollowUp"
+                    >
+                    </el-table-column>
+                    <el-table-column
+                      label="搴旈殢璁夸汉娆�"
+                      align="center"
+                      width="100"
+                      key="followUpNeeded"
+                      prop="followUpNeeded"
+                    >
                     </el-table-column>
                     <el-table-column align="center" label="鍐嶆鍑洪櫌闅忚">
                       <el-table-column
-                        label="搴旈殢璁�"
+                        label="闇�闅忚"
                         align="center"
                         key="needFollowUpAgain"
                         prop="needFollowUpAgain"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.needFollowUpAgainInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '鍐嶆闅忚闇�闅忚鍒楄〃'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.needFollowUpAgain
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
                       <el-table-column
                         label="寰呴殢璁�"
@@ -285,6 +769,22 @@
                         key="pendingFollowUpAgain"
                         prop="pendingFollowUpAgain"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.pendingFollowUpAgainInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '鍐嶆闅忚寰呴殢璁垮垪琛�'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.pendingFollowUpAgain
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
                       <el-table-column
                         label="闅忚鎴愬姛"
@@ -292,6 +792,22 @@
                         key="followUpSuccessAgain"
                         prop="followUpSuccessAgain"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.followUpSuccessAgainInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '鍐嶆闅忚闅忚鎴愬姛鍒楄〃'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.followUpSuccessAgain
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
                       <el-table-column
                         label="闅忚澶辫触"
@@ -299,6 +815,22 @@
                         key="followUpFailAgain"
                         prop="followUpFailAgain"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.followUpFailAgainInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '鍐嶆闅忚闅忚澶辫触鍒楄〃'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.followUpFailAgain
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
                       <el-table-column
                         label="闅忚鐜�"
@@ -307,13 +839,6 @@
                         key="followUpRateAgain"
                         prop="followUpRateAgain"
                       >
-                        <!-- <template slot-scope="scope">
-                    <span
-                      >{{
-                        (Number(scope.row.FollowUpRateAgain) * 100).toFixed(2)
-                      }}%</span
-                    >
-                  </template> -->
                       </el-table-column>
                       <el-table-column
                         label="浜哄伐"
@@ -321,6 +846,22 @@
                         key="manualAgain"
                         prop="manualAgain"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.manualAgainInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '鍐嶆闅忚浜哄伐闅忚鍒楄〃'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.manualAgain
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
                       <el-table-column
                         label="鐭俊"
@@ -328,6 +869,22 @@
                         key="smsAgain"
                         prop="smsAgain"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.smsAgainInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '鍐嶆闅忚鐭俊闅忚鍒楄〃'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.smsAgain
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
                       <el-table-column
                         label="寰俊"
@@ -335,203 +892,30 @@
                         key="weChatAgain"
                         prop="weChatAgain"
                       >
+                        <template slot-scope="scope">
+                          <el-button
+                            size="medium"
+                            type="text"
+                            @click="
+                              viewDetails(
+                                scope.row.weChatAgainInfo,
+                                scope.row.leavehospitaldistrictname +
+                                  '鍐嶆闅忚寰俊闅忚鍒楄〃'
+                              )
+                            "
+                            ><span class="button-zx">{{
+                              scope.row.weChatAgain
+                            }}</span></el-button
+                          >
+                        </template>
                       </el-table-column>
                     </el-table-column>
                   </el-table>
-                </template>
-              </el-table-column>
-              <el-table-column
-                label="鍑洪櫌鐥呭尯"
-                align="center"
-                sortable
-                key="leavehospitaldistrictname"
-                prop="leavehospitaldistrictname"
-                width="150"
-                :show-overflow-tooltip="true"
-              />
-              <el-table-column
-                label="绉戝"
-                align="center"
-                key="deptname"
-                prop="deptname"
-                :show-overflow-tooltip="true"
-              />
-              <el-table-column
-                label="鍑洪櫌浜烘"
-                align="center"
-                key="dischargeCount"
-                prop="dischargeCount"
-              >
-              </el-table-column>
+                </div>
+              </el-tab-pane>
+            </el-tabs>
 
-              <el-table-column
-                label="鏃犻渶闅忚浜烘"
-                align="center"
-                width="100"
-                key="nonFollowUp"
-                prop="nonFollowUp"
-              >
-              </el-table-column>
-              <el-table-column
-                label="搴旈殢璁夸汉娆�"
-                align="center"
-                width="100"
-                key="followUpNeeded"
-                prop="followUpNeeded"
-              >
-              </el-table-column>
-              <el-table-column align="center" label="棣栨鍑洪櫌闅忚">
-                <el-table-column
-                  label="搴旈殢璁�"
-                  align="center"
-                  key="needFollowUp"
-                  prop="needFollowUp"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="寰呴殢璁�"
-                  align="center"
-                  key="pendingFollowUp"
-                  prop="pendingFollowUp"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="闅忚鎴愬姛"
-                  align="center"
-                  key="followUpSuccess"
-                  prop="followUpSuccess"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="闅忚澶辫触"
-                  align="center"
-                  key="followUpFail"
-                  prop="followUpFail"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="闅忚鐜�"
-                  align="center"
-                  width="120"
-                  key="followUpRate"
-                  prop="followUpRate"
-                >
-                  <!-- <template slot-scope="scope">
-                    <span
-                      >{{
-                        (Number(scope.row.followUpRate) * 100).toFixed(2)
-                      }}%</span
-                    >
-                  </template> -->
-                </el-table-column>
-                <el-table-column
-                  label="鍙婃椂鐜�"
-                  align="center"
-                  width="120"
-                  key="rate"
-                  prop="rate"
-                >
-                  <template slot-scope="scope">
-                    <el-button
-                      size="medium"
-                      type="text"
-                      @click="Seedetails(scope.row)"
-                      ><span class="button-zx"
-                        >{{ (Number(scope.row.rate) * 100).toFixed(2) }}%</span
-                      ></el-button
-                    >
-                  </template>
-                </el-table-column>
-                <el-table-column
-                  label="浜哄伐"
-                  align="center"
-                  key="manual"
-                  prop="manual"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="鐭俊"
-                  align="center"
-                  key="sms"
-                  prop="sms"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="寰俊"
-                  align="center"
-                  key="weChat"
-                  prop="weChat"
-                >
-                </el-table-column>
-              </el-table-column>
-              <el-table-column align="center" label="鍐嶆鍑洪櫌闅忚">
-                <el-table-column
-                  label="搴旈殢璁�"
-                  align="center"
-                  key="needFollowUpAgain"
-                  prop="needFollowUpAgain"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="寰呴殢璁�"
-                  align="center"
-                  key="pendingFollowUpAgain"
-                  prop="pendingFollowUpAgain"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="闅忚鎴愬姛"
-                  align="center"
-                  key="followUpSuccessAgain"
-                  prop="followUpSuccessAgain"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="闅忚澶辫触"
-                  align="center"
-                  key="followUpFailAgain"
-                  prop="followUpFailAgain"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="闅忚鐜�"
-                  align="center"
-                  width="120"
-                  key="followUpRateAgain"
-                  prop="followUpRateAgain"
-                >
-                  <!-- <template slot-scope="scope">
-                    <span
-                      >{{
-                        (Number(scope.row.FollowUpRateAgain) * 100).toFixed(2)
-                      }}%</span
-                    >
-                  </template> -->
-                </el-table-column>
-                <el-table-column
-                  label="浜哄伐"
-                  align="center"
-                  key="manualAgain"
-                  prop="manualAgain"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="鐭俊"
-                  align="center"
-                  key="smsAgain"
-                  prop="smsAgain"
-                >
-                </el-table-column>
-                <el-table-column
-                  label="寰俊"
-                  align="center"
-                  key="weChatAgain"
-                  prop="weChatAgain"
-                >
-                </el-table-column>
-              </el-table-column>
-            </el-table>
-
+            <!-- 鍘熸潵鐨勫垎椤电粍浠朵繚鐣欙紙濡傛灉闇�瑕侊級 -->
             <!-- <pagination
               v-show="total > 0"
               :total="total"
@@ -786,8 +1170,235 @@
             :total="patienttotal"
             :page.sync="patientqueryParams.pn"
             :limit.sync="patientqueryParams.ps"
-            @pagination="Seedetails"
+            @pagination="Seedetailstion"
           />
+        </div>
+      </div>
+    </el-dialog>
+    <!-- 鍚勭被璇︽儏 -->
+    <el-dialog
+      :title="infotitle"
+      :visible.sync="infotitleVisible"
+      v-loading="infotitloading"
+      width="70%"
+      :close-on-click-modal="false"
+    >
+      <div style="margin-bottom: 16px; display: flex; align-items: center">
+        <span style="margin-right: 10px; font-weight: bold">鎮h�呭鍚嶆煡璇�:</span>
+        <el-input
+          v-model="searchName"
+          placeholder="璇疯緭鍏ユ偅鑰呭鍚嶈繘琛岀瓫閫�"
+          clearable
+          style="width: 300px"
+          @input="handleSearch"
+          @clear="handleSearch"
+        >
+        </el-input>
+        <span
+          style="margin-left: 10px; color: rgb(35, 81, 233); font-size: 16px"
+        >
+          鍏� {{ infotitlelist.length }} 鏉¤褰�
+        </span>
+      </div>
+      <div class="examine-jic">
+        <div class="jic-value">
+          <el-row :gutter="20">
+            <!-- 閫夋嫨鎮h�呭垪琛� -->
+            <div
+              class="data-list"
+              ref="dataList"
+              @scroll="handleScroll"
+              v-loading="infotitloading"
+            >
+              <el-table
+                :data="currentDisplayList"
+                height="660"
+                style="width: 100%"
+              >
+                <el-table-column
+                  prop="sendname"
+                  align="center"
+                  label="濮撳悕"
+                  width="100"
+                >
+                </el-table-column>
+                <el-table-column
+                  prop="taskName"
+                  align="center"
+                  width="200"
+                  show-overflow-tooltip
+                  label="浠诲姟鍚嶇О"
+                >
+                </el-table-column>
+                <el-table-column
+                  prop="sendstate"
+                  align="center"
+                  width="200"
+                  label="浠诲姟鐘舵��"
+                >
+                  <template slot-scope="scope">
+                    <div v-if="scope.row.sendstate == 1">
+                      <el-tag type="primary" :disable-transitions="false"
+                        >琛ㄥ崟宸查鍙�</el-tag
+                      >
+                    </div>
+                    <div v-if="scope.row.sendstate == 2">
+                      <el-tag type="primary" :disable-transitions="false"
+                        >寰呴殢璁�</el-tag
+                      >
+                    </div>
+                    <div v-if="scope.row.sendstate == 3">
+                      <el-tag type="success" :disable-transitions="false"
+                        >琛ㄥ崟宸插彂閫�</el-tag
+                      >
+                    </div>
+                    <div v-if="scope.row.sendstate == 4">
+                      <el-tag type="info" :disable-transitions="false"
+                        >涓嶆墽琛�</el-tag
+                      >
+                    </div>
+                    <div v-if="scope.row.sendstate == 5">
+                      <el-tag type="danger" :disable-transitions="false"
+                        >鍙戦�佸け璐�</el-tag
+                      >
+                    </div>
+                    <div v-if="scope.row.sendstate == 6">
+                      <el-tag type="success" :disable-transitions="false"
+                        >宸插畬鎴�</el-tag
+                      >
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="浠诲姟鎵ц鏂瑰紡"
+                  align="center"
+                  key="preachform"
+                  prop="preachform"
+                  width="160"
+                  :show-overflow-tooltip="true"
+                >
+                  <template slot-scope="scope">
+                    <span v-for="item in scope.row.preachform"
+                      >{{ item }}銆�
+                    </span>
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  prop="visitTime"
+                  align="center"
+                  label="搴旈殢璁挎椂闂�"
+                  width="200"
+                  show-overflow-tooltip
+                >
+                </el-table-column>
+                <el-table-column
+                  prop="finishtime"
+                  align="center"
+                  label="闅忚瀹屾垚鏃堕棿"
+                  width="200"
+                  show-overflow-tooltip
+                >
+                </el-table-column>
+                <el-table-column
+                  label="鍑洪櫌鏃ユ湡"
+                  width="200"
+                  align="center"
+                  key="endtime"
+                  prop="endtime"
+                >
+                  <template slot-scope="scope">
+                    <span>{{ formatTime(scope.row.endtime) }}</span>
+                  </template></el-table-column
+                >
+                <el-table-column
+                  label="璐d换鎶ゅ+"
+                  width="120"
+                  align="center"
+                  key="nurseName"
+                  prop="nurseName"
+                />
+                <el-table-column
+                  label="涓绘不鍖荤敓"
+                  width="120"
+                  align="center"
+                  key="drname"
+                  prop="drname"
+                />
+
+                <el-table-column
+                  label="缁撴灉鐘舵��"
+                  align="center"
+                  key="excep"
+                  prop="excep"
+                  width="120"
+                >
+                  <template slot-scope="scope">
+                    <dict-tag
+                      :options="dict.type.sys_yujing"
+                      :value="scope.row.excep"
+                    />
+                  </template>
+                </el-table-column>
+                <el-table-column
+                  label="澶勭悊鎰忚"
+                  align="center"
+                  key="suggest"
+                  prop="suggest"
+                  width="120"
+                >
+                  <template slot-scope="scope">
+                    <dict-tag
+                      :options="dict.type.sys_suggest"
+                      :value="scope.row.suggest"
+                    />
+                  </template>
+                </el-table-column>
+
+                <el-table-column
+                  prop="templatename"
+                  align="center"
+                  label="鏈嶅姟妯℃澘"
+                  width="200"
+                  show-overflow-tooltip
+                >
+                </el-table-column>
+                <el-table-column
+                  prop="remark"
+                  align="center"
+                  label="鏈嶅姟璁板綍"
+                  width="200"
+                  show-overflow-tooltip
+                >
+                </el-table-column>
+
+                <el-table-column
+                  prop="bankcardno"
+                  align="center"
+                  label="鍛煎彨鐘舵��"
+                  width="210"
+                >
+                </el-table-column>
+                <el-table-column
+                  label="鎿嶄綔"
+                  fixed="right"
+                  align="center"
+                  width="200"
+                  class-name="small-padding fixed-width"
+                >
+                  <template slot-scope="scope">
+                    <el-button
+                      size="medium"
+                      type="text"
+                      @click="SeedetailsgGo(scope.row)"
+                      ><span class="button-zx"
+                        ><i class="el-icon-s-order"></i>鏌ョ湅</span
+                      ></el-button
+                    >
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+          </el-row>
         </div>
       </div>
     </el-dialog>
@@ -803,9 +1414,13 @@
 } from "@/api/system/label";
 import store from "@/store";
 import { getSfStatistics, selectTimelyRate } from "@/api/system/user";
-
+import * as XLSX from "xlsx";
+import FileSaver from "file-saver";
+import ExcelJS from "exceljs";
+import { saveAs } from "file-saver";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
 const shortcuts = [
   {
     text: "浠婂ぉ",
@@ -830,31 +1445,52 @@
     },
   },
 ];
+
 export default {
   name: "Percentage",
   dicts: ["sys_normal_disable", "sys_user_sex"],
   components: { Treeselect },
   data() {
     return {
-      topactiveName: "Local", //椤堕儴閫夋嫨
-      activeName: "first", //渚ц竟閫夋嫨
-      expands: [],
-      // 閬僵灞�
-      loading: false,
+      // 鏂板锛歍ab鏍囩椤垫帶鍒�
+      activeTab: "first", // 褰撳墠婵�娲荤殑tab锛宖irst-棣栨闅忚锛宻econd-鍐嶆闅忚
+
+      // 鍒嗙鐨勬暟鎹垪琛�
+      firstFollowUpList: [], // 棣栨闅忚鏁版嵁
+      secondFollowUpList: [], // 鍐嶆闅忚鏁版嵁
+
+      // 鍒嗙鐨勫姞杞界姸鎬�
+      loading: false, // 棣栨闅忚琛ㄦ牸鍔犺浇鐘舵��
+      loadingSecond: false, // 鍐嶆闅忚琛ㄦ牸鍔犺浇鐘舵��
+
+      // 鍒嗙鐨勫睍寮�鐘舵��
+      expands: [], // 棣栨闅忚琛ㄦ牸灞曞紑琛�
+      expandsSecond: [], // 鍐嶆闅忚琛ㄦ牸灞曞紑琛�
+
+      // 鍒嗙鐨勯�夋嫨鐘舵��
+      ids: [], // 棣栨闅忚閫変腑椤�
+      idsSecond: [], // 鍐嶆闅忚閫変腑椤�
+
+      orgname: "",
+      infotitlelist: [],
+      currentDisplayList: [],
+      loadIndex: 0,
+      pageSize: 100,
+      isLoading: false,
+
       Seedloading: false,
       chartDialogVisible: false,
+      infotitleVisible: false,
+      searchName: "",
+      infotitloading: false,
+      infotitle: "",
       pieChart: null,
       barLineChart: null,
-      // 閫変腑鏁扮粍
-      ids: [],
-      // 闈炲崟涓鐢�
+
       single: true,
-      // 闈炲涓鐢�
       multiple: true,
-      // 鏄剧ず鎼滅储鏉′欢
       showSearch: true,
-      idds: "", //鍒嗙被id
-      // 鎬绘潯鏁�
+      idds: "",
       total: 0,
       flatArrayhospit: [],
       flatArraydept: [],
@@ -874,12 +1510,11 @@
         pn: 1,
         ps: 10,
       },
-      amendtag: false, //鏄惁淇敼绫诲埆
-      lstamendtag: false, //鏄惁淇敼鏍囩
-      scavisible: false, //鍒犻櫎寮规
-      deleteVisible: false, //鍒嗙被鍒犻櫎寮规
-      deletefenl: "楂樿鍘�", //鍒犻櫎椤�
-      //淇敼娣诲姞鏍囩寮规鏁版嵁
+      amendtag: false,
+      lstamendtag: false,
+      scavisible: false,
+      deleteVisible: false,
+      deletefenl: "楂樿鍘�",
       tagform: {
         isupload: "",
         tagname: "",
@@ -889,79 +1524,26 @@
       classifyform: {
         categoryname: "",
       },
-      // 鏍囩琛ㄦ牸鏁版嵁
-      userList: [],
-      // 寮瑰嚭灞傛爣棰�
       title: "",
-      // 鏄惁鏄剧ず寮瑰嚭灞�
       open: false,
-      // 鏃ユ湡鑼冨洿
       dateRange: [],
-      // 宀椾綅閫夐」
       postOptions: [],
-      // 瑙掕壊閫夐」
       roleOptions: [],
-      // 瀛樺偍鎵�鏈夌瀹や唬鐮�
       allDeptCodes: [],
-      // 瀛樺偍鎵�鏈夌梾鍖轰唬鐮�
       allWardCodes: [],
-      // 琛ㄥ崟鍙傛暟
+      checkboxlist: [],
       form: {},
       forms: {
         name: "",
       },
       numberlb: 22,
-      dialogFormVisible: false, //娣诲姞銆佷慨鏀圭被鍒脊妗�
-      lstamendtagVisible: false, //娣诲姞銆佷慨鏀规爣绛惧脊妗�
-      goQRCodeVisible: false, //浜岀淮鐮佸脊妗�
-      sidecolumnval: "", //绫诲埆鎼滅储
+      dialogFormVisible: false,
+      lstamendtagVisible: false,
+      goQRCodeVisible: false,
+      sidecolumnval: "",
       propss: { multiple: true },
       SeedetailsVisible: false,
-      options: [
-        {
-          value: 1,
-          label: "鐩戞祴璇勪及",
-        },
-        {
-          value: 2,
-          label: "鍑洪櫌闅忚",
-        },
-        {
-          value: 3,
-          label: "闂ㄨ瘖闅忚",
-        },
-        {
-          value: 4,
-          label: "瀹f暀鍏虫��",
-        },
-        {
-          value: 5,
-          label: "澶嶈瘖绠$悊",
-        },
-
-        {
-          value: 7,
-          label: "鎮h�呮姤鍛�",
-        },
-
-        {
-          value: 9,
-          label: "浣撴闅忚",
-        },
-
-        {
-          value: 11,
-          label: "褰卞儚闅忚",
-        },
-        {
-          value: 12,
-          label: "蹇冪數闅忚",
-        },
-        {
-          value: 13,
-          label: "涓撶梾闅忚",
-        },
-      ],
+      options: store.getters.tasktypes,
       pickerOptions: {
         disabledDate(time) {
           return time.getTime() < Date.now() - 3600 * 1000 * 24;
@@ -974,17 +1556,14 @@
         },
         shortcuts: shortcuts,
       },
-      // 鏌ヨ鏍囩鍒楄〃鍙傛暟
       queryParams: {
-        pageNum: 1,
-        pageSize: 10,
         serviceType: [2],
         dateRange: [],
         statisticaltype: 1,
-        leavehospitaldistrictcodes: ["all"], // 榛樿閫変腑鍏ㄩ儴鐥呭尯
-        deptcodes: [], // 榛樿閫変腑鍏ㄩ儴绉戝
+        leavehospitaldistrictcodes: ["all"],
+        deptcodes: [],
+        visitCount: 1, // 鏂板锛氶殢璁挎鏁板弬鏁帮紝1-棣栨锛�2-鍐嶆
       },
-      // 鍒椾俊鎭�
       columns: [
         { key: 0, label: `鏍囩缂栧彿`, visible: true },
         { key: 1, label: `鏍囩鍚嶇О`, visible: true },
@@ -999,16 +1578,19 @@
   watch: {},
   created() {
     this.getDeptTree();
-    this.getList();
+    this.getFirstFollowUpList(); // 榛樿鍔犺浇棣栨闅忚鏁版嵁
+    this.checkboxlist = store.getters.checkboxlist;
+    this.orgname = localStorage.getItem("orgname");
   },
 
   methods: {
-    /** 鏌ヨ鏍囩鍒楄〃 */
-    getList() {
-      // 澶勭悊鏌ヨ鍙傛暟
+    /** 鏌ヨ棣栨闅忚鍒楄〃 */
+    async getFirstFollowUpList() {
+      this.loading = true;
+      this.queryParams.visitCount = 1; // 璁剧疆闅忚娆℃暟涓洪娆�
+
       const params = {
         ...this.queryParams,
-        // 濡傛灉閫夋嫨浜�"鍏ㄩ儴"锛屽垯浼犳墍鏈夌梾鍖�/绉戝浠g爜
         leavehospitaldistrictcodes:
           this.queryParams.leavehospitaldistrictcodes.includes("all")
             ? this.allWardCodes
@@ -1018,13 +1600,251 @@
           : this.queryParams.deptcodes,
       };
 
-      // 绉婚櫎鍙兘瀛樺湪鐨�"all"鍊�
       delete params.leavehospitaldistrictcodes.all;
       delete params.deptcodes.all;
-      getSfStatistics(params).then((response) => {
-        console.log(response);
-        // this.total = response.total;
-        this.userList = response.data;
+
+      try {
+        const response = await getSfStatistics(params);
+        this.firstFollowUpList = this.customSort(response.data);
+        this.total = response.total;
+      } catch (error) {
+        console.error("鑾峰彇棣栨闅忚鏁版嵁澶辫触:", error);
+        this.$message.error("鑾峰彇棣栨闅忚鏁版嵁澶辫触");
+      } finally {
+        this.loading = false;
+      }
+    },
+
+    /** 鏌ヨ鍐嶆闅忚鍒楄〃 */
+    async getSecondFollowUpList() {
+      this.loadingSecond = true;
+      this.queryParams.visitCount = 2; // 璁剧疆闅忚娆℃暟涓哄啀娆�
+
+      const params = {
+        ...this.queryParams,
+        leavehospitaldistrictcodes:
+          this.queryParams.leavehospitaldistrictcodes.includes("all")
+            ? this.allWardCodes
+            : this.queryParams.leavehospitaldistrictcodes,
+        deptcodes: this.queryParams.deptcodes.includes("all")
+          ? this.allDeptCodes
+          : this.queryParams.deptcodes,
+      };
+
+      delete params.leavehospitaldistrictcodes.all;
+      delete params.deptcodes.all;
+
+      try {
+        const response = await getSfStatistics(params);
+        this.secondFollowUpList = this.customSort(response.data);
+        this.total = response.total;
+      } catch (error) {
+        console.error("鑾峰彇鍐嶆闅忚鏁版嵁澶辫触:", error);
+        this.$message.error("鑾峰彇鍐嶆闅忚鏁版嵁澶辫触");
+      } finally {
+        this.loadingSecond = false;
+      }
+    },
+
+    /** Tab鍒囨崲浜嬩欢 */
+    handleTabClick(tab) {
+      if (tab.name === "first") {
+        if (this.firstFollowUpList.length === 0) {
+          this.getFirstFollowUpList();
+        }
+      } else if (tab.name === "second") {
+        if (this.secondFollowUpList.length === 0) {
+          this.getSecondFollowUpList();
+        }
+      }
+    },
+    sortChineseNumber(aRow, bRow) {
+      const a = aRow.leavehospitaldistrictname;
+      const b = bRow.leavehospitaldistrictname;
+
+      // 涓枃鏁板瓧鍒伴樋鎷変集鏁板瓧鐨勬槧灏勶紙鎵╁睍鍒�45锛�
+      const chineseNumMap = {
+        涓�: 1,
+        浜�: 2,
+        涓�: 3,
+        鍥�: 4,
+        浜�: 5,
+        鍏�: 6,
+        涓�: 7,
+        鍏�: 8,
+        涔�: 9,
+        鍗�: 10,
+        鍗佷竴: 11,
+        鍗佷簩: 12,
+        鍗佷笁: 13,
+        鍗佸洓: 14,
+        鍗佷簲: 15,
+        鍗佸叚: 16,
+        鍗佷竷: 17,
+        鍗佸叓: 18,
+        鍗佷節: 19,
+        浜屽崄: 20,
+        浜屽崄涓�: 21,
+        浜屽崄浜�: 22,
+        浜屽崄涓�: 23,
+        浜屽崄鍥�: 24,
+        浜屽崄浜�: 25,
+        浜屽崄鍏�: 26,
+        浜屽崄涓�: 27,
+        浜屽崄鍏�: 28,
+        浜屽崄涔�: 29,
+        涓夊崄: 30,
+        涓夊崄涓�: 31,
+        涓夊崄浜�: 32,
+        涓夊崄涓�: 33,
+        涓夊崄鍥�: 34,
+        涓夊崄浜�: 35,
+        涓夊崄鍏�: 36,
+        涓夊崄涓�: 37,
+        涓夊崄鍏�: 38,
+        涓夊崄涔�: 39,
+        鍥涘崄: 40,
+        鍥涘崄涓�: 41,
+        鍥涘崄浜�: 42,
+        鍥涘崄涓�: 43,
+        鍥涘崄鍥�: 44,
+        鍥涘崄浜�: 45,
+      };
+
+      // 鎻愬彇涓枃鏁板瓧
+      const getNumberFromText = (text) => {
+        if (!text || typeof text !== "string") return -1;
+
+        // 鍖归厤涓枃鏁板瓧锛屾敮鎸佷竴鍒板洓鍗佷簲
+        const match = text.match(/^([涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+)/);
+
+        if (match && match[1]) {
+          const chineseNum = match[1];
+          return chineseNumMap[chineseNum] !== undefined
+            ? chineseNumMap[chineseNum]
+            : -1;
+        }
+
+        // 濡傛灉娌℃湁鍖归厤鍒颁腑鏂囨暟瀛楋紝灏濊瘯鍖归厤闃挎媺浼暟瀛�
+        const arabicMatch = text.match(/^(\d+)/);
+        if (arabicMatch && arabicMatch[1]) {
+          const num = parseInt(arabicMatch[1], 10);
+          return num >= 1 && num <= 45 ? num : -1;
+        }
+
+        return -1;
+      };
+
+      const numA = getNumberFromText(a);
+      const numB = getNumberFromText(b);
+
+      // 澶勭悊鏃犳硶瑙f瀽鐨勬儏鍐�
+      if (numA === -1 && numB === -1) {
+        return (a || "").localeCompare(b || "");
+      }
+      if (numA === -1) return 1;
+      if (numB === -1) return -1;
+
+      return numA - numB;
+    },
+    // 鎼滅储澶勭悊鍑芥暟
+    handleSearch() {
+      if (!this.searchName.trim()) {
+        // 濡傛灉鎼滅储妗嗕负绌猴紝鏄剧ず鎵�鏈夋暟鎹�
+        this.currentDisplayList = [...this.infotitlelist];
+      } else {
+        // 鏍规嵁鎮h�呭鍚嶈繘琛岀瓫閫夛紙涓嶅尯鍒嗗ぇ灏忓啓锛�
+        const keyword = this.searchName.toLowerCase();
+        this.currentDisplayList = this.infotitlelist.filter((item) => {
+          return item.sendname && item.sendname.toLowerCase().includes(keyword);
+        });
+      }
+    },
+    customSort(data) {
+      // 瀹氫箟鎮ㄦ湡鏈涚殑鐥呭尯椤哄簭锛堟墿灞曞埌鍥涘崄浜旓級
+      const order = [
+        "涓�",
+        "浜�",
+        "涓�",
+        "鍥�",
+        "浜�",
+        "鍏�",
+        "涓�",
+        "鍏�",
+        "涔�",
+        "鍗�",
+        "鍗佷竴",
+        "鍗佷簩",
+        "鍗佷笁",
+        "鍗佸洓",
+        "鍗佷簲",
+        "鍗佸叚",
+        "鍗佷竷",
+        "鍗佸叓",
+        "鍗佷節",
+        "浜屽崄",
+        "浜屽崄涓�",
+        "浜屽崄浜�",
+        "浜屽崄涓�",
+        "浜屽崄鍥�",
+        "浜屽崄浜�",
+        "浜屽崄鍏�",
+        "浜屽崄涓�",
+        "浜屽崄鍏�",
+        "浜屽崄涔�",
+        "涓夊崄",
+        "涓夊崄涓�",
+        "涓夊崄浜�",
+        "涓夊崄涓�",
+        "涓夊崄鍥�",
+        "涓夊崄浜�",
+        "涓夊崄鍏�",
+        "涓夊崄涓�",
+        "涓夊崄鍏�",
+        "涓夊崄涔�",
+        "鍥涘崄",
+        "鍥涘崄涓�",
+        "鍥涘崄浜�",
+        "鍥涘崄涓�",
+        "鍥涘崄鍥�",
+        "鍥涘崄浜�",
+      ];
+
+      return data.sort((a, b) => {
+        // 鎻愬彇鐥呭尯鍚嶇О涓殑涓枃鏁板瓧閮ㄥ垎
+        const getIndex = (name) => {
+          if (!name || typeof name !== "string") return -1;
+
+          // 鍖归厤涓枃鏁板瓧
+          const chineseMatch = name.match(/^([涓�浜屼笁鍥涗簲鍏竷鍏節鍗乚+)/);
+          if (chineseMatch && chineseMatch[1]) {
+            return order.indexOf(chineseMatch[1]);
+          }
+
+          // 鍖归厤闃挎媺浼暟瀛�
+          const arabicMatch = name.match(/^(\d+)/);
+          if (arabicMatch && arabicMatch[1]) {
+            const num = parseInt(arabicMatch[1], 10);
+            if (num >= 1 && num <= 45) {
+              return num - 1; // 鍥犱负鏁扮粍绱㈠紩浠�0寮�濮�
+            }
+          }
+
+          return -1;
+        };
+
+        const indexA = getIndex(a.leavehospitaldistrictname);
+        const indexB = getIndex(b.leavehospitaldistrictname);
+
+        // 鎺掑簭閫昏緫
+        if (indexA === -1 && indexB === -1) {
+          return (a.leavehospitaldistrictname || "").localeCompare(
+            b.leavehospitaldistrictname || ""
+          );
+        }
+        if (indexA === -1) return 1;
+        if (indexB === -1) return -1;
+        return indexA - indexB;
       });
     },
     getRowKey(row) {
@@ -1046,9 +1866,17 @@
       const params = {
         ...this.queryParams,
         // 濡傛灉閫夋嫨浜�"鍏ㄩ儴"锛屽垯浼犳墍鏈夌梾鍖�/绉戝浠g爜
+        deptcodes: this.queryParams.deptcodes.includes("all")
+          ? this.allDeptCodes
+          : this.queryParams.deptcodes,
         leavehospitaldistrictcodes: [row.leavehospitaldistrictcode],
         drcode: "1",
+        visitCount: 1, // 璁剧疆涓洪娆¢殢璁�
       };
+
+      // 绉婚櫎鍙兘瀛樺湪鐨�"all"鍊�
+      delete params.leavehospitaldistrictcodes.all;
+      delete params.deptcodes.all;
       // 濡傛灉璇ヨ杩樻病鏈夊姞杞藉尰鐢熸暟鎹紝鍒欏姞杞�
       if (!row.doctorStats) {
         this.loading = true;
@@ -1060,6 +1888,162 @@
       } else {
         this.expands = [this.getRowKey(row)];
       }
+    },
+    getSummaries(param) {
+      const { columns, data } = param;
+      const sums = [];
+
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "鍚堣";
+          return;
+        }
+        if (index === 1 || index === 2) {
+          sums[index] = "/";
+          return;
+        }
+
+        // 瀵圭櫨鍒嗘瘮瀛楁鐗规畩澶勭悊 - 鍙栧钩鍧囧��
+        if (
+          column.property === "followUpRate" ||
+          column.property === "rate" ||
+          column.property === "followUpRateAgain"
+        ) {
+          // 鎻愬彇鎵�鏈夋湁鏁堢櫨鍒嗘瘮鍊煎苟杞崲涓哄皬鏁�
+          const percentageValues = data
+            .map((item) => {
+              const value = item[column.property];
+              if (!value || value === "-" || value === "0%") return null;
+
+              // 澶勭悊甯︾櫨鍒嗗彿鐨勬暟鎹�
+              if (typeof value === "string" && value.includes("%")) {
+                // 鍘婚櫎鐧惧垎鍙峰苟杞崲涓哄皬鏁�
+                const numValue = parseFloat(value.replace("%", "")) / 100;
+                return isNaN(numValue) ? null : numValue;
+              } else {
+                // 澶勭悊宸茬粡鏄皬鏁扮殑鏁版嵁
+                const numValue = parseFloat(value);
+                return isNaN(numValue) ? null : numValue;
+              }
+            })
+            .filter((value) => value !== null && value !== 0); // 杩囨护鎺塶ull鍜�0鍊�
+
+          if (percentageValues.length > 0) {
+            const average =
+              percentageValues.reduce((sum, value) => sum + value, 0) /
+              percentageValues.length;
+            sums[index] = (average * 100).toFixed(2) + "%";
+          } else {
+            sums[index] = "0.00%";
+          }
+        } else {
+          // 鏅�氭暟瀛楀瓧娈� - 姹傚拰
+          const values = data.map((item) => {
+            const value = item[column.property];
+            if (value === "-" || value === "" || value === null) return 0;
+            return Number(value) || 0;
+          });
+
+          if (!values.every((value) => isNaN(value))) {
+            sums[index] = values.reduce((prev, curr) => prev + curr, 0);
+            sums[index] = this.formatNumber(sums[index]);
+          } else {
+            sums[index] = "-";
+          }
+        }
+      });
+
+      return sums;
+    },
+
+    // 鍐呴儴琛ㄦ牸鍚堣琛岃绠楁柟娉�
+    getInnerSummaries(param) {
+      const { columns, data } = param;
+      const sums = [];
+
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "灏忚";
+          return;
+        }
+
+        if (column.property === "drname" || column.property === "deptname") {
+          sums[index] = "-";
+          return;
+        }
+
+        // 瀵圭櫨鍒嗘瘮瀛楁鐗规畩澶勭悊 - 鍙栧钩鍧囧��
+        if (column.property === "followUpRate" || column.property === "rate") {
+          // 鎻愬彇鎵�鏈夋湁鏁堢櫨鍒嗘瘮鍊煎苟杞崲涓哄皬鏁�
+          const percentageValues = data
+            .map((item) => {
+              const value = item[column.property];
+              if (!value || value === "-" || value === "0%") return null;
+
+              // 澶勭悊甯︾櫨鍒嗗彿鐨勬暟鎹�
+              if (typeof value === "string" && value.includes("%")) {
+                // 鍘婚櫎鐧惧垎鍙峰苟杞崲涓哄皬鏁�
+                const numValue = parseFloat(value.replace("%", "")) / 100;
+                return isNaN(numValue) ? null : numValue;
+              } else {
+                // 澶勭悊宸茬粡鏄皬鏁扮殑鏁版嵁
+                const numValue = parseFloat(value);
+                return isNaN(numValue) ? null : numValue;
+              }
+            })
+            .filter((value) => value !== null && value !== 0);
+
+          if (percentageValues.length > 0) {
+            const average =
+              percentageValues.reduce((sum, value) => sum + value, 0) /
+              percentageValues.length;
+            sums[index] = (average * 100).toFixed(2) + "%";
+          } else {
+            sums[index] = "0.00%";
+          }
+        } else {
+          // 鏅�氭暟瀛楀瓧娈� - 姹傚拰
+          const values = data.map((item) => {
+            const value = item[column.property];
+            if (value === "-" || value === "" || value === null) return 0;
+            return Number(value) || 0;
+          });
+
+          if (!values.every((value) => isNaN(value))) {
+            sums[index] = values.reduce((prev, curr) => prev + curr, 0);
+            sums[index] = this.formatNumber(sums[index]);
+          } else {
+            sums[index] = "-";
+          }
+        }
+      });
+
+      return sums;
+    },
+
+    // 杈呭姪鏂规硶锛氭彁鍙栫櫨鍒嗘瘮鏁板��
+    extractPercentageValue(value) {
+      if (!value) return null;
+
+      if (typeof value === "string") {
+        // 澶勭悊甯︾櫨鍒嗗彿鐨勫瓧绗︿覆
+        if (value.includes("%")) {
+          const num = parseFloat(value.replace("%", ""));
+          return isNaN(num) ? null : num / 100;
+        }
+        // 澶勭悊绾暟瀛楀瓧绗︿覆
+        const num = parseFloat(value);
+        return isNaN(num) ? null : num;
+      }
+
+      // 澶勭悊鏁板瓧绫诲瀷
+      return typeof value === "number" ? value : null;
+    },
+
+    // 鏁板瓧鏍煎紡鍖栨柟娉�
+    formatNumber(num) {
+      if (isNaN(num)) return "-";
+      return Number.isInteger(num) ? num.toString() : num.toFixed(0);
     },
     /** 淇敼鏍囩 */
     handleUpdate(row) {
@@ -1149,6 +2133,75 @@
         this.Seedloading = false;
       });
     },
+    Seedetailstion() {
+      selectTimelyRate(this.patientqueryParams).then((response) => {
+        this.logsheetlist = response.data.detail;
+        this.patienttotal = response.data.total;
+        this.Seedloading = false;
+      });
+    },
+    viewDetails(row, title) {
+      this.infotitleVisible = true;
+      this.infotitle = title;
+      this.infotitlelist = row; // 鍋囪row灏辨槸闇�瑕佸睍绀虹殑璇︾粏鏁扮粍
+      console.log(this.infotitlelist, "this.infotitlelist");
+
+      this.infotitlelist.forEach((item) => {
+        let idArray = null;
+
+        if (item.preachform) {
+          if (item.endtime) {
+            item.preachformson = item.preachform;
+            idArray = item.preachform.split(",");
+          }
+
+          item.preachform = idArray.map((value) => {
+            // 鏌ユ壘id瀵瑰簲鐨勫璞�
+            const item = this.checkboxlist.find((item) => item.value == value);
+            // 濡傛灉鎵惧埌瀵瑰簲鐨刬d锛岃繑鍥瀕abel鍊硷紝鍚﹀垯杩斿洖null
+            return item ? item.label : null;
+          });
+        }
+      });
+      // 鍒濆鍖栧姞杞�
+      this.loadIndex = 0;
+      this.currentDisplayList = [];
+      this.$nextTick(() => {
+        this.loadMoreData();
+      });
+    },
+    loadMoreData() {
+      if (this.isLoading) return;
+      this.isLoading = true;
+
+      // 妯℃嫙寮傛鍔犺浇锛屽疄闄呭彲鑳芥槸鐩存帴鍒囩墖鏈湴鏁版嵁
+      setTimeout(() => {
+        console.log(this.infotitlelist, "this.infotitlelist");
+
+        const nextChunk = this.infotitlelist.slice(
+          this.loadIndex,
+          this.loadIndex + this.pageSize
+        );
+        this.currentDisplayList = this.currentDisplayList.concat(nextChunk);
+        this.loadIndex += this.pageSize;
+        this.isLoading = false;
+      }, 200);
+    },
+    handleScroll(event) {
+      const scrollContainer = event.target;
+      // 鍒ゆ柇鏄惁婊氬姩鍒板簳閮�
+      const isAtBottom =
+        scrollContainer.scrollTop + scrollContainer.clientHeight >=
+        scrollContainer.scrollHeight - 10;
+
+      if (
+        isAtBottom &&
+        !this.isLoading &&
+        this.loadIndex < this.infotitlelist.length
+      ) {
+        this.loadMoreData();
+      }
+    },
     SeedetailsgGo(row) {
       this.SeedetailsVisible = false;
       let type = "";
@@ -1234,7 +2287,7 @@
           row.isupload = row.isupload === "0" ? "1" : "0";
         });
     },
-    /** 鎼滅储鎸夐挳鎿嶄綔 */
+    /** 鎼滅储鎸夐挳鎿嶄綔 - 淇敼涓烘悳绱㈠綋鍓嶆縺娲荤殑tab鏁版嵁 */
     handleQuery() {
       this.queryParams.pageNum = 1;
       if (!this.queryParams.dateRange) this.queryParams.dateRange = [];
@@ -1243,14 +2296,20 @@
       } else if (this.queryParams.statisticaltype == 2) {
         this.queryParams.leavehospitaldistrictcodes = [];
       }
-      console.log(this.queryParams.dateRange);
 
       this.queryParams.startTime = this.parseTime(
         this.queryParams.dateRange[0]
       );
       this.queryParams.endTime = this.parseTime(this.queryParams.dateRange[1]);
-      this.getList();
+
+      // 鏍规嵁褰撳墠婵�娲荤殑tab鍔犺浇瀵瑰簲鏁版嵁
+      if (this.activeTab === "first") {
+        this.getFirstFollowUpList();
+      } else {
+        this.getSecondFollowUpList();
+      }
     },
+
     /** 閲嶇疆鎸夐挳鎿嶄綔 */
     resetQuery() {
       this.queryParams.dateRange = [];
@@ -1285,15 +2344,751 @@
         })
         .catch(() => {});
     },
-    /** 瀵煎嚭鎸夐挳鎿嶄綔 */
-    handleExport() {
-      this.download(
-        "smartor/serviceSubtask/getSfStatisticsExport",
-        {
-          ...this.queryParams,
+    // 瀵煎嚭鏂规硶
+
+    async exportTable() {
+      try {
+        // 1. 鑾峰彇骞舵牸寮忓寲鏃ユ湡鑼冨洿
+        let dateRangeString = "";
+        let sheetNameSuffix = "";
+
+        if (
+          this.queryParams.dateRange &&
+          this.queryParams.dateRange.length === 2
+        ) {
+          const startDateStr = this.queryParams.dateRange[0];
+          const endDateStr = this.queryParams.dateRange[1];
+          const formatDateForDisplay = (dateTimeStr) => {
+            return dateTimeStr.split(" ")[0];
+          };
+          const startDateFormatted = formatDateForDisplay(startDateStr);
+          const endDateFormatted = formatDateForDisplay(endDateStr);
+          dateRangeString = `${startDateFormatted}鑷�${endDateFormatted}`;
+          sheetNameSuffix = `${startDateFormatted}鑷�${endDateFormatted}`;
+        } else {
+          const now = new Date();
+          const currentMonth = now.getMonth() + 1;
+          dateRangeString = `${currentMonth}鏈坄;
+          sheetNameSuffix = `${currentMonth}鏈坄;
+        }
+
+        // 2. 鏍规嵁褰撳墠婵�娲荤殑tab纭畾瀵煎嚭鐨勬暟鎹�
+        const isFirstFollowUp = this.activeTab === "first";
+        let excelName, worksheetName, dataToExport;
+
+        if (isFirstFollowUp) {
+          excelName = `棣栨鍑洪櫌闅忚缁熻琛╛${dateRangeString}.xlsx`;
+          worksheetName = `棣栨闅忚缁熻_${sheetNameSuffix}`;
+          dataToExport = this.firstFollowUpList;
+
+          if (!dataToExport || dataToExport.length === 0) {
+            this.$message.warning("鏆傛棤棣栨闅忚鏁版嵁鍙鍑�");
+            return false;
+          }
+        } else {
+          excelName = `鍐嶆鍑洪櫌闅忚缁熻琛╛${dateRangeString}.xlsx`;
+          worksheetName = `鍐嶆闅忚缁熻_${sheetNameSuffix}`;
+          dataToExport = this.secondFollowUpList;
+
+          if (!dataToExport || dataToExport.length === 0) {
+            this.$message.warning("鏆傛棤鍐嶆闅忚鏁版嵁鍙鍑�");
+            return false;
+          }
+        }
+
+        // 3. 鍒涘缓宸ヤ綔绨垮拰宸ヤ綔琛�
+        const workbook = new ExcelJS.Workbook();
+        const worksheet = workbook.addWorksheet(worksheetName);
+
+        // 4. 鏋勫缓琛ㄦ牸
+        if (isFirstFollowUp) {
+          this.buildFirstFollowUpExportSheet(
+            worksheet,
+            dataToExport,
+            sheetNameSuffix
+          );
+        } else {
+          this.buildSecondFollowUpExportSheet(
+            worksheet,
+            dataToExport,
+            sheetNameSuffix
+          );
+        }
+
+        // 5. 鐢熸垚骞朵笅杞芥枃浠�
+        const buffer = await workbook.xlsx.writeBuffer();
+        const blob = new Blob([buffer], {
+          type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
+        });
+        saveAs(blob, excelName);
+
+        this.$message.success("瀵煎嚭鎴愬姛");
+        return true;
+      } catch (error) {
+        console.error("瀵煎嚭澶辫触:", error);
+        this.$message.error(`瀵煎嚭澶辫触: ${error.message}`);
+        return false;
+      }
+    },
+    /** 鏋勫缓棣栨闅忚瀵煎嚭琛ㄦ牸 */
+    buildFirstFollowUpExportSheet(worksheet, data, sheetNameSuffix) {
+      const titleStyle = {
+        font: {
+          name: "寰蒋闆呴粦",
+          size: 16,
+          bold: true,
+          color: { argb: "FF000000" },
         },
-        `user_${new Date().getTime()}.xlsx`
-      );
+        fill: {
+          type: "pattern",
+          pattern: "solid",
+          fgColor: { argb: "FFE6F3FF" },
+        },
+        alignment: { vertical: "middle", horizontal: "center", wrapText: true },
+        border: {
+          top: { style: "thin", color: { argb: "FFD0D0D0" } },
+          left: { style: "thin", color: { argb: "FFD0D0D0" } },
+          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
+          right: { style: "thin", color: { argb: "FFD0D0D0" } },
+        },
+      };
+
+      const headerStyle = {
+        font: {
+          name: "寰蒋闆呴粦",
+          size: 11,
+          bold: true,
+          color: { argb: "FF000000" },
+        },
+        fill: {
+          type: "pattern",
+          pattern: "solid",
+          fgColor: { argb: "FFF5F7FA" },
+        },
+        alignment: { vertical: "middle", horizontal: "center", wrapText: true },
+        border: {
+          top: { style: "thin", color: { argb: "FFD0D0D0" } },
+          left: { style: "thin", color: { argb: "FFD0D0D0" } },
+          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
+          right: { style: "thin", color: { argb: "FFD0D0D0" } },
+        },
+      };
+
+      const cellStyle = {
+        font: { name: "瀹嬩綋", size: 10, color: { argb: "FF000000" } },
+        alignment: { vertical: "middle", horizontal: "center" },
+        border: {
+          top: { style: "thin", color: { argb: "FFD0D0D0" } },
+          left: { style: "thin", color: { argb: "FFD0D0D0" } },
+          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
+          right: { style: "thin", color: { argb: "FFD0D0D0" } },
+        },
+      };
+
+      const summaryStyle = {
+        font: {
+          name: "瀹嬩綋",
+          size: 10,
+          bold: true,
+          color: { argb: "FF409EFF" },
+        },
+        fill: {
+          type: "pattern",
+          pattern: "solid",
+          fgColor: { argb: "FFF5F7FA" },
+        },
+        alignment: { vertical: "middle", horizontal: "center" },
+        border: {
+          top: { style: "thin", color: { argb: "FFD0D0D0" } },
+          left: { style: "thin", color: { argb: "FFD0D0D0" } },
+          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
+          right: { style: "thin", color: { argb: "FFD0D0D0" } },
+        },
+      };
+
+      // 1. 娣诲姞鎬绘爣棰樿
+      worksheet.mergeCells(1, 1, 1, 16); // 鍚堝苟A1鍒癙1
+      const titleCell = worksheet.getCell(1, 1);
+      titleCell.value = `棣栨鍑洪櫌闅忚缁熻琛╛${sheetNameSuffix}`;
+      titleCell.style = titleStyle;
+      worksheet.getRow(1).height = 35;
+
+      // 2. 鍒涘缓琛ㄥご
+      const secondRowHeaders = [
+        "", // A2 灞曞紑鍒楀崰浣�
+        "鍑洪櫌鐥呭尯",
+        "绉戝",
+        "鍑洪櫌浜烘",
+        "鏃犻渶闅忚浜烘",
+        "搴旈殢璁夸汉娆�", // B2 to F2
+        // 棣栨鍑洪櫌闅忚瀛愯〃澶�
+        "闇�闅忚",
+        "寰呴殢璁�",
+        "闅忚鎴愬姛",
+        "闅忚澶辫触",
+        "闅忚鐜�",
+        "鍙婃椂鐜�",
+        "浜哄伐",
+        "鐭俊",
+        "寰俊",
+      ];
+
+      // 娣诲姞绗簩琛�
+      secondRowHeaders.forEach((header, index) => {
+        const cell = worksheet.getCell(3, index + 1);
+        cell.value = header;
+        cell.style = headerStyle;
+      });
+
+      // 3. 鍚堝苟鍗曞厓鏍�
+      // 鍚堝苟 A2:A3, B2:B3, C2:C3, D2:D3, E2:E3, F2:F3
+      for (let i = 1; i <= 6; i++) {
+        worksheet.mergeCells(2, i, 3, i);
+        const cell = worksheet.getCell(2, i);
+        cell.style = headerStyle;
+      }
+
+      // 璁剧疆绗竴琛屽悎骞跺崟鍏冩牸鐨勫��
+      worksheet.getCell(2, 1).value = "";
+      worksheet.getCell(2, 2).value = "鍑洪櫌鐥呭尯";
+      worksheet.getCell(2, 3).value = "绉戝";
+      worksheet.getCell(2, 4).value = "鍑洪櫌浜烘";
+      worksheet.getCell(2, 5).value = "鏃犻渶闅忚浜烘";
+      worksheet.getCell(2, 6).value = "搴旈殢璁夸汉娆�";
+
+      // 4. 鍚堝苟"棣栨鍑洪櫌闅忚"鏍囬
+      worksheet.mergeCells(2, 7, 2, 15); // G2:O2
+      worksheet.getCell(2, 7).value = "棣栨鍑洪櫌闅忚";
+      worksheet.getCell(2, 7).style = headerStyle;
+
+      // 5. 璁剧疆琛岄珮
+      worksheet.getRow(2).height = 28;
+      worksheet.getRow(3).height = 25;
+
+      // 6. 娣诲姞鏁版嵁琛�
+      data.forEach((item, rowIndex) => {
+        const dataRow = worksheet.addRow(
+          [
+            "", // 灞曞紑鍒�
+            item.leavehospitaldistrictname || "",
+            item.deptname || "",
+            item.dischargeCount || 0,
+            item.nonFollowUp || 0,
+            item.followUpNeeded || 0,
+            // 棣栨鍑洪櫌闅忚鏁版嵁
+            item.needFollowUp || 0,
+            item.pendingFollowUp || 0,
+            item.followUpSuccess || 0,
+            item.followUpFail || 0,
+            item.followUpRate || "0%",
+            item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%",
+            item.manual || 0,
+            item.sms || 0,
+            item.weChat || 0,
+          ],
+          rowIndex + 4
+        );
+
+        // 搴旂敤鏁版嵁琛屾牱寮�
+        dataRow.eachCell((cell) => {
+          cell.style = cellStyle;
+        });
+        dataRow.height = 24;
+      });
+
+      // 7. 娣诲姞鍚堣琛�
+      const summaries = this.getFirstFollowUpSummaries(data);
+      const summaryRow = worksheet.addRow(summaries);
+      summaryRow.eachCell((cell, colNumber) => {
+        cell.style = summaryStyle;
+        if (colNumber === 1) {
+          cell.value = "鍚堣";
+        }
+      });
+      summaryRow.height = 28;
+
+      // 8. 璁剧疆鍒楀
+      worksheet.columns = [
+        { width: 8 }, // 灞曞紑鍒�
+        { width: 20 }, // 鍑洪櫌鐥呭尯
+        { width: 15 }, // 绉戝
+        { width: 12 }, // 鍑洪櫌浜烘
+        { width: 12 }, // 鏃犻渶闅忚浜烘
+        { width: 12 }, // 搴旈殢璁夸汉娆�
+        // 棣栨鍑洪櫌闅忚鍒�
+        { width: 10 }, // 闇�闅忚
+        { width: 10 }, // 寰呴殢璁�
+        { width: 10 }, // 闅忚鎴愬姛
+        { width: 10 }, // 闅忚澶辫触
+        { width: 12 }, // 闅忚鐜�
+        { width: 12 }, // 鍙婃椂鐜�
+        { width: 8 }, // 浜哄伐
+        { width: 8 }, // 鐭俊
+        { width: 8 }, // 寰俊
+      ];
+    },
+
+    /** 棣栨闅忚鏁版嵁鍚堣琛岃绠� */
+    getFirstFollowUpSummaries(data) {
+      const summaries = [
+        "鍚堣",
+        "/",
+        "/",
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        "0%",
+        "0%",
+        0,
+        0,
+        0,
+      ];
+
+      data.forEach((item) => {
+        // 鏁板�煎瓧娈垫眰鍜�
+        summaries[3] += Number(item.dischargeCount) || 0;
+        summaries[4] += Number(item.nonFollowUp) || 0;
+        summaries[5] += Number(item.followUpNeeded) || 0;
+        summaries[6] += Number(item.needFollowUp) || 0;
+        summaries[7] += Number(item.pendingFollowUp) || 0;
+        summaries[8] += Number(item.followUpSuccess) || 0;
+        summaries[9] += Number(item.followUpFail) || 0;
+        summaries[12] += Number(item.manual) || 0;
+        summaries[13] += Number(item.sms) || 0;
+        summaries[14] += Number(item.weChat) || 0;
+      });
+
+      // 璁$畻鐧惧垎姣斿瓧娈电殑骞冲潎鍊�
+      const followUpRateValues = data
+        .map((item) => this.extractPercentageValue(item.followUpRate))
+        .filter((value) => value !== null);
+
+      const rateValues = data
+        .map((item) => this.extractPercentageValue(item.rate))
+        .filter((value) => value !== null);
+
+      if (followUpRateValues.length > 0) {
+        const avgFollowUpRate =
+          followUpRateValues.reduce((sum, val) => sum + val, 0) /
+          followUpRateValues.length;
+        summaries[10] = (avgFollowUpRate * 100).toFixed(2) + "%";
+      }
+
+      if (rateValues.length > 0) {
+        const avgRate =
+          rateValues.reduce((sum, val) => sum + val, 0) / rateValues.length;
+        summaries[11] = (avgRate * 100).toFixed(2) + "%";
+      }
+
+      // 鏍煎紡鍖栨暟瀛�
+      summaries[3] = this.formatNumber(summaries[3]);
+      summaries[4] = this.formatNumber(summaries[4]);
+      summaries[5] = this.formatNumber(summaries[5]);
+      summaries[6] = this.formatNumber(summaries[6]);
+      summaries[7] = this.formatNumber(summaries[7]);
+      summaries[8] = this.formatNumber(summaries[8]);
+      summaries[9] = this.formatNumber(summaries[9]);
+      summaries[12] = this.formatNumber(summaries[12]);
+      summaries[13] = this.formatNumber(summaries[13]);
+      summaries[14] = this.formatNumber(summaries[14]);
+
+      return summaries;
+    },
+
+    /** 鏋勫缓鍐嶆闅忚瀵煎嚭琛ㄦ牸 */
+    buildSecondFollowUpExportSheet(worksheet, data, sheetNameSuffix) {
+      const titleStyle = {
+        font: {
+          name: "寰蒋闆呴粦",
+          size: 16,
+          bold: true,
+          color: { argb: "FF000000" },
+        },
+        fill: {
+          type: "pattern",
+          pattern: "solid",
+          fgColor: { argb: "FFE6F3FF" },
+        },
+        alignment: { vertical: "middle", horizontal: "center", wrapText: true },
+        border: {
+          top: { style: "thin", color: { argb: "FFD0D0D0" } },
+          left: { style: "thin", color: { argb: "FFD0D0D0" } },
+          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
+          right: { style: "thin", color: { argb: "FFD0D0D0" } },
+        },
+      };
+
+      const headerStyle = {
+        font: {
+          name: "寰蒋闆呴粦",
+          size: 11,
+          bold: true,
+          color: { argb: "FF000000" },
+        },
+        fill: {
+          type: "pattern",
+          pattern: "solid",
+          fgColor: { argb: "FFF5F7FA" },
+        },
+        alignment: { vertical: "middle", horizontal: "center", wrapText: true },
+        border: {
+          top: { style: "thin", color: { argb: "FFD0D0D0" } },
+          left: { style: "thin", color: { argb: "FFD0D0D0" } },
+          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
+          right: { style: "thin", color: { argb: "FFD0D0D0" } },
+        },
+      };
+
+      const cellStyle = {
+        font: { name: "瀹嬩綋", size: 10, color: { argb: "FF000000" } },
+        alignment: { vertical: "middle", horizontal: "center" },
+        border: {
+          top: { style: "thin", color: { argb: "FFD0D0D0" } },
+          left: { style: "thin", color: { argb: "FFD0D0D0" } },
+          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
+          right: { style: "thin", color: { argb: "FFD0D0D0" } },
+        },
+      };
+
+      const summaryStyle = {
+        font: {
+          name: "瀹嬩綋",
+          size: 10,
+          bold: true,
+          color: { argb: "FF409EFF" },
+        },
+        fill: {
+          type: "pattern",
+          pattern: "solid",
+          fgColor: { argb: "FFF5F7FA" },
+        },
+        alignment: { vertical: "middle", horizontal: "center" },
+        border: {
+          top: { style: "thin", color: { argb: "FFD0D0D0" } },
+          left: { style: "thin", color: { argb: "FFD0D0D0" } },
+          bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
+          right: { style: "thin", color: { argb: "FFD0D0D0" } },
+        },
+      };
+
+      // 1. 娣诲姞鎬绘爣棰樿
+      worksheet.mergeCells(1, 1, 1, 15); // 鍚堝苟A1鍒癘1
+      const titleCell = worksheet.getCell(1, 1);
+      titleCell.value = `鍐嶆鍑洪櫌闅忚缁熻琛╛${sheetNameSuffix}`;
+      titleCell.style = titleStyle;
+      worksheet.getRow(1).height = 35;
+
+      // 2. 鍒涘缓琛ㄥご
+      const secondRowHeaders = [
+        "", // A2 灞曞紑鍒楀崰浣�
+        "鍑洪櫌鐥呭尯",
+        "绉戝",
+        "鍑洪櫌浜烘",
+        "鏃犻渶闅忚浜烘",
+        "搴旈殢璁夸汉娆�", // B2 to F2
+        // 鍐嶆鍑洪櫌闅忚瀛愯〃澶�
+        "闇�闅忚",
+        "寰呴殢璁�",
+        "闅忚鎴愬姛",
+        "闅忚澶辫触",
+        "闅忚鐜�",
+        "浜哄伐",
+        "鐭俊",
+        "寰俊",
+      ];
+
+      // 娣诲姞绗簩琛�
+      secondRowHeaders.forEach((header, index) => {
+        const cell = worksheet.getCell(3, index + 1);
+        cell.value = header;
+        cell.style = headerStyle;
+      });
+
+      // 3. 鍚堝苟鍗曞厓鏍�
+      // 鍚堝苟 A2:A3, B2:B3, C2:C3, D2:D3, E2:E3, F2:F3
+      for (let i = 1; i <= 6; i++) {
+        worksheet.mergeCells(2, i, 3, i);
+        const cell = worksheet.getCell(2, i);
+        cell.style = headerStyle;
+      }
+
+      // 璁剧疆绗竴琛屽悎骞跺崟鍏冩牸鐨勫��
+      worksheet.getCell(2, 1).value = "";
+      worksheet.getCell(2, 2).value = "鍑洪櫌鐥呭尯";
+      worksheet.getCell(2, 3).value = "绉戝";
+      worksheet.getCell(2, 4).value = "鍑洪櫌浜烘";
+      worksheet.getCell(2, 5).value = "鏃犻渶闅忚浜烘";
+      worksheet.getCell(2, 6).value = "搴旈殢璁夸汉娆�";
+
+      // 4. 鍚堝苟"鍐嶆鍑洪櫌闅忚"鏍囬
+      worksheet.mergeCells(2, 7, 2, 14); // G2:N2
+      worksheet.getCell(2, 7).value = "鍐嶆鍑洪櫌闅忚";
+      worksheet.getCell(2, 7).style = headerStyle;
+
+      // 5. 璁剧疆琛岄珮
+      worksheet.getRow(2).height = 28;
+      worksheet.getRow(3).height = 25;
+
+      // 6. 娣诲姞鏁版嵁琛�
+      data.forEach((item, rowIndex) => {
+        const dataRow = worksheet.addRow(
+          [
+            "", // 灞曞紑鍒�
+            item.leavehospitaldistrictname || "",
+            item.deptname || "",
+            item.dischargeCount || 0,
+            item.nonFollowUp || 0,
+            item.followUpNeeded || 0,
+            // 鍐嶆鍑洪櫌闅忚鏁版嵁
+            item.needFollowUpAgain || 0,
+            item.pendingFollowUpAgain || 0,
+            item.followUpSuccessAgain || 0,
+            item.followUpFailAgain || 0,
+            item.followUpRateAgain || "0%",
+            item.manualAgain || 0,
+            item.smsAgain || 0,
+            item.weChatAgain || 0,
+          ],
+          rowIndex + 4
+        );
+
+        // 搴旂敤鏁版嵁琛屾牱寮�
+        dataRow.eachCell((cell) => {
+          cell.style = cellStyle;
+        });
+        dataRow.height = 24;
+      });
+
+      // 7. 娣诲姞鍚堣琛�
+      const summaries = this.getSecondFollowUpSummaries(data);
+      const summaryRow = worksheet.addRow(summaries);
+      summaryRow.eachCell((cell, colNumber) => {
+        cell.style = summaryStyle;
+        if (colNumber === 1) {
+          cell.value = "鍚堣";
+        }
+      });
+      summaryRow.height = 28;
+
+      // 8. 璁剧疆鍒楀
+      worksheet.columns = [
+        { width: 8 }, // 灞曞紑鍒�
+        { width: 20 }, // 鍑洪櫌鐥呭尯
+        { width: 15 }, // 绉戝
+        { width: 12 }, // 鍑洪櫌浜烘
+        { width: 12 }, // 鏃犻渶闅忚浜烘
+        { width: 12 }, // 搴旈殢璁夸汉娆�
+        // 鍐嶆鍑洪櫌闅忚鍒�
+        { width: 10 }, // 闇�闅忚
+        { width: 10 }, // 寰呴殢璁�
+        { width: 10 }, // 闅忚鎴愬姛
+        { width: 10 }, // 闅忚澶辫触
+        { width: 12 }, // 闅忚鐜�
+        { width: 8 }, // 浜哄伐
+        { width: 8 }, // 鐭俊
+        { width: 8 }, // 寰俊
+      ];
+    },
+
+    /** 鍐嶆闅忚鏁版嵁鍚堣琛岃绠� */
+    getSecondFollowUpSummaries(data) {
+      const summaries = ["鍚堣", "/", "/", 0, 0, 0, 0, 0, 0, 0, "0%", 0, 0, 0];
+
+      data.forEach((item) => {
+        // 鏁板�煎瓧娈垫眰鍜�
+        summaries[3] += Number(item.dischargeCount) || 0;
+        summaries[4] += Number(item.nonFollowUp) || 0;
+        summaries[5] += Number(item.followUpNeeded) || 0;
+        summaries[6] += Number(item.needFollowUpAgain) || 0;
+        summaries[7] += Number(item.pendingFollowUpAgain) || 0;
+        summaries[8] += Number(item.followUpSuccessAgain) || 0;
+        summaries[9] += Number(item.followUpFailAgain) || 0;
+        summaries[11] += Number(item.manualAgain) || 0;
+        summaries[12] += Number(item.smsAgain) || 0;
+        summaries[13] += Number(item.weChatAgain) || 0;
+      });
+
+      // 璁$畻闅忚鐜囩櫨鍒嗘瘮瀛楁鐨勫钩鍧囧��
+      const followUpRateAgainValues = data
+        .map((item) => this.extractPercentageValue(item.followUpRateAgain))
+        .filter((value) => value !== null);
+
+      if (followUpRateAgainValues.length > 0) {
+        const avgFollowUpRateAgain =
+          followUpRateAgainValues.reduce((sum, val) => sum + val, 0) /
+          followUpRateAgainValues.length;
+        summaries[10] = (avgFollowUpRateAgain * 100).toFixed(2) + "%";
+      }
+
+      // 鏍煎紡鍖栨暟瀛�
+      summaries[3] = this.formatNumber(summaries[3]);
+      summaries[4] = this.formatNumber(summaries[4]);
+      summaries[5] = this.formatNumber(summaries[5]);
+      summaries[6] = this.formatNumber(summaries[6]);
+      summaries[7] = this.formatNumber(summaries[7]);
+      summaries[8] = this.formatNumber(summaries[8]);
+      summaries[9] = this.formatNumber(summaries[9]);
+      summaries[11] = this.formatNumber(summaries[11]);
+      summaries[12] = this.formatNumber(summaries[12]);
+      summaries[13] = this.formatNumber(summaries[13]);
+
+      return summaries;
+    },
+
+    /** 鍐嶆闅忚琛ㄦ牸鐨勫悎璁¤璁$畻鏂规硶 */
+    getSummariesSecond(param) {
+      const { columns, data } = param;
+      const sums = [];
+
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "鍚堣";
+          return;
+        }
+        if (index === 1 || index === 2) {
+          sums[index] = "/";
+          return;
+        }
+
+        if (column.property === "followUpRateAgain") {
+          const percentageValues = data
+            .map((item) => {
+              const value = item[column.property];
+              if (!value || value === "-" || value === "0%") return null;
+              if (typeof value === "string" && value.includes("%")) {
+                const numValue = parseFloat(value.replace("%", "")) / 100;
+                return isNaN(numValue) ? null : numValue;
+              } else {
+                const numValue = parseFloat(value);
+                return isNaN(numValue) ? null : numValue;
+              }
+            })
+            .filter((value) => value !== null && value !== 0);
+
+          if (percentageValues.length > 0) {
+            const average =
+              percentageValues.reduce((sum, value) => sum + value, 0) /
+              percentageValues.length;
+            sums[index] = (average * 100).toFixed(2) + "%";
+          } else {
+            sums[index] = "0.00%";
+          }
+        } else {
+          const values = data.map((item) => {
+            const value = item[column.property];
+            if (value === "-" || value === "" || value === null) return 0;
+            return Number(value) || 0;
+          });
+
+          if (!values.every((value) => isNaN(value))) {
+            sums[index] = values.reduce((prev, curr) => prev + curr, 0);
+            sums[index] = this.formatNumber(sums[index]);
+          } else {
+            sums[index] = "-";
+          }
+        }
+      });
+
+      return sums;
+    },
+    /** 鍐嶆闅忚鍐呴儴琛ㄦ牸鍚堣琛岃绠楁柟娉� */
+    getInnerSummariesSecond(param) {
+      const { columns, data } = param;
+      const sums = [];
+
+      columns.forEach((column, index) => {
+        if (index === 0) {
+          sums[index] = "灏忚";
+          return;
+        }
+
+        if (column.property === "drname" || column.property === "deptname") {
+          sums[index] = "-";
+          return;
+        }
+
+        if (column.property === "followUpRateAgain") {
+          const percentageValues = data
+            .map((item) => {
+              const value = item[column.property];
+              if (!value || value === "-" || value === "0%") return null;
+              if (typeof value === "string" && value.includes("%")) {
+                const numValue = parseFloat(value.replace("%", "")) / 100;
+                return isNaN(numValue) ? null : numValue;
+              } else {
+                const numValue = parseFloat(value);
+                return isNaN(numValue) ? null : numValue;
+              }
+            })
+            .filter((value) => value !== null && value !== 0);
+
+          if (percentageValues.length > 0) {
+            const average =
+              percentageValues.reduce((sum, value) => sum + value, 0) /
+              percentageValues.length;
+            sums[index] = (average * 100).toFixed(2) + "%";
+          } else {
+            sums[index] = "0.00%";
+          }
+        } else {
+          const values = data.map((item) => {
+            const value = item[column.property];
+            if (value === "-" || value === "" || value === null) return 0;
+            return Number(value) || 0;
+          });
+
+          if (!values.every((value) => isNaN(value))) {
+            sums[index] = values.reduce((prev, curr) => prev + curr, 0);
+            sums[index] = this.formatNumber(sums[index]);
+          } else {
+            sums[index] = "-";
+          }
+        }
+      });
+
+      return sums;
+    },
+    /** 鍐嶆闅忚琛ㄦ牸鐨勮鐐瑰嚮灞曞紑 */
+    handleRowClickSecond(row) {
+      if (this.expandsSecond.includes(this.getRowKey(row))) {
+        this.expandsSecond = [];
+        return;
+      }
+
+      const params = {
+        ...this.queryParams,
+        deptcodes: this.queryParams.deptcodes.includes("all")
+          ? this.allDeptCodes
+          : this.queryParams.deptcodes,
+        leavehospitaldistrictcodes: [row.leavehospitaldistrictcode],
+        drcode: "1",
+        visitCount: 2, // 璁剧疆涓哄啀娆¢殢璁�
+      };
+
+      delete params.leavehospitaldistrictcodes.all;
+      delete params.deptcodes.all;
+
+      if (!row.doctorStats) {
+        this.loadingSecond = true;
+        getSfStatistics(params).then((res) => {
+          this.$set(row, "doctorStats", res.data);
+          this.expandsSecond = [this.getRowKey(row)];
+          this.loadingSecond = false;
+        });
+      } else {
+        this.expandsSecond = [this.getRowKey(row)];
+      }
+    },
+
+    /** 鍐嶆闅忚琛ㄦ牸鐨勫閫夋閫変腑鏁版嵁 */
+    handleSelectionChangeSecond(selection) {
+      this.idsSecond = selection.map((item) => item.tagid);
+      this.single = selection.length != 1;
+      this.multiple = !selection.length;
     },
     // 鏄剧ず鍥捐〃寮圭獥
 
@@ -1321,298 +3116,302 @@
     },
 
     // 鍒濆鍖栭ゼ鍥�
-initPieChart() {
-  const echarts = require("echarts");
-  const pieDom = document.getElementById("pieChart");
-  if (!pieDom) return;
+    initPieChart() {
+      const echarts = require("echarts");
+      const pieDom = document.getElementById("pieChart");
+      if (!pieDom) return;
 
-  if (this.pieChart) {
-    this.pieChart.dispose();
-  }
-
-  this.pieChart = echarts.init(pieDom);
-
-  // 璁$畻楗煎浘鏁版嵁
-  const followUpData = {
-    pending: 0,
-    success: 0,
-    fail: 0,
-  };
-
-  this.userList.forEach((item) => {
-    followUpData.pending += item.pendingFollowUp || 0;
-    followUpData.success += item.followUpSuccess || 0;
-    followUpData.fail += item.followUpFail || 0;
-  });
-
-  // 浣跨敤鏇寸編瑙傜殑棰滆壊鏂规
-  const pieOption = {
-    title: {
-      text: "闅忚鐘舵�佸垎甯�",
-      left: "center",
-      textStyle: {
-        color: '#333',
-        fontSize: 16
+      if (this.pieChart) {
+        this.pieChart.dispose();
       }
-    },
-    tooltip: {
-      trigger: "item",
-      formatter: "{a} <br/>{b}: {c} ({d}%)",
-    },
-    legend: {
-      orient: "vertical",
-      left: "left",
-      data: ["寰呴殢璁�", "闅忚鎴愬姛", "闅忚澶辫触"],
-      textStyle: {
-        color: '#666'
-      }
-    },
-    color: ['#FF9D4D', '#36B37E', '#FF5C5C'], // 鏂扮殑閰嶈壊鏂规
-    series: [
-      {
-        name: "闅忚鐘舵��",
-        type: "pie",
-        radius: ["40%", "70%"],
-        avoidLabelOverlap: true,
-        itemStyle: {
-          borderRadius: 10,
-          borderColor: "#fff",
-          borderWidth: 2
-        },
-        label: {
-          show: true,
-          formatter: "{b}: {c} ({d}%)",
-          color: '#333'
-        },
-        emphasis: {
-          label: {
-            show: true,
-            fontSize: "18",
-            fontWeight: "bold"
+
+      this.pieChart = echarts.init(pieDom);
+
+      // 璁$畻楗煎浘鏁版嵁
+      const followUpData = {
+        pending: 0,
+        success: 0,
+        fail: 0,
+      };
+
+      this.userList.forEach((item) => {
+        followUpData.pending += item.pendingFollowUp || 0;
+        followUpData.success += item.followUpSuccess || 0;
+        followUpData.fail += item.followUpFail || 0;
+      });
+
+      // 浣跨敤鏇寸編瑙傜殑棰滆壊鏂规
+      const pieOption = {
+        title: {
+          text: "闅忚鐘舵�佸垎甯�",
+          left: "center",
+          textStyle: {
+            color: "#333",
+            fontSize: 16,
           },
-          itemStyle: {
-            shadowBlur: 10,
-            shadowOffsetX: 0,
-            shadowColor: 'rgba(0, 0, 0, 0.5)'
-          }
         },
-        data: [
-          {
-            value: followUpData.pending,
-            name: "寰呴殢璁�"
+        tooltip: {
+          trigger: "item",
+          formatter: "{a} <br/>{b}: {c} ({d}%)",
+        },
+        legend: {
+          orient: "vertical",
+          left: "left",
+          data: ["寰呴殢璁�", "闅忚鎴愬姛", "闅忚澶辫触"],
+          textStyle: {
+            color: "#666",
           },
+        },
+        color: ["#FF9D4D", "#36B37E", "#FF5C5C"], // 鏂扮殑閰嶈壊鏂规
+        series: [
           {
-            value: followUpData.success,
-            name: "闅忚鎴愬姛"
-          },
-          {
-            value: followUpData.fail,
-            name: "闅忚澶辫触"
-          }
-        ]
-      }
-    ]
-  };
-
-  this.pieChart.setOption(pieOption);
-  window.addEventListener("resize", this.resizePieChart);
-},
-
-// 鍒濆鍖栨煴鐘舵姌绾垮浘
-initBarLineChart() {
-  const echarts = require("echarts");
-  const barDom = document.getElementById("barLineChart");
-  if (!barDom) return;
-
-  if (this.barLineChart) {
-    this.barLineChart.dispose();
-  }
-
-  this.barLineChart = echarts.init(barDom);
-
-  // 鍑嗗鏁版嵁
-  const categories = this.userList.map(
-    (item) => item.leavehospitaldistrictname || item.deptname
-  );
-
-  const dischargeData = this.userList.map(
-    (item) => item.dischargeCount || 0
-  );
-  const followUpData = this.userList.map(
-    (item) => item.followUpNeeded || 0
-  );
-
-  // 鏂板涓ゆ潯鎶樼嚎鏁版嵁
- const followUpRateData = this.userList.map(item => {
-    if (!item.followUpRate) return 0;
-    // 鍘绘帀鐧惧垎鍙峰苟杞负鏁板瓧
-    const rateStr = String(item.followUpRate).replace('%', '');
-    return parseFloat(rateStr) || 0;
-  });
-
-  const timelyRateData = this.userList.map(item =>
-    item.rate ? (Number(item.rate) * 100).toFixed(2) : 0
-  );
-
-  const option = {
-    title: {
-      text: "绉戝/鐥呭尯闅忚瓒嬪娍",
-      left: "center",
-      textStyle: {
-        color: '#333',
-        fontSize: 16
-      }
-    },
-    tooltip: {
-      trigger: "axis",
-      axisPointer: {
-        type: "cross",
-        crossStyle: {
-          color: "#999",
-        },
-      },
-    },
-    legend: {
-      data: ["鍑洪櫌浜烘", "搴旈殢璁夸汉娆�", "闅忚鐜�(%)", "鍙婃椂鐜�(%)"],
-      top: "bottom",
-      textStyle: {
-        color: '#666'
-      }
-    },
-    color: ['#5470C6', '#91CC75', '#EE6666', '#9A60B4'], // 鏂板绱壊鐢ㄤ簬鍙婃椂鐜�
-    xAxis: {
-      type: "category",
-      data: categories,
-      axisLabel: {
-        interval: 0,
-        rotate: 30,
-        color: '#666'
-      },
-      axisLine: {
-        lineStyle: {
-          color: '#ddd'
-        }
-      }
-    },
-    yAxis: [
-      {
-        type: "value",
-        name: "浜烘",
-        min: 0,
-        axisLabel: {
-          color: '#666'
-        },
-        axisLine: {
-          lineStyle: {
-            color: '#ddd'
-          }
-        },
-        splitLine: {
-          lineStyle: {
-            color: '#f0f0f0'
-          }
-        }
-      },
-      {
-        type: "value",
-        name: "鐧惧垎姣�(%)",
-        min: 0,
-        max: 100,
-        axisLabel: {
-          color: '#666',
-          formatter: '{value}%'
-        },
-        axisLine: {
-          lineStyle: {
-            color: '#ddd'
-          }
-        },
-        splitLine: {
-          show: false
-        }
-      }
-    ],
-    series: [
-      {
-        name: "鍑洪櫌浜烘",
-        type: "bar",
-        barWidth: "25%",
-        data: dischargeData,
-        itemStyle: {
-          borderRadius: [4, 4, 0, 0]
-        }
-      },
-      {
-        name: "搴旈殢璁夸汉娆�",
-        type: "bar",
-        barWidth: "25%",
-        data: followUpData,
-        itemStyle: {
-          borderRadius: [4, 4, 0, 0]
-        }
-      },
-      {
-        name: "闅忚鐜�(%)",
-        type: "line",
-        yAxisIndex: 1,
-        data: followUpRateData,
-        symbolSize: 8,
-        lineStyle: {
-          width: 3
-        },
-        markLine: {
-          silent: true,
-          data: [{
-            yAxis: 80,
-            lineStyle: {
-              color: '#EE6666',
-              type: 'dashed'
+            name: "闅忚鐘舵��",
+            type: "pie",
+            radius: ["40%", "70%"],
+            avoidLabelOverlap: true,
+            itemStyle: {
+              borderRadius: 10,
+              borderColor: "#fff",
+              borderWidth: 2,
             },
-            // label: {
-            //   position: 'end',
-            //   formatter: '鐩爣80%'
-            // }
-          }]
-        }
-      },
-      {
-        name: "鍙婃椂鐜�(%)",
-        type: "line",
-        yAxisIndex: 1,
-        data: timelyRateData,
-        symbolSize: 8,
-        lineStyle: {
-          width: 3,
-          type: 'dotted' // 浣跨敤铏氱嚎鍖哄垎
-        },
-        markLine: {
-          silent: true,
-          data: [{
-            yAxis: 90,
-            lineStyle: {
-              color: '#9A60B4',
-              type: 'dashed'
+            label: {
+              show: true,
+              formatter: "{b}: {c} ({d}%)",
+              color: "#333",
             },
-            // label: {
-            //   position: 'end',
-            //   formatter: '鐩爣90%'
-            // }
-          }]
-        }
-      }
-    ],
-    grid: {
-      top: '15%',
-      left: '3%',
-      right: '4%',
-      bottom: '15%',
-      containLabel: true
-    }
-  };
+            emphasis: {
+              label: {
+                show: true,
+                fontSize: "18",
+                fontWeight: "bold",
+              },
+              itemStyle: {
+                shadowBlur: 10,
+                shadowOffsetX: 0,
+                shadowColor: "rgba(0, 0, 0, 0.5)",
+              },
+            },
+            data: [
+              {
+                value: followUpData.pending,
+                name: "寰呴殢璁�",
+              },
+              {
+                value: followUpData.success,
+                name: "闅忚鎴愬姛",
+              },
+              {
+                value: followUpData.fail,
+                name: "闅忚澶辫触",
+              },
+            ],
+          },
+        ],
+      };
 
-  this.barLineChart.setOption(option);
-  window.addEventListener("resize", this.resizeBarLineChart);
-},
+      this.pieChart.setOption(pieOption);
+      window.addEventListener("resize", this.resizePieChart);
+    },
+
+    // 鍒濆鍖栨煴鐘舵姌绾垮浘
+    initBarLineChart() {
+      const echarts = require("echarts");
+      const barDom = document.getElementById("barLineChart");
+      if (!barDom) return;
+
+      if (this.barLineChart) {
+        this.barLineChart.dispose();
+      }
+
+      this.barLineChart = echarts.init(barDom);
+
+      // 鍑嗗鏁版嵁
+      const categories = this.userList.map(
+        (item) => item.leavehospitaldistrictname || item.deptname
+      );
+
+      const dischargeData = this.userList.map(
+        (item) => item.dischargeCount || 0
+      );
+      const followUpData = this.userList.map(
+        (item) => item.followUpNeeded || 0
+      );
+
+      // 鏂板涓ゆ潯鎶樼嚎鏁版嵁
+      const followUpRateData = this.userList.map((item) => {
+        if (!item.followUpRate) return 0;
+        // 鍘绘帀鐧惧垎鍙峰苟杞负鏁板瓧
+        const rateStr = String(item.followUpRate).replace("%", "");
+        return parseFloat(rateStr) || 0;
+      });
+
+      const timelyRateData = this.userList.map((item) =>
+        item.rate ? (Number(item.rate) * 100).toFixed(2) : 0
+      );
+
+      const option = {
+        title: {
+          text: "绉戝/鐥呭尯闅忚瓒嬪娍",
+          left: "center",
+          textStyle: {
+            color: "#333",
+            fontSize: 16,
+          },
+        },
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "cross",
+            crossStyle: {
+              color: "#999",
+            },
+          },
+        },
+        legend: {
+          data: ["鍑洪櫌浜烘", "搴旈殢璁夸汉娆�", "闅忚鐜�(%)", "鍙婃椂鐜�(%)"],
+          top: "bottom",
+          textStyle: {
+            color: "#666",
+          },
+        },
+        color: ["#5470C6", "#91CC75", "#EE6666", "#9A60B4"], // 鏂板绱壊鐢ㄤ簬鍙婃椂鐜�
+        xAxis: {
+          type: "category",
+          data: categories,
+          axisLabel: {
+            interval: 0,
+            rotate: 30,
+            color: "#666",
+          },
+          axisLine: {
+            lineStyle: {
+              color: "#ddd",
+            },
+          },
+        },
+        yAxis: [
+          {
+            type: "value",
+            name: "浜烘",
+            min: 0,
+            axisLabel: {
+              color: "#666",
+            },
+            axisLine: {
+              lineStyle: {
+                color: "#ddd",
+              },
+            },
+            splitLine: {
+              lineStyle: {
+                color: "#f0f0f0",
+              },
+            },
+          },
+          {
+            type: "value",
+            name: "鐧惧垎姣�(%)",
+            min: 0,
+            max: 100,
+            axisLabel: {
+              color: "#666",
+              formatter: "{value}%",
+            },
+            axisLine: {
+              lineStyle: {
+                color: "#ddd",
+              },
+            },
+            splitLine: {
+              show: false,
+            },
+          },
+        ],
+        series: [
+          {
+            name: "鍑洪櫌浜烘",
+            type: "bar",
+            barWidth: "25%",
+            data: dischargeData,
+            itemStyle: {
+              borderRadius: [4, 4, 0, 0],
+            },
+          },
+          {
+            name: "搴旈殢璁夸汉娆�",
+            type: "bar",
+            barWidth: "25%",
+            data: followUpData,
+            itemStyle: {
+              borderRadius: [4, 4, 0, 0],
+            },
+          },
+          {
+            name: "闅忚鐜�(%)",
+            type: "line",
+            yAxisIndex: 1,
+            data: followUpRateData,
+            symbolSize: 8,
+            lineStyle: {
+              width: 3,
+            },
+            markLine: {
+              silent: true,
+              data: [
+                {
+                  yAxis: 80,
+                  lineStyle: {
+                    color: "#EE6666",
+                    type: "dashed",
+                  },
+                  // label: {
+                  //   position: 'end',
+                  //   formatter: '鐩爣80%'
+                  // }
+                },
+              ],
+            },
+          },
+          {
+            name: "鍙婃椂鐜�(%)",
+            type: "line",
+            yAxisIndex: 1,
+            data: timelyRateData,
+            symbolSize: 8,
+            lineStyle: {
+              width: 3,
+              type: "dotted", // 浣跨敤铏氱嚎鍖哄垎
+            },
+            markLine: {
+              silent: true,
+              data: [
+                {
+                  yAxis: 90,
+                  lineStyle: {
+                    color: "#9A60B4",
+                    type: "dashed",
+                  },
+                  // label: {
+                  //   position: 'end',
+                  //   formatter: '鐩爣90%'
+                  // }
+                },
+              ],
+            },
+          },
+        ],
+        grid: {
+          top: "15%",
+          left: "3%",
+          right: "4%",
+          bottom: "15%",
+          containLabel: true,
+        },
+      };
+
+      this.barLineChart.setOption(option);
+      window.addEventListener("resize", this.resizeBarLineChart);
+    },
 
     // 鍥捐〃鍝嶅簲寮忚皟鏁存柟娉�
     resizePieChart() {
@@ -1648,6 +3447,27 @@
 </script>
 
 <style lang="scss" scoped>
+::v-deep .el-tabs__header {
+  margin-bottom: 20px;
+}
+
+::v-deep .el-tabs__item {
+  font-size: 16px;
+  padding: 0 20px;
+  height: 40px;
+  line-height: 40px;
+}
+
+::v-deep .el-tabs__active-bar {
+  height: 3px;
+}
+
+/* Tab鍐呭鍖哄煙鏍峰紡 */
+.el-tab-pane {
+  .your-table-container {
+    margin-top: 10px;
+  }
+}
 .sidecolumn {
   width: 180px;
   min-height: 100vh;
@@ -1723,6 +3543,53 @@
   text-align: left;
   font-size: 20px;
 }
+// 缇庡寲鍚堣琛屾牱寮�
+::v-deep .el-table__footer {
+  .el-table__cell {
+    background-color: #f5f7fa;
+    font-weight: 600;
+    color: #409eff;
+
+    .cell {
+      font-weight: 600;
+      color: #409eff;
+    }
+  }
+}
+
+// 鍐呴儴琛ㄦ牸鍚堣琛屾牱寮�
+::v-deep .inner-table .el-table__footer {
+  .el-table__cell {
+    background-color: #ecf5ff;
+    font-weight: 500;
+    color: #67c23a;
+
+    .cell {
+      font-weight: 500;
+      color: #67c23a;
+    }
+  }
+}
+
+// 鐧惧垎姣斿瓧娈电壒娈婃牱寮�
+.your-table-container
+  ::v-deep
+  .el-table__footer
+  .el-table__cell[data-field="followUpRate"]
+  .cell,
+.your-table-container
+  ::v-deep
+  .el-table__footer
+  .el-table__cell[data-field="rate"]
+  .cell,
+.your-table-container
+  ::v-deep
+  .el-table__footer
+  .el-table__cell[data-field="followUpRateAgain"]
+  .cell {
+  color: #e6a23c !important;
+  font-weight: 700 !important;
+}
 
 .leftvlue {
   //   display: flex;
@@ -1789,6 +3656,10 @@
   width: 100px;
   height: 50px;
 }
+.data-list {
+  max-height: 800px;
+  overflow-y: auto;
+}
 .documentf {
   display: flex;
   justify-content: flex-end;

--
Gitblit v1.9.3