From a7eb9f0ef66e3528a58f0f6c140e7bf3eda6e596 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期三, 15 四月 2026 09:04:29 +0800
Subject: [PATCH] 测试完成

---
 src/views/sfstatistics/percentage/index.vue | 2817 ++++++-----------------------------------------------------
 1 files changed, 304 insertions(+), 2,513 deletions(-)

diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
index 34a7bdb..911156a 100644
--- a/src/views/sfstatistics/percentage/index.vue
+++ b/src/views/sfstatistics/percentage/index.vue
@@ -1,2578 +1,369 @@
 <template>
-  <div class="Questionnairemanagement">
-    <div class="leftvlue">
-      <div class="leftvlue-bg">
-        <el-row :gutter="20">
-          <!--鏍囩鏁版嵁-->
-          <el-col :span="24" :xs="24">
-            <el-form
-              :model="queryParams"
-              ref="queryForm"
-              size="small"
-              :inline="true"
-              v-show="showSearch"
-              label-width="98px"
-            >
-              <el-form-item label="缁熻绫诲瀷" prop="userName">
-                <el-select
-                  v-model="queryParams.statisticaltype"
-                  placeholder="璇烽�夋嫨缁熻绫诲瀷"
-                >
-                  <el-option
-                    v-for="item in Statisticallist"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-                <el-select
-                  style="margin-left: 10px"
-                  v-if="queryParams.statisticaltype == 1"
-                  v-model="queryParams.leavehospitaldistrictcodes"
-                  size="medium"
-                  multiple
-                  filterable
-                  placeholder="璇烽�夋嫨鐥呭尯"
-                >
-                  <el-option
-                    v-for="item in flatArrayhospit"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-                <el-select
-                  v-else-if="queryParams.statisticaltype == 2"
-                  v-model="queryParams.deptcodes"
-                  size="medium"
-                  multiple
-                  filterable
-                  placeholder="璇烽�夋嫨绉戝"
-                >
-                  <el-option
-                    v-for="item in flatArraydept"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
+  <div class="follow-up-statistics">
+    <!-- 鎼滅储琛ㄥ崟鍖哄煙 -->
+    <div class="search-section">
+      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="98px">
+        <el-form-item label="缁熻绫诲瀷" prop="userName">
+          <el-select v-model="queryParams.statisticaltype" placeholder="璇烽�夋嫨缁熻绫诲瀷">
+            <el-option v-for="item in Statisticallist" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+          <el-select
+            style="margin-left: 10px"
+            v-if="queryParams.statisticaltype == 1"
+            v-model="queryParams.leavehospitaldistrictcodes"
+            size="medium"
+            multiple
+            filterable
+            placeholder="璇烽�夋嫨鐥呭尯"
+          >
+            <el-option v-for="item in flatArrayhospit" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+          <el-select
+            v-else-if="queryParams.statisticaltype == 2"
+            v-model="queryParams.deptcodes"
+            size="medium"
+            multiple
+            filterable
+            placeholder="璇烽�夋嫨绉戝"
+          >
+            <el-option v-for="item in flatArraydept" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
 
-              <el-form-item label="缁熻绫诲瀷" prop="userName">
-                <el-select
-                  v-model="queryParams.serviceType"
-                  multiple
-                  placeholder="璇烽�夋嫨"
-                >
-                  <el-option
-                    v-for="item in options"
-                    :key="item.value"
-                    :label="item.label"
-                    :value="item.value"
-                  >
-                  </el-option>
-                </el-select>
-              </el-form-item>
-              <el-form-item
-                label-width="200"
-                label="搴旈殢璁挎椂闂磋寖鍥�"
-                prop="userName"
-              >
-                <el-date-picker
-                  v-model="queryParams.dateRange"
-                  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>
+        <el-form-item label="鏈嶅姟绫诲瀷" prop="userName">
+          <el-select v-model="queryParams.serviceType" multiple placeholder="璇烽�夋嫨">
+            <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
+          </el-select>
+        </el-form-item>
 
-              <el-form-item>
-                <el-button
-                  type="primary"
-                  icon="el-icon-search"
-                  size="medium"
-                  @click="handleQuery"
-                  >鎼滅储</el-button
-                >
-                <el-button
-                  icon="el-icon-refresh"
-                  size="medium"
-                  @click="resetQuery"
-                  >閲嶇疆</el-button
-                >
-              </el-form-item>
-              <el-col :span="19">
-                <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-col>
-            </el-form>
-            <div class="your-table-container">
-              <el-table
-                ref="exportTable"
-                id="exportTableid"
-                v-loading="loading"
-                :data="userList"
-                :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-form-item label-width="200" label="搴旈殢璁挎椂闂磋寖鍥�" prop="userName">
+          <el-date-picker
+            v-model="queryParams.dateRange"
+            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-form-item>
 
-                      <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>
-                  </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>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" size="medium" @click="handleQuery">鎼滅储</el-button>
+          <el-button icon="el-icon-refresh" size="medium" @click="resetQuery">閲嶇疆</el-button>
+        </el-form-item>
 
-                <el-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"
-                  >
-                    <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="闅忚鎴愬姛"
-                    align="center"
-                    key="followUpSuccess"
-                    prop="followUpSuccess"
-                  >
-                  </el-table-column>
-                  <el-table-column
-                    label="闅忚澶辫触"
-                    align="center"
-                    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="闅忚鐜�"
-                    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-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>
-
-            <!-- <pagination
-              v-show="total > 0"
-              :total="total"
-              :page.sync="queryParams.pageNum"
-              :limit.sync="queryParams.pageSize"
-              @pagination="getList"
-            /> -->
-          </el-col>
-        </el-row>
-      </div>
+        <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-form>
     </div>
-    <!-- 缁熻瓒嬪娍鍥惧脊绐� -->
-    <el-dialog
-      title="闅忚缁熻瓒嬪娍鍥�"
-      :visible.sync="chartDialogVisible"
-      width="80%"
-      :close-on-click-modal="false"
-    >
-      <div class="chart-container">
-        <el-row :gutter="20">
-          <el-col :span="12">
-            <div class="chart-title">闅忚鐘舵�佸垎甯�</div>
-            <div id="pieChart" style="width: 100%; height: 400px"></div>
-          </el-col>
-          <el-col :span="12">
-            <div class="chart-title">闅忚瓒嬪娍鍒嗘瀽</div>
-            <div id="barLineChart" style="width: 100%; height: 400px"></div>
-          </el-col>
-        </el-row>
-      </div>
-    </el-dialog>
-    <el-dialog
-      title="鏈強鏃堕殢璁挎偅鑰呮湇鍔�"
-      :visible.sync="SeedetailsVisible"
-      v-loading="Seedloading"
-      width="70%"
-      :close-on-click-modal="false"
-    >
-      <div class="examine-jic">
-        <div class="jic-value">
-          <el-row :gutter="20">
-            <!--鐢ㄦ埛鏁版嵁-->
-            <el-form
-              :model="patientqueryParams"
-              ref="queryForm"
-              size="small"
-              :inline="true"
-              label-width="98px"
-            >
-              <el-form-item label="鎮h�咃細">
-                <el-input
-                  v-model="patientqueryParams.name"
-                  @keyup.enter.native="handleQuery"
-                ></el-input>
-              </el-form-item>
-              <el-form-item label="鎮h�呰瘖鏂細">
-                <el-input
-                  v-model="patientqueryParams.leavediagname"
-                  @keyup.enter.native="handleQuery"
-                ></el-input>
-              </el-form-item>
 
