fix: 健康管理系统,统计页面功能开发。

This commit is contained in:
tianyongbao
2024-12-19 16:08:27 +08:00
parent 42711ddc49
commit e13adf29be
9 changed files with 301 additions and 207 deletions

View File

@@ -23,3 +23,19 @@ export function getHealthAnalysis(query) {
params: query params: query
}) })
} }
export function getRecordAnalysis(query) {
return request({
url: '/health/analysis/recordAnalysis',
method: 'get',
params: query
})
}
export function getDoctorAnalysis(query) {
return request({
url: '/health/analysis/doctorAnalysis',
method: 'get',
params: query
})
}

View File

@@ -4,10 +4,15 @@
<div class="title">查询条件</div> <div class="title">查询条件</div>
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="人员姓名" prop="personId"> <el-form-item label="人员姓名" prop="personId">
<el-select v-model="queryParams.personId" placeholder="请选择人员" clearable> <el-select v-model="queryParams.personId" placeholder="请选择人员姓名" clearable @change="handleQueryPersonChange">
<el-option v-for="person in personList" :key="person.id" :label="person.name" :value="person.id" /> <el-option v-for="person in personList" :key="person.id" :label="person.name" :value="person.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="健康档案" prop="healthRecordId">
<el-select v-model="queryParams.healthRecordId" placeholder="请选择健康档案" clearable>
<el-option v-for="health in healthRecordList" :key="health.id" :label="health.name" :value="health.id" />
</el-select>
</el-form-item>
<el-form-item label="医院名称" prop="hospitalName"> <el-form-item label="医院名称" prop="hospitalName">
<el-input v-model="queryParams.hospitalName" placeholder="请输入医院名称" clearable @keyup.enter="handleQuery" /> <el-input v-model="queryParams.hospitalName" placeholder="请输入医院名称" clearable @keyup.enter="handleQuery" />
</el-form-item> </el-form-item>
@@ -390,6 +395,13 @@ const handlePersonChange = (personId) => {
} }
}) })
} }
const handleQueryPersonChange = (personId) => {
queryHealthRecordParams.personId = personId
queryParams.value.healthRecordId = null
listHealthRecord(queryHealthRecordParams).then((response) => {
healthRecordList.value = response.rows
})
}
const handleCountChange = (count) => { const handleCountChange = (count) => {
if (formDetail.value.price != null) { if (formDetail.value.price != null) {
@@ -726,6 +738,11 @@ function getList() {
function getPersonList() { function getPersonList() {
listPerson(queryPersonParams.value).then((response) => { listPerson(queryPersonParams.value).then((response) => {
personList.value = response.rows personList.value = response.rows
if (response.rows.length > 0) {
listHealthRecord(queryHealthRecordParams).then((res) => {
healthRecordList.value = res.rows
})
}
}) })
} }

View File

@@ -63,7 +63,7 @@
<div class="item-wrap"> <div class="item-wrap">
<div class="title">就医次数</div> <div class="title">就医次数</div>
<div> <div>
<span class="num">{{ mar.marCategoryCount }}</span <span class="num">{{ doctor.doctorCount }}</span
><span class="unit"></span> ><span class="unit"></span>
</div> </div>
</div> </div>
@@ -75,7 +75,7 @@
<div class="item-wrap"> <div class="item-wrap">
<div class="title">就医费用</div> <div class="title">就医费用</div>
<div> <div>
<span class="num">{{ mar.marCount }}</span <span class="num">{{ doctor.doctorCost }}</span
><span class="unit"> </span> ><span class="unit"> </span>
</div> </div>
</div> </div>
@@ -88,8 +88,7 @@
<div class="item-wrap"> <div class="item-wrap">
<div class="title">常去医院</div> <div class="title">常去医院</div>
<div> <div>
<span class="num">{{ mar.qingre }}</span <span class="num" style="font-size: 16px">{{ doctor.commonHospital }}</span>
><span class="unit">XXX</span>
</div> </div>
</div> </div>
</div> </div>
@@ -100,25 +99,23 @@
<div class="item-wrap"> <div class="item-wrap">
<div class="title">常去科室</div> <div class="title">常去科室</div>
<div> <div>
<span class="num">{{ mar.zhike }}</span <span style="font-size: 18px" class="num">{{ doctor.commonDepartments }}</span>
><span class="unit">XXX</span> </div>
</div>
</div>
<div class="right-con">
<div class="img">
<img src="@/assets/images/average.png" alt="" />
</div>
<div class="item-wrap">
<div class="title">常看大夫</div>
<div>
<span class="num" style="font-size: 18px">{{ doctor.commonDoctor }}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="summary-con" style="height: 115px"> <div class="summary-con" style="height: 115px">
<div class="right-con">
<div class="img">
<img src="@/assets/images/average.png" alt="" />
</div>
<div class="item-wrap">
<div class="title">常看大夫</div>
<div>
<span class="num">{{ mar.wuhua }}</span
><span class="unit">XXX</span>
</div>
</div>
</div>
<div class="right-con"> <div class="right-con">
<div class="img"> <div class="img">
<img src="@/assets/images/average.png" alt="" /> <img src="@/assets/images/average.png" alt="" />
@@ -126,7 +123,7 @@
<div class="item-wrap"> <div class="item-wrap">
<div class="title">门诊次数</div> <div class="title">门诊次数</div>
<div> <div>
<span class="num">{{ mar.marCategoryCount }}</span <span class="num">{{ doctor.clinicCount }}</span
><span class="unit"></span> ><span class="unit"></span>
</div> </div>
</div> </div>
@@ -138,7 +135,19 @@
<div class="item-wrap"> <div class="item-wrap">
<div class="title">急诊次数</div> <div class="title">急诊次数</div>
<div> <div>
<span class="num">{{ mar.marCount }}</span <span class="num">{{ doctor.emergencyCount }}</span
><span class="unit"> </span>
</div>
</div>
</div>
<div class="right-con">
<div class="img">
<img src="@/assets/images/average.png" alt="" />
</div>
<div class="item-wrap">
<div class="title">输液次数</div>
<div>
<span class="num">{{ doctor.infusionCount }}</span
><span class="unit"> </span> ><span class="unit"> </span>
</div> </div>
</div> </div>
@@ -151,7 +160,19 @@
<div class="item-wrap"> <div class="item-wrap">
<div class="title">住院次数</div> <div class="title">住院次数</div>
<div> <div>
<span class="num">{{ mar.qingre }}</span <span class="num">{{ doctor.hospitalizedCount }}</span
><span class="unit"></span>
</div>
</div>
</div>
<div class="right-con">
<div class="img">
<img src="@/assets/images/average.png" alt="" />
</div>
<div class="item-wrap">
<div class="title">线上问诊次数</div>
<div>
<span class="num">{{ doctor.onlineCount }}</span
><span class="unit"></span> ><span class="unit"></span>
</div> </div>
</div> </div>
@@ -161,46 +182,62 @@
<div class="title">就医统计</div> <div class="title">就医统计</div>
<div class="operate-btn-con"> <div class="operate-btn-con">
<el-radio-group v-model="radioVal" @change="handleRadioChange"> <el-radio-group v-model="radioVal" @change="handleRadioChange">
<el-radio-button label="就医明细统计" />
<el-radio-button label="就诊医院统计" />
<el-radio-button label="就诊科室统计" />
<el-radio-button label="就诊大夫统计" />
<el-radio-button label="就医费用柱状图" /> <el-radio-button label="就医费用柱状图" />
<el-radio-button label="就医费用折线图" /> <el-radio-button label="就医费用折线图" />
<el-radio-button label="就诊医院统计" />
<el-radio-button label="就诊大夫统计" />
<el-radio-button label="就医明细统计" />
</el-radio-group> </el-radio-group>
</div> </div>
</div> </div>
<div class="content-con"> <div class="content-con">
<div v-show="radioVal === '就医费用柱状图'" class="chart" id="chartBar" style="height: calc(100% - 225px); margin-top: -10px"></div> <div v-show="radioVal === '就医费用柱状图'" class="chart" id="chartBar" style="height: calc(100% - 225px); margin-top: -10px"></div>
<div v-show="radioVal === '就医费用折线图'" class="chart" id="chartLine" style="height: calc(100% - 225px); margin-top: -10px"></div> <div v-show="radioVal === '就医费用折线图'" class="chart" id="chartLine" style="height: calc(100% - 225px); margin-top: -10px"></div>
<el-table v-show="radioVal === '就诊医院统计'" v-loading="loading" :data="mar.marMapList" height="calc(100% - 245px)"> <el-table v-show="radioVal === '就诊医院统计'" v-loading="loading" :data="doctor.hospitalStaticList" height="calc(100% - 245px)">
<el-table-column label="序号" width="50" type="index" align="center"> <el-table-column label="序号" width="50" type="index" align="center">
<template #default="scope"> <template #default="scope">
<span>{{ scope.$index + 1 }}</span> <span>{{ scope.$index + 1 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="医院名称" align="center" prop="time" /> <el-table-column label="医院名称" align="center" prop="hospitalName" />
<el-table-column label="就诊次数" align="center" prop="value" /> <el-table-column label="就诊次数" align="center" prop="count" />
</el-table> </el-table>
<el-table v-show="radioVal === '就诊大夫统计'" v-loading="loading" :data="mar.marMapList" height="calc(100% - 245px)"> <el-table v-show="radioVal === '就诊科室统计'" v-loading="loading" :data="doctor.departStaticList" height="calc(100% - 245px)">
<el-table-column label="序号" width="50" type="index" align="center"> <el-table-column label="序号" width="50" type="index" align="center">
<template #default="scope"> <template #default="scope">
<span>{{ scope.$index + 1 }}</span> <span>{{ scope.$index + 1 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="就诊大夫" align="center" prop="time" /> <el-table-column label="就诊科室" align="center" prop="departments" />
<el-table-column label="所在医院" align="center" prop="value" /> <el-table-column label="就诊次数" align="center" prop="count" />
<el-table-column label="就诊次数" align="center" prop="dosage" />
</el-table> </el-table>
<el-table v-show="radioVal === '就医明细统计'" v-loading="loading" :data="mar.marMapList" height="calc(100% - 245px)"> <el-table v-show="radioVal === '就诊大夫统计'" v-loading="loading" :data="doctor.doctorStaticList" height="calc(100% - 245px)">
<el-table-column label="序号" width="50" type="index" align="center"> <el-table-column label="序号" width="50" type="index" align="center">
<template #default="scope"> <template #default="scope">
<span>{{ scope.$index + 1 }}</span> <span>{{ scope.$index + 1 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="药品名称" align="center" prop="time" /> <el-table-column label="就诊大夫" align="center" prop="doctor" />
<el-table-column label="用药次数" align="center" prop="value" /> <el-table-column label="所在医院" align="center" prop="hospitalName" />
<el-table-column label="用药总量" align="center" prop="dosage" /> <el-table-column label="就诊次数" align="center" prop="count" />
<el-table-column label="单位" align="center" prop="unit" /> </el-table>
<el-table v-show="radioVal === '就医明细统计'" v-loading="loading" :data="doctor.doctorTableList" height="calc(100% - 245px)">
<el-table-column label="序号" width="50" type="index" align="center">
<template #default="scope">
<span>{{ scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="就诊医院" align="center" width="250" prop="hospitalName" />
<el-table-column label="就医类型" align="center" width="150" prop="type">
<template #default="scope">
<dict-tag :options="doctor_type" :value="scope.row.type" />
</template>
</el-table-column>
<el-table-column label="就诊大夫" align="center" width="150" prop="doctor" />
<el-table-column label="就诊时间" align="center" width="160" prop="visitingTime" />
<el-table-column label="诊断结果" align="center" prop="diagnosis" />
<el-table-column label="就诊费用(元)" align="center" width="150" prop="totalCost" />
</el-table> </el-table>
</div> </div>
</div> </div>
@@ -212,14 +249,20 @@ import dayjs from 'dayjs'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import yearPicker from '@/components/YearPicker/index.vue' import yearPicker from '@/components/YearPicker/index.vue'
import { getMarAnalysis } from '@/api/health/statisticAnalysis' import { getDoctorAnalysis } from '@/api/health/statisticAnalysis'
import { listPerson, getPerson } from '@/api/health/person' import { listPerson, getPerson } from '@/api/health/person'
import { listHealthRecord } from '@/api/health/healthRecord' import { listHealthRecord } from '@/api/health/healthRecord'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const { deal_type, account_type, deal_category } = proxy.useDict('deal_type', 'account_type', 'deal_category')
const personList = ref([]) const personList = ref([])
const healthRecordList = ref([]) const healthRecordList = ref([])
const { doctor_type, cost_type, check_type, package_unit, nursing_type, mar_type } = proxy.useDict(
'doctor_type',
'cost_type',
'check_type',
'package_unit',
'nursing_type',
'mar_type'
)
const dateValue = ref({ startYear: 2000, endYear: new Date().getFullYear() }) const dateValue = ref({ startYear: 2000, endYear: new Date().getFullYear() })
const showYearValue = ref({ startShowYear: '', endShowYear: '' }) const showYearValue = ref({ startShowYear: '', endShowYear: '' })
const updateStatisticYear = (startYear, endYear) => { const updateStatisticYear = (startYear, endYear) => {
@@ -234,7 +277,7 @@ const dates = [{ value: 1, label: '日' }]
const accountsList = ref([]) const accountsList = ref([])
const loading = ref(true) const loading = ref(true)
const total = ref(0) const total = ref(0)
const radioVal = ref('用药次数柱状图') const radioVal = ref('就医明细统计')
const dateValidate = (rules, value, callback) => { const dateValidate = (rules, value, callback) => {
const dateType = rules.dateType || 'days' const dateType = rules.dateType || 'days'
const num = rules.num || 31 const num = rules.num || 31
@@ -312,9 +355,9 @@ function getPersonList() {
} }
const today = new Date() const today = new Date()
const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2) + '-' + ('0' + today.getDate()).slice(-2) // const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2) + '-' + ('0' + today.getDate()).slice(-2)
const start = dayjs(end).add(-60, 'day') // const start = dayjs(end).add(-60, 'day')
queryParams.value.time = [start, end] // queryParams.value.time = [start, end]
const handleTimeChange = (type) => { const handleTimeChange = (type) => {
queryParams.value.time = null queryParams.value.time = null
if (type === 1) { if (type === 1) {
@@ -362,7 +405,7 @@ const calendarChange = (val) => {
if (val[1]) firstChooseDate.value = '' if (val[1]) firstChooseDate.value = ''
} }
const mar = ref({}) const doctor = ref({})
const chartData = ref({ const chartData = ref({
name: [], name: [],
value1: [] value1: []
@@ -387,16 +430,16 @@ function getList() {
id, id,
recordId recordId
} }
getMarAnalysis(params).then((response) => { getDoctorAnalysis(params).then((response) => {
loading.value = false loading.value = false
mar.value = { ...response.data } doctor.value = { ...response.data }
mar.value.marList.map((item) => { doctor.value.doctorCostList.map((item) => {
return { return {
name: item.time, name: item.time,
value: item.value value: item.value
} }
}) })
response.data.marList.map((item) => { response.data.doctorCostList.map((item) => {
chartData.value.name.push(item.time) chartData.value.name.push(item.time)
chartData.value.value1.push(item.value) chartData.value.value1.push(item.value)
}) })
@@ -411,10 +454,10 @@ function handleQuery() {
function resetQuery() { function resetQuery() {
proxy.resetForm('queryRef') proxy.resetForm('queryRef')
queryParams.value.id = null queryParams.value.id = null
const today = new Date() // const today = new Date()
const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2) + '-' + ('0' + today.getDate()).slice(-2) // const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2) + '-' + ('0' + today.getDate()).slice(-2)
const start = dayjs(end).add(-60, 'day') // const start = dayjs(end).add(-60, 'day')
queryParams.value.time = [start, end] // queryParams.value.time = [start, end]
total.value = 0 total.value = 0
getPersonList() getPersonList()
} }
@@ -440,7 +483,7 @@ const drawBar = (data) => {
type: 'shadow' type: 'shadow'
}, },
formatter: function (params) { formatter: function (params) {
return params[0].name + '<br>' + '用' + params[0].value + '' return params[0].name + '<br>' + '用:' + params[0].value + ''
} }
}, },
grid: { grid: {
@@ -470,7 +513,7 @@ const drawBar = (data) => {
type: 'value', type: 'value',
// min: 1, // 设置 y 轴的最小值为 0 // min: 1, // 设置 y 轴的最小值为 0
// max: 16, // 设置 y 轴的最大值为 100 // max: 16, // 设置 y 轴的最大值为 100
interval: 1, //设置y轴刻度间隔 // interval: 1, //设置y轴刻度间隔
axisTick: { axisTick: {
show: true // 默认为true如果要隐藏则改为 false show: true // 默认为true如果要隐藏则改为 false
}, },
@@ -491,18 +534,7 @@ const drawBar = (data) => {
itemStyle: { itemStyle: {
// 此处可以是一个固定颜色值,也可以是一个回调函数根据数据动态计算颜色 // 此处可以是一个固定颜色值,也可以是一个回调函数根据数据动态计算颜色
color: function (params) { color: function (params) {
// 这里可以根据需要设置不同的颜色,比如根据数据值 return '#2283cf' // 数据在50到99之间为蓝色
if (params.data < 4) {
return '#37b328'
} else if (params.data >= 4 && params.data < 8) {
return '#ff00ff'
} else if (params.data >= 8 && params.data < 12) {
return '#ff0066'
} else if (params.data >= 12 && params.data < 15) {
return '#ff0000'
} else if (params.data >= 15) {
return '#990000' // 数据在50到99之间为蓝色
}
} }
} }
} }
@@ -540,7 +572,7 @@ const drawLine = (data) => {
type: 'shadow' type: 'shadow'
}, },
formatter: function (params) { formatter: function (params) {
return params[0].name + '<br>' + '用' + params[0].value + '' return params[0].name + '<br>' + '用:' + params[0].value + ''
} }
}, },
xAxis: { xAxis: {
@@ -559,8 +591,8 @@ const drawLine = (data) => {
yAxis: { yAxis: {
type: 'value', type: 'value',
// min: 1, // 设置 y 轴的最小值为 0 // min: 1, // 设置 y 轴的最小值为 0
// max: 16, // 设置 y 轴的最大值为 100 // // max: 16, // 设置 y 轴的最大值为 100
interval: 1, //设置y轴刻度间隔 // interval: 1, //设置y轴刻度间隔
axisTick: { axisTick: {
show: true show: true
}, },
@@ -582,18 +614,7 @@ const drawLine = (data) => {
itemStyle: { itemStyle: {
// 此处可以是一个固定颜色值,也可以是一个回调函数根据数据动态计算颜色 // 此处可以是一个固定颜色值,也可以是一个回调函数根据数据动态计算颜色
color: function (params) { color: function (params) {
// 这里可以根据需要设置不同的颜色,比如根据数据值 return '#2283cf' // 数据在50到99之间为蓝色
if (params.data < 4) {
return '#37b328'
} else if (params.data >= 4 && params.data < 8) {
return '#ff00ff'
} else if (params.data >= 8 && params.data < 12) {
return '#ff0066'
} else if (params.data >= 12 && params.data < 15) {
return '#ff0000'
} else if (params.data >= 15) {
return '#990000' // 数据在50到99之间为蓝色
}
} }
}, },
smooth: true, smooth: true,
@@ -626,14 +647,14 @@ const drawLine = (data) => {
myChart.setOption(option) myChart.setOption(option)
} }
const currentType = ref('用药次数柱状图') const currentType = ref('就医费用柱状图')
const handleRadioChange = (type) => { const handleRadioChange = (type) => {
currentType.value = type currentType.value = type
switch (type) { switch (type) {
case '用药次数柱状图': case '就医费用柱状图':
drawBar(chartData.value) drawBar(chartData.value)
break break
case '用药次数折线图': case '就医费用折线图':
drawLine(chartData.value) drawLine(chartData.value)
break break
default: default:

View File

@@ -12,7 +12,7 @@
<div class="item"> <div class="item">
<img src="./assets/ticketSum.png" alt="" /> <img src="./assets/ticketSum.png" alt="" />
<div class="info-sum"> <div class="info-sum">
<div class="title">档案</div> <div class="title">档案数</div>
<div class="num">{{ healthRecordCount }}<span></span></div> <div class="num">{{ healthRecordCount }}<span></span></div>
</div> </div>
</div> </div>
@@ -127,7 +127,7 @@
<div class="item"> <div class="item">
<img src="./assets/one.png" alt="" /> <img src="./assets/one.png" alt="" />
<div class="info-sum"> <div class="info-sum">
<div class="title">档案</div> <div class="title">档案数</div>
<div class="num">{{ item.healthRecordCount }}<span></span></div> <div class="num">{{ item.healthRecordCount }}<span></span></div>
</div> </div>
</div> </div>

View File

@@ -61,7 +61,7 @@
</el-table-column> </el-table-column>
<el-table-column label="发生时间" align="center" prop="occurTime" width="160"> </el-table-column> <el-table-column label="发生时间" align="center" prop="occurTime" width="160"> </el-table-column>
<el-table-column label="康复时间" align="center" prop="rehabilitationTime" width="160"> </el-table-column> <el-table-column label="康复时间" align="center" prop="rehabilitationTime" width="160"> </el-table-column>
<el-table-column label="持续时间" align="center" prop="duration" width="160"> </el-table-column> <el-table-column label="康复周期" align="center" prop="duration" width="160"> </el-table-column>
<el-table-column label="发生原因" align="center" width="120" prop="etiology"> <el-table-column label="发生原因" align="center" width="120" prop="etiology">
<template #default="scope"> <template #default="scope">
<dict-tag :options="etiology" :value="scope.row.etiology" /> <dict-tag :options="etiology" :value="scope.row.etiology" />

View File

@@ -9,7 +9,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="健康档案" prop="recordId"> <el-form-item label="健康档案" prop="recordId">
<el-select v-model="queryParams.recordId" placeholder="请选择健康档案" @change="handleRecordChange"> <el-select v-model="queryParams.recordId" placeholder="请选择健康档案" clearable @change="handleRecordChange">
<el-option v-for="health in healthRecordList" :key="health.id" :label="health.name" :value="health.id" /> <el-option v-for="health in healthRecordList" :key="health.id" :label="health.name" :value="health.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
@@ -56,14 +56,26 @@
</div> </div>
<div class="main-con" style="height: calc(100% - 1.45rem)"> <div class="main-con" style="height: calc(100% - 1.45rem)">
<div class="summary-con" style="height: 115px"> <div class="summary-con" style="height: 115px">
<div class="right-con" v-show="mar.marCategoryCount > 0"> <div class="right-con">
<div class="img"> <div class="img">
<img src="@/assets/images/average.png" alt="" /> <img src="@/assets/images/average.png" alt="" />
</div> </div>
<div class="item-wrap"> <div class="item-wrap">
<div class="title">建档次数</div> <div class="title">档案数量</div>
<div> <div>
<span class="num">{{ mar.marCategoryCount }}</span <span class="num">{{ record.healthRecordCount }}</span
><span class="unit"></span>
</div>
</div>
</div>
<div class="right-con">
<div class="img">
<img src="@/assets/images/average.png" alt="" />
</div>
<div class="item-wrap">
<div class="title">档案过程记录次数</div>
<div>
<span class="num">{{ record.processRecordCount }}</span
><span class="unit"></span> ><span class="unit"></span>
</div> </div>
</div> </div>
@@ -75,8 +87,9 @@
<div class="item-wrap"> <div class="item-wrap">
<div class="title">平均康复周期</div> <div class="title">平均康复周期</div>
<div> <div>
<span class="num">{{ mar.marCount }}</span <span class="num">{{ record.perDuration.split(',')[0] }}</span
><span class="unit"> </span> ><span class="unit"></span> <span class="num">{{ record.perDuration.split(',')[1] }}</span
><span class="unit">小时</span>
</div> </div>
</div> </div>
</div> </div>
@@ -85,10 +98,10 @@
<img src="@/assets/images/average.png" alt="" /> <img src="@/assets/images/average.png" alt="" />
</div> </div>
<div class="item-wrap"> <div class="item-wrap">
<div class="title">就医次数</div> <div class="title">就医医院</div>
<div> <div>
<span class="num">{{ mar.marCount }}</span <span class="num">{{ record.hospitalCount }}</span
><span class="unit"> </span> ><span class="unit"></span>
</div> </div>
</div> </div>
</div> </div>
@@ -98,10 +111,10 @@
<img src="@/assets/images/average.png" alt="" /> <img src="@/assets/images/average.png" alt="" />
</div> </div>
<div class="item-wrap"> <div class="item-wrap">
<div class="title">医费用</div> <div class="title">诊大夫</div>
<div> <div>
<span class="num">{{ mar.qingre }}</span <span class="num">{{ record.doctorTotalCount }}</span
><span class="unit"></span> ><span class="unit"></span>
</div> </div>
</div> </div>
</div> </div>
@@ -112,10 +125,22 @@
<img src="@/assets/images/average.png" alt="" /> <img src="@/assets/images/average.png" alt="" />
</div> </div>
<div class="item-wrap"> <div class="item-wrap">
<div class="title">用药种类</div> <div class="title">就医次数</div>
<div> <div>
<span class="num">{{ mar.zhike }}</span <span class="num">{{ record.doctorCount }}</span
><span class="unit"></span> ><span class="unit"></span>
</div>
</div>
</div>
<div class="right-con">
<div class="img">
<img src="@/assets/images/average.png" alt="" />
</div>
<div class="item-wrap">
<div class="title">就医费用</div>
<div>
<span class="num">{{ record.doctorCost }}</span
><span class="unit"></span>
</div> </div>
</div> </div>
</div> </div>
@@ -126,7 +151,7 @@
<div class="item-wrap"> <div class="item-wrap">
<div class="title">用药天数</div> <div class="title">用药天数</div>
<div> <div>
<span class="num">{{ mar.wuhua }}</span <span class="num">{{ record.marDayCount }}</span
><span class="unit"></span> ><span class="unit"></span>
</div> </div>
</div> </div>
@@ -138,7 +163,7 @@
<div class="item-wrap"> <div class="item-wrap">
<div class="title">用药次数</div> <div class="title">用药次数</div>
<div> <div>
<span class="num">{{ mar.wuhua }}</span <span class="num">{{ record.marCount }}</span
><span class="unit"></span> ><span class="unit"></span>
</div> </div>
</div> </div>
@@ -150,7 +175,7 @@
<div class="item-wrap"> <div class="item-wrap">
<div class="title">发烧天数</div> <div class="title">发烧天数</div>
<div> <div>
<span class="num">{{ mar.kangjun }}</span> <span class="unit">(大于37)</span> <span class="num">{{ record.feverDayCount }}</span> <span class="unit">(>=37)</span>
</div> </div>
</div> </div>
</div> </div>
@@ -159,40 +184,30 @@
<div class="title">档案统计</div> <div class="title">档案统计</div>
<div class="operate-btn-con"> <div class="operate-btn-con">
<el-radio-group v-model="radioVal" @change="handleRadioChange"> <el-radio-group v-model="radioVal" @change="handleRadioChange">
<el-radio-button label="用药次数柱状图" /> <el-radio-button label="档案明细" />
<el-radio-button label="用药次数折线图" /> <el-radio-button label="档案费用柱状图" />
<el-radio-button label="按天用药明细" /> <el-radio-button label="档案费用折线图" />
<el-radio-button label="用药分类明细" />
</el-radio-group> </el-radio-group>
</div> </div>
</div> </div>
<div class="content-con"> <div class="content-con">
<div v-show="radioVal === '用药次数柱状图'" class="chart" id="chartBar" style="height: calc(100% - 225px); margin-top: -10px"></div> <div v-show="radioVal === '档案费用柱状图'" class="chart" id="chartBar" style="height: calc(100% - 225px); margin-top: -10px"></div>
<div v-show="radioVal === '用药次数折线图'" class="chart" id="chartLine" style="height: calc(100% - 225px); margin-top: -10px"></div> <div v-show="radioVal === '档案费用折线图'" class="chart" id="chartLine" style="height: calc(100% - 225px); margin-top: -10px"></div>
<el-table v-show="radioVal === '按天用药明细'" v-loading="loading" :data="mar.tableMarList" height="calc(100% - 245px)"> <el-table v-show="radioVal === '档案明细'" v-loading="loading" :data="record.recordList" height="calc(100% - 245px)">
<el-table-column label="序号" width="50" type="index" align="center"> <el-table-column label="序号" width="50" type="index" align="center">
<template #default="scope"> <template #default="scope">
<span>{{ scope.$index + 1 }}</span> <span>{{ scope.$index + 1 }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="用药日期" align="center" prop="time" /> <el-table-column label="档案名称" align="center" prop="name" />
<el-table-column prop="detail" label="用药明细" v-if="queryParams.type === 1"> <el-table-column label="发生时间" align="center" prop="occurTime" />
<template #default="scope"> <el-table-column label="持续时间" align="center" prop="duration" />
<span v-html="formatMultiLineData(scope.row.detail)"></span> <el-table-column label="过程记录次数" align="center" prop="processCount" />
</template> <el-table-column label="就医次数" align="center" prop="doctorCount" />
</el-table-column> <el-table-column label="就医费用" align="center" prop="doctorCost" />
</el-table> <el-table-column label="用药天数" align="center" prop="marDayCount" />
<el-table-column label="用药次数" align="center" prop="marCount" />
<el-table v-show="radioVal === '用药分类明细'" v-loading="loading" :data="mar.marMapList" height="calc(100% - 245px)"> <el-table-column label="发烧天数" align="center" prop="feverDayCount" />
<el-table-column label="序号" width="50" type="index" align="center">
<template #default="scope">
<span>{{ scope.$index + 1 }}</span>
</template>
</el-table-column>
<el-table-column label="药品名称" align="center" prop="time" />
<el-table-column label="用药次数" align="center" prop="value" />
<el-table-column label="用药总量" align="center" prop="dosage" />
<el-table-column label="单位" align="center" prop="unit" />
</el-table> </el-table>
</div> </div>
</div> </div>
@@ -204,11 +219,10 @@ import dayjs from 'dayjs'
import * as echarts from 'echarts' import * as echarts from 'echarts'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import yearPicker from '@/components/YearPicker/index.vue' import yearPicker from '@/components/YearPicker/index.vue'
import { getMarAnalysis } from '@/api/health/statisticAnalysis' import { getRecordAnalysis } from '@/api/health/statisticAnalysis'
import { listPerson, getPerson } from '@/api/health/person' import { listPerson } from '@/api/health/person'
import { listHealthRecord } from '@/api/health/healthRecord' import { listHealthRecord } from '@/api/health/healthRecord'
const { proxy } = getCurrentInstance() const { proxy } = getCurrentInstance()
const { deal_type, account_type, deal_category } = proxy.useDict('deal_type', 'account_type', 'deal_category')
const personList = ref([]) const personList = ref([])
const healthRecordList = ref([]) const healthRecordList = ref([])
@@ -226,7 +240,7 @@ const dates = [{ value: 1, label: '日' }]
const accountsList = ref([]) const accountsList = ref([])
const loading = ref(true) const loading = ref(true)
const total = ref(0) const total = ref(0)
const radioVal = ref('用药次数柱状图') const radioVal = ref('档案明细')
const dateValidate = (rules, value, callback) => { const dateValidate = (rules, value, callback) => {
const dateType = rules.dateType || 'days' const dateType = rules.dateType || 'days'
const num = rules.num || 31 const num = rules.num || 31
@@ -278,10 +292,7 @@ const handlePersonChange = (personId) => {
queryHealthRecordParams.personId = personId queryHealthRecordParams.personId = personId
listHealthRecord(queryHealthRecordParams).then((response) => { listHealthRecord(queryHealthRecordParams).then((response) => {
healthRecordList.value = response.rows healthRecordList.value = response.rows
if (response.rows.length > 0) {
queryParams.value.recordId = response.rows[0].id
getList() getList()
}
}) })
} }
@@ -294,39 +305,36 @@ function getPersonList() {
queryHealthRecordParams.personId = response.rows[0].id queryHealthRecordParams.personId = response.rows[0].id
listHealthRecord(queryHealthRecordParams).then((res) => { listHealthRecord(queryHealthRecordParams).then((res) => {
healthRecordList.value = res.rows healthRecordList.value = res.rows
if (res.rows.length > 0) {
queryParams.value.recordId = res.rows[0].id
getList() getList()
}
}) })
} }
}) })
} }
const today = new Date() const today = new Date()
const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2) + '-' + ('0' + today.getDate()).slice(-2) // const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2) + '-' + ('0' + today.getDate()).slice(-2)
const start = dayjs(end).add(-90, 'day') // const start = dayjs(end).add(-90, 'day')
queryParams.value.time = [start, end] // queryParams.value.time = [start, end]
const handleTimeChange = (type) => { // const handleTimeChange = (type) => {
queryParams.value.time = null // queryParams.value.time = null
if (type === 1) { // if (type === 1) {
const today = new Date() // const today = new Date()
const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2) + '-' + ('0' + today.getDate()).slice(-2) // const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2) + '-' + ('0' + today.getDate()).slice(-2)
const start = dayjs(end).add(-90, 'day') // const start = dayjs(end).add(-90, 'day')
queryParams.value.time = [start, end] // queryParams.value.time = [start, end]
} else if (type === 2) { // } else if (type === 2) {
const today = new Date() // const today = new Date()
const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2) // const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2)
const start = dayjs(end).add(-11, 'months') // const start = dayjs(end).add(-11, 'months')
queryParams.value.time = [start, end] // queryParams.value.time = [start, end]
} else if (type === 3) { // } else if (type === 3) {
const today = new Date() // const today = new Date()
const endYear = today.getFullYear() // const endYear = today.getFullYear()
queryParams.value.time = [new Date(endYear - 2, 0, 1), new Date(endYear, 0, 1)] // queryParams.value.time = [new Date(endYear - 2, 0, 1), new Date(endYear, 0, 1)]
showYearValue.value = { startShowYear: endYear - 2, endShowYear: endYear } // showYearValue.value = { startShowYear: endYear - 2, endShowYear: endYear }
} // }
getList() // getList()
} // }
function formatMultiLineData(data) { function formatMultiLineData(data) {
if (data != null) { if (data != null) {
return data.replace(/<br\/>/g, '<br/>') return data.replace(/<br\/>/g, '<br/>')
@@ -354,7 +362,7 @@ const calendarChange = (val) => {
if (val[1]) firstChooseDate.value = '' if (val[1]) firstChooseDate.value = ''
} }
const mar = ref({}) const record = ref({})
const chartData = ref({ const chartData = ref({
name: [], name: [],
value1: [] value1: []
@@ -379,16 +387,16 @@ function getList() {
id, id,
recordId recordId
} }
getMarAnalysis(params).then((response) => { getRecordAnalysis(params).then((response) => {
loading.value = false loading.value = false
mar.value = { ...response.data } record.value = { ...response.data }
mar.value.marList.map((item) => { record.value.recordCostList.map((item) => {
return { return {
name: item.time, name: item.time,
value: item.value value: item.value
} }
}) })
response.data.marList.map((item) => { response.data.recordCostList.map((item) => {
chartData.value.name.push(item.time) chartData.value.name.push(item.time)
chartData.value.value1.push(item.value) chartData.value.value1.push(item.value)
}) })
@@ -403,10 +411,10 @@ function handleQuery() {
function resetQuery() { function resetQuery() {
proxy.resetForm('queryRef') proxy.resetForm('queryRef')
queryParams.value.id = null queryParams.value.id = null
const today = new Date() // const today = new Date()
const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2) + '-' + ('0' + today.getDate()).slice(-2) // const end = today.getFullYear() + '-' + ('0' + (today.getMonth() + 1)).slice(-2) + '-' + ('0' + today.getDate()).slice(-2)
const start = dayjs(end).add(-60, 'day') // const start = dayjs(end).add(-60, 'day')
queryParams.value.time = [start, end] // queryParams.value.time = [start, end]
total.value = 0 total.value = 0
getPersonList() getPersonList()
} }
@@ -432,7 +440,7 @@ const drawBar = (data) => {
type: 'shadow' type: 'shadow'
}, },
formatter: function (params) { formatter: function (params) {
return params[0].name + '<br>' + '用' + params[0].value + '' return params[0].name + '<br>' + '用:' + params[0].value + ''
} }
}, },
grid: { grid: {
@@ -462,7 +470,7 @@ const drawBar = (data) => {
type: 'value', type: 'value',
// min: 1, // 设置 y 轴的最小值为 0 // min: 1, // 设置 y 轴的最小值为 0
// max: 16, // 设置 y 轴的最大值为 100 // max: 16, // 设置 y 轴的最大值为 100
interval: 1, //设置y轴刻度间隔 // interval: 1, //设置y轴刻度间隔
axisTick: { axisTick: {
show: true // 默认为true如果要隐藏则改为 false show: true // 默认为true如果要隐藏则改为 false
}, },
@@ -484,17 +492,7 @@ const drawBar = (data) => {
// 此处可以是一个固定颜色值,也可以是一个回调函数根据数据动态计算颜色 // 此处可以是一个固定颜色值,也可以是一个回调函数根据数据动态计算颜色
color: function (params) { color: function (params) {
// 这里可以根据需要设置不同的颜色,比如根据数据值 // 这里可以根据需要设置不同的颜色,比如根据数据值
if (params.data < 4) { return '#2283cf' // 数据在50到99之间为蓝色
return '#37b328'
} else if (params.data >= 4 && params.data < 8) {
return '#ff00ff'
} else if (params.data >= 8 && params.data < 12) {
return '#ff0066'
} else if (params.data >= 12 && params.data < 15) {
return '#ff0000'
} else if (params.data >= 15) {
return '#990000' // 数据在50到99之间为蓝色
}
} }
} }
} }
@@ -532,7 +530,7 @@ const drawLine = (data) => {
type: 'shadow' type: 'shadow'
}, },
formatter: function (params) { formatter: function (params) {
return params[0].name + '<br>' + '用' + params[0].value + '' return params[0].name + '<br>' + '用:' + params[0].value + ''
} }
}, },
xAxis: { xAxis: {
@@ -552,7 +550,7 @@ const drawLine = (data) => {
type: 'value', type: 'value',
// min: 1, // 设置 y 轴的最小值为 0 // min: 1, // 设置 y 轴的最小值为 0
// max: 16, // 设置 y 轴的最大值为 100 // max: 16, // 设置 y 轴的最大值为 100
interval: 1, //设置y轴刻度间隔 // interval: 1, //设置y轴刻度间隔
axisTick: { axisTick: {
show: true show: true
}, },
@@ -575,17 +573,7 @@ const drawLine = (data) => {
// 此处可以是一个固定颜色值,也可以是一个回调函数根据数据动态计算颜色 // 此处可以是一个固定颜色值,也可以是一个回调函数根据数据动态计算颜色
color: function (params) { color: function (params) {
// 这里可以根据需要设置不同的颜色,比如根据数据值 // 这里可以根据需要设置不同的颜色,比如根据数据值
if (params.data < 4) { return '#2283cf' // 数据在50到99之间为蓝色
return '#37b328'
} else if (params.data >= 4 && params.data < 8) {
return '#ff00ff'
} else if (params.data >= 8 && params.data < 12) {
return '#ff0066'
} else if (params.data >= 12 && params.data < 15) {
return '#ff0000'
} else if (params.data >= 15) {
return '#990000' // 数据在50到99之间为蓝色
}
} }
}, },
smooth: true, smooth: true,
@@ -618,14 +606,14 @@ const drawLine = (data) => {
myChart.setOption(option) myChart.setOption(option)
} }
const currentType = ref('用药次数柱状图') const currentType = ref('档案费用柱状图')
const handleRadioChange = (type) => { const handleRadioChange = (type) => {
currentType.value = type currentType.value = type
switch (type) { switch (type) {
case '用药次数柱状图': case '档案费用柱状图':
drawBar(chartData.value) drawBar(chartData.value)
break break
case '用药次数折线图': case '档案费用折线图':
drawLine(chartData.value) drawLine(chartData.value)
break break
default: default:

View File

@@ -4,10 +4,15 @@
<div class="title">查询条件</div> <div class="title">查询条件</div>
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="人员姓名" prop="personId"> <el-form-item label="人员姓名" prop="personId">
<el-select v-model="queryParams.personId" placeholder="请选择人员姓名" clearable> <el-select v-model="queryParams.personId" placeholder="请选择人员姓名" clearable @change="handleQueryPersonChange">
<el-option v-for="person in personList" :key="person.id" :label="person.name" :value="person.id" /> <el-option v-for="person in personList" :key="person.id" :label="person.name" :value="person.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="健康档案" prop="healthRecordId">
<el-select v-model="queryParams.healthRecordId" placeholder="请选择健康档案" clearable>
<el-option v-for="health in healthRecordList" :key="health.id" :label="health.name" :value="health.id" />
</el-select>
</el-form-item>
<el-form-item label="用药类型" prop="type"> <el-form-item label="用药类型" prop="type">
<el-select v-model="queryParams.type" placeholder="请选择用药类型" @change="handleTypeChange" clearable> <el-select v-model="queryParams.type" placeholder="请选择用药类型" @change="handleTypeChange" clearable>
<el-option v-for="dict in mar_type" :key="dict.value" :label="dict.label" :value="dict.value" /> <el-option v-for="dict in mar_type" :key="dict.value" :label="dict.label" :value="dict.value" />
@@ -256,6 +261,13 @@ const handlePersonChange = (personId) => {
} }
}) })
} }
const handleQueryPersonChange = (personId) => {
queryHealthRecordParams.personId = personId
queryParams.value.healthRecordId = null
listHealthRecord(queryHealthRecordParams).then((response) => {
healthRecordList.value = response.rows
})
}
const handleTypeChange = (type) => { const handleTypeChange = (type) => {
queryMedicineParams.value.treatmentType = type queryMedicineParams.value.treatmentType = type
@@ -276,6 +288,11 @@ const handleMedicineChange = (medicineId) => {
function getPersonList() { function getPersonList() {
listPerson(queryPersonParams.value).then((response) => { listPerson(queryPersonParams.value).then((response) => {
personList.value = response.rows personList.value = response.rows
if (response.rows.length > 0) {
listHealthRecord(queryHealthRecordParams).then((res) => {
healthRecordList.value = res.rows
})
}
}) })
} }

View File

@@ -4,10 +4,15 @@
<div class="title">查询条件</div> <div class="title">查询条件</div>
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="人员姓名" prop="personId"> <el-form-item label="人员姓名" prop="personId">
<el-select v-model="queryParams.personId" placeholder="请选择人员姓名" clearable> <el-select v-model="queryParams.personId" placeholder="请选择人员姓名" clearable @change="handleQueryPersonChange">
<el-option v-for="person in personList" :key="person.id" :label="person.name" :value="person.id" /> <el-option v-for="person in personList" :key="person.id" :label="person.name" :value="person.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="健康档案" prop="healthRecordId">
<el-select v-model="queryParams.healthRecordId" placeholder="请选择健康档案" clearable>
<el-option v-for="health in healthRecordList" :key="health.id" :label="health.name" :value="health.id" />
</el-select>
</el-form-item>
<el-form-item label="记录时间" prop="time"> <el-form-item label="记录时间" prop="time">
<el-date-picker v-model="queryParams.time" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" /> <el-date-picker v-model="queryParams.time" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
</el-form-item> </el-form-item>
@@ -164,10 +169,23 @@ const handlePersonChange = (personId) => {
}) })
} }
const handleQueryPersonChange = (personId) => {
queryHealthRecordParams.personId = personId
queryParams.value.healthRecordId = null
listHealthRecord(queryHealthRecordParams).then((response) => {
healthRecordList.value = response.rows
})
}
/** 查询成员管理列表 */ /** 查询成员管理列表 */
function getPersonList() { function getPersonList() {
listPerson(queryPersonParams.value).then((response) => { listPerson(queryPersonParams.value).then((response) => {
personList.value = response.rows personList.value = response.rows
if (response.rows.length > 0) {
listHealthRecord(queryHealthRecordParams).then((res) => {
healthRecordList.value = res.rows
})
}
}) })
} }

View File

@@ -4,10 +4,15 @@
<div class="title">查询条件</div> <div class="title">查询条件</div>
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px"> <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="人员姓名" prop="personId"> <el-form-item label="人员姓名" prop="personId">
<el-select v-model="queryParams.personId" placeholder="请选择人员姓名" clearable> <el-select v-model="queryParams.personId" placeholder="请选择人员姓名" clearable @change="handleQueryPersonChange">
<el-option v-for="person in personList" :key="person.id" :label="person.name" :value="person.id" /> <el-option v-for="person in personList" :key="person.id" :label="person.name" :value="person.id" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="健康档案" prop="healthRecordId">
<el-select v-model="queryParams.healthRecordId" placeholder="请选择健康档案" clearable>
<el-option v-for="health in healthRecordList" :key="health.id" :label="health.name" :value="health.id" />
</el-select>
</el-form-item>
<el-form-item label="测量时间" prop="time"> <el-form-item label="测量时间" prop="time">
<el-date-picker v-model="queryParams.time" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" /> <el-date-picker v-model="queryParams.time" type="daterange" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间" />
</el-form-item> </el-form-item>
@@ -180,10 +185,22 @@ const handlePersonChange = (personId) => {
}) })
} }
const handleQueryPersonChange = (personId) => {
queryHealthRecordParams.personId = personId
queryParams.value.healthRecordId = null
listHealthRecord(queryHealthRecordParams).then((response) => {
healthRecordList.value = response.rows
})
}
/** 查询成员管理列表 */ /** 查询成员管理列表 */
function getPersonList() { function getPersonList() {
listPerson(queryPersonParams.value).then((response) => { listPerson(queryPersonParams.value).then((response) => {
personList.value = response.rows personList.value = response.rows
if (response.rows.length > 0) {
listHealthRecord(queryHealthRecordParams).then((res) => {
healthRecordList.value = res.rows
})
}
}) })
} }