Compare commits

...

2 Commits

Author SHA1 Message Date
afe4e5f45d Merge branch 'main' of http://47.97.125.165:8902/jiangs/lis8.0-vue3 2025-11-07 17:53:25 +08:00
c0e90c4510 报告查询 2025-11-07 17:53:20 +08:00
6 changed files with 124 additions and 65 deletions

View File

@ -70,7 +70,7 @@ import ImagePreview from "@/components/ImagePreview"
import TreeSelect from '@/components/TreeSelect'
// 字典标签组件
import DictTag from '@/components/DictTag'
import Print from 'vue3-print-nb';
import print from 'vue3-print-nb';
const app = createApp(App)
// 全局方法挂载
@ -96,7 +96,7 @@ app.component('Editor', Editor)
//VUE3标准方法注入全局方法
app.provide('comDict', comDict);
app.use(Print); // 注册打印插件
app.use(print); // 注册打印插件
app.provide('$vuePrint', app.config.globalProperties.$vuePrint);
app.use(router)
app.use(store)

View File

@ -123,6 +123,10 @@
<CustomTable v-if="bottomTableData.length > 0" :data="bottomTableData" :columns="bottomColumns"
:config="bottomTableConfig">
</CustomTable>
<div v-if="bottomTableData.length > 0" class="expert-comment" :title="expertComment">
专家评语:{{ expertComment }}
</div>
</el-col>
</el-row>
@ -177,7 +181,6 @@ import { usePrintStore } from '@/store/modules/printStore'
//@ts-ignore
import useUserStore from '@/store/modules/user'
import { useRoute } from 'vue-router'
const route = useRoute()
const userStore = useUserStore()
@ -221,9 +224,15 @@ const queryParams = reactive<QueryParams>({
dybz: '',
userid: ''
});
// 获取当前日期(当天)
const today = dayjs();
// 计算前6天的日期(当天 + 前6天 = 7天)
const startOfWeek = today.subtract(6, 'day');
const startDate = route.query.startdate ? String(route.query.startdate) : startOfWeek.format('YYYY-MM-DD');
const endDate = route.query.endate ? String(route.query.endate) : today.format('YYYY-MM-DD');
const startDate = typeof route.query.startdate === 'string' ? route.query.startdate : '';
const endDate = typeof route.query.endate === 'string' ? route.query.endate : '';
queryParams.times = [startDate, endDate];
queryParams.ksdh = (route.query.deptcode as string) || '';
queryParams.userid = (route.query.userid as string) || '';
@ -297,20 +306,21 @@ const columns = ref([
{ prop: 'dybz', label: '印', align: 'center', visible: true, slot: 'dybz', width: 40 },
{ prop: 'jzbz', label: '急', align: 'center', visible: true, slot: 'jzbz', width: 40 },
{ prop: 'alarmflag', label: '危', align: 'center', visible: true, slot: 'alarmflag', width: 40 },
{ prop: 'jyrqname', label: '检验日期', align: 'center', visible: true, sortable: true, width: 100 },
{ prop: 'brdh', label: '病人代号', align: 'center', visible: true, width: 100 },
{ prop: 'brdh', label: '病人代号', align: 'center', visible: true, sortable: true, width: 100 },
{ prop: 'brxm', label: '病人姓名', align: 'center', visible: true, },
{ prop: 'brxbname', label: '性别', align: 'center', visible: true, width: 40 },
{ prop: 'ch', label: '床号', align: 'center', visible: true, width: 50 },
{ prop: 'yqdl', label: '仪器', align: 'center', visible: true, width: 100 },
{ prop: 'ybh', label: '样本号', align: 'center', visible: true, width: 60 },
{ prop: 'jymd', label: '检验目的', align: 'center', visible: true, width: 200 },
{ prop: 'yblxname', label: '样本类型', align: 'center', visible: true, },
{ prop: 'jymd', label: '检验目的', align: 'center', visible: true, width: 118 },
{ prop: 'sqsj', label: '申请时间', align: 'center', visible: true, width: 150 },
{ prop: 'sqsj', label: '送检时间', align: 'center', visible: true, width: 150 },
{ prop: 'confirmtime', label: '报告时间', align: 'center', visible: true, sortable: true, width: 150 },
{ prop: 'sjysname', label: '送检医生', align: 'center', visible: true, width: 80 },
{ prop: 'brlyname', label: '病人类型', align: 'center', visible: true, width: 80 },
{ prop: 'yqmc', label: '仪器名称', align: 'center', visible: true, width: 150 },
{ prop: 'yljg', label: '医疗机构', align: 'center', visible: true, width: 150 },
{ prop: 'jyrqname', label: '检验日期', align: 'center', visible: true, width: 100 },
{ prop: 'ybh', label: '样本号', align: 'center', visible: true, width: 60 },
{ prop: 'yqmc', label: '仪器名称', align: 'center', visible: true, width: 150 },
{ prop: 'yqdl', label: '仪器', align: 'center', visible: true, width: 100 },
])
const selectionChange = (selection: any) => {
@ -321,6 +331,20 @@ const selectionChange = (selection: any) => {
const rightTableRef = ref()
const rowHandle = (row: any) => {
console.log('row==>', row);
if (row.yqdl == '细菌仪') {
rightColumns.value[1].visible = false
rightColumns.value[2].visible = true
rightColumns.value[4].visible = false
rightColumns.value[5].visible = false
rightColumns.value[6].visible = true
} else {
rightColumns.value[1].visible = true
rightColumns.value[2].visible = false
rightColumns.value[4].visible = true
rightColumns.value[5].visible = true
rightColumns.value[6].visible = false
}
timelineItems.value =
[
{ title: '检验申请', time: row.sqsj },
@ -467,10 +491,12 @@ const rightTableData = ref([])
// 配置项
const rightColumns = ref([
{ prop: 'xmdh', label: '项目代号', align: 'center', visible: true, },
{ prop: 'xmmc', label: '项目名称', align: 'center', visible: true, width: 150 },
{ prop: 'xmmc', label: '项目名称', align: 'center', visible: true, },
{ prop: 'xmmc', label: '培养结果', align: 'center', visible: true, width: 150 },
{ prop: 'csjg', label: '检验结果', align: 'center', visible: true, },
{ prop: 'refs', label: '参考值', align: 'center', visible: true, },
{ prop: 'dw', label: '单位', align: 'center', visible: true, },
{ prop: 'od', label: '菌落计数', align: 'center', visible: true, },
{ prop: 'jgbz', label: '结果标志', align: 'center', visible: true, slot: 'jgbz' },
])
@ -502,7 +528,7 @@ const rightTableConfig = ref(
{
// stripe: true, // 斑马纹
border: true, // 边框
height: '40vh', // 高度
height: '25vh', // 高度
highlightCurrentRow: true, // 高亮当前行
cellStyle: rightCellStyleHd
}
@ -512,11 +538,12 @@ const formatJgbz = (v: string) => {
return v == 'H' ? '高' : v == 'L' ? '低' : v == 'N' ? '阴性' : v == 'P' ? '阳性' : v == 'Q' ? '弱阳性' : v == 'M' ? '正常' : ''
}
const expertComment = ref('')
const xmRow = ref<any>({})
// 查询抗生素
const xmrowHandle = (row: any) => {
xmRow.value = row
expertComment.value = row.textresult
const data = {
jyrq: Info.value.jyrq,
yq: Info.value.yq,
@ -528,7 +555,7 @@ const xmrowHandle = (row: any) => {
bottomTableData.value = res.rows
if (res.rows.length > 0) {
nextTick(() => {
rightTableConfig.value.height = `calc(50vh - ${heightForm.value}px)`
rightTableConfig.value.height = `calc(35vh - ${heightForm.value}px)`
rightTableRef.value?.doLayout && rightTableRef.value.doLayout();
});
} else {
@ -753,10 +780,11 @@ const getEcharts = (data: any) => {
const bottomTableData = ref([])
// 配置项
const bottomColumns = ref([
{ prop: 'ywdh', label: '抗生素编号', align: 'center', visible: true, },
{ prop: 'ywmc', label: '抗生素名称', align: 'center', visible: true, },
{ prop: 'csjg', label: '测试结果', align: 'center', visible: true },
// { prop: 'jgbz', label: '结果标志', align: 'center', visible: true },
{ prop: 'ywdh', label: '抗生素代码', align: 'center', visible: true, },
{ prop: 'ywmc', label: '抗生素名称', align: 'center', width: 200, visible: true, },
{ prop: 'mic', label: 'MIC', align: 'center', visible: true },
{ prop: 'rad', label: 'KB', align: 'center', visible: true },
{ prop: 'csjg', label: '药敏结果', align: 'center', visible: true },
])
const botCellStyleHd = ({ row, column, rowIndex, columnIndex }: {
row: any;
@ -764,10 +792,10 @@ const botCellStyleHd = ({ row, column, rowIndex, columnIndex }: {
rowIndex: number;
columnIndex: number;
}) => {
if (column.label == '测试结果' && row.jgbz == 'R') {
if (column.label == '药敏结果' && row.jgbz == 'R') {
return { background: '#ffc0c0 !important', color: '#606266' };
}
if (column.label == '测试结果' && row.jgbz.trim() == "") {
if (column.label == '药敏结果' && row.jgbz.trim() == "") {
return { background: '#ffff80 !important', color: '#606266' };
}
}
@ -776,7 +804,7 @@ const bottomTableConfig = ref(
{
// stripe: true, // 斑马纹
border: true, // 边框
height: '32vh', // 高度
height: '40vh', // 高度
highlightCurrentRow: true, // 高亮当前行
cellStyle: botCellStyleHd
}
@ -951,4 +979,20 @@ function adjustTableHeight() {
:deep(.el-form-item--default) {
margin-bottom: 1.125rem;
}
.expert-comment {
/* 限制最大显示行数为2行 */
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
/* 超出部分隐藏 */
overflow: hidden;
/* 可选:设置行高和最大宽度,优化显示效果 */
line-height: 1.5;
/* 行高,根据字体大小调整 */
max-width: 100%;
pointer-events: auto;
/* 允许鼠标交互 */
cursor: default;
}
</style>

View File

@ -1,6 +1,6 @@
<template>
<el-dialog v-model="show" title="申请信息条形码自动输入" width="800px" :close-on-click-modal="false" :draggable="true"
@close="handleClose">
<el-dialog v-model="show" title="申请信息条形码自动输入" width="800px" class="dialog_box" :close-on-click-modal="false"
:draggable="true" @close="handleClose">
<div class="container">
<el-form inline class="compact-form">
<el-form-item label="样本号:">
@ -55,8 +55,7 @@
}}</span> 个
</div>
</div>
<el-table :data="tableData" border class="mt-4 w-full" height="400px">
<el-table :data="tableData" ref="tableRef" border height="400px" show-overflow-tooltip>
<el-table-column prop="ybh" label="样本号" />
<el-table-column prop="sqh" label="条码" />
<el-table-column prop="brxm" label="姓名" />
@ -64,7 +63,6 @@
<el-table-column prop="jymd" label="项目" width="300" />
</el-table>
</div>
</el-dialog>
</template>
@ -139,6 +137,9 @@ const handleEnter = () => {
}
prevSpecimen.value = res.data
tableData.value.push(res.data)
nextTick(() => {
tableRef.value.setScrollTop(tableData.value.length * 30);
})
currentScanCount.value++;
}
})
@ -147,25 +148,34 @@ const handleEnter = () => {
// 上一个标本
const goPrev = () => {
emit('goPrev');
sqhRef.value?.focus()
};
// 下一个标本
const goNext = () => {
emit('goNext');
sqhRef.value?.focus()
};
// 最后一个标本
const goLast = () => {
emit('goLast');
sqhRef.value?.focus()
};
const tableRef = ref()
const printHandle = () => {
if (!tableData.value.length) return ElMessage.warning('样本打印数据为空')
};
const open = () => {
ybh.value = labPat.value.ybh
show.value = true;
nextTick(() => {
setTimeout(() => {
sqhRef.value?.focus()
}, 100);
})
};
const handleClose = () => {
@ -182,6 +192,12 @@ const formatDict = (v: string, dictType: string) => {
defineExpose({
open,
});
onMounted(() => {
for (let index = 0; index < 100; index++) {
tableData.value.push({ ybh: index, sqh: '321421321', brxm: '李是大', brdh: '4332132', jymd: '高蛋白大 大的 ' },);
}
});
</script>
<style scoped>
@ -222,4 +238,25 @@ defineExpose({
color: #0000ff;
}
}
/* 页面基础样式 */
.page-container {
padding: 20px;
}
.header {
margin-bottom: 30px;
}
.other-content {
margin-bottom: 20px;
padding: 10px;
border: 1px dashed #ccc;
}
.footer {
margin-top: 30px;
text-align: center;
color: #666;
}
</style>

View File

@ -32,7 +32,7 @@
</template>
</CustomTable>
</div>
<div ref="myEcharts" class="mt20" style="width:100%;height: 40vh" />
<div ref="myEcharts" class="mt20" style="width:100%;height: 35vh" />
</div>
</template>
@ -42,7 +42,6 @@ import * as echarts from 'echarts';
import { historyInfo } from '@/api/liswork/work/LisWork'
import dayjs from 'dayjs';
import CustomTable from '@/components/elTable/index.vue'
import { getGroupInstrdList } from '@/api/liswork/work/LisWork'
const props = defineProps({
// 主键
queryParams: {
@ -57,12 +56,11 @@ const props = defineProps({
// 解构 props
const { queryParams } = toRefs(props);
const instrOptions = ref<Array<{ yq: string, yqmc: string }>>([])
const tableData: any = ref([]);
const tableRef = ref();
const columns = ref([
{ label: '项目', prop: 'xmmc', width: 140, align: 'center', visible: true, },
{ label: '本次', prop: 'firstCsjg', width: 140, align: 'center', visible: true, },
{ label: '本次', prop: 'firstCsjg', width: 100, align: 'center', visible: true, },
{ label: '上一次', prop: 'oneCsjg', width: 150, align: 'center', visible: true, headerSlot: 'oneCsjg' },
{ label: '上二次', prop: 'twoCsjg', width: 150, align: 'center', visible: true, headerSlot: 'twoCsjg' },
{ label: '上三次', prop: 'threeCsjg', width: 150, align: 'center', visible: true, headerSlot: 'threeCsjg' },
@ -108,7 +106,7 @@ const cellStyle = ({ column, row }: any) => {
const config = {
border: true,
maxHeight: '350px',
height: '44vh',
highlightCurrentRow: true,
cellStyle: cellStyle
}
@ -123,22 +121,16 @@ const formatHeader = (column: any, prefix: string) => {
const yljgKey = `${prefix}yljg`;
const dateKey = `${prefix}Date`;
const ybhKey = `${prefix}ybh`;
const yqKey = `${prefix}yq`;
const yqKey = `${prefix}yqmc`;
const brxbKey = `${prefix}brxb`;
const nlKey = `${prefix}nl`;
const item = tableData.value[index];
return `${item[yljgKey]} <br /> ${item[dateKey]} <br /> ${formatYq(item[yqKey])}(${item[ybhKey]}) <br /> ${item[brxbKey]},${item[nlKey]}`;
return `${item[yljgKey]} <br /> ${item[dateKey]} <br /> ${item[yqKey]}(${item[ybhKey]}) <br /> ${item[brxbKey]},${item[nlKey]}`;
}
return column.label;
};
const formatDict = (v: string, dictType: string) => {
return props.dictData[dictType]?.find((item: any) => item.value == v)?.label || v;
}
const formatYq = (yq: string) => {
return instrOptions.value?.find((item: any) => item.yq == yq.trim())?.yqmc || yq;
}
const getList = () => {
historyInfo(queryParams.value).then((res: any) => {
@ -153,7 +145,7 @@ const getList = () => {
map.set(item.xmdh, {
csjg: item.csjg,
jyrq: dayjs(item.jyrq).format('YY/MM/DD'),
yq: item.yq,
yqmc: item.yqmc,
ybh: item.ybh,
yljg: item.yljg,
result_flag: item.result_flag,
@ -184,7 +176,7 @@ const getList = () => {
if (item) {
row[`${period}Csjg`] = item.csjg;
row[`${period}Date`] = item.jyrq;
row[`${period}yq`] = item.yq;
row[`${period}yqmc`] = item.yqmc;
row[`${period}ybh`] = item.ybh;
row[`${period}yljg`] = item.yljg;
row[`${period}brxb`] = item.brxb;
@ -341,14 +333,6 @@ const getEcharts = (data: any) => {
}
onMounted(() => {
getGroupInstrdList().then((res: any) => {
if (res.code == 0) {
instrOptions.value = res.data.map((item: any) => ({
yq: item.yq.trim(),
yqmc: item.yqmc
}))
}
})
})
</script>

View File

@ -509,6 +509,8 @@ const handleNext = () => {
}
// 最后一个样本
const handleLast = () => {
queryParams.value.ybh = labPatList.value[labPatList.value.length - 1].ybh;
handleNext();
}
const batchRef = ref()
// 批量扫码

View File

@ -81,7 +81,7 @@ const tableDetailRef = ref();
const columns = ref([
{ label: '项目', prop: 'xmmc', width: 140, align: 'center', visible: true, },
{ label: '本次', prop: 'firstCsjg', width: 100, align: 'center', visible: true, headerSlot: 'firstCsjg' },
{ label: '本次', prop: 'firstCsjg', width: 150, align: 'center', visible: true, headerSlot: 'firstCsjg' },
{ label: '上一次', prop: 'oneCsjg', width: 150, align: 'center', visible: true, headerSlot: 'oneCsjg' },
{ label: '上二次', prop: 'twoCsjg', width: 150, align: 'center', visible: true, headerSlot: 'twoCsjg' },
{ label: '上三次', prop: 'threeCsjg', width: 150, align: 'center', visible: true, headerSlot: 'threeCsjg' },
@ -143,11 +143,11 @@ const formatHeader = (column: any, prefix: string) => {
const dateKey = `${prefix}Date`;
const ybhKey = `${prefix}ybh`;
const yqdlKey = `${prefix}yqdl`;
const yqKey = `${prefix}yq`;
const yqKey = `${prefix}yqmc`;
const brxbKey = `${prefix}brxb`;
const nlKey = `${prefix}nl`;
const item = tableDataDetail.value[index];
return ` ${item[dateKey]} <br /> (${item[ybhKey]}) <br /> ${formatyq(item[yqKey])} <br />${item[brxbKey]},${item[nlKey]}`;
return ` ${item[dateKey]} <br /> ${item[yqKey]} (${item[ybhKey]})<br />${item[brxbKey]},${item[nlKey]}`;
}
return column.label;
};
@ -194,7 +194,7 @@ const handleRowClick = (row: any) => {
csjg: item.csjg,
jyrq: dayjs(item.jyrq).format('YY/MM/DD'),
yqdl: item.yqdl,
yq: item.yq,
yqmc: item.yqmc,
ybh: item.ybh,
yljg: item.yljg,
result_flag: item.result_flag,
@ -226,7 +226,7 @@ const handleRowClick = (row: any) => {
row[`${period}Csjg`] = item.csjg;
row[`${period}Date`] = item.jyrq;
row[`${period}yqdl`] = item.yqdl;
row[`${period}yq`] = item.yq;
row[`${period}yqmc`] = item.yqmc;
row[`${period}ybh`] = item.ybh;
row[`${period}yljg`] = item.yljg;
row[`${period}ResultFlag`] = item.result_flag;
@ -246,14 +246,6 @@ const handleRowClick = (row: any) => {
})
}
const formatDict = (v: string, dictType: string) => {
return dictData.value[dictType]?.find((item: any) => item.value == v)?.label || v;
}
const formatyq = (v: string) => {
return instrOptions.value.find((item: any) => item.yq == v.trim())?.yqmc || v;
}
</script>
<style scoped lang="scss">