-              <el-form-item>
-                <el-button
-                  type="primary"
-                  icon="el-icon-search"
-                  size="medium"
-                  @click="handleQuery"
-                  >鎼滅储</el-button
-                >
-                <el-button
-                  icon="el-icon-refresh"
-                  size="medium"
-                  @click="resetQuery"
-                  >鍙栨秷鍒涘缓</el-button
-                >
-              </el-form-item>
-            </el-form>
-            <!-- 閫夋嫨鎮h�呭垪琛� -->
-            <el-table :data="logsheetlist" style="width: 100%">
-              <el-table-column
-                prop="sendname"
-                align="center"
-                label="濮撳悕"
-                width="100"
-              >
-              </el-table-column>
-              <el-table-column
-                prop="taskName"
-                align="center"
-                width="200"
-                show-overflow-tooltip
-                label="浠诲姟鍚嶇О"
-              >
-              </el-table-column>
-              <el-table-column
-                prop="sendstate"
-                align="center"
-                width="200"
-                label="浠诲姟鐘舵��"
-              >
-                <template slot-scope="scope">
-                  <div v-if="scope.row.sendstate == 1">
-                    <el-tag type="primary" :disable-transitions="false"
-                      >琛ㄥ崟宸查鍙�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 2">
-                    <el-tag type="primary" :disable-transitions="false"
-                      >寰呴殢璁�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 3">
-                    <el-tag type="success" :disable-transitions="false"
-                      >琛ㄥ崟宸插彂閫�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 4">
-                    <el-tag type="info" :disable-transitions="false"
-                      >涓嶆墽琛�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 5">
-                    <el-tag type="danger" :disable-transitions="false"
-                      >鍙戦�佸け璐�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 6">
-                    <el-tag type="success" :disable-transitions="false"
-                      >宸插畬鎴�</el-tag
-                    >
-                  </div>
-                </template>
-              </el-table-column>
-              <el-table-column
-                prop="visitTime"
-                align="center"
-                label="搴旈殢璁挎椂闂�"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-              <el-table-column
-                prop="finishtime"
-                align="center"
-                label="闅忚瀹屾垚鏃堕棿"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-              <el-table-column
-                label="鍑洪櫌鏃ユ湡"
-                width="200"
-                align="center"
-                key="endtime"
-                prop="endtime"
-              >
-                <template slot-scope="scope">
-                  <span>{{ formatTime(scope.row.endtime) }}</span>
-                </template></el-table-column
-              >
-              <el-table-column
-                label="璐d换鎶ゅ+"
-                width="120"
-                align="center"
-                key="nurseName"
-                prop="nurseName"
-              />
-              <el-table-column
-                label="涓绘不鍖荤敓"
-                width="120"
-                align="center"
-                key="drname"
-                prop="drname"
-              />
-
-              <el-table-column
-                label="缁撴灉鐘舵��"
-                align="center"
-                key="excep"
-                prop="excep"
-                width="120"
-              >
-                <template slot-scope="scope">
-                  <dict-tag
-                    :options="dict.type.sys_yujing"
-                    :value="scope.row.excep"
-                  />
-                </template>
-              </el-table-column>
-              <el-table-column
-                label="澶勭悊鎰忚"
-                align="center"
-                key="suggest"
-                prop="suggest"
-                width="120"
-              >
-                <template slot-scope="scope">
-                  <dict-tag
-                    :options="dict.type.sys_suggest"
-                    :value="scope.row.suggest"
-                  />
-                </template>
-              </el-table-column>
-
-              <el-table-column
-                prop="templatename"
-                align="center"
-                label="鏈嶅姟妯℃澘"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-              <el-table-column
-                prop="remark"
-                align="center"
-                label="鏈嶅姟璁板綍"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-
-              <el-table-column
-                prop="bankcardno"
-                align="center"
-                label="鍛煎彨鐘舵��"
-                width="210"
-              >
-              </el-table-column>
-              <el-table-column
-                label="鎿嶄綔"
-                fixed="right"
-                align="center"
-                width="200"
-                class-name="small-padding fixed-width"
-              >
-                <template slot-scope="scope">
-                  <el-button
-                    size="medium"
-                    type="text"
-                    @click="SeedetailsgGo(scope.row)"
-                    ><span class="button-zx"
-                      ><i class="el-icon-s-order"></i>鏌ョ湅</span
-                    ></el-button
-                  >
-                </template>
-              </el-table-column>
-            </el-table>
-          </el-row>
-          <pagination
-            v-show="patienttotal > 0 && this.patientqueryParams.allhosp != 6"
-            :total="patienttotal"
-            :page.sync="patientqueryParams.pn"
-            :limit.sync="patientqueryParams.ps"
-            @pagination="Seedetails"
+    <!-- Tab鍒囨崲鍖哄煙 -->
+    <div class="tab-section">
+      <el-tabs v-model="activeTab" @tab-click="handleTabClick">
+        <el-tab-pane label="棣栨闅忚" name="first">
+          <FirstFollowUp
+            ref="firstFollowUp"
+            :query-params="queryParams"
+            :flat-array-hospit="flatArrayhospit"
+            :flat-array-dept="flatArraydept"
+            :options="options"
+            :orgname="orgname"
+            @view-details="viewDetails"
+            @see-details="Seedetails"
           />
-        </div>
-      </div>
-    </el-dialog>
-    <!-- 鍚勭被璇︽儏 -->
-    <el-dialog
+        </el-tab-pane>
+
+        <el-tab-pane label="鍐嶆闅忚" name="second">
+          <SecondFollowUp
+            ref="secondFollowUp"
+            :query-params="queryParams"
+            :flat-array-hospit="flatArrayhospit"
+            :flat-array-dept="flatArraydept"
+            :options="options"
+            :orgname="orgname"
+            @view-details="viewDetails"
+          />
+        </el-tab-pane>
+
+        <el-tab-pane label="寤剁画鎶ょ悊缁熻" name="continued" v-if="orgname == '鐪佺珛鍚屽痉缈犺嫅闄㈠尯'">
+          <ContinuedCare
+            ref="continuedCare"
+            :query-params="queryParams"
+            :flat-array-hospit="flatArrayhospit"
+            :flat-array-dept="flatArraydept"
+            :options="options"
+            :orgname="orgname"
+            @view-details="viewDetails"
+          />
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+
+    <!-- 寮圭獥鍖哄煙 -->
+    <ChartDialog
+      :visible="chartDialogVisible"
+      :data="chartData"
+      :active-tab="activeTab"
+      @close="chartDialogVisible = false"
+    />
+
+    <DetailDialog
+      :visible="infotitleVisible"
       :title="infotitle"
