| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654 |
- <template>
- <div class="doctorWork">
- <!-- 顶部筛选 -->
- <div class="screening">
- <div class="screening-title flex-vertical-center-l">
- <span></span>
- <div>筛选</div>
- </div>
- <div class="screening-form flex-vertical-center-l flex-wrap">
- <div class="screening-item flex-vertical-center-l">
- <span>年度:</span>
- <div class="input">
- <el-date-picker
- size="mini"
- @change="yearBlur"
- v-model="form.year"
- type="year"
- placeholder="选择年"
- :clearable="false"
- ></el-date-picker>
- </div>
- </div>
- <div class="screening-item flex-vertical-center-l">
- <span>月度:</span>
- <div class="input">
- <el-date-picker
- size="mini"
- v-model="form.month"
- format="MM"
- type="month"
- placeholder="选择月"
- ></el-date-picker>
- </div>
- </div>
- <div class="screening-item flex-vertical-center-l">
- <span>机构名称:</span>
- <div class="input">
- <el-select size="mini" v-model="form.medName" placeholder="请选择">
- <el-option
- :label="item.name"
- :value="item.pid"
- v-for="(item,index) in medSelectList"
- :key="index"
- ></el-option>
- </el-select>
- </div>
- </div>
- <div class="screening-item flex-vertical-center-l">
- <div class="input flex-vertical-center-l">
- <el-checkbox v-model="form.checked">是否包含下级</el-checkbox>
- </div>
- </div>
- <div class="screening-item flex-vertical-center-l" v-if="false">
- <div class="input">
- <el-select size="mini" v-model="form.depart" placeholder="请选择">
- <el-option label="全部科室" :value="1"></el-option>
- <el-option label="中医内科" :value="2"></el-option>
- <el-option label="康复科" :value="3"></el-option>
- </el-select>
- </div>
- </div>
- <el-button size="mini" type="primary" @click="search">搜索</el-button>
- <el-button size="mini" type="warning" @click="clearFilter">清空</el-button>
- </div>
- </div>
- <!-- 展示数据层 -->
- <div class="showData">
- <div class="flex-vertical-center-l">
- <div class="top-change flex-vertical-center-l">
- <div :class="isEcharts==0?'choosed':''" @click="topChange(0)">图表</div>
- <div :class="isEcharts==1?'choosed':''" @click="topChange(1)">列表</div>
- </div>
- <div class="flex-center bg-yellow" v-if="isEcharts==1" @click="exportDow">导出</div>
- </div>
- <!-- 展示两种数据 -->
- <div class="showEcharts" v-if="isEcharts==0">
- <div id="myChart" :style="{width: '100%'}" class="myCharts"></div>
- <div class="e-format">
- 格式:时间:数量
- <span style="margin-left:30px;"></span> X轴:时间 Y轴:单位(个)
- </div>
- </div>
- <!-- 列表展示 -->
- <div class="showList" v-if="isEcharts==1">
- <ul>
- <li class="flex-vertical-between" v-for="(item,index) in list" :key="index">
- <div class="title">{{form.year |formMatD}}-{{item.id}}</div>
- <div>
- 中医门诊量:
- <span>{{item.outpatientCount}}</span>
- </div>
- <div>
- 中医住院量:
- <span>{{item.hospitalCount}}</span>
- </div>
- <div>
- 饮片开方量:
- <span>{{item.slicesCount}}</span>
- </div>
- <div>
- 颗粒剂开方量:
- <span>{{item.particlesCount}}</span>
- </div>
- <div>
- 中药制剂开方量:
- <span>{{item.chinaMadeCount}}</span>
- </div>
- <div>
- 适宜技术处方开方量:
- <span>{{item.techCount}}</span>
- </div>
- </li>
- </ul>
- </div>
- </div>
- </div>
- </template>
- <script>
- import { mapState, mapGetters, mapActions, mapMutations } from "vuex";
- import { medicalInstitution } from "@/api/city.js";
- import { getHospitalWork, exportDow } from "@/api/dataAnalysis.js";
- export default {
- data() {
- return {
- // 筛选数据
- form: {
- medName: "",
- year: "",
- month: "",
- checked: false,
- depart: 1
- },
- isFinish: 1, // 上一段函数 是否完成
- // 医疗机构
- medSelectList: [],
- // 是否是图表
- isEcharts: 0, // 0 图表 1 列表
- list: [], // 列表
- xAxisData: [], // 图表 横向坐标
- chinaMadeCount: [], // 中药制剂开方数据
- chinaPreCount: [], // 中药处方
- hospitalCount: [], // 中医住院量
- outpatientCount: [], //中医门诊量
- particlesCount: [], // 颗粒剂开方量
- slicesCount: [], // 饮片开方量
- techCount: [] // 适宜技术处方
- };
- },
- created() {},
- mounted() {
- let date = new Date();
- this.form.year = date.getFullYear().toString();
- this.medicalInstitution();
- this.getHospitalWork();
- },
- filters: {
- formMatD(value) {
- let date = new Date(value);
- let year = date.getFullYear();
- let month = date.getMonth() + 1;
- return year;
- }
- },
- methods: {
- // 年份失去焦点
- yearBlur(e) {
- if (!e || e.length > 4 || e.length < 4) {
- let date = new Date();
- this.form.year = date.getFullYear().toString();
- }
- },
- // 顶部列表更改
- topChange(type) {
- this.isEcharts = type;
- if (type == 0) {
- setTimeout(() => {
- this.drawLine();
- // this.drawLine2()
- }, 200);
- }
- },
- // 绘制 图表
- drawLine() {
- // 基于准备好的dom,初始化echarts实例
- let myChart = this.$echarts.init(document.getElementById("myChart"));
- // 绘制图表
- myChart.setOption({
- grid: {
- left: "1%",
- right: "1%",
- bottom: "3%",
- containLabel: true
- },
- legend: {
- data: [
- "中医门诊量",
- "中医住院量",
- "中药处方开方量",
- "饮片开方量",
- "颗粒剂开方量",
- "中药制剂开方量",
- "适宜技术处方开方量"
- ]
- },
- color: [
- "#5FA0FA",
- "#FFB703",
- "#1bb2d8",
- "#FD2446",
- "#51CEC6",
- "#DAEDF6",
- "#FB925A"
- ],
- tooltip: {},
- xAxis: {
- type: "category",
- data: this.xAxisData,
- name: "时间",
- nameLocation: "end"
- },
- yAxis: {
- type: "value"
- // name: "单位(个)"
- },
- series: [
- {
- name: "中医门诊量",
- type: "bar",
- data: this.outpatientCount
- },
- {
- name: "中医住院量",
- type: "bar",
- data: this.hospitalCount
- },
- {
- name: "中药处方开方量",
- type: "bar",
- data: this.chinaPreCount
- },
- {
- name: "饮片开方量",
- type: "bar",
- // stack: "中药处方开方量",
- data: this.slicesCount
- },
- {
- name: "颗粒剂开方量",
- type: "bar",
- // stack: "中药处方开方量",
- data: this.particlesCount
- },
- {
- name: "中药制剂开方量",
- type: "bar",
- // stack: "中药处方开方量",
- data: this.chinaMadeCount
- },
- {
- name: "适宜技术处方开方量",
- type: "bar",
- data: this.techCount
- }
- ]
- });
- },
- // 绘制饼图
- drawLine2() {
- let text = this.forMatDate(1, this.form.month)
- ? "医生工作量分析-" +
- this.forMatDate(0, this.form.year) +
- "年" +
- this.forMatDate(1, this.form.month) +
- "月"
- : "医生工作量分析-" + this.forMatDate(0, this.form.year) + "年";
- // 基于准备好的dom,初始化echarts实例
- let myChart = this.$echarts.init(document.getElementById("myChart"));
- console.log(myChart, "chart");
- // 绘制图表
- myChart.setOption({
- title: {
- text: text,
- // top: '10%',
- left: "center"
- },
- tooltip: {
- trigger: "item"
- },
- legend: {
- orient: "vertical",
- left: "left"
- },
- series: [
- {
- name: "医生工作量分析",
- type: "pie",
- radius: "50%",
- data: [
- {
- name: "中医门诊量" + "-" + this.outpatientCount[0] + "个",
- value: this.outpatientCount[0]
- },
- {
- name: "中医住院量" + "-" + this.hospitalCount[0] + "个",
- value: this.hospitalCount[0]
- },
- {
- name: "中药处方开方量" + "-" + this.chinaPreCount[0] + "个",
- value: this.chinaPreCount[0]
- },
- {
- name: "饮片开方量" + "-" + this.slicesCount[0] + "个",
- // type: 'bar',
- stack: "中药处方开方量",
- value: this.slicesCount[0]
- },
- {
- name: "颗粒剂开方量" + "-" + this.particlesCount[0] + "个",
- // type: 'bar',
- stack: "中药处方开方量",
- value: this.particlesCount[0]
- },
- {
- name: "中药制剂开方量" + "-" + this.chinaMadeCount[0] + "个",
- // type: 'bar',
- stack: "中药处方开方量",
- value: this.chinaMadeCount[0]
- },
- {
- name: "适宜技术处方开方量" + "-" + this.techCount[0] + "个",
- // type: 'bar',
- value: this.techCount[0]
- }
- ],
- emphasis: {
- itemStyle: {
- shadowBlur: 10,
- shadowOffsetX: 0,
- shadowColor: "rgba(0, 0, 0, 0.5)"
- }
- }
- }
- ]
- });
- },
- search() {
- this.xAxisData = []; // 图表 横向坐标
- this.chinaMadeCount = []; // 中药制剂开方数据
- this.chinaPreCount = []; // 中药处方
- this.hospitalCount = []; // 中医住院量
- this.outpatientCount = []; //中医门诊量
- this.particlesCount = []; // 颗粒剂开方量
- this.slicesCount = []; // 饮片开方量
- this.techCount = []; // 适宜技术处方
- this.getHospitalWork();
- },
- clearFilter() {
- let date = new Date();
- this.form = {
- medName: "",
- year: date.getFullYear().toString(),
- month: "",
- checked: false,
- depart: 1
- };
- this.xAxisData = []; // 图表 横向坐标
- this.chinaMadeCount = []; // 中药制剂开方数据
- this.chinaPreCount = []; // 中药处方
- this.hospitalCount = []; // 中医住院量
- this.outpatientCount = []; //中医门诊量
- this.particlesCount = []; // 颗粒剂开方量
- this.slicesCount = []; // 饮片开方量
- this.techCount = []; // 适宜技术处方
- if (this.isFinish == 0) return;
- this.getHospitalWork();
- },
- // 处理选择器 时间数据
- forMatDate(type, data) {
- if (!data) return "";
- // type : 0 year 1 month
- let date = new Date(data);
- let year = date.getFullYear();
- let month = date.getMonth() + 1;
- if (type == 0) {
- return year;
- } else if (type == 1) {
- return month;
- }
- },
- // 获取医疗机构选择器
- async medicalInstitution() {
- let params = {
- organizationId: this.getuserinfo.organizationid
- };
- let res = await medicalInstitution(params);
- if (res.ResultCode == 0) {
- this.medSelectList = res.Data;
- }
- },
- // 获取工作量分析数据
- async getHospitalWork() {
- this.isFinish = 0; //
- let params = {
- month: this.forMatDate(1, this.form.month),
- stiId: this.form.medName,
- type: this.form.checked ? "0" : "1",
- year: this.forMatDate(0, this.form.year)
- };
- let res = await getHospitalWork(params);
- if (res.ResultCode == 0) {
- this.list = res.Data;
- if (!this.form.month) {
- for (let i = 1; i <= 12; i++) {
- let j = i < 10 ? "0" + i : i;
- let xAxis = this.forMatDate(0, this.form.year) + "-" + j + "月";
- this.xAxisData.push(xAxis);
- }
- } else {
- this.xAxisData = [
- this.forMatDate(0, this.form.year) +
- "-" +
- this.forMatDate(1, this.form.month) +
- "月"
- ];
- }
- res.Data.forEach((item, index) => {
- this.chinaMadeCount.push(item.chinaMadeCount);
- this.chinaPreCount.push(item.chinaPreCount);
- this.hospitalCount.push(item.hospitalCount);
- this.outpatientCount.push(item.outpatientCount);
- this.particlesCount.push(item.particlesCount);
- this.slicesCount.push(item.slicesCount);
- this.techCount.push(item.techCount);
- });
- // 数里列表数据
- this.list.filter((item, index) => {
- if (this.form.month) {
- return (item.id =
- this.forMatDate(1, this.form.month) < 10
- ? "0" + this.forMatDate(1, this.form.month)
- : this.forMatDate(1, this.form.month));
- } else {
- return (item.id = index + 1 < 10 ? "0" + (index + 1) : index + 1);
- }
- });
- let text = this.forMatDate(1, this.form.month)
- ? this.forMatDate(0, this.form.year) +
- "年" +
- this.forMatDate(1, this.form.month) +
- "月"
- : this.forMatDate(0, this.form.year) + "年";
- setTimeout(() => {
- this.isFinish = 1; //
- this.drawLine();
- // this.drawLine2()
- }, 200);
- }
- },
- // 表导出
- async exportDow() {
- let params = {
- month: this.forMatDate(1, this.form.month),
- stiId: this.form.medName,
- type: this.form.checked ? "0" : "1",
- year: this.forMatDate(0, this.form.year)
- };
- const loading = this.$loading({
- lock: true,
- text: "正在导出,请稍后",
- spinner: "el-icon-loading",
- background: "rgba(0, 0, 0, 0.7)"
- });
- let res = await exportDow(params).catch(err => {
- loading.close();
- });
- if (res.ResultCode == 0) {
- let path = process.env.VUE_APP_UPLOAD + "file/" + res.ResultInfo;
- const a = document.createElement("a"); // 创建a标签
- a.setAttribute("download", ""); // download属性
- a.setAttribute("href", path); // href链接
- a.click(); // 自执行点击事件
- a.remove();
- this.$message({
- type: "success",
- message: "导出成功",
- showClose: true
- });
- loading.close();
- }
- }
- },
- computed: {
- ...mapGetters(["getuserinfo"])
- }
- };
- </script>
- <style lang="scss" scoped>
- @import "../../style/common.scss";
- @import "../../style/base.scss";
- .showData {
- background: #fff;
- border-radius: 10px;
- margin-top: 5px;
- padding: 10px;
- height: 71vh;
- overflow: auto;
- .top-change {
- margin-bottom: 10px;
- width: 100px;
- height: 34px;
- border-radius: 8px;
- cursor: pointer;
- border: 1px solid #dcdfe6;
- font-size: 14px;
- div:first-child {
- border-radius: 8px 0 0 8px;
- }
- div:last-child {
- border-radius: 0 8px 8px 0;
- }
- div {
- height: 34px;
- width: 50px;
- box-sizing: border-box;
- line-height: 34px;
- text-align: center;
- }
- .choosed {
- background: #5386f6;
- color: #fff;
- }
- }
- .bg-yellow {
- border-radius: 8px;
- background: #ffae45;
- color: #fff;
- width: 74px;
- height: 34px;
- margin-bottom: 20px;
- cursor: pointer;
- margin-left: 20px;
- }
- .showEcharts {
- width: 100%;
- .myCharts {
- height: 340px;
- }
- }
- .showList {
- width: 100%;
- ul {
- li {
- padding: 15px;
- border-bottom: 1px solid #dcdfe6;
- }
- li:hover {
- background: #dcdfe6;
- cursor: default;
- }
- .title {
- font-weight: bold;
- color: #5386f6;
- width: 90px;
- }
- }
- }
- }
- </style>
- <style lang="scss" scoped>
- @media screen and (min-width: 1681px) and (max-width: 1920px) {
- .showData {
- height: 81vh;
- .showEcharts {
- width: 100%;
- .myCharts {
- height: 400px;
- }
- }
- }
- }
- @media screen and (min-width: 1601px) and (max-width: 1680px) {
- .showData {
- height: 80vh;
- .showEcharts {
- width: 100%;
- .myCharts {
- height: 400px;
- }
- }
- }
- }
- @media screen and (min-width: 1361px) and (max-width: 1600px) {
- .showData {
- height: 73vh;
- .showEcharts {
- width: 100%;
- .myCharts {
- height: 360px;
- }
- }
- }
- }
- @media screen and(min-width:1281px) and (max-width: 1360px) {
- .showData {
- height: 73vh;
- .showEcharts {
- width: 100%;
- .myCharts {
- height: 360px;
- }
- }
- }
- }
- </style>
|