质量指标

This commit is contained in:
wyuu 2026-06-05 17:37:24 +08:00
parent c43e714c45
commit 880c4a0ba9
5 changed files with 542 additions and 367 deletions

View File

@ -235,3 +235,11 @@ export function qcCalc(data?: Object) {
params: data
})
}
//质量汇总查询
export function ncisQuery(data?: Object) {
return request({
url: '/ncis/query',
method: 'get',
params: data
})
}

View File

@ -125,6 +125,8 @@ aside {
.app-container {
padding: 10px 10px 0 10px;
height: calc(100vh - 5.25rem);
box-shadow: 0 2px 12px rgba(0, 0, 0, 0.07);
background-color: #f9f9f9;
}
.components-container {

View File

@ -41,12 +41,6 @@
</el-row>
<el-row>
<el-col :span="4">
<el-form-item label-width="50px">
<el-checkbox v-model="queryParams.alarmflag" label="仅危急值" @change="alarmHandle" size="large" />
<el-checkbox v-model="queryParams.jzbz" label="仅急诊" @change="jzbzHandle" size="large" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="姓名:" prop="brxm">
<el-input v-model="queryParams.brxm" clearable placeholder="请输入姓名" @keyup.enter="handleQuery"
@ -65,6 +59,12 @@
@clear="handleQuery" />
</el-form-item>
</el-col>
<el-form-item label-width="50px">
<el-checkbox v-model="queryParams.alarmflag" label="仅危急值" @change="alarmHandle" />
<el-checkbox v-model="queryParams.jzbz" label="仅急诊" @change="jzbzHandle" />
</el-form-item>
</el-row>
</el-form>
</el-row>
@ -103,13 +103,15 @@
</template>
</CustomVxeTable>
<div class="mask" :style="{ top: `${pageY}px` }">
<el-popover placement="left" :width="300" trigger="click">
<el-popover placement="left" :width="400" trigger="click">
<template #reference>
<div class="text">项目明细</div>
<div class="text">医嘱明细</div>
</template>
<el-table :data="sqlisReqs" style="width: 100%" border @row-click="sqxmClick" highlight-current-row
show-overflow-tooltip max-height="300px">
<el-table-column prop="sqxmdh" width="100" label="项目代号" />
<el-table-column prop="sqh" label="申请单号" />
<el-table-column prop="bz1" label="医嘱号" />
<el-table-column prop="sqxmdh" label="项目代号" />
<el-table-column prop="sqxmmc" label="项目名称" />
</el-table>
</el-popover>

View File

@ -1,366 +1,11 @@
<template>
<div class="app-container">
<div class="search-section">
<el-form inline :model="searchForm" class="search-form">
<el-form-item label="医疗机构">
<SelectTable v-model:data="searchForm.yljg" dictType="HOS" placeholder="请选择" width="200px" />
</el-form-item>
<el-form-item label="年度">
<el-date-picker v-model="searchForm.year" type="year" placeholder="选择年份" format="YYYY" value-format="YYYY"
style="width: 200px" />
</el-form-item>
<el-form-item label="季度">
<el-select v-model="searchForm.quarter" style="width: 120px" clearable>
<el-option label="第一季度" value="Q1" />
<el-option label="第二季度" value="Q2" />
<el-option label="第三季度" value="Q3" />
<el-option label="第四季度" value="Q4" />
</el-select>
</el-form-item>
<el-form-item label="月度">
<el-select v-model="searchForm.month" style="width: 120px" clearable>
<el-option label="1月" value="01" />
<el-option label="2月" value="02" />
<el-option label="3月" value="03" />
<el-option label="4月" value="04" />
<el-option label="5月" value="05" />
<el-option label="6月" value="06" />
<el-option label="7月" value="07" />
<el-option label="8月" value="08" />
<el-option label="9月" value="09" />
<el-option label="10月" value="10" />
<el-option label="11月" value="11" />
<el-option label="12月" value="12" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleSearch">查询</el-button>
<el-button type="warning" icon="Printer">打印</el-button>
</el-form-item>
</el-form>
</div>
<div>
<!-- 顶部标题 -->
<div class="header">
<div class="header-right">
<span>日期:{{ pageDate }}</span>
</div>
<div class="title">武汉市第五医院</div>
<div class="title">2026年度检验全过程质量指标</div>
</div>
<div class="table-main">
<!-- 说明文字 -->
<div class="note-section">
<div class="note-line">
您实验室LIS是否纳入质量指标相关数据采集与统计(*):
<el-radio-group v-model="lisIncluded">
<el-radio label="Y">是</el-radio>
<el-radio label="N">否</el-radio>
</el-radio-group>
</div>
<div class="note-red">
注意:如果条目您实验室确无可统计的数据,请填写“未统计”;若数据为0,请填写数字“0”;填写每个表格前请先勾选此表数据来源:LIS统计、手工计算或估算。
</div>
<div class="note-red">
非本单位实验室开展的检验项目均不纳入统计
</div>
</div>
<!-- 表格1 -->
<div class="table-section">
<el-table :data="table1Data" border style="width:100%" :row-class-name="setSourceRowClass"
:span-method="spanSourceMethod">
<el-table-column prop="itemName" label="(一)标本可接受性(*)" width="300" />
<el-table-column label="专业" align="center">
<el-table-column label="生化" prop="biochemistry" align="center">
<!-- 数据来源列:渲染单选框 -->
<template #default="{ row }">
<div v-if="row.isSourceRow" :style="{ textAlign: row.isSourceRow ? 'left' : 'center' }">
<el-radio-group :model-value="row.dataSource">
<el-radio label="LIS">LIS</el-radio>
<el-radio label="MANUAL">手工</el-radio>
<el-radio label="ESTIMATE">估算</el-radio>
</el-radio-group>
</div>
</template>
</el-table-column>
<el-table-column label="免疫" prop="immunity" align="center" />
<el-table-column label="临检" prop="clinical" align="center" />
<el-table-column label="微生物" prop="microbiology" align="center" />
</el-table-column>
</el-table>
</div>
<!-- 表格2 -->
<div class="table-section">
<el-table :data="table2Data" border style="width:100%">
<el-table-column prop="itemName" label="(二)检验报告(*)" width="300" />
<el-table-column label="专业" align="center">
<el-table-column label="生化" prop="biochemistry" align="center" />
<el-table-column label="免疫" prop="immunity" align="center" />
<el-table-column label="临检" prop="clinical" align="center" />
<el-table-column label="微生物" prop="microbiology" align="center" />
</el-table-column>
</el-table>
</div>
<!-- 表格3 -->
<div class="table-section">
<el-table :data="table3Data" border style="width:100%">
<el-table-column prop="itemName" label="(三)周转时间(*)" width="300" />
<el-table-column label="专业" align="center">
<el-table-column label="生化" prop="biochemistry" align="center" />
<el-table-column label="自动化免疫" prop="immunoAuto" align="center" />
<el-table-column label="三大常规" prop="routine" align="center" />
<el-table-column label="凝血" prop="coagulation" align="center" />
</el-table-column>
</el-table>
</div>
<!-- 表格4 -->
<div class="table-section">
<el-table :data="table4Data" border style="width:100%" :span-method="objectSpanMethod"
:row-class-name="tableRowClassName">
<el-table-column label="(三)周转时间(具体项目)(*)" width="300">
<el-table-column label="项目(时间单位:min)" prop="itemName" width="300" />
</el-table-column>
<el-table-column label="检验前周转时间" align="center">
<el-table-column label="本实验室规定时间" prop="preSpecTime" align="center">
<template #default="{ row }">
<div v-if="row.isSourceRow" :style="{ textAlign: row.isSourceRow ? 'left' : 'center' }">
<el-radio-group :model-value="row.dataSource">
<el-radio label="LIS">LIS</el-radio>
<el-radio label="MANUAL">手工</el-radio>
<el-radio label="ESTIMATE">估算</el-radio>
</el-radio-group>
</div>
</template>
</el-table-column>
<el-table-column label="年中位数" prop="preMedian" align="center" />
<el-table-column label="年第90百分位数" prop="preP90" align="center" />
</el-table-column>
<el-table-column label="实验室内周转时间" align="center">
<el-table-column label="本实验室规定时间" prop="inSpecTime" align="center" />
<el-table-column label="年中位数" prop="inMedian" align="center" />
<el-table-column label="年第90百分位数" prop="inP90" align="center" />
</el-table-column>
<el-table-column label="总周转时间" align="center">
<el-table-column label="本实验室规定时间" prop="totalSpecTime" align="center" />
<el-table-column label="年中位数" prop="totalMedian" align="center" />
<el-table-column label="年第90百分位数" prop="totalP90" align="center" />
</el-table-column>
<el-table-column label="年标本量" prop="totalSample" align="center" />
</el-table>
</div>
<!-- 表格5 -->
<div class="table-section">
<el-table :data="table5Data" border style="width:100%">
<el-table-column prop="itemName" label="(四)血培养污染(*)" width="300" />
<el-table-column label="专业" align="center">
<el-table-column label="微生物" prop="microbiology" align="center" />
</el-table-column>
</el-table>
</div>
<!-- 表格6 -->
<div class="table-section">
<el-table :data="table6Data" border style="width:100%" :row-class-name="setSourceRowClass">
<!-- 第一列:项目名称 -->
<el-table-column prop="itemName" label="(五)IQC、EQA(*)(微生物检测的EQA算1项,项目计数为小项,如钾、钠、氯各计1项)" width="700" />
<!-- 第二列:数值/数据来源勾选 -->
<el-table-column prop="value">
<template #default="{ row }">
<div v-if="row.isSourceRow" :style="{ textAlign: row.isSourceRow ? 'left' : 'center' }">
<el-radio-group :model-value="row.dataSource">
<el-radio label="LIS">LIS</el-radio>
<el-radio label="MANUAL">手工</el-radio>
<el-radio label="ESTIMATE">估算</el-radio>
</el-radio-group>
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script setup lang="ts" name="Summary">
import dayjs from 'dayjs'
<script setup lang="ts">
const searchForm = ref({
yljg: '',
year: '',
quarter: '',
month: ''
})
const pageDate = ref(dayjs().format('YYYY/MM/DD'))
const lisIncluded = ref('Y')
const table1Data = ref([
{ itemName: '数据来源', isSourceRow: true, dataSource: 'LIS' },
{ itemName: '本年标本总数', biochemistry: 0, immunity: 0, clinical: 0, microbiology: 0, }
])
// 样式标记
const setSourceRowClass = ({ row }) => row.isSourceRow ? 'source-row' : ''
const spanSourceMethod = ({ row, columnIndex }) => {
if (row.isSourceRow) {
// 数据来源行:第0列占1列1行,第1列跨4列(生化/免疫/临检/微生物),其余列隐藏
if (columnIndex === 0) {
return { rowspan: 1, colspan: 1 }; // 项目名称列
} else if (columnIndex >= 1 && columnIndex <= 4) {
// 专业列(生化/免疫/临检/微生物)合并为1列
if (columnIndex === 1) {
return { rowspan: 1, colspan: 4 }; // 仅第一列(生化)跨4列,其余列隐藏
} else {
return { rowspan: 0, colspan: 0 }; // 免疫/临检/微生物列隐藏
}
}
}
// 非数据来源行:正常显示
return { rowspan: 1, colspan: 1 };
}
const table2Data = ref([])
const table3Data = ref([])
const table4Data = ref([
{ itemName: '数据来源', isSourceRow: true, dataSource: 'LIS' },
{ itemName: '门诊项目', isMerge: true, },
{ itemName: '尿常规', preSpecTime: 60, preMedian: 13, preP90: 38, inSpecTime: 60, inMedian: 8, totalSpecTime: 120, totalSample: 9572 },
{ itemName: '住院项目', isMerge: true },
{ itemName: '血钾', preSpecTime: 60, preMedian: 52, preP90: 127, inSpecTime: 120, inMedian: 48, totalSpecTime: 180, totalSample: 14345 },
])
const table5Data = ref([])
const table6Data = ref([
{ itemName: '数据来源', isSourceRow: true, dataSource: 'LIS' },
{ itemName: '该年开展检验项目总数', value: 690 },
{ itemName: '开展室内质控项目总数', value: 155 },
{ itemName: '恋室室内质控CV有要求的项目数(定量项目)', value: 285 },
{ itemName: '室内质控CV高于规定要求的项目数(定量项目)', value: 0 }
])
const handleSearch = () => {
console.log('查询条件:', searchForm.value)
}
// 合并单元格逻辑
const objectSpanMethod = ({ row, columnIndex }: any) => {
if (row.isMerge || row.isSourceRow) {
// 第0列(项目名称)不合并,其余列全部合并(跨10列)
if (columnIndex === 0) {
return { rowspan: 1, colspan: 1 }
} else {
return { rowspan: 1, colspan: 10 }
}
}
}
const tableRowClassName = ({ row }) => {
if (row.isMerge) return 'source-row'
if (row.isSourceRow) return 'source-row'
return ''
}
onMounted(() => {
})
</script>
<style scoped lang="scss">
// 新增查询区域样式
.search-section {
margin-bottom: 16px;
padding: 10px;
background: #e4f0fc;
border-radius: 4px;
.search-form {
.el-form-item {
margin-bottom: 0;
margin-right: 16px;
}
}
}
.header {
position: relative;
text-align: center;
margin-bottom: 8px;
.header-right {
position: absolute;
right: 0;
top: 0;
text-align: right;
font-size: 14px;
span {
display: block;
}
}
.title {
font-size: 18px;
font-weight: bold;
line-height: 1.6;
}
}
.table-main {
height: 70vh;
overflow-y: auto;
}
.note-section {
margin-bottom: 16px;
.note-line {
margin-bottom: 6px;
}
.note-red {
color: red;
font-size: 13px;
line-height: 1.4;
}
}
.table-section {
margin-bottom: 20px;
}
.data-source-row {
display: flex;
align-items: center;
padding: 6px 10px;
background: #f5f7fa;
border: 1px solid #ebeef5;
border-top: none;
.el-radio-group {
margin-left: 12px;
}
}
:deep(.el-table--border th.el-table__cell) {
border-right: 1px solid #fff !important;
}
:deep(.el-table__row) {
&.source-row {
font-weight: bold;
font-size: 16px !important;
color: #000;
}
}
</style>
<style scoped></style>

View File

@ -0,0 +1,518 @@
<template>
<div class="app-container">
<div class="search-section">
<el-form inline :model="searchForm" class="search-form">
<el-form-item label="医疗机构">
<SelectTable v-model:data="searchForm.yljg" :tableData="dictData.HOS" placeholder="请选择" width="200px" />
</el-form-item>
<el-form-item label="">
<el-select v-model="searchForm.querytype" style="width: 120px" clearable @change="changeType">
<el-option label="年度" value="1" />
<el-option label="季度" value="2" />
<el-option label="月度" value="3" />
</el-select>
<el-date-picker v-model="searchForm.year" type="year" placeholder="选择年份" format="YYYY" value-format="YYYY"
style="width: 150px" class="mr10 ml10" />
<el-select v-model="searchForm.querydate" style="width: 150px" clearable v-if="searchForm.querytype === '2'">
<el-option v-for="item in jdData" :label="item.label" :value="item.value" />
</el-select>
<el-select v-model="searchForm.querydate" style="width: 150px" clearable v-if="searchForm.querytype === '3'">
<el-option label="1月" value="01" />
<el-option label="2月" value="02" />
<el-option label="3月" value="03" />
<el-option label="4月" value="04" />
<el-option label="5月" value="05" />
<el-option label="6月" value="06" />
<el-option label="7月" value="07" />
<el-option label="8月" value="08" />
<el-option label="9月" value="09" />
<el-option label="10月" value="10" />
<el-option label="11月" value="11" />
<el-option label="12月" value="12" />
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="handleSearch">查询</el-button>
<el-button type="warning" icon="Printer">打印</el-button>
</el-form-item>
</el-form>
</div>
<!-- 顶部标题 -->
<div class="header">
<div class="header-right">
<span>日期:{{ pageDate }}</span>
</div>
<div class="title">{{ formatDict(searchForm.yljg, 'HOS') }}</div>
<div class="title">{{ typeName }}检验全过程质量指标</div>
</div>
<div class="table-main">
<!-- 说明文字 -->
<div class="note-section">
<div class="note-line">
您实验室LIS是否纳入质量指标相关数据采集与统计(*):
<el-radio-group :model-value="lisIncluded">
<el-radio label="Y">是</el-radio>
<el-radio label="N">否</el-radio>
</el-radio-group>
</div>
<div class="note-red">
注意:如果条目您实验室确无可统计的数据,请填写“未统计”;若数据为0,请填写数字“0”;填写每个表格前请先勾选此表数据来源:LIS统计、手工计算或估算。
</div>
<div class="note-red">
非本单位实验室开展的检验项目均不纳入统计
</div>
</div>
<!-- 表格1 -->
<div class="table-section">
<el-table :data="table1Data" border style="width:70%" :row-class-name="setSourceRowClass"
:span-method="spanSourceMethod">
<el-table-column prop="xmlb" label="(一)标本可接受性(*)" width="300" />
<el-table-column label="专业" align="center">
<el-table-column label="生化" prop="sl1" align="center">
<!-- 数据来源列:渲染单选框 -->
<template #default="{ row }">
<div v-if="row.isSourceRow" :style="{ textAlign: row.isSourceRow ? 'left' : 'center' }">
<el-radio-group :model-value="row.dataSource">
<el-radio label="LIS">LIS</el-radio>
<el-radio label="MANUAL">手工</el-radio>
<el-radio label="ESTIMATE">估算</el-radio>
</el-radio-group>
</div>
</template>
</el-table-column>
<el-table-column label="免疫" prop="sl2" align="center" />
<el-table-column label="临检" prop="sl3" align="center" />
<el-table-column label="微生物" prop="sl4" align="center" />
</el-table-column>
</el-table>
</div>
<!-- 表格2 -->
<div class="table-section">
<el-table :data="table2Data" border style="width:70%" :row-class-name="setSourceRowClass"
:span-method="spanSourceMethod">
<el-table-column prop="xmlb" label="(二)检验报告(*)" width="300" />
<el-table-column label="专业" align="center">
<el-table-column label="生化" prop="sl1" align="center">
<template #default="{ row }">
<div v-if="row.isSourceRow" :style="{ textAlign: row.isSourceRow ? 'left' : 'center' }">
<el-radio-group :model-value="row.dataSource">
<el-radio label="LIS">LIS</el-radio>
<el-radio label="MANUAL">手工</el-radio>
<el-radio label="ESTIMATE">估算</el-radio>
</el-radio-group>
</div>
</template>
</el-table-column>
<el-table-column label="免疫" prop="sl2" align="center" />
<el-table-column label="临检" prop="sl3" align="center" />
<el-table-column label="微生物" prop="sl4" align="center" />
</el-table-column>
</el-table>
</div>
<!-- 表格3 -->
<div class="table-section">
<el-table :data="table3Data" border style="width:70%" :span-method="objectSpanMethod"
:row-class-name="tableRowClassName">
<el-table-column prop="xmlb" label="(三)周转时间(*)" width="300">
<template #default="{ row }">
<div>{{ row.xmlb }}</div>
<div>{{ row.bz }}</div>
</template>
</el-table-column>
<el-table-column label="专业" align="center">
<el-table-column label="生化" prop="sl1" align="center">
<template #default="{ row }">
<div v-if="row.isSourceRow" :style="{ textAlign: row.isSourceRow ? 'left' : 'center' }">
<el-radio-group :model-value="row.dataSource">
<el-radio label="LIS">LIS</el-radio>
<el-radio label="MANUAL">手工</el-radio>
<el-radio label="ESTIMATE">估算</el-radio>
</el-radio-group>
</div>
</template>
</el-table-column>
<el-table-column label="自动化免疫" prop="sl2" align="center" />
<el-table-column label="三大常规" prop="sl3" align="center" />
<el-table-column label="凝血" prop="sl4" align="center" />
</el-table-column>
</el-table>
</div>
<!-- 表格4 -->
<div class="table-section">
<el-table :data="table4Data" border style="width:70%" :span-method="objectSpanMethod"
:row-class-name="tableRowClassName">
<el-table-column label="(三)周转时间(具体项目)(*)" width="200">
<el-table-column label="项目(时间单位:min)" prop="xmlb" width="200" />
</el-table-column>
<el-table-column label="检验前周转时间" align="center">
<el-table-column label="本实验室规定时间" prop="sl1" align="center">
<template #default="{ row }">
<div v-if="row.isSourceRow" :style="{ textAlign: row.isSourceRow ? 'left' : 'center' }">
<el-radio-group :model-value="row.dataSource">
<el-radio label="LIS">LIS</el-radio>
<el-radio label="MANUAL">手工</el-radio>
<el-radio label="ESTIMATE">估算</el-radio>
</el-radio-group>
</div>
</template>
</el-table-column>
<el-table-column label="年中位数" prop="sl2" align="center" />
<el-table-column label="年第90百分位数" prop="sl3" align="center" />
</el-table-column>
<el-table-column label="实验室内周转时间" align="center">
<el-table-column label="本实验室规定时间" prop="sl4" align="center" />
<el-table-column label="年中位数" prop="sl5" align="center" />
<el-table-column label="年第90百分位数" prop="sl6" align="center" />
</el-table-column>
<el-table-column label="总周转时间" align="center">
<el-table-column label="本实验室规定时间" prop="sl7" align="center" />
<el-table-column label="年中位数" prop="sl8" align="center" />
<el-table-column label="年第90百分位数" prop="sl9" align="center" />
</el-table-column>
<el-table-column label="年标本量" prop="sl10" align="center" />
</el-table>
</div>
<!-- 表格5 -->
<div class="table-section">
<el-table :data="table5Data" border style="width:70%" :row-class-name="setSourceRowClass">
<el-table-column prop="xmlb" label="(四)血培养污染(*)" width="200" />
<el-table-column label="专业" align="center">
<el-table-column label="微生物" prop="sl1" align="center">
<template #default="{ row }">
<div v-if="row.isSourceRow" :style="{ textAlign: row.isSourceRow ? 'left' : 'center' }">
<el-radio-group :model-value="row.dataSource">
<el-radio label="LIS">LIS</el-radio>
<el-radio label="MANUAL">手工</el-radio>
<el-radio label="ESTIMATE">估算</el-radio>
</el-radio-group>
</div>
</template>
</el-table-column>
</el-table-column>
</el-table>
</div>
<!-- 表格6 -->
<div class="table-section">
<el-table :data="table6Data" border style="width:70%" :row-class-name="setSourceRowClass">
<el-table-column prop="xmlb" label="(五)IQC、EQA(*)(微生物检测的EQA算1项,项目计数为小项,如钾、钠、氯各计1项)" width="550" />
<el-table-column prop="sl1" align="center">
<template #default="{ row }">
<div v-if="row.isSourceRow" :style="{ textAlign: row.isSourceRow ? 'left' : 'center' }">
<el-radio-group :model-value="row.dataSource">
<el-radio label="LIS">LIS</el-radio>
<el-radio label="MANUAL">手工</el-radio>
<el-radio label="ESTIMATE">估算</el-radio>
</el-radio-group>
</div>
</template>
</el-table-column>
</el-table>
</div>
</div>
</div>
</template>
<script setup lang="ts" name="Summary">
import dayjs from 'dayjs'
import { formatDict, getDictData, dictData } from '@/hooks'
import useUserStore from '@/store/modules/user';
import { ncisQuery } from '@/api/liswork/qualityControl'
import { ElLoading, ElMessage } from 'element-plus';
const userStore = useUserStore()
const searchForm = ref({
yljg: userStore.sysLoginParam.loginYLJG,
querytype: '1',
querydate: '',
year: dayjs().format('YYYY'),
})
const pageDate = ref(dayjs().format('YYYY/MM/DD'))
const lisIncluded = ref('Y')
const typeName = computed(() => {
const year = searchForm.value.year
if (searchForm.value.querytype === '1') {
return `${year || dayjs().format('YYYY')}年度`
} else if (searchForm.value.querytype === '2') {
return `${year}年${jdData.value.find(item => item.value == searchForm.value.querydate)?.label || ''}`
} else if (searchForm.value.querytype === '3') {
return `${year}年${searchForm.value.querydate ? Number(searchForm.value.querydate) : dayjs().month() + 1}月`
}
return dayjs().format('YYYY') + '年度'
})
const jdData = ref([
{ label: '第一季度', value: '1' },
{ label: '第二季度', value: '2' },
{ label: '第三季度', value: '3' },
{ label: '第四季度', value: '4' },
])
const table1Data = ref([
{ xmlb: '数据来源', isSourceRow: true, dataSource: 'LIS' },
])
// 样式标记
const setSourceRowClass = ({ row }) => row.isSourceRow ? 'source-row' : ''
const spanSourceMethod = ({ row, columnIndex }) => {
if (row.isSourceRow) {
// 数据来源行:第0列占1列1行,第1列跨4列(生化/免疫/临检/微生物),其余列隐藏
if (columnIndex === 0) {
return { rowspan: 1, colspan: 1 }; // 项目名称列
} else if (columnIndex >= 1 && columnIndex <= 4) {
// 专业列(生化/免疫/临检/微生物)合并为1列
if (columnIndex === 1) {
return { rowspan: 1, colspan: 4 }; // 仅第一列(生化)跨4列,其余列隐藏
} else {
return { rowspan: 0, colspan: 0 }; // 免疫/临检/微生物列隐藏
}
}
}
// 非数据来源行:正常显示
return { rowspan: 1, colspan: 1 };
}
const table2Data = ref([
{ xmlb: '数据来源', isSourceRow: true, dataSource: 'LIS' },
])
const table3Data = ref([
{ xmlb: '数据来源', isSourceRow: true, dataSource: 'LIS' },
])
const table4Data = ref([
{ xmlb: '数据来源', isSourceRow: true, dataSource: 'LIS' },
// { xmlb: '门诊项目', isMerge: true, },
// { xmlb: '尿常规', sl1: 60, sl2: 13, sl3: 38, sl4: 60, sl5: 8, sl6: 120, sl7: 9572,sl8:12 },
// { xmlb: '住院项目', isMerge: true },
// { xmlb: '血钾', sl1: 60, sl2: 52, sl3: 127, sl4: 120, sl5: 48, sl6: 180, sl7: 14345,sl8:34 },
])
const table5Data = ref([
{ xmlb: '数据来源', isSourceRow: true, dataSource: 'LIS' },
])
const table6Data = ref([
{ xmlb: '数据来源', isSourceRow: true, dataSource: 'LIS' },
])
const changeType = (val) => {
if (val == 1) {
searchForm.value.querydate = dayjs().format('YYYY')
} else if (val == 2) {
searchForm.value.querydate = '1'
}
else if (val == 3) {
searchForm.value.querydate = '01'
}
}
const handleSearch = () => {
const data = {
yljg: searchForm.value.yljg,
querytype: searchForm.value.querytype,
querydate: ''
}
if (searchForm.value.querytype === '1') {
data['querydate'] = searchForm.value.year
} else if (searchForm.value.querytype === '2') {
data['querydate'] = searchForm.value.year + searchForm.value.querydate
} else if (searchForm.value.querytype === '3') {
data['querydate'] = searchForm.value.year + searchForm.value.querydate
}
if (!data.querydate) return ElMessage.warning('请选择查询日期')
const loading = ElLoading.service({
lock: true,
text: '加载中...',
background: 'rgba(0, 0, 0, 0.7)',
})
ncisQuery(data).then(res => {
table1Data.value = [{ xmlb: '数据来源', isSourceRow: true, dataSource: 'LIS' }, ...res.data.table0]
table2Data.value = [{ xmlb: '数据来源', isSourceRow: true, dataSource: 'LIS' }, ...res.data.table1]
table3Data.value = formatTableData(res.data.table2)
table4Data.value = formatTableData(res.data.table3)
table5Data.value = [{ xmlb: '数据来源', isSourceRow: true, dataSource: 'LIS' }, ...res.data.table4]
table6Data.value = [{ xmlb: '数据来源', isSourceRow: true, dataSource: 'LIS' }, ...res.data.table5]
}).finally(() => {
loading.close()
})
}
// 转换函数
const formatTableData = (rawData) => {
// 按zb分组
const groupMap: Record<string, any[]> = {}
rawData.forEach(item => {
if (!groupMap[item.zb]) groupMap[item.zb] = []
groupMap[item.zb].push(item)
})
const result: any[] = []
result.push({ xmlb: '数据来源', isSourceRow: true, dataSource: 'LIS' })
// 遍历分组组装
Object.keys(groupMap).forEach(zbName => {
// 分组标题行
result.push({ xmlb: zbName, isMerge: true })
// 明细行
groupMap[zbName].forEach(row => {
result.push({ ...row })
})
})
return result
}
// 合并单元格逻辑
const objectSpanMethod = ({ row, columnIndex }: any) => {
if (row.isMerge || row.isSourceRow) {
// 第0列(项目名称)不合并,其余列全部合并(跨10列)
if (columnIndex === 0) {
return { rowspan: 1, colspan: 1 }
} else {
return { rowspan: 1, colspan: 10 }
}
}
}
const tableRowClassName = ({ row }) => {
if (row.isMerge) return 'source-row'
if (row.isSourceRow) return 'source-row'
return ''
}
onMounted(() => {
getDictData('HOS')
})
</script>
<style scoped lang="scss">
// 新增查询区域样式
.search-section {
margin-bottom: 16px;
padding: 10px;
border-radius: 4px;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
.search-form {
.el-form-item {
margin-bottom: 0;
margin-right: 16px;
}
}
}
.header {
position: relative;
text-align: center;
margin-bottom: 8px;
.header-right {
position: absolute;
right: 0;
top: 0;
text-align: right;
font-size: 14px;
span {
display: block;
}
}
.title {
font-size: 18px;
font-weight: bold;
line-height: 1.6;
}
}
.table-main {
height: calc(100% - 160px);
overflow-y: auto;
}
.note-section {
margin-bottom: 16px;
padding-left: 15%;
.note-line {
margin-bottom: 6px;
}
.note-red {
color: red;
font-size: 13px;
line-height: 1.4;
}
}
.table-section {
margin-bottom: 5px;
display: flex;
justify-content: center;
}
.data-source-row {
display: flex;
align-items: center;
padding: 6px 10px;
background: #f5f7fa;
border: 1px solid #ebeef5;
border-top: none;
.el-radio-group {
margin-left: 12px;
}
}
:deep(.el-table) {
border-radius: 0 !important;
.el-table__header-wrapper,
.el-table__fixed-header-wrapper {
th {
word-break: break-word;
background-color: #c0c0c0 !important;
color: #000;
font-size: .8125rem;
font-weight: 500;
}
}
}
:deep(.el-table--border th.el-table__cell) {
border-right: 1px solid #d1d4d9 !important;
border-bottom: 1px solid #d1d4d9 !important;
}
:deep(.el-table--border) {
border: 1px solid #d1d4d9 !important;
}
:deep(.el-table td.el-table__cell,
.el-table th.el-table__cell.is-leaf) {
border-bottom: 1px solid #d1d4d9 !important;
}
:deep(.el-table--border .el-table__cell) {
border-right: 1px solid #d1d4d9 !important;
}
:deep(.el-table__row) {
&.source-row {
font-weight: bold;
font-size: 16px !important;
color: #000;
}
}
</style>