报告查询列表联调

This commit is contained in:
wyuu 2025-09-01 17:48:41 +08:00
parent ef2856f0ff
commit 0ee42a673a
6 changed files with 185 additions and 83 deletions

View File

@ -43,3 +43,11 @@ export function fetchCodeReqmain(query?: Object) {
params: query, params: query,
}); });
} }
// 查询报告单列表
export function reportList(query?: Object) {
return request({
url: '/report/ReportList',
method: 'post',
data: query,
});
}

View File

@ -18,7 +18,7 @@
<!-- 动态列 --> <!-- 动态列 -->
<template v-for="item in columns" :key="item.prop || item.key"> <template v-for="item in columns" :key="item.prop || item.key">
<!-- 自定义插槽列 --> <!-- 自定义插槽列 行数据插槽(有row属性) -->
<el-table-column v-if="item.slot && item.visible" :prop="item.prop" :label="item.label" :width="item.width" <el-table-column v-if="item.slot && item.visible" :prop="item.prop" :label="item.label" :width="item.width"
:min-width="item.minWidth" :fixed="item.fixed" :align="item.align || 'left'" :sortable="item.sortable" :min-width="item.minWidth" :fixed="item.fixed" :align="item.align || 'left'" :sortable="item.sortable"
:show-overflow-tooltip="item.showOverflowTooltip !== false"> :show-overflow-tooltip="item.showOverflowTooltip !== false">
@ -31,7 +31,7 @@
<el-table-column v-if="!item.slot && item.visible" :prop="item.prop" :label="item.label" :width="item.width" <el-table-column v-if="!item.slot && item.visible" :prop="item.prop" :label="item.label" :width="item.width"
:min-width="item.minWidth" :fixed="item.fixed" :align="item.align || 'left'" :sortable="item.sortable" :min-width="item.minWidth" :fixed="item.fixed" :align="item.align || 'left'" :sortable="item.sortable"
:show-overflow-tooltip="item.showOverflowTooltip !== false" :formatter="item.formatter"> :show-overflow-tooltip="item.showOverflowTooltip !== false" :formatter="item.formatter">
<!-- 表头插槽 --> <!-- 表头插槽 (无row属性)-->
<template v-if="item.headerSlot" #header="scope"> <template v-if="item.headerSlot" #header="scope">
<slot :name="item.headerSlot" :column="scope.column" :$index="scope.$index" /> <slot :name="item.headerSlot" :column="scope.column" :$index="scope.$index" />
</template> </template>
@ -83,6 +83,12 @@ interface TableColumn {
visible?: boolean; // 是否显示列 visible?: boolean; // 是否显示列
} }
// 在子组件中定义插槽类型
defineSlots<{
// 具名插槽和动态插槽(不含 default)
[slotName: string]: (props: { row?: any; column?: any; $index?: number }) => any;
}>();
// Props 定义 // Props 定义
const props = defineProps({ const props = defineProps({
// 表格数据 // 表格数据

View File

@ -75,7 +75,7 @@
:columns="columns"></right-toolbar> :columns="columns"></right-toolbar>
</el-row> </el-row>
<CustomTable :data="tableData" :columns="columns" :config="tableConfig" :loading="loading" <CustomTable ref="tableRef" :data="tableData" :columns="columns" :config="tableConfig" :loading="loading"
@row-click="rowHandle" @selection-change="selectionChange"> @row-click="rowHandle" @selection-change="selectionChange">
<template #jzbz="{ row }"> <template #jzbz="{ row }">
{{ row.jzbz == '1' ? '急诊' : '非急诊' }} {{ row.jzbz == '1' ? '急诊' : '非急诊' }}
@ -160,7 +160,7 @@ const heightForm = ref(90);
const dialogVisible = ref(false) const dialogVisible = ref(false)
const title = ref('采样登记') const title = ref('采样登记')
const sqhText = ref('') const sqhText = ref('')
const tableRef = ref()
interface QueryParams { interface QueryParams {
times: string[]; // 明确类型为字符串元组 times: string[]; // 明确类型为字符串元组
yljg: string; yljg: string;
@ -515,6 +515,7 @@ const getList = () => {
loading.value = false; loading.value = false;
tableData.value = response.data tableData.value = response.data
getRightTable(response.data[0]) getRightTable(response.data[0])
tableRef.value.setCurrentRow(response.data[0])
} }
}) })
} }

