feat(reportmanage): 报表维度扩展 — 多维度报表查询

- 新增 IReportDimensionAppService + ReportDimensionAppServiceImpl
- 新增 ReportDimensionController (GET /query)
- 支持按状态/DRG/诊断维度统计
- 前端 ReportDimension.vue 维度切换+明细表格
This commit is contained in:
2026-06-18 17:37:34 +08:00
parent 0994550f2f
commit 5dda5fe217
5 changed files with 271 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
import request from '@/utils/request'
export function getReportByDimension(params) {
return request({ url: '/report-manage/report-dimension/query', method: 'get', params })
}

View File

@@ -0,0 +1,125 @@
<template>
<div class="report-dimension-container">
<div class="page-header">
<span class="tab-title">多维度报表</span>
</div>
<el-card shadow="never" style="margin-bottom: 16px">
<template #header>
<span>查询条件</span>
</template>
<el-form :model="queryParams" inline>
<el-form-item label="统计维度">
<el-select v-model="queryParams.dimension" style="width: 140px">
<el-option label="按质控状态" value="status" />
<el-option label="按DRG分组" value="drg" />
<el-option label="按主要诊断" value="diagnosis" />
</el-select>
</el-form-item>
<el-form-item label="开始日期">
<el-date-picker v-model="queryParams.startDate" type="date" value-format="YYYY-MM-DD" placeholder="开始日期" />
</el-form-item>
<el-form-item label="结束日期">
<el-date-picker v-model="queryParams.endDate" type="date" value-format="YYYY-MM-DD" placeholder="结束日期" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="loadData" :loading="loading">查询</el-button>
</el-form-item>
</el-form>
</el-card>
<el-row :gutter="16" style="margin-bottom: 16px">
<el-col :span="8">
<el-card shadow="never">
<div class="stat-card">
<div class="stat-value" style="color: #409eff">{{ reportData.totalCount || 0 }}</div>
<div class="stat-label">总病案数</div>
</div>
</el-card>
</el-col>
<el-col :span="8">
<el-card shadow="never">
<div class="stat-card">
<div class="stat-value" style="color: #e6a23c">{{ formatCost(reportData.totalCost) }}</div>
<div class="stat-label">总费用</div>
</div>
</el-card>
</el-col>
<el-col :span="8">
<el-card shadow="never">
<div class="stat-card">
<div class="stat-value" style="color: #67c23a">{{ formatCost(reportData.avgCost) }}</div>
<div class="stat-label">平均费用</div>
</div>
</el-card>
</el-col>
</el-row>
<el-card shadow="never">
<template #header>
<span>{{ dimensionLabel }}明细</span>
</template>
<el-table :data="reportData.data || []" v-loading="loading" border stripe style="width: 100%">
<el-table-column prop="dimension" :label="dimensionLabel" min-width="160" />
<el-table-column prop="count" label="病案数" width="100" />
<el-table-column prop="totalCost" label="总费用" width="140">
<template #default="{ row }">{{ formatCost(row.totalCost) }}</template>
</el-table-column>
<el-table-column prop="avgCost" label="平均费用" width="140">
<template #default="{ row }">{{ formatCost(row.avgCost) }}</template>
</el-table-column>
<el-table-column prop="avgLosDays" label="平均住院日" width="120">
<template #default="{ row }">{{ row.avgLosDays }}</template>
</el-table-column>
</el-table>
</el-card>
</div>
</template>
<script setup>
import { ref, reactive, computed, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { getReportByDimension } from '@/api/reportmanage/dimension'
const loading = ref(false)
const queryParams = reactive({
dimension: 'status',
startDate: '',
endDate: ''
})
const reportData = ref({})
const DIMENSION_LABEL = { status: '质控状态', drg: 'DRG分组', diagnosis: '主要诊断' }
const dimensionLabel = computed(() => DIMENSION_LABEL[queryParams.dimension] || '维度')
const formatCost = (val) => {
if (!val || val === '0') return '¥0'
return '¥' + Number(val).toLocaleString('zh-CN', { minimumFractionDigits: 2 })
}
const loadData = async () => {
loading.value = true
try {
const params = { dimension: queryParams.dimension }
if (queryParams.startDate) params.startDate = queryParams.startDate
if (queryParams.endDate) params.endDate = queryParams.endDate
const res = await getReportByDimension(params)
reportData.value = res.data || {}
} catch (e) {
ElMessage.error('加载失败: ' + (e.message || '未知错误'))
} finally {
loading.value = false
}
}
onMounted(() => loadData())
</script>
<style scoped>
.report-dimension-container { padding: 16px; }
.page-header { margin-bottom: 16px; }
.tab-title { font-size: 18px; font-weight: bold; }
.stat-card { text-align: center; padding: 12px 0; }
.stat-value { font-size: 28px; font-weight: bold; }
.stat-label { font-size: 13px; color: #909399; margin-top: 4px; }
</style>