-      :visible.sync="infotitleVisible"
-      v-loading="infotitloading"
-      width="70%"
-      :close-on-click-modal="false"
-    >
-      <div class="examine-jic">
-        <div class="jic-value">
-          <el-row :gutter="20">
-            <!-- 閫夋嫨鎮h�呭垪琛� -->
-            <el-table :data="infotitlelist" height="660" style="width: 100%">
-              <el-table-column
-                prop="sendname"
-                align="center"
-                label="濮撳悕"
-                width="100"
-              >
-              </el-table-column>
-              <el-table-column
-                prop="taskName"
-                align="center"
-                width="200"
-                show-overflow-tooltip
-                label="浠诲姟鍚嶇О"
-              >
-              </el-table-column>
-              <el-table-column
-                prop="sendstate"
-                align="center"
-                width="200"
-                label="浠诲姟鐘舵��"
-              >
-                <template slot-scope="scope">
-                  <div v-if="scope.row.sendstate == 1">
-                    <el-tag type="primary" :disable-transitions="false"
-                      >琛ㄥ崟宸查鍙�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 2">
-                    <el-tag type="primary" :disable-transitions="false"
-                      >寰呴殢璁�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 3">
-                    <el-tag type="success" :disable-transitions="false"
-                      >琛ㄥ崟宸插彂閫�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 4">
-                    <el-tag type="info" :disable-transitions="false"
-                      >涓嶆墽琛�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 5">
-                    <el-tag type="danger" :disable-transitions="false"
-                      >鍙戦�佸け璐�</el-tag
-                    >
-                  </div>
-                  <div v-if="scope.row.sendstate == 6">
-                    <el-tag type="success" :disable-transitions="false"
-                      >宸插畬鎴�</el-tag
-                    >
-                  </div>
-                </template>
-              </el-table-column>
-              <el-table-column
-                prop="visitTime"
-                align="center"
-                label="搴旈殢璁挎椂闂�"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-              <el-table-column
-                prop="finishtime"
-                align="center"
-                label="闅忚瀹屾垚鏃堕棿"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-              <el-table-column
-                label="鍑洪櫌鏃ユ湡"
-                width="200"
-                align="center"
-                key="endtime"
-                prop="endtime"
-              >
-                <template slot-scope="scope">
-                  <span>{{ formatTime(scope.row.endtime) }}</span>
-                </template></el-table-column
-              >
-              <el-table-column
-                label="璐d换鎶ゅ+"
-                width="120"
-                align="center"
-                key="nurseName"
-                prop="nurseName"
-              />
-              <el-table-column
-                label="涓绘不鍖荤敓"
-                width="120"
-                align="center"
-                key="drname"
-                prop="drname"
-              />
+      :data="infotitlelist"
+      :search-name="searchName"
+      @close="infotitleVisible = false"
+      @search="handleSearch"
+      @details-go="SeedetailsgGo"
+    />
 
-              <el-table-column
-                label="缁撴灉鐘舵��"
-                align="center"
-                key="excep"
-                prop="excep"
-                width="120"
-              >
-                <template slot-scope="scope">
-                  <dict-tag
-                    :options="dict.type.sys_yujing"
-                    :value="scope.row.excep"
-                  />
-                </template>
-              </el-table-column>
-              <el-table-column
-                label="澶勭悊鎰忚"
-                align="center"
-                key="suggest"
-                prop="suggest"
-                width="120"
-              >
-                <template slot-scope="scope">
-                  <dict-tag
-                    :options="dict.type.sys_suggest"
-                    :value="scope.row.suggest"
-                  />
-                </template>
-              </el-table-column>
-
-              <el-table-column
-                prop="templatename"
-                align="center"
-                label="鏈嶅姟妯℃澘"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-              <el-table-column
-                prop="remark"
-                align="center"
-                label="鏈嶅姟璁板綍"
-                width="200"
-                show-overflow-tooltip
-              >
-              </el-table-column>
-
-              <el-table-column
-                prop="bankcardno"
-                align="center"
-                label="鍛煎彨鐘舵��"
-                width="210"
-              >
-              </el-table-column>
-              <el-table-column
-                label="鎿嶄綔"
-                fixed="right"
-                align="center"
-                width="200"
-                class-name="small-padding fixed-width"
-              >
-                <template slot-scope="scope">
-                  <el-button
-                    size="medium"
-                    type="text"
-                    @click="SeedetailsgGo(scope.row)"
-                    ><span class="button-zx"
-                      ><i class="el-icon-s-order"></i>鏌ョ湅</span
-                    ></el-button
-                  >
-                </template>
-              </el-table-column>
-            </el-table>
-          </el-row>
-          <pagination
-            v-show="patienttotal > 0 && this.patientqueryParams.allhosp != 6"
-            :total="patienttotal"
-            :page.sync="patientqueryParams.pn"
-            :limit.sync="patientqueryParams.ps"
-            @pagination="Seedetails"
-          />
-        </div>
-      </div>
-    </el-dialog>
+    <TimelyRateDialog
+      :visible="SeedetailsVisible"
+      :loading="Seedloading"
+      :data="logsheetlist"
+      :total="patienttotal"
+      :query-params="patientqueryParams"
+      @close="SeedetailsVisible = false"
+      @search="Seedetailstion"
+      @details-go="SeedetailsgGo"
+    />
   </div>
 </template>
 
 <script>