View File

@ -3,47 +3,46 @@
<div ref="compactForm"> <div ref="compactForm">
<el-row :gutter="10" class="compact-form" v-show="showSearch"> <el-row :gutter="10" class="compact-form" v-show="showSearch">
<el-form :model="queryParams" ref="queryRef" :inline="true" :rules="queryRules"> <el-form :model="queryParams" ref="queryRef" :inline="true" :rules="queryRules">
<el-form-item label="日期:" prop="failed1"> <el-form-item label="日期:" prop="times">
<el-date-picker v-model="queryParams.failed1" type="daterange" range-separator="-" start-placeholder="开始时间" <el-date-picker v-model="queryParams.times" type="daterange" range-separator="-" start-placeholder="开始时间"
end-placeholder="结束时间" /> end-placeholder="结束时间" />
</el-form-item> </el-form-item>
<el-form-item label="病人状态:" prop="failed2"> <el-form-item label="病人状态:" prop="dybz">
<el-select v-model="queryParams.failed2" placeholder="请选择"> <el-select v-model="queryParams.dybz" placeholder="请选择">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> <el-option label="已打印" value="1" />
<el-option label="未打印" value="0" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="科室:" prop="failed3"> <el-form-item label="科室:" prop="ksdh">
<el-select v-model="queryParams.failed3" placeholder="请选择" style="width: 120px;"> <el-select v-model="queryParams.ksdh" placeholder="请选择" filterable>
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in dictData.DP" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="病人类型:" prop="failed4"> <el-form-item label="病人类型:" prop="brly">
<el-select v-model="queryParams.failed4" placeholder="请选择"> <el-select v-model="queryParams.brly" placeholder="请选择" style="width: 120px;">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" /> <el-option v-for="item in dictData.PT" :key="item.value" :label="item.label" :value="item.value" />
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="" prop="failed5"> <el-form-item label="" prop="">
<el-radio-group v-model="queryParams.failed5"> <el-checkbox v-model="queryParams.alarmflag" label="仅危急值" @change="alarmHandle" size="large" />
<el-radio label="1">仅危急值</el-radio> <el-checkbox v-model="queryParams.jzbz" label="仅急诊" @change="jzbzHandle" size="large" />
<el-radio label="2">仅急诊</el-radio>
</el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="姓名" prop="failed6"> <el-form-item label="姓名" prop="brxm">
<el-col :span="1.5"> <el-col :span="1.5">
<el-input v-model="queryParams.failed6" clearable placeholder="姓名" @keyup.enter="handleQuery" <el-input v-model="queryParams.brxm" clearable placeholder="姓名" @keyup.enter="handleQuery"
@clear="handleQuery" /> @clear="handleQuery" />
</el-col> </el-col>
</el-form-item> </el-form-item>
<el-form-item label="病人号" prop="failed7"> <el-form-item label="病人号" prop="brdh">
<el-col :span="1.5"> <el-col :span="1.5">
<el-input v-model="queryParams.failed7" clearable placeholder="病人号" @keyup.enter="handleQuery" <el-input v-model="queryParams.brdh" clearable placeholder="病人号" @keyup.enter="handleQuery"
@clear="handleQuery" /> @clear="handleQuery" />
</el-col> </el-col>
</el-form-item> </el-form-item>
<el-form-item label="条形码" prop="failed8"> <el-form-item label="条形码" prop="sqh">
<el-col :span="1.5"> <el-col :span="1.5">
<el-input v-model="queryParams.failed8" clearable placeholder="条形码" @keyup.enter="handleQuery" <el-input v-model="queryParams.sqh" clearable placeholder="条形码" @keyup.enter="handleQuery"
@clear="handleQuery" /> @clear="handleQuery" />
</el-col> </el-col>
</el-form-item> </el-form-item>
@ -63,7 +62,7 @@
<el-button type="primary" plain icon="Plus">打印</el-button> <el-button type="primary" plain icon="Plus">打印</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="danger" plain icon="Edit">勾选中所有未打印</el-button> <el-button type="danger" plain icon="Edit" @click="selectStatusRows">勾选中所有未打印</el-button>
</el-col> </el-col>
<el-col :span="1.5"> <el-col :span="1.5">
<el-button type="success" plain>打印单张PDF报告</el-button> <el-button type="success" plain>打印单张PDF报告</el-button>
@ -76,8 +75,13 @@
:columns="columns"></right-toolbar> :columns="columns"></right-toolbar>
</el-row> </el-row>
<CustomTable :data="tableData" :columns="columns" :config="tableConfig" :loading="loading"> <CustomTable ref="tableRefs" :data="tableData" :columns="columns" :config="tableConfig" :loading="loading">
<template #dybz="{ row }">
{{ row.dybz == 1 ? '✅' : '❌' }}
</template>
<template #jzbz="{ row }">
{{ row.jzbz == 1 ? '急诊' : '危急诊' }}
</template>
</CustomTable> </CustomTable>
</el-col> </el-col>
@ -123,11 +127,16 @@
import { ref, reactive, toRaw, computed, watch, nextTick, onMounted } from 'vue'; import { ref, reactive, toRaw, computed, watch, nextTick, onMounted } from 'vue';
import CustomTable from '@/components/tableCom/index.vue' import CustomTable from '@/components/tableCom/index.vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { reportList } from '@/api/checkCode/index'
//@ts-ignore
import { comDict } from '@/utils/dict'
const router = useRouter() const router = useRouter()
const compactForm = ref<HTMLElement | null>(null); const compactForm = ref<HTMLElement | null>(null);
const heightForm = ref(90); const heightForm = ref(90);
const dialogVisible = ref(false) const dialogVisible = ref(false)
const tableRefs = ref()
const openDB = () => { const openDB = () => {
dialogVisible.value = true dialogVisible.value = true
} }
@ -167,19 +176,33 @@ const compareTableData = [
} }
] ]
interface QueryParams {
times: string[]; // 明确类型为字符串元组
alarmflag: boolean,
jzbz: boolean,
ksdh: string,
brly: string,
brxm: string,
brdh: string,
sqh: string,
dybz: string,
}
// 提交表单数据 // 提交表单数据
const queryParams = reactive({ const queryParams = reactive<QueryParams>({
failed1: [], times: ['2025-07-18 00:00:00', '2025-07-18 23:59:59'],
failed2: '', ksdh: '',
failed3: '', brly: '',
failed4: '', alarmflag: false,
failed5: '', jzbz: false,
failed6: '', brxm: '',
failed7: '', brdh: '',
failed8: '', sqh: '',
dybz: '',
}); });
const alarmflag = ref('0')
const jzbz = ref('0')
const showSearch = ref(true); const showSearch = ref(true);
const queryRef = ref() const queryRef = ref()
// 定义校验规则 // 定义校验规则
@ -193,60 +216,55 @@ const queryRules = ref({
// { required: true, message: '条码状态不能为空', trigger: 'change' }, // { required: true, message: '条码状态不能为空', trigger: 'change' },
// ], // ],
}) })
const options = [
{
value: 'Option1',
label: 'Option1',
},
{
value: 'Option2',
label: 'Option2',
},
]
const handleQuery = async () => { const handleQuery = async () => {
const valid = await queryRef.value.validate().catch(() => { }); const valid = await queryRef.value.validate().catch(() => { });
if (!valid) return false; if (!valid) return false;
getList()
} }
// 重置 // 重置
const resetQuery = () => { const resetQuery = () => {
queryRef.value?.resetFields(); queryRef.value?.resetFields();
getList()
} }
const loading = false; const loading = false;
// 数据源 // 数据源
const tableData = [ const tableData = ref([])
{
id: 1, tfailed1: '打印', tfailed2: '急诊', tfailed3: '危急诊', tfailed4: '检验日期', tfailed5: '病人代号', tfailed6: '床号', tfailed7: '仪器', tfailed8: '样本号',
tfailed9: '样本类型', tfailed10: '检查项目', tfailed11: '检查结果', tfailed12: '检查结果', tfailed13: '检查结果', tfailed14: '检查结果'
},
{
id: 2, tfailed1: '打印', tfailed2: '急诊', tfailed3: '危急诊', tfailed4: '检验日期', tfailed5: '病人代号', tfailed6: '床号', tfailed7: '仪器', tfailed8: '样本号',
tfailed9: '样本类型', tfailed10: '检查项目', tfailed11: '检查结果', tfailed12: '检查结果', tfailed13: '检查结果', tfailed14: '检查结果'
},
]
// 配置项 // 配置项
const columns = ref([ const columns = ref<ColumnItem[]>([
{ prop: 'tfailed1', label: '打印', visible: true, key: 0, sortable: true, width: '110px' }, { prop: 'dybz', label: '打印', visible: true, key: 0, slot: 'dybz', },
{ prop: 'tfailed2', label: '急诊', visible: true, key: 1, width: '110px' }, { prop: 'jzbz', label: '急诊', visible: true, key: 1, slot: 'jzbz', },
{ prop: 'tfailed3', label: '危急诊', align: 'center', visible: true, key: 2, }, { prop: 'alarmflag', label: '危急值', align: 'center', visible: true, key: 2, },
{ prop: 'tfailed4', label: '检验日期', align: 'center', visible: true, key: 3, width: '110px' }, { prop: 'jyrq', label: '检验日期', align: 'center', visible: true, key: 3, width: '150px' },
{ prop: 'tfailed5', label: '病人代号', align: 'center', visible: true, key: 4, width: '110px' }, { prop: 'brdh', label: '病人代号', align: 'center', visible: true, key: 4, width: '110px' },
{ prop: 'tfailed6', label: '床号', align: 'center', visible: true, key: 5, width: '110px' }, { prop: 'ch', label: '床号', align: 'center', visible: true, key: 5, sortable: true, },
{ prop: 'tfailed7', label: '仪器', align: 'center', visible: true, key: 6, width: '110px' }, { prop: 'yqdl', label: '仪器', align: 'center', visible: true, key: 6, width: '110px' },
{ prop: 'tfailed8', label: '样本号', align: 'center', visible: true, key: 7, width: '110px' }, { prop: 'ybh', label: '样本号', align: 'center', visible: true, key: 7, },
{ prop: 'tfailed9', label: '样本类型', align: 'center', visible: true, key: 8, width: '110px' }, { prop: 'yblxname', label: '样本类型', align: 'center', visible: true, key: 8, },
{ prop: 'tfailed10', label: '检验目的', align: 'center', visible: true, key: 9, width: '110px' }, { prop: 'jymd', label: '检验目的', align: 'center', visible: true, key: 9, },
{ prop: 'tfailed11', label: '病人类型', align: 'center', visible: true, key: 10, width: '110px' }, { prop: 'brlyname', label: '病人类型', align: 'center', visible: true, key: 10, },
{ prop: 'tfailed12', label: '性别', align: 'center', visible: true, key: 11, width: '110px' }, { prop: 'brxbname', label: '性别', align: 'center', visible: true, key: 11, },
{ prop: 'tfailed13', label: '仪器名称', align: 'center', visible: true, key: 12, width: '110px' }, { prop: 'yqmc', label: '仪器名称', align: 'center', visible: true, key: 12, width: '150px' },
{ prop: 'tfailed14', label: '医疗机构', align: 'center', visible: true, key: 13, width: '110px' }, { prop: 'yljg', label: '医疗机构', align: 'center', visible: true, key: 13, width: '150px' },
]) ])
// 单元格样式
const cellStyleHd = ({ row, column, rowIndex, columnIndex }: {
row: any;
column: any;
rowIndex: number;
columnIndex: number;
}) => {
// console.log(row, column, rowIndex, columnIndex);
if (column.label == "急诊" && row.jzbz == "1") {
return { background: '#f00 !important', color: '#fff' };
}
};
// 表格配置 // 表格配置
const tableConfig = ref( const tableConfig = ref(
{ {
@ -256,10 +274,36 @@ const tableConfig = ref(
index: false, // 序号 index: false, // 序号
height: '100%', // 高度 height: '100%', // 高度
highlightCurrentRow: true, // 高亮当前行 highlightCurrentRow: true, // 高亮当前行
fit: true fit: true,
cellStyle: cellStyleHd
} }
) )
// 勾选未打印
const selectStatusRows = () => {
tableData.value.forEach((item: any) => {
if (item.dybz != 1) {
tableRefs.value.toggleRowSelection(item, true)
}
})
}
const alarmHandle = (val: boolean) => {
if (val) {
queryParams.jzbz = false
alarmflag.value = '1'
} else {
alarmflag.value = '0'
}
}
const jzbzHandle = (val: boolean) => {
if (val) {
queryParams.alarmflag = false
jzbz.value = '1'
} else {
jzbz.value = '0'
}
}
interface ColumnItem { interface ColumnItem {
@ -267,9 +311,10 @@ interface ColumnItem {
label: string; label: string;
visible: boolean; visible: boolean;
key: number; key: number;
align: string; align?: string;
slot: string; slot?: string;
width: string; width?: string;
sortable?: boolean;
} }
// 更新列 // 更新列
const updateColumns = (arr: Array<ColumnItem>) => { const updateColumns = (arr: Array<ColumnItem>) => {
@ -277,7 +322,6 @@ const updateColumns = (arr: Array<ColumnItem>) => {
}; };
// 右侧数据源 // 右侧数据源
const rightTableData = [ const rightTableData = [
{ {
@ -337,12 +381,55 @@ const bottomTableConfig = ref(
fit: true, fit: true,
} }
) )
interface DictData {
DP?: Array<any>;
PT?: Array<any>;
[key: string]: any[] | undefined; // 添加索引签名以支持动态访问
}
onMounted(() => { // 字典数据存储
const dictData = ref<DictData>({});
onMounted(async () => {
getList()
adjustTableHeight(); adjustTableHeight();
// 加载病人来源字典
const dictRefs = await comDict('PT', 'DP');
// 从 ref 中获取实际数据
dictData.value = {
PT: toRaw(dictRefs.PT.value) || [],
DP: toRaw(dictRefs.DP.value) || [],
};
}); });
const getList = () => {
const data = {
// dept: '0235',
// userid: 'lis',
alarmflag: alarmflag.value,
jzbz: jzbz.value,
dybz: queryParams.dybz,
ksdh: queryParams.ksdh,
brly: queryParams.brly,
brxm: queryParams.brxm,
brdh: queryParams.brdh,
sqh: queryParams.sqh,
st: queryParams.times[0],
et: queryParams.times[1],
yljg: 1
}
reportList(data).then((res: any) => {
if (res.code == 200) {
tableData.value = res.rows
tableRefs.value.setCurrentRow(res.rows[0])
}
})
}
// 计算table高度 // 计算table高度
watch(showSearch, () => { watch(showSearch, () => {
nextTick(() => { nextTick(() => {

View File

@ -32,6 +32,6 @@
// "allowUnknownInTemplate": true // 允许模板中使用未知属性 // "allowUnknownInTemplate": true // 允许模板中使用未知属性
// } // }
}, },
"include": ["src/**/*","src/**/*.ts", "src/**/*.vue", "src/**/*.tsx", "src/**/*.d.ts", "auto-imports.d.ts"], // **表示任意目录,而 * 表示任意文件。这表明 src 目录中的所有文件都将被编译 "include": ["src/**/*","src/**/*.ts", "src/**/*.vue","src/**/**/*.vue", "src/**/*.tsx", "src/**/*.d.ts", "auto-imports.d.ts"], // **表示任意目录,而 * 表示任意文件。这表明 src 目录中的所有文件都将被编译
"exclude": ["node_modules", "dist"] ,// 指示不需要编译的文件目录 "exclude": ["node_modules", "dist"] ,// 指示不需要编译的文件目录
} }

View File

@ -35,7 +35,7 @@ export default defineConfig(({
server: { server: {
port: 8888, port: 8888,
host: true, host: true,
open: true, open: false,
proxy: { proxy: {
// https://cn.vitejs.dev/config/#server-proxy // https://cn.vitejs.dev/config/#server-proxy
'/dev-api': { '/dev-api': {