This commit is contained in:
2024-11-07 14:57:27 +08:00
parent d1ff25ff24
commit b77fd4c06e
2 changed files with 112 additions and 190 deletions

View File

@ -0,0 +1,19 @@
import request from '@/utils/request'
// 随访明细表查询
export function getFollowUpDetail(query) {
return request({
url: '/system/statistics/getFollowUpDetail',
method: 'get',
params: query
})
}
// 随访成功率统计
export function getFollowUpRate(query) {
return request({
url: `/system/statistics/getFollowUpRate`,
method: 'get',
params: query
})
}

View File

@ -40,7 +40,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button> <el-button type="primary" icon="el-icon-search" size="mini" @click="getList">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button> <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -49,32 +49,32 @@
<div class="app"> <div class="app">
<div class="content"> <div class="content">
<div class="words">AI电话拨打次数</div> <div class="words">AI电话拨打次数</div>
<div class="num">350</div> <div class="num">{{ echartlist.aiNum }}</div>
<div class="rate">成功率:</div> <div class="rate">成功率:</div>
<el-progress :percentage="60"></el-progress> <el-progress :percentage="echartlist.aiSuccessRate"></el-progress>
</div> </div>
<div class="content"> <div class="content">
<div class="words">人工电话拨打次数</div> <div class="words">人工电话拨打次数</div>
<div class="num">600</div> <div class="num">{{ echartlist.commonNum }}</div>
<div class="rate">成功率:</div> <div class="rate">成功率:</div>
<el-progress :percentage="90"></el-progress> <el-progress :percentage="echartlist.commonSuccessRate"></el-progress>
</div> </div>
<div class="content"> <div class="content">
<div class="words">AI电话拨打人数</div> <div class="words">AI电话拨打人数</div>
<div class="num">200</div> <div class="num">{{ echartlist.aiPatientNum }}</div>
<div class="rate">成功率:</div> <div class="rate">成功率:</div>
<el-progress :percentage="60"></el-progress> <el-progress :percentage="echartlist.aiPatientSuccessRate"></el-progress>
</div> </div>
<div class="content"> <div class="content">
<div class="words">人工电话拨打人数</div> <div class="words">人工电话拨打人数</div>
<div class="num">400</div> <div class="num">{{ echartlist.commonPatientNum }}</div>
<div class="rate">成功率:</div> <div class="rate">成功率:</div>
<el-progress :percentage="90"></el-progress> <el-progress :percentage="echartlist.commonPatientSuccessRate"></el-progress>
</div> </div>
<div class="content" style="margin-right: 0;"> <div class="content" style="margin-right: 0;">
<div class="words" style="top:20px;font-size: 17px;">总通话人数600</div> <div class="words" style="top:20px;font-size: 17px;">总通话人数{{ echartlist.sumPatientNum }}</div>
<div class="words" style="top:60px;font-size: 17px;">短信发送数300</div> <div class="words" style="top:60px;font-size: 17px;">短信发送数{{ echartlist.smsNum }}</div>
<div class="words" style="top:100px;font-size: 17px;">小程序通知数350</div> <div class="words" style="top:100px;font-size: 17px;">小程序通知数{{ echartlist.subscribeNum }}</div>
</div> </div>
</div> </div>
<div class="trend"> <div class="trend">
@ -86,69 +86,42 @@
</div> </div>
<div class="trend" style="padding-bottom: 50px;"> <div class="trend" style="padding-bottom: 50px;">
<div class="tabletitles"> <div class="tabletitles">
<div :class="tapbtn == 1 ? 'tabletitleleft taptitle' : 'tabletitleleft'" @click="tapbtn = 1"> <div :class="queryParams.type == 'dept' ? 'tabletitleleft taptitle' : 'tabletitleleft'"
@click="clicktype('dept')">
科室/人员 科室/人员
</div> </div>
<div :class="tapbtn == 2 ? 'tabletitleright taptitle' : 'tabletitleright'" @click="tapbtn = 2"> <div :class="queryParams.type == 'date' ? 'tabletitleright taptitle' : 'tabletitleright'"
@click="clicktype('date')">
日期 日期
</div> </div>
</div> </div>
<el-descriptions title="随访明细表" style="padding:20px 0 0 15px;" /> <el-descriptions title="随访明细表" style="padding:20px 0 0 15px;" />
<div v-if="tapbtn == 1"> <el-table :data="tableData" style="width: 98%;margin:0 auto;" row-key="rowId" border v-loading="loading"
<el-table :data="tableData" style="width: 98%;margin:0 auto;" row-key="id" border :tree-props="{ children: 'childerenList', hasChildren: 'hasChildren' }">
:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"> <el-table-column prop="rowName" label="科室/人员">
<el-table-column prop="ksry" label="科室/人员">
</el-table-column> </el-table-column>
<el-table-column prop="jzcyrs" label="就诊/出院人数" sortable> <el-table-column prop="patientNum" label="就诊/出院人数" sortable>
</el-table-column> </el-table-column>
<el-table-column prop="ysfjhrs" label="有随访计划人数"> <el-table-column prop="followUpNum" label="有随访计划人数">
</el-table-column> </el-table-column>
<el-table-column prop="sffgl" label="随访覆盖率" sortable> <el-table-column prop="followUpCoverRate" label="随访覆盖率" sortable>
</el-table-column> </el-table-column>
<el-table-column prop="sfcgrs" label="随访成功人数"> <el-table-column prop="followUpSuccessNum" label="随访成功人数">
</el-table-column> </el-table-column>
<el-table-column prop="sfcglr" label="随访成功率(人)"> <el-table-column prop="followUpSuccessRate" label="随访成功率">
</el-table-column>
<el-table-column prop="sfjhcs" label="随访计划次数(任务)">
</el-table-column>
<el-table-column prop="sfjhcgs" label="随访计划成功数(任务)">
</el-table-column>
<el-table-column prop="sfcglrw" label="随访成功率(任务)">
</el-table-column>
<el-table-column prop="sfjhsbs" label="随访计划失败数(任务)">
</el-table-column>
<el-table-column prop="sfjhsbl" label="随访计划失败率(任务)">
</el-table-column>
</el-table>
</div>
<div v-if="tapbtn == 2">
<el-table :data="tableDatasj" style="width: 98%;margin:0 auto;" border>
<el-table-column prop="tjsj" label="统计时间">
</el-table-column>
<el-table-column prop="jzcyrs" label="就诊/出院人数" sortable>
</el-table-column>
<el-table-column prop="ysfjhrs" label="有随访计划人数">
</el-table-column>
<el-table-column prop="sffgl" label="随访覆盖率" sortable>
</el-table-column>
<el-table-column prop="sfcgrs" label="随访成功人数">
</el-table-column>
<el-table-column prop="sfcgl" label="随访成功率">
</el-table-column> </el-table-column>
<el-table-column label="按随访任务(方式)"> <el-table-column label="按随访任务(方式)">
<el-table-column prop="zndhcs" label="智能电话次数"> <el-table-column prop="aiNum" label="AI电话次数">
</el-table-column> </el-table-column>
<el-table-column prop="zndhcgl" label="智能电话成功率"> <el-table-column prop="aiSuccessRate" label="AI电话成功率">
</el-table-column> </el-table-column>
<el-table-column prop="rgsfcs" label="人工随访次数"> <el-table-column prop="commonNum" label="人工随访次数">
</el-table-column> </el-table-column>
<el-table-column prop="rgsfcgl" label="人工随访成功率"> <el-table-column prop="commonSuccessRate" label="人工随访成功率">
</el-table-column> </el-table-column>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
</div>
</div> </div>
</div> </div>
</template> </template>
@ -158,6 +131,10 @@ import {
selectAgencyList, selectAgencyList,
getAgencyList, getAgencyList,
} from "@/api/manage/selectAgencyList"; } from "@/api/manage/selectAgencyList";
import {
getFollowUpDetail,
getFollowUpRate
} from '@/api/system/followupstatistics'
import * as echarts from 'echarts'; import * as echarts from 'echarts';
export default { export default {
name: "followupstatistics", name: "followupstatistics",
@ -166,8 +143,6 @@ export default {
maxTableHeight: undefined, maxTableHeight: undefined,
// //
queryParams: { queryParams: {
pageNum: 1,
pageSize: 10,
startDate: null, startDate: null,
endDate: null, endDate: null,
hospitalAgencyId: null, hospitalAgencyId: null,
@ -178,6 +153,7 @@ export default {
departmentName: null, departmentName: null,
wardId: null, wardId: null,
wardName: null, wardName: null,
type: 'dept'
}, },
visitDate: [], visitDate: [],
//list //list
@ -188,124 +164,24 @@ export default {
departmentlist: [], departmentlist: [],
//list //list
wardlist: [], wardlist: [],
tapbtn: 1, echartlist: [],
tableData: [{ loading: false,
id: 1, tableData: [],
ksry: '总计',
jzcyrs: '66',
ysfjhrs: '76',
sffgl: '116%',
sfcgrs: '69',
sfcglr: '105%',
sfjhcs: '387',
sfjhcgs: '260',
sfcglrw: '77%',
sfjhsbs: '140',
sfjhsbl: '36%'
}, {
id: 2,
ksry: '骨伤科',
jzcyrs: '18',
ysfjhrs: '26',
sffgl: '145%',
sfcgrs: '26',
sfcglr: '145%',
sfjhcs: '387',
sfjhcgs: '260',
sfcglrw: '77%',
sfjhsbs: '140',
sfjhsbl: '36%'
}, {
id: 3,
ksry: '妇科',
jzcyrs: '66',
ysfjhrs: '76',
sffgl: '116%',
sfcgrs: '69',
sfcglr: '105%',
sfjhcs: '387',
sfjhcgs: '260',
sfcglrw: '77%',
sfjhsbs: '140',
sfjhsbl: '36%',
children: [{
id: 31,
ksry: '张三',
jzcyrs: '66',
ysfjhrs: '76',
sffgl: '116%',
sfcgrs: '69',
sfcglr: '105%',
sfjhcs: '387',
sfjhcgs: '260',
sfcglrw: '77%',
sfjhsbs: '140',
sfjhsbl: '36%',
}, {
id: 32,
ksry: '李四',
jzcyrs: '66',
ysfjhrs: '76',
sffgl: '116%',
sfcgrs: '69',
sfcglr: '105%',
sfjhcs: '387',
sfjhcgs: '260',
sfcglrw: '77%',
sfjhsbs: '140',
sfjhsbl: '36%',
}]
}, {
id: 4,
ksry: '肾内科',
jzcyrs: '66',
ysfjhrs: '76',
sffgl: '116%',
sfcgrs: '69',
sfcglr: '105%',
sfjhcs: '387',
sfjhcgs: '260',
sfcglrw: '77%',
sfjhsbs: '140',
sfjhsbl: '36%',
}],
tableDatasj: [{
id: 5,
tjsj: '2024-10',
jzcyrs: '66',
ysfjhrs: '76',
sffgl: '116%',
sfcgrs: '69',
sfcgl: '105%',
zndhcs: '7',
zndhcgl: '84%',
rgsfcs: '1',
rgsfcgl: '100%',
}, {
id: 6,
tjsj: '2024-09',
jzcyrs: '18',
ysfjhrs: '26',
sffgl: '145%',
sfcgrs: '26',
sfcgl: '145%',
zndhcs: '3',
zndhcgl: '30%',
rgsfcs: '2',
rgsfcgl: '50%',
}],
}; };
}, },
created() { created() {
this.selectAgencyinfo(); this.selectAgencyinfo();
this.getList();
}, },
mounted() { mounted() {
this.echartinfo();
this.echartinfotwo();
this.getMaxTableHeight() this.getMaxTableHeight()
this.screenChange() this.screenChange()
}, },
methods: { methods: {
clicktype(index) {
this.queryParams.type = index
this.getFollowUpDetailinfo();
},
echartinfo() { echartinfo() {
var chartDom = document.getElementById('leftechart'); var chartDom = document.getElementById('leftechart');
var myChart = echarts.init(chartDom); var myChart = echarts.init(chartDom);
@ -324,7 +200,7 @@ export default {
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
data: ['2024年9月', '2024年10月'] data: this.echartlist.numTrendVoList.map(e => e.followUpMonth)
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
@ -334,7 +210,7 @@ export default {
{ {
name: 'AI电话拨打人数', name: 'AI电话拨打人数',
type: 'line', type: 'line',
data: [120, 200], data: this.echartlist.numTrendVoList.map(e => e.aiPatientNum),
lineStyle: { lineStyle: {
width: 3, width: 3,
color: '#942CCA', color: '#942CCA',
@ -343,7 +219,7 @@ export default {
{ {
name: '人工电话拨打人数', name: '人工电话拨打人数',
type: 'line', type: 'line',
data: [220, 400], data: this.echartlist.numTrendVoList.map(e => e.commonPatientNum),
lineStyle: { lineStyle: {
width: 3, width: 3,
color: '#22B14C', color: '#22B14C',
@ -352,7 +228,7 @@ export default {
{ {
name: '短信发送数', name: '短信发送数',
type: 'line', type: 'line',
data: [150, 300], data: this.echartlist.numTrendVoList.map(e => e.smsNum),
lineStyle: { lineStyle: {
width: 3, width: 3,
color: '#ED1C24', color: '#ED1C24',
@ -361,7 +237,7 @@ export default {
{ {
name: '小程序通知数', name: '小程序通知数',
type: 'line', type: 'line',
data: [320, 350], data: this.echartlist.numTrendVoList.map(e => e.subscribeNum),
lineStyle: { lineStyle: {
width: 3, width: 3,
color: '#FF7F27', color: '#FF7F27',
@ -380,7 +256,7 @@ export default {
formatter: function (params) { formatter: function (params) {
var result = params[0].name + "<br>"; var result = params[0].name + "<br>";
params.forEach(function (item) { params.forEach(function (item) {
if (item.value) { if (item.value >= 0) {
result += item.marker + " " + item.seriesName + " : " + item.value + "%</br>"; result += item.marker + " " + item.seriesName + " : " + item.value + "%</br>";
} else { } else {
result += item.marker + " " + item.seriesName + " : - </br>"; result += item.marker + " " + item.seriesName + " : - </br>";
@ -400,7 +276,7 @@ export default {
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
data: ['2024年9月', '2024年10月'] data: this.echartlist.rateTrendVoList.map(e => e.followUpMonth)
}, },
yAxis: [ yAxis: [
{ {
@ -424,7 +300,7 @@ export default {
{ {
name: 'AI电话拨打次数成功率', name: 'AI电话拨打次数成功率',
type: 'line', type: 'line',
data: [15, 60], data: this.echartlist.rateTrendVoList.map(e => e.aiSuccessRate),
lineStyle: { lineStyle: {
width: 3, width: 3,
color: '#FFF200', color: '#FFF200',
@ -433,7 +309,7 @@ export default {
{ {
name: '人工电话拨打次数成功率', name: '人工电话拨打次数成功率',
type: 'line', type: 'line',
data: [32, 90], data: this.echartlist.rateTrendVoList.map(e => e.commonSuccessRate),
lineStyle: { lineStyle: {
width: 3, width: 3,
color: '#00A2E8', color: '#00A2E8',
@ -442,7 +318,7 @@ export default {
{ {
name: 'AI电话拨打人数成功率', name: 'AI电话拨打人数成功率',
type: 'line', type: 'line',
data: [12, 60], data: this.echartlist.rateTrendVoList.map(e => e.aiPatientSuccessRate),
lineStyle: { lineStyle: {
width: 3, width: 3,
color: '#3F48CC', color: '#3F48CC',
@ -451,7 +327,7 @@ export default {
{ {
name: '人工电话拨打人数成功率', name: '人工电话拨打人数成功率',
type: 'line', type: 'line',
data: [22, 90], data: this.echartlist.rateTrendVoList.map(e => e.commonPatientSuccessRate),
lineStyle: { lineStyle: {
width: 3, width: 3,
color: '#880015', color: '#880015',
@ -462,7 +338,7 @@ export default {
option && myChart.setOption(option); option && myChart.setOption(option);
}, },
/** 查询 */ /** 查询 */
getList() { async getList() {
if (this.visitDate?.length > 0) { if (this.visitDate?.length > 0) {
this.queryParams.startDate = this.visitDate[0]; this.queryParams.startDate = this.visitDate[0];
this.queryParams.endDate = this.visitDate[1]; this.queryParams.endDate = this.visitDate[1];
@ -470,11 +346,37 @@ export default {
this.queryParams.startDate = null; this.queryParams.startDate = null;
this.queryParams.endDate = null; this.queryParams.endDate = null;
} }
await getFollowUpRate(this.queryParams).then(res => {
this.echartlist = res.data
this.echartinfo();
this.echartinfotwo();
this.getFollowUpDetailinfo();
})
}, },
/** 搜索按钮操作 */ async getFollowUpDetailinfo() {
handleQuery() { if (this.visitDate?.length > 0) {
this.queryParams.pageNum = 1; this.queryParams.startDate = this.visitDate[0];
this.getList(); this.queryParams.endDate = this.visitDate[1];
} else {
this.queryParams.startDate = null;
this.queryParams.endDate = null;
}
this.loading = true
await getFollowUpDetail(this.queryParams).then(res => {
var id = 1
res.data.forEach(e => {
id++
e.rowId = id
if (e.childerenList?.length > 0) {
e.childerenList.forEach(el => {
id++
el.rowId = id
})
}
})
this.tableData = res.data
this.loading = false
})
}, },
/** 重置按钮操作 */ /** 重置按钮操作 */
resetQuery() { resetQuery() {
@ -482,6 +384,7 @@ export default {
this.queryParams.visitDateStart = null; this.queryParams.visitDateStart = null;
this.queryParams.visitDateEnd = null; this.queryParams.visitDateEnd = null;
this.resetForm("queryForm"); this.resetForm("queryForm");
this.getList();
}, },
selectAgencyinfo() { selectAgencyinfo() {
let query = { let query = {