Browse Source

患者统计(患者总数、性别、年龄)

newMaster
1747191978@qq.com 4 months ago
parent
commit
1534347f87
  1. 11
      acupuncture-前台/src/api/indexCom.js
  2. 2
      acupuncture-前台/src/views/index.vue
  3. 185
      acupuncture-前台/src/views/indexCom/index.js
  4. 515
      acupuncture-前台/src/views/indexCom/patient.vue

11
acupuncture-前台/src/api/indexCom.js

@ -105,3 +105,14 @@ export function queryData(data) {
data: data,
});
}
// 患者信息
export function patientTotal(data) {
return request({
url: "/statistics/patientTotal",
method: "post",
data: data,
});
}
// 诊疗信息
// 治疗类型
// 随访分布

2
acupuncture-前台/src/views/index.vue

@ -6,7 +6,7 @@
<search
@radio-change="radioChange"
@picker-change="pickerChage"
title="病例统计"
title="患者信息统计"
type="1"
></search>
</el-card>

185
acupuncture-前台/src/views/indexCom/index.js

@ -1,5 +1,5 @@
import * as echarts from "echarts";
// 患者信息
// 患者总数
export const HZXX = {
tooltip: {
trigger: "item",
@ -52,8 +52,48 @@ export const HZXX = {
},
],
};
// 患者信息 - 数据分析
export const HZXXSJFX = {
// 患者性别
export const gende = {
tooltip: {
trigger: "item",
},
title: {
text: "",
left: "center",
top: "40%",
textStyle: {
textAlign: "center",
color: "#393D4E",
fontSize: 40,
fontWeight: 600,
},
},
grid: {
top: "0%",
left: "0",
right: "0%",
bottom: "0%",
containLabel: true,
},
color: ["#4F8BFF", "#FE4943"],
series: [
{
type: "pie",
radius: "80%",
avoidLabelOverlap: false,
label: {
show: false,
position: "center",
},
labelLine: {
show: false,
},
data: [],
},
],
};
// 年龄分布
export const ageEcharts = {
tooltip: {
trigger: "axis",
axisPointer: {
@ -78,20 +118,7 @@ export const HZXXSJFX = {
},
xAxis: {
type: "category",
data: [
"2023-01",
"2023-02",
"2023-03",
"2023-04",
"2023-05",
"2023-06",
"2023-07",
"2023-08",
"2023-09",
"2023-10",
"2023-11",
"2023-12",
],
data: ["<40","41-50","51-60","61-70","71-80",">80",],
},
grid: {
top: "12%",
@ -101,7 +128,7 @@ export const HZXXSJFX = {
containLabel: true,
},
yAxis: {
name: "单位( 个 )",
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
@ -113,8 +140,8 @@ export const HZXXSJFX = {
},
series: [
{
name: "仅溶栓人数",
data: [20, 20, 50, 80, 70, 11, 15],
name: "<40",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#4f8bff",
@ -126,8 +153,8 @@ export const HZXXSJFX = {
},
},
{
name: "仅介入人数",
data: [120, 200, 150, 80, 70, 110, 10],
name: "41-50",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#ffcd6c",
@ -138,12 +165,114 @@ export const HZXXSJFX = {
},
},
},
{
name: "51-60",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#ffcd6c",
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
{
name: "61-70",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#4f8bff",
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
{
name: "71-80",
data: [120, 200, 150, 80, 70, 110, 10],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#ffcd6c",
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
{
name: ">80",
data: [],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#ffcd6c",
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
barBorderRadius: [50, 50, 0, 0],
},
},
},
],
};
// 患者信息 - 数据分析
export const HZXXSJFX = {
tooltip: {
trigger: "axis",
axisPointer: {
type: "cross",
label: {
backgroundColor: "#6a7985",
},
},
formatter: function (params) {
let res1 = params[0].name;
for (var i = 0, l = params.length; i < l; i++) {
res1 +=
"<br/>" +
`<span style="background:${params[i].color};width:12px;display:inline-block;height:12px;border-radius:50%;margin-right:5px;"></span>` +
params[i].seriesName +
" : " +
params[i].value +
"个";
}
return res1;
},
},
xAxis: {
type: "category",
data: ["性别"],
},
grid: {
top: "12%",
left: "5%",
right: "2%",
bottom: "0%",
containLabel: true,
},
yAxis: {
name: "数量( 个 )",
type: "value",
minInterval: 1,
splitLine: {
show: true,
lineStyle: {
type: "dashed",
},
},
},
series: [
{
name: "未溶栓且未介入人数",
data: [120, 200, 150, 80, 70, 110, 15],
name: "",
data: [20, 20, 50, 80, 70, 11, 15],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#00d1a1",
color: "#4f8bff",
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]
@ -152,11 +281,11 @@ export const HZXXSJFX = {
},
},
{
name: "溶栓+介入人数",
data: [120, 200, 150, 80, 70, 110, 15],
name: "",
data: [120, 200, 150, 80, 70, 110, 10],
type: "bar",
barMaxWidth: 24, //柱图宽度
color: "#a794fe",
color: "#ffcd6c",
itemStyle: {
normal: {
//这里设置柱形图圆角 [左上角,右上角,右下角,左下角]

515
acupuncture-前台/src/views/indexCom/patient.vue

@ -1,246 +1,285 @@
<template>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px; min-width: 600px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">病例统计</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #4f8bff"></span>
仅溶栓人数
</div>
<span class="dian" style="background: #ffcd6c"></span>
仅介入人数
</div>
<div class="dian-box dis">
<span class="dian" style="background: #00d1a1"></span>
未溶栓且未介入人数
</div>
<div class="dian-box dis">
<span class="dian" style="background: #a794fe"></span>
溶栓+介入人数
</div>
</div>
</div>
<!-- 统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="patienty" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 2; min-width: 610px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">数据对比 </span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #4f8bff"></span>
仅溶栓人数
</div>
<span class="dian" style="background: #ffcd6c"></span>
仅介入人数
</div>
<div class="dian-box dis">
<span class="dian" style="background: #00d1a1"></span>
未溶栓且未介入人数
</div>
<div class="dian-box dis">
<span class="dian" style="background: #a794fe"></span>
溶栓+介入人数
</div>
</div>
</div>
<!-- 统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="patientz" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
<div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">患者总数</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="patienty" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">性别数量</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #4f8bff"></span>
</div>
<span class="dian" style="background: #fe4943"></span>
</div>
</div>
</div>
<!-- 性别统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="gender" style="width: 100%"></div>
</div>
</el-card>
</div>
</div>
</div>
<div class="app-container">
<div class="dis" style="width: 100%">
<div style="flex: 1; margin-right: 20px">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">年龄分布</span>
<div class="dis"></div>
</div>
<!-- 患者总数统计图 -->
<div style="height: 300px" v-loading="loading">
<div id="age" style="width: 100%"></div>
</div>
</el-card>
</div>
<div style="flex: 1">
<el-card shadow="always">
<div class="dis title-box">
<span class="header-title">性别统计</span>
<div class="dis">
<div class="dian-box dis">
<div class="dian-box dis">
<span class="dian" style="background: #4f8bff"></span>
</div>
<span class="dian" style="background: #ffcd6c"></span>
</div>
</div>
</div>
<!-- 性别统计图 -->
<div style="height: 300px" v-loading="loading">
<!-- <div id="gender" style="width: 100%"></div> -->
</div>
</el-card>
</div>
</div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize";
import { queryPatient, queryByDatePatient } from "@/api/indexCom.js";
import { HZXX, HZXXSJFX } from "./index";
export default {
name: "Post",
props: ["title"],
mixins: [resize],
data() {
return {
loading: false,
HZXXvalue: null,
SJDBvalue: null,
queryParams: {
param: {
timeType: 4,
startTime: "",
endTime: "",
},
},
};
},
created() {
// this.Linepatient()
// this.getData();
},
methods: {
statistics(_data, _type) {
this.initial(_data, _type); //
this.loading = true;
this.getData(); //
},
//
async getData() {
try {
//
await queryPatient(this.queryParams).then((res) => {
this.HZXXvalue = res.data;
this.Linepatient();
});
//
await queryByDatePatient(this.queryParams).then((res) => {
this.SJDBvalue = res.data.list;
this.columnar();
});
this.loading = false;
} catch (e) {}
},
import * as echarts from "echarts";
require("echarts/theme/macarons"); // echarts theme
import resize from "@/views/dashboard/mixins/resize";
import {
patientTotal,
queryByDatePatient
} from "@/api/indexCom.js";
import {
HZXX,
HZXXSJFX,
gende,
ageEcharts
} from "./index";
export default {
name: "Post",
props: ["title"],
mixins: [resize],
data() {
return {
loading: false,
HZXXvalue: null, //
gendeValue: null, //
ageValue: null, //
queryParams: {
param: {
startTime: "",
endTime: "",
},
},
};
},
created() {
// this.Linepatient()
this.getData();
},
methods: {
statistics(_data, _type) {
this.initial(_data, _type); //
this.loading = true;
this.getData(); //
},
//
async getData() {
try {
await patientTotal(this.queryParams).then((res) => {
//
this.HZXXvalue = [{
value: res.data.totalPatients,
name: "患者总数"
}, ];
//
this.gendeValue = [{
value: res.data.totalPatients,
name: "男"
},
{
value: res.data.totalPatients,
name: "女"
},
];
//
let ageValue = res.data.age
this.ageValue = [ageValue.num1, ageValue.num2, ageValue.num2, ageValue.num4, ageValue
.num5, ageValue.num6
]
this.Linepatient(); //
this.handleAge(); //
this.columnar(); //
});
this.loading = false;
} catch (e) {}
},
//
Linepatient() {
HZXX.title.text = this.HZXXvalue?.total;
HZXX.series[0].data = [
{ value: this.HZXXvalue?.onlyRs, name: "仅溶栓人数", roundCap: true },
{
value: this.HZXXvalue?.onlyXgzl,
name: "仅介入人数",
roundCap: true,
},
{ value: this.HZXXvalue?.neither, name: "未溶栓且未介入人数" },
{ value: this.HZXXvalue?.both, name: "溶栓+介入人数" },
// { value: 200, name: "", roundCap: true },
// { value: 150, name: "", roundCap: true },
// { value: 100, name: "" },
];
this.$nextTick(() => {
// domecharts
var myChart = echarts.init(document.getElementById("patienty"), null, {
height: 300,
});
myChart.setOption(HZXX, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
// -
columnar() {
HZXXSJFX.series[0].data = this.SJDBvalue?.map((item) => {
return item.onlyRs; //
});
HZXXSJFX.series[1].data = this.SJDBvalue?.map((item) => {
return item.onlyXgzl; //
});
HZXXSJFX.series[2].data = this.SJDBvalue?.map((item) => {
return item.neither; //
});
HZXXSJFX.series[3].data = this.SJDBvalue?.map((item) => {
return item.both; //+
});
HZXXSJFX.xAxis.data = this.SJDBvalue?.map((item) => {
return item.date; //X
});
this.$nextTick(() => {
// domecharts
var myChart = echarts.init(document.getElementById("patientz"), null, {
height: 300,
});
myChart.setOption(HZXXSJFX, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
initial(_data, _type) {
console.log("_data, _type: ", _data, _type);
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
timeType: _type,
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
getRenew() {
this.Linepatient();
this.columnar();
},
},
};
//
Linepatient() {
HZXX.title.text = this.HZXXvalue[0].value;
HZXX.series[0].data = this.HZXXvalue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("patienty"), null, {
height: 300,
});
myChart.setOption(HZXX, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
columnar() {
gende.series[0].data = this.gendeValue;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("gender"), null, {
height: 300,
});
myChart.setOption(gende, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
handleAge() {
console.log('ageEcharts',ageEcharts)
ageEcharts.series[0].data = [this.ageValue[0]]
ageEcharts.series[1].data = [this.ageValue[1]]
ageEcharts.series[2].data = [this.ageValue[2]]
ageEcharts.series[3].data = [this.ageValue[3]]
ageEcharts.series[4].data = [this.ageValue[4]]
ageEcharts.series[5].data = [this.ageValue[5]]
this.$nextTick(() => {
// domecharts
var myChart = echarts.init(document.getElementById("age"), null, {
height: 300,
});
myChart.setOption(ageEcharts, true);
myChart.resize();
window.onresize = myChart.resize;
});
},
//
initial(_data, _type) {
_data[0] = this.$moment(_data[0]).format("YYYY-MM-DD");
_data[1] = this.$moment(_data[1]).format("YYYY-MM-DD");
this.queryParams.param = {
startTime: _data[0] + " " + "00:00:00",
endTime: _data[1] + " " + "23:59:59",
};
},
//
getRenew() {
this.Linepatient();
this.columnar();
},
},
};
</script>
<style scoped src="@/assets/styles/common.css"></style>
<style scoped>
>>> .el-card__body {
padding: 10px 0 !important;
}
.dis {
display: flex;
}
.header-title {
font-size: 18px;
}
.title-box {
padding: 10px 20px;
border-bottom: 1px solid #dfe6ec;
}
.dian-box {
align-items: center;
}
.dian {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin: 0 10px;
}
.title-box {
justify-content: space-between;
}
. >>> .el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>> .el-radio__input {
display: none;
}
>>> .el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>
>>>.el-card__body {
padding: 10px 0 !important;
}
.dis {
display: flex;
}
.header-title {
font-size: 18px;
}
.title-box {
padding: 10px 20px;
border-bottom: 1px solid #dfe6ec;
}
.dian-box {
align-items: center;
}
.dian {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 50%;
margin: 0 10px;
}
.title-box {
justify-content: space-between;
}
.>>>.el-radio--small.is-bordered {
margin-right: 20px !important;
margin-left: 0 !important;
}
>>>.el-radio__input {
display: none;
}
>>>.el-radio__label {
padding-left: 5px;
}
.app-container {
padding: 0;
display: flex;
justify-content: space-between;
}
.title {
display: flex;
align-items: center;
font-size: 20px;
font-weight: 600;
}
.title-bor {
display: inline-block;
height: 20px;
width: 6px;
background: #4f8bff;
margin-right: 10px;
border-radius: 8px;
}
</style>
Loading…
Cancel
Save