|
@@ -9,7 +9,9 @@
|
|
|
<i class="el-icon-arrow-down el-icon--right"></i>
|
|
|
</el-button>
|
|
|
<el-dropdown-menu slot="dropdown">
|
|
|
- <el-dropdown-item v-for="(item, index) in yearList" :key="index" @click.native="funSeleterYear(item)">{{ item.name }}</el-dropdown-item>
|
|
|
+ <el-dropdown-item v-for="(item, index) in yearList" :key="index" @click.native="funSeleterYear(item)">
|
|
|
+ {{ item.name }}
|
|
|
+ </el-dropdown-item>
|
|
|
</el-dropdown-menu>
|
|
|
</el-dropdown>
|
|
|
|
|
@@ -19,11 +21,14 @@
|
|
|
<i class="el-icon-arrow-down el-icon--right"></i>
|
|
|
</el-button>
|
|
|
<el-dropdown-menu slot="dropdown">
|
|
|
- <el-dropdown-item v-for="(item, index) in quarterList" :key="index" @click.native="funSeleterQuarter(item)">{{ item.name }}</el-dropdown-item>
|
|
|
+ <el-dropdown-item v-for="(item, index) in quarterList" :key="index"
|
|
|
+ @click.native="funSeleterQuarter(item)">{{ item.name }}
|
|
|
+ </el-dropdown-item>
|
|
|
</el-dropdown-menu>
|
|
|
</el-dropdown>
|
|
|
<div class="selects">
|
|
|
- <el-date-picker v-model="formData.startTime" type="date" format="yyyy 年 MM 月 dd 日" value-format="yyyyMMdd" placeholder="开始日期"></el-date-picker>
|
|
|
+ <el-date-picker v-model="formData.startTime" type="date" format="yyyy 年 MM 月 dd 日"
|
|
|
+ value-format="yyyyMMdd" placeholder="开始日期"></el-date-picker>
|
|
|
|
|
|
<el-date-picker
|
|
|
v-model="formData.endTime"
|
|
@@ -39,7 +44,7 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
<div class="cardBox">
|
|
|
- <Title :title="'运行病历数量'" />
|
|
|
+ <Title :title="'运行病历数量'"/>
|
|
|
<div class="contentBox">
|
|
|
<div class="left">
|
|
|
<div class="l">
|
|
@@ -58,7 +63,7 @@
|
|
|
</div>
|
|
|
<!-- 科室排名 -->
|
|
|
<div class="chart">
|
|
|
- <Title :title="'科室排名'" />
|
|
|
+ <Title :title="'科室排名'"/>
|
|
|
<div id="myChart1" style="width: 100%; height: 600px"></div>
|
|
|
</div>
|
|
|
|
|
@@ -79,20 +84,21 @@
|
|
|
<el-form :inline="true" :model="caseSearchData" class="demo-form-inline">
|
|
|
<el-form-item label="">
|
|
|
<el-select v-model="caseSearchData.department" filterable clearable placeholder="科室">
|
|
|
- <el-option v-for="(item, index) in departmentList" :label="item.name" :value="item.name" :key="index"></el-option>
|
|
|
+ <el-option v-for="(item, index) in departmentList" :label="item.name" :value="item.name"
|
|
|
+ :key="index"></el-option>
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" @click="getCaseList">查询</el-button>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
- <ProblemTableBoxVue :data="caseList" />
|
|
|
+ <ProblemTableBoxVue :data="caseList"/>
|
|
|
</div>
|
|
|
</el-collapse-transition>
|
|
|
|
|
|
|
|
|
</div>
|
|
|
-
|
|
|
+
|
|
|
<!-- 医师排名 -->
|
|
|
<div class="bg-card" style="margin-bottom: 24px; padding">
|
|
|
<CardTitle title="医师排名">
|
|
@@ -142,7 +148,9 @@
|
|
|
align="center">
|
|
|
<template slot-scope="scope">
|
|
|
<!-- <span class="link" @click="goto('/caseNumber?doctor_name='+ scope.row.key +'&sort=doc_count')" style="color: #004983;">{{ scope.row.doc_count }}例</span> -->
|
|
|
- <span class="link" @click="goto('/caseNumber')" style="color: #004983;">{{ scope.row.doc_count }}例</span>
|
|
|
+ <span class="link" @click="goto(`/doctor/bl?doctor_name=${scope.row.key}&start_time=${start_time}&end_time=${end_time}`)" style="color: #004983;">{{
|
|
|
+ scope.row.doc_count
|
|
|
+ }}例</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column
|
|
@@ -150,14 +158,15 @@
|
|
|
label="总扣分"
|
|
|
align="center">
|
|
|
<template slot-scope="scope">
|
|
|
- <span class="link" @click="toPageDoctor(scope.row,'score')" style="color: #004983;">-{{ scope.row.score }}分</span>
|
|
|
+ <span class="link" @click="toPageDoctor(scope.row,'score')"
|
|
|
+ style="color: #004983;">-{{ scope.row.score }}分</span>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column
|
|
|
prop="avg_score"
|
|
|
label="平均分"
|
|
|
align="center"
|
|
|
- >
|
|
|
+ >
|
|
|
<template slot-scope="scope">
|
|
|
<span>{{ scope.row.avg_score }}分</span>
|
|
|
</template>
|
|
@@ -174,7 +183,7 @@
|
|
|
</el-pagination>
|
|
|
</el-col>
|
|
|
<el-col :span="11">
|
|
|
- <DoctorRankVue v-if="doctor_rank.length" :data="doctor_rank" />
|
|
|
+ <DoctorRankVue v-if="doctor_rank.length" :data="processedData"/>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
</div>
|
|
@@ -182,14 +191,14 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|
|
|
-
|
|
|
- <script>
|
|
|
+
|
|
|
+<script>
|
|
|
import * as echarts from 'echarts';
|
|
|
-import { mapGetters } from 'vuex';
|
|
|
+import {mapGetters} from 'vuex';
|
|
|
import Title from '@/components/Title';
|
|
|
import ProblemTableBoxVue from './components/ProblemTableBox.vue';
|
|
|
import MedicalRecordTableBoxVue from './components/MedicalRecordTableBox.vue';
|
|
|
-import { medicalRecordDoctorExport } from '@/api/excel'
|
|
|
+import {medicalRecordDoctorExport} from '@/api/excel'
|
|
|
import DoctorRankVue from './components/DoctorRank.vue'
|
|
|
|
|
|
export default {
|
|
@@ -202,9 +211,16 @@ export default {
|
|
|
name: 'Dashboard',
|
|
|
computed: {
|
|
|
...mapGetters(['name']),
|
|
|
+ processedData() {
|
|
|
+ // 在计算属性中进行数据处理,返回处理后的结果
|
|
|
+ return this.makeDoctorRank(this.doctor_rank);
|
|
|
+ }
|
|
|
},
|
|
|
data() {
|
|
|
return {
|
|
|
+ start_time:'',
|
|
|
+ end_time:'',
|
|
|
+ doctor_rank:[],
|
|
|
formData: {
|
|
|
rangeDate: [],
|
|
|
chooseDate: '',
|
|
@@ -236,8 +252,8 @@ export default {
|
|
|
},
|
|
|
caseList: [],
|
|
|
departmentList: [],
|
|
|
- doctorList:[], // 医生列表
|
|
|
- doctor_name:'',
|
|
|
+ doctorList: [], // 医生列表
|
|
|
+ doctor_name: '',
|
|
|
quxian_show: true,
|
|
|
// 医师排名
|
|
|
doctor_show: true,
|
|
@@ -251,6 +267,13 @@ export default {
|
|
|
};
|
|
|
},
|
|
|
mounted() {
|
|
|
+ const date = new Date();
|
|
|
+ const year = date.getFullYear();
|
|
|
+ const month = String(date.getMonth() + 1).padStart(2, "0");
|
|
|
+ const day = String(date.getDate()).padStart(2, "0");
|
|
|
+ this.start_time = `${year}0101`;
|
|
|
+ this.end_time = `${year}${month}${day}`;
|
|
|
+
|
|
|
this.doctor_rank = JSON.parse(JSON.stringify(this.doctor_tableData)).slice(0, 10)
|
|
|
this.storageSet('start_time', '');
|
|
|
this.storageSet('end_time', '');
|
|
@@ -265,7 +288,7 @@ export default {
|
|
|
this.selectInfo();
|
|
|
},
|
|
|
beforeRouteEnter(to, from, next) {
|
|
|
-
|
|
|
+
|
|
|
next(vm => {
|
|
|
// 回到原来的位置
|
|
|
const position = JSON.parse(window.sessionStorage.getItem('position'))
|
|
@@ -279,14 +302,28 @@ export default {
|
|
|
next()
|
|
|
},
|
|
|
methods: {
|
|
|
- toPageDoctor(row,sort) {
|
|
|
- this.$router.push({
|
|
|
- path: '/defectNumber',
|
|
|
- query: {
|
|
|
- doctor_name: row.key,
|
|
|
- sort,
|
|
|
- }
|
|
|
- })
|
|
|
+
|
|
|
+ makeDoctorRank(data) {//处理图表数据
|
|
|
+ let newData = JSON.parse(JSON.stringify(data)) || []
|
|
|
+ //根据defect_doc_count进行顺序排名 小的在前面
|
|
|
+ return newData.sort(
|
|
|
+ (a, b) => {
|
|
|
+ return a.defect_doc_count - b.defect_doc_count
|
|
|
+ }
|
|
|
+ )
|
|
|
+ },
|
|
|
+
|
|
|
+
|
|
|
+ toPageDoctor(row, sort) {
|
|
|
+ this.$router.push({
|
|
|
+ path: '/doctor/bl',
|
|
|
+ query: {
|
|
|
+ doctor_name: row.key,
|
|
|
+ sort,
|
|
|
+ start_time: this.start_time,
|
|
|
+ end_time: this.end_time,
|
|
|
+ }
|
|
|
+ })
|
|
|
},
|
|
|
// 医师排名
|
|
|
onToggleDoctorShow() {
|
|
@@ -296,20 +333,20 @@ export default {
|
|
|
this.quxian_show = !this.quxian_show
|
|
|
},
|
|
|
// 获取医生列表
|
|
|
- getDoctorList(){
|
|
|
+ getDoctorList() {
|
|
|
this.$axios2.post('/case-quality/doctor_list').then(res => {
|
|
|
this.doctorList = res.data;
|
|
|
});
|
|
|
},
|
|
|
// 缺陷病例统计
|
|
|
- getAnalysis(){
|
|
|
+ getAnalysis() {
|
|
|
this.$axios2.post('/case-quality/analysis').then(res => {
|
|
|
|
|
|
});
|
|
|
},
|
|
|
-
|
|
|
+
|
|
|
// 甲乙病级病例
|
|
|
- getMedicalRecordLevel(){
|
|
|
+ getMedicalRecordLevel() {
|
|
|
this.$axios2.post('/case-quality/medical_record_level').then(res => {
|
|
|
|
|
|
});
|
|
@@ -343,9 +380,9 @@ export default {
|
|
|
this.paginationDataDoctor.page = val
|
|
|
this.getDoctorRank()
|
|
|
},
|
|
|
-
|
|
|
+
|
|
|
getDoctorRank() {
|
|
|
- const { page, size } = this.paginationDataDoctor
|
|
|
+ const {page, size} = this.paginationDataDoctor
|
|
|
const params = {
|
|
|
page,
|
|
|
page_size: size,
|
|
@@ -354,9 +391,9 @@ export default {
|
|
|
is_export: 0
|
|
|
};
|
|
|
this.$axios2.post('/case-quality/medical_record_doctor', params).then(res => {
|
|
|
- const { count } = res.data
|
|
|
+ const {count} = res.data
|
|
|
if (count < 10) {
|
|
|
- for(let i=0; i<10 - count-1; i++) {
|
|
|
+ for (let i = 0; i < 10 - count - 1; i++) {
|
|
|
res.data.list.push({
|
|
|
"key": "",
|
|
|
"doc_count": '',
|
|
@@ -364,8 +401,8 @@ export default {
|
|
|
"score": '',
|
|
|
"svg_score": '',
|
|
|
"proportion": "",
|
|
|
- "dep_name":'',
|
|
|
- "code":'',
|
|
|
+ "dep_name": '',
|
|
|
+ "code": '',
|
|
|
})
|
|
|
}
|
|
|
}
|
|
@@ -432,7 +469,7 @@ export default {
|
|
|
|
|
|
// 医师排名导出
|
|
|
handleExport() {
|
|
|
- const { page, size } = this.paginationDataDoctor
|
|
|
+ const {page, size} = this.paginationDataDoctor
|
|
|
const params = {
|
|
|
page,
|
|
|
page_size: size,
|
|
@@ -590,53 +627,65 @@ export default {
|
|
|
},
|
|
|
};
|
|
|
</script>
|
|
|
-
|
|
|
- <style lang="scss" scoped>
|
|
|
+
|
|
|
+<style lang="scss" scoped>
|
|
|
.pages {
|
|
|
padding: 0 18px;
|
|
|
background: #f4f4f4;
|
|
|
+
|
|
|
.btnNAv {
|
|
|
display: flex;
|
|
|
justify-content: flex-end;
|
|
|
padding-top: 30px;
|
|
|
padding-bottom: 10px;
|
|
|
+
|
|
|
a {
|
|
|
padding: 15px 30px;
|
|
|
color: #fff;
|
|
|
border-radius: 10px;
|
|
|
margin-left: 15px;
|
|
|
}
|
|
|
+
|
|
|
.bj {
|
|
|
background: #35ae4a;
|
|
|
}
|
|
|
+
|
|
|
.bc {
|
|
|
background: #dd7500;
|
|
|
}
|
|
|
+
|
|
|
.dc {
|
|
|
background: #439ab6;
|
|
|
}
|
|
|
+
|
|
|
.fh {
|
|
|
background: #185da6;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
.block {
|
|
|
margin-bottom: 20px;
|
|
|
background: #fff;
|
|
|
padding: 25px 15px;
|
|
|
border-radius: 5px;
|
|
|
+
|
|
|
.blockCon {
|
|
|
display: flex;
|
|
|
justify-content: space-between;
|
|
|
+
|
|
|
.lefts {
|
|
|
display: flex;
|
|
|
}
|
|
|
+
|
|
|
.selects {
|
|
|
margin: 0 20px;
|
|
|
+
|
|
|
span {
|
|
|
margin-right: 10px;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
.ytext {
|
|
|
font-size: 16px;
|
|
|
color: #e48d53;
|
|
@@ -644,20 +693,25 @@ export default {
|
|
|
line-height: 40px;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
.cardBox {
|
|
|
margin: 0 0 16px 0;
|
|
|
background: #fff;
|
|
|
padding: 25px 15px;
|
|
|
border-radius: 5px;
|
|
|
+
|
|
|
.contentBox {
|
|
|
display: flex;
|
|
|
+
|
|
|
.left {
|
|
|
display: flex;
|
|
|
flex: 1;
|
|
|
+
|
|
|
.l {
|
|
|
display: flex;
|
|
|
flex: 1;
|
|
|
flex-wrap: wrap;
|
|
|
+
|
|
|
.i {
|
|
|
width: calc(50% - 20px);
|
|
|
margin-right: 20px;
|
|
@@ -670,12 +724,14 @@ export default {
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
text-align: center;
|
|
|
+
|
|
|
.ba {
|
|
|
flex: 1;
|
|
|
font-size: 16px;
|
|
|
font-weight: 400;
|
|
|
color: #fff;
|
|
|
}
|
|
|
+
|
|
|
.num {
|
|
|
font-size: 24px;
|
|
|
font-weight: bold;
|
|
@@ -683,6 +739,7 @@ export default {
|
|
|
flex: 1;
|
|
|
margin-left: 20px;
|
|
|
}
|
|
|
+
|
|
|
.icon {
|
|
|
width: 50px;
|
|
|
position: absolute;
|
|
@@ -691,8 +748,10 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
.r {
|
|
|
margin: 0 9% 0 0;
|
|
|
+
|
|
|
.i {
|
|
|
width: 195px;
|
|
|
height: 56px;
|
|
@@ -707,6 +766,7 @@ export default {
|
|
|
width: 22px;
|
|
|
margin: 6px 0 0 27px;
|
|
|
}
|
|
|
+
|
|
|
.t {
|
|
|
font-size: 18px;
|
|
|
font-weight: 400;
|
|
@@ -714,6 +774,7 @@ export default {
|
|
|
text-align: left;
|
|
|
margin-left: 10px;
|
|
|
}
|
|
|
+
|
|
|
.rt {
|
|
|
margin-left: 10px;
|
|
|
font-weight: bold;
|
|
@@ -736,42 +797,51 @@ export default {
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
.right {
|
|
|
width: 521px;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
.cpoin {
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
+
|
|
|
.chart {
|
|
|
margin-bottom: 16px;
|
|
|
background-color: #fff;
|
|
|
padding: 25px 15px;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
.color-btn {
|
|
|
color: #409eff;
|
|
|
border-color: #c6e2ff;
|
|
|
background-color: #ecf5ff;
|
|
|
}
|
|
|
-.title-box{
|
|
|
+
|
|
|
+.title-box {
|
|
|
width: 100%;
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: space-between;
|
|
|
}
|
|
|
-.medicalRecord-box{
|
|
|
+
|
|
|
+.medicalRecord-box {
|
|
|
width: 100%;
|
|
|
display: flex;
|
|
|
margin-top: 16px;
|
|
|
- &>div{
|
|
|
+
|
|
|
+ & > div {
|
|
|
flex: 1;
|
|
|
}
|
|
|
- .medicalRecord-list-box{
|
|
|
+
|
|
|
+ .medicalRecord-list-box {
|
|
|
flex: 1;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
// 卡片背景
|
|
|
|
|
|
.pages {
|
|
@@ -781,48 +851,60 @@ export default {
|
|
|
border-radius: 5px;
|
|
|
overflow-x: hidden;
|
|
|
}
|
|
|
+
|
|
|
.mb20 {
|
|
|
margin-bottom: 20px;
|
|
|
}
|
|
|
+
|
|
|
.bg185DA6 {
|
|
|
background: #185DA6;
|
|
|
}
|
|
|
+
|
|
|
.text-right {
|
|
|
text-align: right;
|
|
|
}
|
|
|
+
|
|
|
.text-center {
|
|
|
text-align: center;
|
|
|
}
|
|
|
+
|
|
|
.link {
|
|
|
text-decoration: underline;
|
|
|
color: #FF786F;
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
+
|
|
|
.link2 {
|
|
|
color: #004983;
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
+
|
|
|
.c_FF786F {
|
|
|
color: #FF786F;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
.title_arrow {
|
|
|
width: 10px;
|
|
|
height: 11px;
|
|
|
margin-left: 5px;
|
|
|
cursor: pointer;
|
|
|
+
|
|
|
&.arrow_top {
|
|
|
transform: rotate(180deg);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
#tongji_pie {
|
|
|
height: 200px;
|
|
|
}
|
|
|
+
|
|
|
#qxxq_pie {
|
|
|
height: 600px;
|
|
|
margin-top: 68px;
|
|
|
}
|
|
|
-.xz-btn{
|
|
|
+
|
|
|
+.xz-btn {
|
|
|
width: 84px;
|
|
|
height: 32px;
|
|
|
text-align: center;
|
|
@@ -837,4 +919,3 @@ export default {
|
|
|
top: 0;
|
|
|
}
|
|
|
</style>
|
|
|
-
|