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