-import {
-  toamendtag,
-  addapitag,
-  deletetag,
-  changetagcategory,
-} 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: "浠婂ぉ",
-    onClick(picker) {
-      picker.$emit("pick", new Date());
-    },
-  },
-  {
-    text: "鏄ㄥぉ",
-    onClick(picker) {
-      const date = new Date();
-      date.setTime(date.getTime() - 3600 * 1000 * 24);
-      picker.$emit("pick", date);
-    },
-  },
-  {
-    text: "涓�鍛ㄥ墠",
-    onClick(picker) {
-      const date = new Date();
-      date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
-      picker.$emit("pick", date);
-    },
-  },
-];
+import FirstFollowUp from './components/FirstFollowUp.vue'
+import SecondFollowUp from './components/SecondFollowUp.vue'
+import ContinuedCare from './components/ContinuedCare.vue'
+import ChartDialog from './components/ChartDialog.vue'
+import DetailDialog from './components/DetailDialog.vue'
+import TimelyRateDialog from './components/TimelyRateDialog.vue'
+
+
 export default {
-  name: "Percentage",
-  dicts: ["sys_normal_disable", "sys_user_sex"],
-  components: { Treeselect },
+  name: 'FollowUpStatistics',
+  components: {
+    FirstFollowUp,
+    SecondFollowUp,
+    ContinuedCare,
+    ChartDialog,
+    DetailDialog,
+    TimelyRateDialog
+  },
   data() {
     return {
-      topactiveName: "Local", //椤堕儴閫夋嫨
-      activeName: "first", //渚ц竟閫夋嫨
-      orgname: "",
-      expands: [],
-      infotitlelist: [],
-      // 閬僵灞�
-      loading: false,
-      Seedloading: false,
-      chartDialogVisible: false,
-      infotitleVisible: false,
-      infotitloading: false,
-      infotitle: "",
-      pieChart: null,
-      barLineChart: null,
-      // 閫変腑鏁扮粍
-      ids: [],
-      // 闈炲崟涓鐢�
-      single: true,
-      // 闈炲涓鐢�
-      multiple: true,
-      // 鏄剧ず鎼滅储鏉′欢
-      showSearch: true,
-      idds: "", //鍒嗙被id
-      // 鎬绘潯鏁�
-      total: 0,
-      flatArrayhospit: [],
-      flatArraydept: [],
-      patienttotal: 0,
-      logsheetlist: [],
+      activeTab: 'first',
+      orgname: localStorage.getItem('orgname') || '',
       Statisticallist: [
-        {
-          label: "鐥呭尯缁熻",
-          value: 1,
-        },
-        {
-          label: "绉戝缁熻",
-          value: 2,
-        },
+        { label: '鐥呭尯缁熻', value: 1 },
+        { label: '绉戝缁熻', value: 2 }
       ],
-      patientqueryParams: {
-        pn: 1,
-        ps: 10,
-      },
-      amendtag: false, //鏄惁淇敼绫诲埆
-      lstamendtag: false, //鏄惁淇敼鏍囩
-      scavisible: false, //鍒犻櫎寮规
-      deleteVisible: false, //鍒嗙被鍒犻櫎寮规
-      deletefenl: "楂樿鍘�", //鍒犻櫎椤�
-      //淇敼娣诲姞鏍囩寮规鏁版嵁
-      tagform: {
-        isupload: "",
-        tagname: "",
-        tagcategoryid: "",
-        tagdescription: "",
-      },
-      classifyform: {
-        categoryname: "",
-      },
-      // 鏍囩琛ㄦ牸鏁版嵁
-      userList: [],
-      // 寮瑰嚭灞傛爣棰�
-      title: "",
-      // 鏄惁鏄剧ず寮瑰嚭灞�
-      open: false,
-      // 鏃ユ湡鑼冨洿
-      dateRange: [],
-      // 宀椾綅閫夐」
-      postOptions: [],
-      // 瑙掕壊閫夐」
-      roleOptions: [],
-      // 瀛樺偍鎵�鏈夌瀹や唬鐮�
-      allDeptCodes: [],
-      // 瀛樺偍鎵�鏈夌梾鍖轰唬鐮�
-      allWardCodes: [],
-      // 琛ㄥ崟鍙傛暟
-      form: {},
-      forms: {
-        name: "",
-      },
-      numberlb: 22,
-      dialogFormVisible: false, //娣诲姞銆佷慨鏀圭被鍒脊妗�
-      lstamendtagVisible: false, //娣诲姞銆佷慨鏀规爣绛惧脊妗�
-      goQRCodeVisible: false, //浜岀淮鐮佸脊妗�
-      sidecolumnval: "", //绫诲埆鎼滅储
-      propss: { multiple: true },
-      SeedetailsVisible: false,
-      options: store.getters.tasktypes,
-      pickerOptions: {
-        disabledDate(time) {
-          return time.getTime() < Date.now() - 3600 * 1000 * 24;
-        },
-        shortcuts: shortcuts,
-      },
-      pickerOptionsa: {
-        disabledDate(time) {
-          return time.getTime() > Date.now();
-        },
-        shortcuts: shortcuts,
-      },
-      // 鏌ヨ鏍囩鍒楄〃鍙傛暟
+      options: this.$store.getters.tasktypes,
       queryParams: {
-        pageNum: 1,
-        pageSize: 10,
         serviceType: [2],
         dateRange: [],
         statisticaltype: 1,
-        leavehospitaldistrictcodes: ["all"], // 榛樿閫変腑鍏ㄩ儴鐥呭尯
-        deptcodes: [], // 榛樿閫変腑鍏ㄩ儴绉戝
+        leavehospitaldistrictcodes: ['all'],
+        deptcodes: []
       },
-      // 鍒椾俊鎭�
-      columns: [
-        { key: 0, label: `鏍囩缂栧彿`, visible: true },
-        { key: 1, label: `鏍囩鍚嶇О`, visible: true },
-        { key: 2, label: `鏍囩鏄电О`, visible: true },
-        { key: 3, label: `閮ㄩ棬`, visible: true },
-        { key: 4, label: `鎵嬫満鍙风爜`, visible: true },
-        { key: 5, label: `鐘舵�乣, visible: true },
-        { key: 6, label: `鍒涘缓鏃堕棿`, visible: true },
-      ],
-    };
+      flatArrayhospit: [],
+      flatArraydept: [],
+      allDeptCodes: [],
+      allWardCodes: [],
+      showSearch: true,
+
+      // 寮圭獥鐩稿叧鐘舵��
+      chartDialogVisible: false,
+      chartData: [],
+      infotitleVisible: false,
+      SeedetailsVisible: false,
+      searchName: '',
+      infotitle: '',
+      infotitlelist: [],
+      patienttotal: 0,
+      logsheetlist: [],
+      Seedloading: false,
+      patientqueryParams: {
+        pn: 1,
+        ps: 10
+      }
+    }
   },
-  watch: {},
   created() {
-    this.getDeptTree();
-    this.getList();
-    this.orgname = localStorage.getItem("orgname");
+    this.getDeptTree()
   },
-
   methods: {
-    /** 鏌ヨ鏍囩鍒楄〃 */
-    getList() {
-      // 澶勭悊鏌ヨ鍙傛暟
-      const params = {
-        ...this.queryParams,
-        // 濡傛灉閫夋嫨浜�"鍏ㄩ儴"锛屽垯浼犳墍鏈夌梾鍖�/绉戝浠g爜
-        leavehospitaldistrictcodes:
-          this.queryParams.leavehospitaldistrictcodes.includes("all")
-            ? this.allWardCodes
-            : this.queryParams.leavehospitaldistrictcodes,
-        deptcodes: this.queryParams.deptcodes.includes("all")
-          ? this.allDeptCodes
-          : 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;
-      });
-    },
-    getRowKey(row) {
-      return row.statisticaltype === 1
-        ? row.leavehospitaldistrictcode
-        : row.deptcode;
-    },
-
-    // 澶勭悊琛岀偣鍑诲睍寮�
-    handleRowClick(row) {
-      console.log(row, "row");
-
-      // 濡傛灉宸茬粡灞曞紑鍒欐敹璧�
-      if (this.expands.includes(this.getRowKey(row))) {
-        this.expands = [];
-        return;
-      }
-      // 澶勭悊鏌ヨ鍙傛暟
-      const params = {
-        ...this.queryParams,
-        // 濡傛灉閫夋嫨浜�"鍏ㄩ儴"锛屽垯浼犳墍鏈夌梾鍖�/绉戝浠g爜
-        leavehospitaldistrictcodes: [row.leavehospitaldistrictcode],
-        drcode: "1",
-      };
-      // 濡傛灉璇ヨ杩樻病鏈夊姞杞藉尰鐢熸暟鎹紝鍒欏姞杞�
-      if (!row.doctorStats) {
-        this.loading = true;
-        getSfStatistics(params).then((res) => {
-          this.$set(row, "doctorStats", res.data);
-          this.expands = [this.getRowKey(row)];
-          this.loading = false;
-        });
-      } 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) {
-      console.log(row, "淇敼鏍囩");
-      this.lstamendtagVisible = true;
-      this.lstamendtag = true;
-      this.tagform = {
-        isupload: row.isupload,
-        tagname: row.tagname,
-        tagcategoryid: row.tagcategoryid,
-        tagdescription: row.tagdescription,
-        tagid: row.tagid,
-      };
-    },
-    // 鑾峰彇绉戝鏍�
     getDeptTree() {
       // 绉戝鍒楄〃
-      this.flatArraydept = store.getters.belongDepts.map((dept) => {
+      this.flatArraydept = this.$store.getters.belongDepts.map((dept) => {
         return {
           label: dept.deptName,
-          value: dept.deptCode,
-        };
-      });
-      // 瀛樺偍鎵�鏈夌瀹や唬鐮�
-      this.allDeptCodes = store.getters.belongDepts.map(
-        (dept) => dept.deptCode
-      );
+          value: dept.deptCode
+        }
+      })
+      this.allDeptCodes = this.$store.getters.belongDepts.map((dept) => dept.deptCode)
 
       // 鐥呭尯鍒楄〃
-      this.flatArrayhospit = store.getters.belongWards.map((ward) => {
+      this.flatArrayhospit = this.$store.getters.belongWards.map((ward) => {
         return {
           label: ward.districtName,
-          value: ward.districtCode,
-        };
-      });
-
-      // 瀛樺偍鎵�鏈夌梾鍖轰唬鐮�
-      this.allWardCodes = store.getters.belongWards.map(
-        (ward) => ward.districtCode
-      );
-      this.flatArraydept.push({ label: "鍏ㄩ儴", value: "all" });
-      this.flatArrayhospit.push({ label: "鍏ㄩ儴", value: "all" });
-    },
-    flattenArray(multiArray) {
-      let result = [];
-
-      // 閫掑綊鍑芥暟锛岀敤浜庡皢澶氱骇鏁扮粍杞崲涓轰竴缁存暟缁勶紝鍙寘鍚渶搴曞眰鐨勫厓绱�
-      function flatten(element) {
-        // 濡傛灉褰撳墠鍏冪礌鏈夊瓙鍏冪礌锛岀户缁�掑綊
-        if (element.children && element.children.length > 0) {
-          element.children.forEach((child) => flatten(child));
-        } else {
-          // 鍏嬮殕鍏冪礌浠ラ伩鍏嶄慨鏀瑰師濮嬫暟鎹�
-          let item = JSON.parse(JSON.stringify(element));
-          result.push(item); // 灏嗘渶搴曞眰鐨勫厓绱犳坊鍔犲埌缁撴灉鏁扮粍
+          value: ward.districtCode
         }
+      })
+      this.allWardCodes = this.$store.getters.belongWards.map((ward) => ward.districtCode)
+
+      this.flatArraydept.push({ label: '鍏ㄩ儴', value: 'all' })
+      this.flatArrayhospit.push({ label: '鍏ㄩ儴', value: 'all' })
+    },
+
+    handleTabClick(tab) {
+      this.activeTab = tab.name
+      this.loadCurrentTabData()
+    },
+
+    loadCurrentTabData() {
+      switch (this.activeTab) {
+        case 'first':
+          this.$refs.firstFollowUp.loadData()
+          break
+        case 'second':
+          this.$refs.secondFollowUp.loadData()
+          break
+        case 'continued':
+          this.$refs.continuedCare.loadData()
+          break
+      }
+    },
+
+    handleQuery() {
+      this.queryParams.startTime = this.parseTime(this.queryParams.dateRange[0])
+      this.queryParams.endTime = this.parseTime(this.queryParams.dateRange[1])
+
+      if (this.queryParams.statisticaltype == 1) {
+        this.queryParams.deptcodes = []
+      } else if (this.queryParams.statisticaltype == 2) {
+        this.queryParams.leavehospitaldistrictcodes = []
       }
 
-      // 浠庨《灞傚厓绱犲紑濮嬮�掑綊
-      multiArray.forEach((element) => flatten(element));
-      return result; // 杩斿洖鍙寘鍚渶搴曞眰鍏冪礌鐨勪竴缁存暟缁�
+      this.loadCurrentTabData()
     },
-    addladeltag() {
-      this.lstamendtagVisible = true;
-      this.lstamendtag = false;
-      this.tagform = {
-        isupload: "",
-        tagname: "",
-        tagcategoryid: "",
-        tagdescription: "",
-        tagid: "",
-      };
+
+    resetQuery() {
+      this.queryParams.dateRange = []
+      this.queryParams.leavehospitaldistrictcodes = []
+      this.handleQuery()
     },
-    Seedetails(row) {
-      this.SeedetailsVisible = true;
-      this.Seedloading = true;
-      this.patientqueryParams.starttime = this.parseTime(
-        this.queryParams.dateRange[0]
-      );
-      this.patientqueryParams.endtime = this.parseTime(
-        this.queryParams.dateRange[1]
-      );
-      this.patientqueryParams.deptcode = row.deptcode;
-      selectTimelyRate(this.patientqueryParams).then((response) => {
-        this.logsheetlist = response.data.detail;
-        this.patienttotal = response.data.total;
-        this.Seedloading = false;
-      });
+
+    async handleExport() {
+      switch (this.activeTab) {
+        case 'first':
+          await this.$refs.firstFollowUp.exportTable()
+          break
+        case 'second':
+          await this.$refs.secondFollowUp.exportTable()
+          break
+        case 'continued':
+          await this.$refs.continuedCare.exportTable()
+          break
+      }
     },
+
+    showChartDialog() {
+      this.chartData = this.getCurrentTabData()
+      this.chartDialogVisible = true
+    },
+
+    getCurrentTabData() {
+      switch (this.activeTab) {
+        case 'first':
+          return this.$refs.firstFollowUp.tableData
+        case 'second':
+          return this.$refs.secondFollowUp.tableData
+        case 'continued':
+          return this.$refs.continuedCare.tableData
+        default:
+          return []
+      }
+    },
+
     viewDetails(row, title) {
-      this.infotitleVisible = true;
-      this.infotitle = title;
-      this.infotitlelist = row;
+      this.infotitle = title
+      this.infotitlelist = row
+      this.infotitleVisible = true
     },
+
+    Seedetails(row) {
+      this.SeedetailsVisible = true
+      this.Seedloading = true
+
+      this.$refs.firstFollowUp.selectTimelyRate(row, this.queryParams.dateRange)
+        .then(response => {
+          this.logsheetlist = response.data.detail
+          this.patienttotal = response.data.total
+          this.Seedloading = false
+        })
+    },
+
+    Seedetailstion() {
+      this.$refs.firstFollowUp.selectTimelyRate(this.patientqueryParams)
+        .then(response => {
+          this.logsheetlist = response.data.detail
+          this.patienttotal = response.data.total
+        })
+    },
+
     SeedetailsgGo(row) {
-      this.SeedetailsVisible = false;
-      let type = "";
-      if (row.preachformson && row.preachformson.includes("3")) {
-        type = 1;
+      this.SeedetailsVisible = false
+      let type = ''
+      if (row.preachformson && row.preachformson.includes('3')) {
+        type = 1
       }
       setTimeout(() => {
         this.$router.push({
-          path: "/followvisit/record/detailpage/",
+          path: '/followvisit/record/detailpage/',
           query: {
             taskid: row.taskid,
             patid: row.patid,
             id: row.id,
-            Voicetype: type,
-            // visitCount: this.topqueryParams.visitCount,
-          },
-        });
-      }, 300);
-    },
-    // 娣诲姞/淇敼鏍囩
-    Maintenancetag() {
-      if (this.lstamendtag) {
-        toamendtag(this.addDateRange(this.tagform)).then((response) => {
-          console.log(response);
-          this.getList();
-        });
-      } else {
-        addapitag(this.addDateRange(this.tagform)).then((response) => {
-          console.log(response);
-          this.getList();
-        });
-      }
-      this.tagform = {
-        isupload: "",
-        tagname: "",
-        tagcategoryid: "",
-        tagdescription: "",
-        tagid: "",
-      };
-    },
-    routerErr(row) {
-      console.log(row, "璺宠浆寮傚父");
-      this.$router.push({
-        path: "/followvisit/discharge",
-        query: {
-          errtype: 1,
-          leavehospitaldistrictcode: row.leavehospitaldistrictcode,
-        },
-      });
-    },
-
-    // 琛ㄥ崟閲嶇疆
-    reset() {
-      this.form = {
-        userId: undefined,
-        deptId: undefined,
-        userName: undefined,
-        nickName: undefined,
-        password: undefined,
-        phonenumber: undefined,
-        email: undefined,
-        sex: undefined,
-        status: "0",
-        remark: undefined,
-        postIds: [],
-        roleIds: [],
-      };
-      this.resetForm("form");
-    },
-    // 鏍囩鐘舵�佷慨鏀�
-    handleStatusChange(row) {
-      console.log(row.isupload);
-      let text = row.isupload === "0" ? "鍚敤" : "鍋滅敤";
-      this.$modal
-        .confirm('纭瑕�"' + text + '""' + row.tagname + '"鏍囩鍚楋紵')
-        .then(function () {
-          return changetagcategory(row.tagid, row.isupload);
-        })
-        .then(() => {
-          this.$modal.msgSuccess(text + "鎴愬姛");
-        })
-        .catch(function () {
-          row.isupload = row.isupload === "0" ? "1" : "0";
-        });
-    },
-    /** 鎼滅储鎸夐挳鎿嶄綔 */
-    handleQuery() {
-      this.queryParams.pageNum = 1;
-      if (!this.queryParams.dateRange) this.queryParams.dateRange = [];
-      if (this.queryParams.statisticaltype == 1) {
-        this.queryParams.deptcodes = [];
-      } 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();
-    },
-    /** 閲嶇疆鎸夐挳鎿嶄綔 */
-    resetQuery() {
-      this.queryParams.dateRange = [];
-      this.queryParams.leavehospitaldistrictcodes = [];
-      this.handleQuery();
-    },
-    // 澶氶�夋閫変腑鏁版嵁
-    handleSelectionChange(selection) {
-      this.ids = selection.map((item) => item.tagid);
-      this.single = selection.length != 1;
-      this.multiple = !selection.length;
-    },
-
-    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete(row) {
-      console.log(row, "鍒犻櫎寮圭獥");
-      const tagids = row.tagid || this.ids;
-      console.log(tagids);
-      const tagname = row.tagname;
-      this.$modal
-        .confirm(
-          tagname
-            ? '鏄惁纭鍒犻櫎鏍囩鍚嶇О涓�"' + tagname + '"鐨勬暟鎹」锛�'
-            : "鏄惁纭鍒犻櫎閫変腑鐨勬暟鎹」锛�"
-        )
-        .then(function () {
-          return deletetag(tagids);
-        })
-        .then(() => {
-          this.getList();
-          this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-        })
-        .catch(() => {});
-    },
-    // 瀵煎嚭鏂规硶
-    // 鏇挎崲鎮ㄥ師鏉ョ殑 exportTable 鏂规硶
-    async exportTable() {
-      try {
-        // 鑾峰彇褰撳墠鏃ユ湡
-        const now = new Date();
-        // 鑾峰彇褰撳墠鏈堜唤锛堟敞鎰忔湀浠戒粠0寮�濮嬶紝闇�瑕佸姞1锛�
-        const currentMonth = now.getMonth() + 1;
-        // 鏋勫缓鏂囦欢鍚�
-        const excelName = `${currentMonth}鏈堝嚭闄㈤殢璁跨粺璁¤〃.xlsx`;
-        // 鍒涘缓鏂扮殑宸ヤ綔绨垮拰宸ヤ綔琛�
-        const workbook = new ExcelJS.Workbook();
-        const worksheet = workbook.addWorksheet(`${currentMonth}鏈堝嚭闄㈤殢璁跨粺璁¤〃`);
-// 瀹氫箟鏍峰紡锛堟柊澧炴�绘爣棰樻牱寮忥級
-    const titleStyle = {
-      font: {
-        name: "寰蒋闆呴粦",
-        size: 16,
-        bold: true,
-        color: { argb: "FF000000" },
-      },
-      fill: {
-        type: "pattern",
-        pattern: "solid",
-        fgColor: { argb: "FFE6F3FF" },
-      },
-      alignment: {
-        vertical: "middle",
-        horizontal: "center",
-        wrapText: true,
-      },
-      border: {
-        top: { style: "thin", color: { argb: "FFD0D0D0" } },
-        left: { style: "thin", color: { argb: "FFD0D0D0" } },
-        bottom: { style: "thin", color: { argb: "FFD0D0D0" } },
-        right: { style: "thin", color: { argb: "FFD0D0D0" } },
-      },
-    };
-        // 瀹氫箟鏍峰紡
-        const headerStyle = {
-          font: {
-            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, 23); // 鍚堝苟A1鍒癢1鐨勬墍鏈夊垪[1,4](@ref)
-    const titleCell = worksheet.getCell(1, 1);
-    titleCell.value = `${currentMonth}鏈堝嚭闄㈤殢璁跨粺璁¤〃`; // 浣跨敤鏂囦欢鍚嶄綔涓烘�绘爣棰�
-    titleCell.style = titleStyle;
-    worksheet.getRow(1).height = 35; // 璁剧疆鎬绘爣棰樿楂�
-        // 1. 棣栧厛锛屽垱寤哄苟璁剧疆绗簩琛岋紙瀛愯〃澶达級鐨勬墍鏈夊崟鍏冩牸
-        const secondRowHeaders = [
-          "", // A2 灞曞紑鍒楀崰浣嶏紙鍏跺�煎皢鐢辩涓�琛屽悎骞跺悗鐨勪富鍗曞厓鏍煎喅瀹氾級
-          "鍑洪櫌鐥呭尯",
-          "绉戝",
-          "鍑洪櫌浜烘",
-          "鏃犻渶闅忚浜烘",
-          "搴旈殢璁夸汉娆�", // B2 to F2
-          // 棣栨鍑洪櫌闅忚瀛愯〃澶�
-          "闇�闅忚",
-          "寰呴殢璁�",
-          "闅忚鎴愬姛",
-          "闅忚澶辫触",
-          "闅忚鐜�",
-          "鍙婃椂鐜�",
-          "浜哄伐",
-          "鐭俊",
-          "寰俊",
-          // 鍐嶆鍑洪櫌闅忚瀛愯〃澶�
-          "闇�闅忚",
-          "寰呴殢璁�",
-          "闅忚鎴愬姛",
-          "闅忚澶辫触",
-          "闅忚鐜�",
-          "浜哄伐",
-          "鐭俊",
-          "寰俊",
-        ];
-
-        // 娣诲姞绗簩琛岋紙鍘熺涓�琛屼笅绉伙級
-    secondRowHeaders.forEach((header, index) => {
-      const cell = worksheet.getCell(3, index + 1); // 鏀逛负绗�3琛�
-      cell.value = header;
-      cell.style = headerStyle;
-    });
-
-    // 3. 璋冩暣鍘熷悎骞跺崟鍏冩牸浣嶇疆锛堝師绗�1琛屽悎骞跺崟鍏冩牸涓嬬Щ鍒扮2琛岋級
-    // 鍚堝苟 A2:A3
-    worksheet.mergeCells(2, 1, 3, 1);
-    worksheet.getCell(2, 1).value = "";
-    worksheet.getCell(2, 1).style = headerStyle;
-
-    // 鍚堝苟 B2:B3
-    worksheet.mergeCells(2, 2, 3, 2);
-    worksheet.getCell(2, 2).value = "鍑洪櫌鐥呭尯";
-    worksheet.getCell(2, 2).style = headerStyle;
-
-    // 鍚堝苟 C2:C3
-    worksheet.mergeCells(2, 3, 3, 3);
-    worksheet.getCell(2, 3).value = "绉戝";
-    worksheet.getCell(2, 3).style = headerStyle;
-
-    // 鍚堝苟 D2:D3
-    worksheet.mergeCells(2, 4, 3, 4);
-    worksheet.getCell(2, 4).value = "鍑洪櫌浜烘";
-    worksheet.getCell(2, 4).style = headerStyle;
-
-    // 鍚堝苟 E2:E3
-    worksheet.mergeCells(2, 5, 3, 5);
-    worksheet.getCell(2, 5).value = "鏃犻渶闅忚浜烘";
-    worksheet.getCell(2, 5).style = headerStyle;
-
-    // 鍚堝苟 F2:F3
-    worksheet.mergeCells(2, 6, 3, 6);
-    worksheet.getCell(2, 6).value = "搴旈殢璁夸汉娆�";
-    worksheet.getCell(2, 6).style = headerStyle;
-
-    // 4. 璋冩暣妯悜鍚堝苟鏍囬浣嶇疆锛堜笅绉诲埌绗�2琛岋級
-    // 棣栨鍑洪櫌闅忚锛堝悎骞禛2:O2锛�
-    worksheet.mergeCells(2, 7, 2, 15); // G2:O2
-    worksheet.getCell(2, 7).value = "棣栨鍑洪櫌闅忚";
-    worksheet.getCell(2, 7).style = headerStyle;
-
-    // 鍐嶆鍑洪櫌闅忚锛堝悎骞禤2:W2锛�
-    worksheet.mergeCells(2, 16, 2, 23); // P2:W2
-    worksheet.getCell(2, 16).value = "鍐嶆鍑洪櫌闅忚";
-    worksheet.getCell(2, 16).style = headerStyle;
-
-    // 5. 璁剧疆琛岄珮
-    worksheet.getRow(1).height = 35; // 鎬绘爣棰樿楂�
-    worksheet.getRow(2).height = 28; // 鍘熺涓�琛屼笅绉�
-    worksheet.getRow(3).height = 25; // 鍘熺浜岃涓嬬Щ
-
-    // 6. 娣诲姞鏁版嵁琛岋紙娉ㄦ剰琛岀储寮曢渶瑕�+1锛屽洜涓轰笂闈㈡彃鍏ヤ簡涓�琛岋級
-    this.userList.forEach((item, rowIndex) => {
-      const dataRow = worksheet.addRow([
-        "", // 灞曞紑鍒�
-        item.leavehospitaldistrictname || "",
-        item.deptname || "",
-        item.dischargeCount || 0,
-        item.nonFollowUp || 0,
-        item.followUpNeeded || 0,
-        // 棣栨鍑洪櫌闅忚鏁版嵁
-        item.needFollowUp || 0,
-        item.pendingFollowUp || 0,
-        item.followUpSuccess || 0,
-        item.followUpFail || 0,
-        item.followUpRate || "0%",
-        item.rate ? (Number(item.rate) * 100).toFixed(2) + "%" : "0%",
-        item.manual || 0,
-        item.sms || 0,
-        item.weChat || 0,
-        // 鍐嶆鍑洪櫌闅忚鏁版嵁
-        item.needFollowUpAgain || 0,
-        item.pendingFollowUpAgain || 0,
-        item.followUpSuccessAgain || 0,
-        item.followUpFailAgain || 0,
-        item.followUpRateAgain || "0%",
-        item.manualAgain || 0,
-        item.smsAgain || 0,
-        item.weChatAgain || 0,
-      ], rowIndex + 4); // 浠庣4琛屽紑濮嬫坊鍔犳暟鎹紙鍘熺3琛岋級
-
-      // 搴旂敤鏁版嵁琛屾牱寮�
-      dataRow.eachCell((cell) => {
-        cell.style = cellStyle;
-      });
-      dataRow.height = 24;
-    });
-
-        // 娣诲姞鍚堣琛�
-        const summaries = this.getSummaries({
-          columns: [
-            { property: "" },
-            { property: "leavehospitaldistrictname" },
-            { property: "deptname" },
-            { property: "dischargeCount" },
-            { property: "nonFollowUp" },
-            { property: "followUpNeeded" },
-            { property: "needFollowUp" },
-            { property: "pendingFollowUp" },
-            { property: "followUpSuccess" },
-            { property: "followUpFail" },
-            { property: "followUpRate" },
-            { property: "rate" },
-            { property: "manual" },
-            { property: "sms" },
-            { property: "weChat" },
-            { property: "needFollowUpAgain" },
-            { property: "pendingFollowUpAgain" },
-            { property: "followUpSuccessAgain" },
-            { property: "followUpFailAgain" },
-            { property: "followUpRateAgain" },
-            { property: "manualAgain" },
-            { property: "smsAgain" },
-            { property: "weChatAgain" },
-          ],
-          data: this.userList,
-        });
-
-        const summaryRow = worksheet.addRow(summaries);
-        summaryRow.eachCell((cell, colNumber) => {
-          cell.style = summaryStyle;
-          // 绗竴鍒楁樉绀�"鍚堣"
-          if (colNumber === 1) {
-            cell.value = "鍚堣";
+            Voicetype: type
           }
-        });
-        summaryRow.height = 28;
-
-        // 璁剧疆鍒楀
-        worksheet.columns = [
-          { width: 8 }, // 灞曞紑鍒�
-          { width: 20 }, // 鍑洪櫌鐥呭尯
-          { width: 15 }, // 绉戝
-          { width: 12 }, // 鍑洪櫌浜烘
-          { width: 12 }, // 鏃犻渶闅忚浜烘
-          { width: 12 }, // 搴旈殢璁夸汉娆�
-          // 棣栨鍑洪櫌闅忚鍒�
-          { width: 10 },
-          { width: 10 },
-          { width: 10 },
-          { width: 10 },
-          { width: 12 },
-          { width: 12 },
-          { width: 8 },
-          { width: 8 },
-          { width: 8 },
-          // 鍐嶆鍑洪櫌闅忚鍒�
-          { width: 10 },
-          { width: 10 },
-          { width: 10 },
-          { width: 10 },
-          { width: 12 },
-          { width: 8 },
-          { width: 8 },
-          { width: 8 },
-        ];
-
-        // 鐢熸垚骞朵笅杞芥枃浠�
-        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;
-      }
+        })
+      }, 300)
     },
 
-    // 鏄剧ず鍥捐〃寮圭獥
-
-    showChartDialog() {
-      this.chartDialogVisible = true;
-      this.$nextTick(() => {
-        this.initPieChart();
-        this.initBarLineChart();
-      });
-    },
-    // 鍦╩ethods涓慨鏀圭粺璁℃柟娉�
-    showChartDialog() {
-      this.chartDialogVisible = true;
-      this.$nextTick(() => {
-        console.log(this.userList, "this.userList");
-
-        this.initCharts();
-      });
-    },
-
-    // 鏂板鍒濆鍖栧浘琛ㄦ柟娉�
-    initCharts() {
-      this.initPieChart();
-      this.initBarLineChart();
-    },
-
-    // 鍒濆鍖栭ゼ鍥�
-    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,
-          },
-        },
-        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",
-              },
-              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.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() {
-      if (this.pieChart) {
-        this.pieChart.resize();
-      }
-    },
-
-    resizeBarLineChart() {
-      if (this.barLineChart) {
-        this.barLineChart.resize();
-      }
-    },
-
-    // 鍦ㄧ粍浠堕攢姣佹椂娓呯悊
-    beforeDestroy() {
-      // 绉婚櫎浜嬩欢鐩戝惉
-      window.removeEventListener("resize", this.resizePieChart);
-      window.removeEventListener("resize", this.resizeBarLineChart);
-
-      // 閿�姣佸浘琛ㄥ疄渚�
-      if (this.pieChart) {
-        this.pieChart.dispose();
-        this.pieChart = null;
-      }
-      if (this.barLineChart) {
-        this.barLineChart.dispose();
-        this.barLineChart = null;
-      }
-    },
-  },
-};
+    handleSearch() {
+      // 鎼滅储閫昏緫
+    }
+  }
+}
 </script>
 
 <style lang="scss" scoped>
-.sidecolumn {
-  width: 180px;
-  min-height: 100vh;
-  text-align: center;
-  //   display: flex;
-  margin-top: 20px;
-  margin: 20px;
-  padding: 30px;
-  background: #edf1f7;
-  border: 1px solid #dcdfe6;
-  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
-    0 0 6px 0 rgba(0, 0, 0, 0.04);
-  .sidecolumn-top {
-    display: flex;
-    justify-content: space-between;
-    .top-wj {
-      font-size: 20px;
-    }
-    .top-tj {
-      font-size: 18px;
-
-      color: rgb(0, 89, 255);
-      cursor: pointer;
-    }
-  }
-  .center-ss {
-    margin-top: 30px;
-    .input-with-select {
-      height: 40px !important;
-    }
-  }
-  .bottom-fl {
-    margin-top: 30px;
-    display: center !important;
-  }
-}
-.qrcode-dialo {
-  text-align: center;
-  //   display: flex;
-  margin: 20px;
-  padding: 30px;
-  background: #edf1f7;
-  border: 1px solid #dcdfe6;
-  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
-    0 0 6px 0 rgba(0, 0, 0, 0.04);
-  .qrcode-text {
-    font-size: 20px;
-    span {
-      margin-left: 20px;
-    }
-  }
-  .qrcode-img {
-    width: 300px;
-    height: 400px;
-  }
-}
-::v-deep.el-tabs--left,
-.el-tabs--right {
-  overflow: hidden;
-  align-items: center;
-  display: flex;
-}
-::v-deep.el-input--medium .el-input__inner {
-  height: 40px !important;
-}
-::v-deep.el-tabs--right .el-tabs__active-bar.is-right {
-  height: 40px;
-  width: 5px;
-  left: 0;
-}
-::v-deep.el-tabs--right .el-tabs__item.is-right {
-  display: block;
-  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;
-  //   flex: 1;
-  // width: 80%;
-  // margin-top: 20px;
-  margin: 20px;
-  padding: 30px;
+.follow-up-statistics {
+  padding: 20px;
   background: #ffff;
   border: 1px solid #dcdfe6;
-  -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12),
-    0 0 6px 0 rgba(0, 0, 0, 0.04);
-  .mulsz {
-    font-size: 20px;
-  }
-}
-/* 浣胯鏈夋墜鍨嬫寚閽� */
-.el-table__row {
-  cursor: pointer;
-}
-/* 鍐呭眰鍖荤敓琛ㄦ牸鏍峰紡 */
-.inner-table {
-  // 琛ㄥご鑳屾櫙鑹�
-  ::v-deep .el-table__header-wrapper {
-    background-color: #f0f7ff !important;
+  box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.12), 0 0 6px 0 rgba(0, 0, 0, 0.04);
 
-    th {
-      background-color: #f0f7ff !important;
+  .search-section {
+    margin-bottom: 20px;
+  }
+
+  .tab-section {
+    ::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;
     }
   }
-
-  // 琛ㄦ牸琛岃儗鏅壊
-  ::v-deep .el-table__body-wrapper {
-    tr {
-      background-color: #f9fbfe !important;
-
-      &:hover {
-        background-color: #e6f1ff !important;
-      }
-    }
-  }
-
-  // 杈规棰滆壊
-  ::v-deep .el-table--border {
-    border-color: #d9e8ff !important;
-
-    td,
-    th {
-      border-color: #d9e8ff !important;
-    }
-  }
-
-  // 鏂戦┈绾规晥鏋�
-  ::v-deep .el-table--striped .el-table__body tr.el-table__row--striped td {
-    background-color: #f5f9ff !important;
-  }
-}
-/* 灞曞紑琛屾牱寮� */
-.el-table__expanded-cell {
-  padding: 10px 0 !important;
-  background: #f8f8f8;
-}
-.document {
-  width: 100px;
-  height: 50px;
-}
-.documentf {
-  display: flex;
-  justify-content: flex-end;
-}
-.button-text {
-  color: rgb(70, 204, 238);
-}
-.button-textck {
-  color: rgb(39, 167, 67);
-}
-.button-textxg {
-  color: rgb(35, 81, 233);
-}
-.button-textsc {
-  color: rgb(235, 23, 23);
 }
 </style>

--
Gitblit v1.9.3