质控管理模块优化

This commit is contained in:
wyuu 2026-05-20 17:46:09 +08:00
parent 1e55a34574
commit 079e6836e9
19 changed files with 423 additions and 207 deletions

View File

@ -24,4 +24,28 @@ export function confirmInputMdl(query?: Object) {
method: 'post',
data: query,
});
}
// 调整数据
export function adjustData(query?: Object) {
return request({
url: '/batchCheck/adjustData',
method: 'post',
data: query,
});
}
// 读取数据
export function readData(query?: Object) {
return request({
url: '/batchCheck/readData',
method: 'post',
data: query,
});
}
// 保存数据
export function saveData(query?: Object) {
return request({
url: '/batchCheck/saveData',
method: 'post',
data: query,
});
}

View File

@ -161,4 +161,26 @@ function useAutoSize() {
return autoSize;
}
export const classCom = { decimalToHexColor, convertHexToNumber, getContrastTextColor, printBase64PDF, printPDF, useAutoSize, getDayDiff }
/**
* 计算带 > < ≥ <= 等符号的数据平均值
* 自动提取数字,忽略符号
* @param {Array} arr 数据数组 例如 ['<2.0', '5092.1', '≥30', '>100']
* @returns {number} 平均值(保留2位小数)
*/
function calcMeanWithSymbols(arr) {
const numbers = arr.map(item => {
if (item === null || item === undefined || item === '') return 0
// 去掉所有非数字、非小数点的字符(> < ≥ <= >= <= 等)
const numStr = String(item).replace(/[^\d.]/g, '')
// 转数字,无效则 0
const num = parseFloat(numStr)
return isNaN(num) ? 0 : num
})
const total = numbers.reduce((sum, val) => sum + val, 0)
// 平均值(严格按原数组长度计算)
const avg = total / arr.length
// 保留2位小数返回
return Math.round(avg * 100) / 100
}
export const classCom = { decimalToHexColor, convertHexToNumber, getContrastTextColor, printBase64PDF, printPDF, useAutoSize, getDayDiff, calcMeanWithSymbols }

View File

@ -9,11 +9,11 @@
<div class="app-container">
<!-- 顶部工具栏 -->
<div class="toolbar">
<el-button icon="EditPen" type="primary">调整</el-button>
<el-button icon="Check" type="success">保存</el-button>
<el-button icon="CirclePlus" type="primary">读取</el-button>
<el-button icon="Delete" type="danger">删除</el-button>
<el-button type="danger">删除全部</el-button>
<el-button icon="EditPen" type="primary" plain @click="adjustHandle">调整</el-button>
<el-button icon="Check" type="success" plain @click="saveHandle">保存</el-button>
<el-button icon="CirclePlus" type="primary" plain @click="readHandle">读取</el-button>
<el-button type="danger" plain @click="delHandle(-1)">删除全部</el-button>
</div>
<!-- 核心左右布局容器 -->
@ -22,29 +22,28 @@
<div class="form-section">
<el-form label-width="80px">
<el-form-item label="标本日期">
<el-date-picker v-model="queryForm.jyrq" type="date" format="YYYY/MM/DD" value-format="YYYY/MM/DD"
<el-date-picker v-model="queryForm.jyrq" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"
style="width: 100%" />
</el-form-item>
<el-form-item label="检验仪器">
<YQSelectTable v-model:data="queryForm.yq" width="100%" clearable />
<YQSelectTable v-model:data="queryForm.yq" width="100%" clearable @get-data-value="getyqData" />
</el-form-item>
<el-form-item label="调整项目">
<el-select v-model="queryForm.testItem" placeholder="" style="width: 100%">
</el-select>
<SelectTable v-model:data="queryForm.xmdh" :tableData="xmList" width="100%" clearable />
</el-form-item>
<el-form-item label="标本号">
<div class="sample-no-inputs">
<el-input v-model="queryForm.sampleNoStart" style="width: 10rem" />
<el-input v-model="queryForm.ybh1" clearable style="width: 10rem" />
<span style="margin: 0 8px;">—</span>
<el-input v-model="queryForm.sampleNoEnd" style="width: 10rem" />
<el-input v-model="queryForm.ybh2" clearable style="width: 10rem" />
</div>
</el-form-item>
<el-form-item label="调整公式">
<el-input v-model="queryForm.formula" style="width: 100%" placeholder="" />
<el-input v-model="queryForm.adjust" style="width: 100%" placeholder="" />
</el-form-item>
<!-- 公式说明文字 -->
<div class="formula-tip">
<div class="adjust-tip">
注:请输入包含R(检验结果)的表达式, 如:R*1.1为结果调整原来的1.1倍
</div>
</el-form>
@ -52,9 +51,18 @@
<!-- 右侧表格区域 -->
<div class="table-section">
<el-table :data="tableData" border style="width: 100%" height="50vh">
<el-table-column label="标本号" prop="sampleNo" width="300" />
<el-table-column label="检验结果" prop="result" />
<el-table :data="tableData" border style="width: 100%" height="50vh" highlight-current-row>
<el-table-column label="标本号" prop="ybh" width="300" />
<el-table-column label="检验结果" prop="csjg">
<template #default="{ row }">
<el-input v-model="row.csjg" class="full-width-input"></el-input>
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="{ row, $index }">
<el-button icon="Delete" type="primary" link @click="delHandle($index)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 表格底部统计信息 -->
@ -70,26 +78,82 @@
<script setup lang="ts">
import YQSelectTable from '@/components/SelectTable/YQSelectTable/index.vue'
import dayjs from 'dayjs'
import { adjustData, readData, saveData } from '@/api/batch'
import { useCommonStore } from '@/store/modules/commonStore';
import { queryOldxminfo } from '@/api/liswork/xtwh/xmReqItemVsApi'
import { classCom } from '@/utils/classCom';
import { ElMessage, ElMessageBox } from 'element-plus';
const commonStore = useCommonStore()
// 查询表单数据
const queryForm = reactive({
jyrq: dayjs().format('YYYY/MM/DD'),
yq: '1贝克曼流水线',
testItem: '',
sampleNoStart: '',
sampleNoEnd: '',
formula: ''
jyrq: dayjs().format('YYYY-MM-DD'),
yq: commonStore.defaultConfig.defaultinstr,
xmdh: '',
ybh1: '',
ybh2: '',
adjust: ''
})
const xmList = ref([])
// 表格数据
const tableData = ref<any[]>([])
const adjustHandle = () => {
queryForm.jyrq = dayjs(queryForm.jyrq).format('YYYY-MM-DD') + ' 00:00:00'
adjustData({ ...queryForm, labResultList: tableData.value }).then(res => {
if (res.code == 0) {
readHandle()
}
})
}
const readHandle = () => {
queryForm.jyrq = dayjs(queryForm.jyrq).format('YYYY-MM-DD') + ' 00:00:00'
readData(queryForm).then(res => {
tableData.value = res.data
})
}
const saveHandle = () => {
queryForm.jyrq = dayjs(queryForm.jyrq).format('YYYY-MM-DD') + ' 00:00:00'
saveData({ ...queryForm, labResultList: tableData.value }).then(res => {
if (res.code == 0) {
ElMessage.success('保存成功')
}
})
}
const delHandle = (index: number) => {
ElMessageBox.confirm('删除结果将无法恢复,是否确定要删除当前数据?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning' }).then(() => {
if (index != -1) {
tableData.value.splice(index, 1)
} else {
tableData.value = []
}
})
}
// 计算均值
const averageResult = computed(() => {
if (tableData.value.length === 0) return ''
const sum = tableData.value.reduce((acc, item) => acc + Number(item.result || 0), 0)
return (sum / tableData.value.length).toFixed(2)
if (tableData.value.length === 0) return 0
const arr = tableData.value.map(item => {
return item.csjg
})
return classCom.calcMeanWithSymbols(arr)
})
const getyqData = () => {
if (!queryForm.yq) return
queryOldxminfo({ yq: queryForm.yq }).then(res => {
xmList.value = res.data.map(item => {
return {
label: item.xmmc,
value: item.xmdh
}
})
})
}
getyqData()
</script>
<style scoped lang="scss">
@ -123,7 +187,7 @@ const averageResult = computed(() => {
height: 100%;
}
.formula-tip {
.adjust-tip {
color: #0000cc;
margin-top: 8px;
font-size: 14px;

View File

@ -2,48 +2,76 @@
<template>
<div class="app-container">
<el-form ref="form" :model="formData" class="query-form" label-width="6.25rem" inline>
<el-form-item label="医疗机构:" prop="yljg">
<SelectTable v-model:data="formData.yljg" :fields="fields" width="150px" dict-type="HOS" />
</el-form-item>
<el-form-item label="仪器分组:" prop="lisgroup">
<SelectTable v-model:data="formData.lisgroup" :fields="fields" width="150px" dict-type="GROUP"
@get-data-value="getYqConfig()" />
</el-form-item>
<el-form-item label="检验仪器:" prop="yq">
<SelectTable v-model:data="formData.yq" :tableData="instrOptions" width="150px" placeholder="请选择仪器"
@getDataValue="getYQList" />
</el-form-item>
<el-form-item label="申请科室:" prop="ksdh">
<SelectTable v-model:data="formData.ksdh" :fields="fields" width="150px" dict-type="DP" />
</el-form-item>
<el-form-item label="检验医师:" prop="yhdh">
<el-input placeholder="请填写检验医师" v-model="formData.yhdh" style="width: 150px;" />
</el-form-item>
<el-form-item label="病人来源:" prop="brly">
<SelectTable v-model:data="formData.brly" :fields="fields" width="150px" dict-type="PT" />
</el-form-item>
<el-form-item label="标本日期:" prop="jyrq">
<el-date-picker v-model="formData.jyrq1" type="date" style="width: 150px;"
value-format="YYYY-MM-DD" />&nbsp;-&nbsp;
<el-date-picker v-model="formData.jyrq2" type="date" style="width: 150px;" value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item label="标本号:" prop="ybh">
<el-input placeholder="开始标本号" v-model="formData.ybh1" style="width: 120px;" /> &nbsp;-&nbsp;
<el-input placeholder="结束标本号" v-model="formData.ybh2" style="width: 120px;" />
</el-form-item>
<el-form-item label="审核标志:">
<el-select v-model="formData.jgbz" style="width: 150px" clearable>
<el-option v-for="item in jgbzOption" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-checkbox v-model="formData.jzbz" label="急诊报告" true-value="1" false-value="0"></el-checkbox>
</el-form-item>
<el-row>
<el-col :span="4">
<el-form-item label="仪器分组:" prop="lisgroup">
<SelectTable v-model:data="formData.lisgroup" :fields="fields" width="10rem" dict-type="GROUP"
@get-data-value="getYqConfig()" />
</el-form-item>
</el-col>
<el-col :span="6.5">
<el-form-item label="标本日期:" prop="jyrq">
<el-date-picker v-model="formData.jyrq1" type="date" style="width: 10rem;"
value-format="YYYY-MM-DD" />&nbsp;-&nbsp;
<el-date-picker v-model="formData.jyrq2" type="date" style="width: 10rem;" value-format="YYYY-MM-DD" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="医疗机构:" prop="yljg">
<SelectTable v-model:data="formData.yljg" :fields="fields" width="10rem" dict-type="HOS" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="病人来源:" prop="brly">
<SelectTable v-model:data="formData.brly" :fields="fields" width="10rem" dict-type="PT" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="审核标志:">
<el-select v-model="formData.jgbz" style="width: 10rem" clearable>
<el-option v-for="item in jgbzOption" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="4">
<el-form-item label="检验仪器:" prop="yq">
<SelectTable v-model:data="formData.yq" :tableData="instrOptions" width="10rem" placeholder="请选择仪器"
@getDataValue="getYQList" />
</el-form-item>
</el-col>
<el-col :span="6.5">
<el-form-item label="标本号:" prop="ybh">
<el-input placeholder="开始标本号" v-model="formData.ybh1" style="width: 10rem;" /> &nbsp;-&nbsp;
<el-input placeholder="结束标本号" v-model="formData.ybh2" style="width: 10rem;" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="申请科室:" prop="ksdh">
<SelectTable v-model:data="formData.ksdh" :fields="fields" width="10rem" dict-type="DP" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="检验医师:" prop="yhdh">
<el-input placeholder="请填写检验医师" v-model="formData.yhdh" style="width: 10rem;" />
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item>
<el-checkbox v-model="formData.jzbz" label="急诊报告" true-value="1" false-value="0"></el-checkbox>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="mb5">
<el-button type="primary" icon="Search" @click="getList">查询</el-button>
<el-button type="primary" icon="DocumentChecked" plain :disabled="!multiple" @click="checkData">批量审核</el-button>
<el-button type="primary" icon="DocumentChecked" plain :disabled="!multiple && formData.jgbz == '0'"
@click="checkData">批量审核</el-button>
<el-button type="primary" icon="DocumentDelete" plain :disabled="!multiple" @click="cancelCheck">取消审核</el-button>
<span class="doctor-name">审核医生:{{ doctorName }}</span>
<el-button type="primary" icon="User" @click="checkUser">切换</el-button>
</div>
<div class="table-container">
<el-row :gutter="10">
@ -75,20 +103,27 @@
<span>{{ row.dybz === "1" ? "已打印" : "未打印" }}</span>
</template>
</CustomTable>
<div class="mt10">
<el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="formData.pageNum" :page-sizes="[10, 20, 50, 100]" :page-size="formData.pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="total">
</el-pagination>
</div>
</el-col>
<el-col :span="6">
<LabResult v-model="paramObj" v-if="!isXJY" />
<LabResultMed v-model="paramObj" v-if="isXJY" />
</el-col>
</el-row>
</div>
<!-- 校验用户 -->
<CheckUser ref="checkUserRef" title="审核人工号密码验证" @onConfirm="handleCheckUserConfirm" />
</div>
</template>
<script setup lang="ts">
<script setup lang="ts" name="BatchCheck">
import CustomTable from '@/components/elTable/index.vue'
import YQSelectTable from '@/components/SelectTable/YQSelectTable/index.vue';
import SelectTable from '@/components/SelectTable/index.vue';
import { batchCheckService, queryBatchCheckListService, cancelBatchCheckService } from '@/api/liswork/batchCheck/batchCheckApi';
import dayjs from 'dayjs';
@ -97,31 +132,38 @@ import { displayBRNL, displayBRXB } from '@/utils/czUtil/lisUtil'
import useUserStore from '@/store/modules/user';
import LabResult from './LabResult.vue';
import LabResultMed from './LabResultMed.vue';
import { getGroupInstrdList } from '@/api/liswork/work/LisWork';
import { checkuser, getGroupInstrdList } from '@/api/liswork/work/LisWork';
import { useCommonStore } from '@/store/modules/commonStore';
import { ElMessage } from 'element-plus';
import CheckUser from "../work/components/CheckUser.vue";
import { listUser } from '@/api/system/user.js'
const tableRef = ref();
const tableRef = useTemplateRef('tableRef');
const tableData = ref([])
const userStore = useUserStore()
const commonStore = useCommonStore()
const paramObj = ref<any>(null) // 用于传递给 LabResult 组件的参数对象
const isXJY = ref(false)
const loading = ref(false)
const doctorName = ref('')
const checkUserRef = useTemplateRef('checkUserRef')
const formData = ref({
lisgroup: commonStore.defaultConfig.lisgroupid, //仪器分组
yljg: userStore.sysLoginParam.loginYLJG,
ksdh: '', //申请科室
ksdh: '',
yq: commonStore.defaultConfig.defaultinstr,
jyrq1: dayjs().format('YYYY-MM-DD'), //标本日期开始
jyrq2: dayjs().format('YYYY-MM-DD'), //标本日期结束
yhdh: '', //检验医师
brly: '', //病人来源
ybh1: '', //标本号开始
ybh2: '', //标本号结束
jgbz: '0', //审核标志
jzbz: 0 //急诊标志
jyrq1: dayjs().format('YYYY-MM-DD'),
jyrq2: dayjs().format('YYYY-MM-DD'),
yhdh: '',
brly: '',
ybh1: '',
ybh2: '',
jgbz: '0',
jzbz: 0,
pageSize: 30,
pageNum: 1
})
const total = ref(0)
const columns = ref([
{ type: 'selection', title: '选择', visible: true, align: 'center', width: 40 },
{ prop: 'jgbz', label: '审核标志', visible: true, align: 'center', slot: 'jgbz' },
@ -130,10 +172,10 @@ const columns = ref([
{ prop: 'ybh', label: '样本号', visible: true, align: 'center' },
{ prop: 'brxm', label: '姓名', visible: true, align: 'center' },
{ prop: 'brdh', label: '住院号', visible: true, align: 'center' },
{ prop: 'sqh', label: '申请号', visible: true, align: 'center' },
{ prop: 'sqh', label: '申请号', visible: true, align: 'center', width: 130 },
{ prop: 'brly', label: '病人类型', visible: true, align: 'center', slot: 'brly' },
{ prop: 'brxb', label: '性别', visible: true, align: 'center', slot: 'brxb' },
{ prop: 'brnl', label: '年龄', visible: true, align: 'center', slot: 'brnl' },
{ prop: 'brxb', label: '性别', visible: true, align: 'center', slot: 'brxb', width: 60 },
{ prop: 'brnl', label: '年龄', visible: true, align: 'center', slot: 'brnl', width: 60 },
{ prop: 'ksdh', label: '科室', visible: true, align: 'center', slot: 'ksdh' },
{ prop: 'ch', label: '床号', visible: true, align: 'center' },
{ prop: 'sjys', label: '送检医生', visible: true, align: 'center', slot: 'sjys' },
@ -149,6 +191,7 @@ const columns = ref([
{ prop: 'confirmermc', label: '审核人', visible: true, align: 'center' },
{ prop: 'confirmdt', label: '审核时间', visible: true, align: 'center', width: 150 },
]);
const yhdh = ref('') //审核医生工号
const jgbzOption = ref([
{ value: '0', label: '未审核' },
@ -175,19 +218,29 @@ const displayJGBZ = (jgbz: string) => {
return option ? option.label : jgbz
}
const handleSizeChange = (size: number) => {
formData.value.pageSize = size
getList()
}
const handleCurrentChange = (val: number) => {
formData.value.pageNum = val
getList()
};
const getList = async () => {
formData.value.jyrq1 = formData.value.jyrq1 + ' 00:00:00'
formData.value.jyrq2 = formData.value.jyrq2 + ' 23:59:59'
formData.value.jyrq1 = dayjs(formData.value.jyrq1).format('YYYY-MM-DD') + ' 00:00:00'
formData.value.jyrq2 = dayjs(formData.value.jyrq2).format('YYYY-MM-DD') + ' 23:59:59'
const res = await queryBatchCheckListService(formData.value)
tableData.value = res.data
}
const checkData = async () => {
if (!doctorName.value) return ElMessage.warning('请校验审核医生!')
const selected = tableRef.value?.getSelectionRows
? tableRef.value.getSelectionRows()
: (tableRef.value?.tableRef?.getSelectionRows ? tableRef.value.tableRef.getSelectionRows() : [])
const paramList = (selected || []).map((item: any) => ({
userId: userStore.name || '',
userId: yhdh.value,
yq: String(item.yq).trim(),
jyrq: dayjs(item.jyrq).format('YYYY-MM-DD HH:mm:ss'),
ybh: item.ybh,
@ -195,7 +248,7 @@ const checkData = async () => {
loading.value = true
const ret = await batchCheckService(paramList)
if (ret && ret.code === 200) {
if (ret && ret.code == 200) {
ElMessage.success('批量审核成功')
}
getList()
@ -203,11 +256,12 @@ const checkData = async () => {
}
const cancelCheck = async () => {
if (!doctorName.value) return ElMessage.warning('请校验审核医生!')
const selected = tableRef.value?.getSelectionRows
? tableRef.value.getSelectionRows()
: (tableRef.value?.tableRef?.getSelectionRows ? tableRef.value.tableRef.getSelectionRows() : [])
const paramList = (selected || []).map((item: any) => ({
userId: userStore.name || '',
userId: yhdh.value,
yq: String(item.yq).trim(),
jyrq: dayjs(item.jyrq).format('YYYY-MM-DD HH:mm:ss'),
ybh: item.ybh,
@ -215,12 +269,26 @@ const cancelCheck = async () => {
loading.value = true
const ret = await cancelBatchCheckService(paramList)
if (ret.code === 200) {
if (ret.code == 200) {
ElMessage.success('取消审核成功')
}
getList()
loading.value = false
}
const checkUser = () => {
checkUserRef.value?.open()
}
//审核医生校验
const handleCheckUserConfirm = (info) => {
checkuser({ yhdh: info.yhdh, mm: info.mm }).then(response => {
if (response.code == 0) {
yhdh.value = info.yhdh
doctorName.value = userList.value.find(item => item.userName == info.yhdh)?.nickName || ''
}
})
}
const instrOptions = ref([])
// 仪器
const getYqConfig = () => {
@ -258,9 +326,15 @@ const getYQList = (val: { yq: string; yqmc: string; yqdl: string } | null) => {
//console.log('选择的仪器大类:', val?.yqdl, '是否是细菌仪:', isXJY.value)
}
const userList = ref<{ userName: string; nickName: string }[]>([])
onMounted(() => {
getYqConfig()
getDictData('DP', 'SRD', 'BT', 'PT')
const data = { status: 0, del_flag: 0, pageSize: 1000, pageNum: 1 }
listUser(data).then((res: any) => {
userList.value = res.rows;
});
})
</script>
@ -273,8 +347,18 @@ onMounted(() => {
height: 100%;
.el-col {
height: 100%;
height: calc(100% - 50px)
}
}
}
.doctor-name {
display: inline-block;
color: #1f6dd3;
margin-left: 20px;
font-weight: 700;
width: 200px;
font-size: 16px;
vertical-align: middle;
}
</style>

View File

@ -1,7 +1,7 @@
<template>
<div class="app-container">
<el-row :gutter="20">
<el-col :span="14">
<el-row :gutter="20" class="row-box">
<el-col :span="14" class="col-box">
<!-- 表单区域 -->
<el-form inline :model="queryParams" class="query-form" size="small" label-width="90px">
<el-form-item label="项目类别:">
@ -24,7 +24,7 @@
<SelectTable v-model:data="queryParams.yqdl" :fields="yqdlFields" :tableData="dictData.YQDL" label="label"
value="value" objKey="value" width="8.75rem" size="small" @getDataValue="getList" />
</el-form-item>
<el-form-item label="项目ID:">
<el-form-item>
<el-input clearable placeholder="项目ID" prefix-icon="Search" v-model="queryParams.xmid" @input="(val) => {
queryParams.xmid = val.replace(/[^0-9]/g, '');
}" style="width: 8.75rem" @change="getList" />
@ -40,13 +40,13 @@
<el-checkbox v-model="queryParams.isMIC" label="隐藏微生物项目" :size="autoSize" @change="getList" />
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-row :gutter="10" class="mb5">
<el-col :span="24">
<el-button type="primary" plain icon="Refresh" :size="autoSize" @click="handleRefresh">刷新</el-button>
<el-button type="primary" icon="Search" :size="autoSize" @click="handleRefresh">查询</el-button>
<el-button type="primary" plain icon="Plus" :size="autoSize" @click="openAddDialog">新增</el-button>
<el-button type="danger" plain icon="Delete" :size="autoSize" @click="handleDel">删除</el-button>
<el-button type="primary" plain :size="autoSize" @click="handleBatchVs">批量项目对应</el-button>
<el-button type="primary" plain :size="autoSize" @click="handleSave">保存</el-button>
<el-button type="success" plain icon="Check" :size="autoSize" @click="handleSave">保存</el-button>
</el-col>
</el-row>
@ -79,27 +79,27 @@
</el-col>
<!-- 原有右侧区域 完全不动 -->
<el-col :span="10">
<el-col :span="10" class="col-box">
<tabView :tabList="tabList" v-model:activeTab="activeTab" @update:active-tab="updateActive" />
<component class="tabDiv" ref="tableTabRef" :is="activeTabN" :formData="selectRow" v-model="modelParam"
@refreshTabData="rowChange"></component>
<BatchInstrVs v-model="batchInstrVsModel" />
</el-col>
</el-row>
<BatchInstrVs v-model="batchInstrVsModel" />
<!-- ====================== 新增弹窗(独立复制版) ====================== -->
<!-- 新增弹窗 -->
<el-dialog v-model="addDialogVisible" title="新增项目" width="70%" top="10px" :close-on-click-modal="false"
destroy-on-close>
<el-tabs v-model="addActiveTab" type="card" class="tabs_box" @tab-click="updateAddActive">
<el-tab-pane v-for="item in tabList" :key="item.value" :label="item.label" :name="item.value">
</el-tab-pane>
</el-tabs>
<component class="tabDiv" ref="addTableTabRef" :is="addActiveTabN" :formData="addFormData" v-model="addModelParam"
@refreshTabData="refreshAddTab" />
<component class="dialogtabDiv" ref="addTableTabRef" :is="addActiveTabN" :formData="addFormData"
v-model="addModelParam" @refreshTabData="refreshAddTab" />
<template #footer>
<el-button @click="addDialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleAddSave">保存</el-button>
<el-button type="primary" @click="handleAddSave">确定</el-button>
</template>
</el-dialog>
</div>
@ -395,6 +395,10 @@ onMounted(() => {
<style lang="scss" scoped>
.query-form .el-form-item {
margin-bottom: 5px;
.el-radio {
margin-right: .625rem;
}
}
.page-box {
@ -402,14 +406,17 @@ onMounted(() => {
text-align: right;
}
.mb8 {
margin-bottom: 8px;
}
.tabDiv {
padding: 10px;
border: 1px solid #e6e6e6;
border-radius: 4px;
min-height: 70vh;
height: 82vh;
}
.dialogtabDiv {
padding: 10px;
height: 70vh;
}
</style>

View File

@ -46,7 +46,7 @@ const columns = ref([
]);
const tableConfig = ref({
border: true, // 边框
height: '78vh', // 高度
height: 'calc(100% - 30px)', // 高度
highlightCurrentRow: true, // 高亮当前行
// cellStyle: cellStyleHd
})

View File

@ -300,7 +300,7 @@ defineExpose({
<style scoped lang="scss">
.basic_info {
height: 82vh;
height: 100%;
overflow-y: auto;
}

View File

@ -3,13 +3,15 @@
<div>
<div class="modifyClass">
<el-button type="primary" @click="onAddClick">增加</el-button>
<el-button type="primary" @click="onDelClick">删除</el-button>
</div>
<CustomTable ref="tableRef" :data="modelParam.commonDescriptionsData" :columns="columns" :config="tableConfig"
@row-click="rowClick">
<CustomTable ref="tableRef" :data="modelParam.commonDescriptionsData" :columns="columns" :config="tableConfig">
<template #textresult="{ row }">
<el-input type="textarea" v-model="row.textresult" class="full-width-input" autosize></el-input>
</template>
<template #action="{ row }">
<el-button type="primary" link @click="onDelClick(row)">删除</el-button>
</template>
</CustomTable>
</div>
</template>
@ -24,16 +26,13 @@ import { delXmTextresultNew } from '@/api/liswork/labItem/labItemApi';
const modelParam = defineModel<any>()
watch(() => modelParam.value.commonDescriptionsData, (val) => {
selectRow.value = null
})
const tableRef = ref();
const columns = ref([
{ prop: 'textresult', label: '文字描述', visible: true, align: 'center', slot: 'textresult', width: 500, showOverflowTooltip: false },
]);
const tableConfig = ref({
border: true, // 边框
height: '78vh', // 高度
height: 'calc(100% - 30px)', // 高度
highlightCurrentRow: true, // 高亮当前行
// cellStyle: cellStyleHd
})
@ -49,11 +48,6 @@ const maxXh = computed(() => {
return modelParam.value.commonDescriptionsData.length > 0 ? modelParam.value.commonDescriptionsData.length + 1 : 0;
});
const rowClick = (row: any) => {
selectRow.value = row
}
const onAddClick = () => {
const newData: XmTextresultNew = {
xmid: modelParam.value.basicData.xmid,
@ -64,13 +58,12 @@ const onAddClick = () => {
modelParam.value.commonDescriptionsData.push(newData)
}
const onDelClick = () => {
if (!selectRow.value) return ElMessage.warning('请选择要删除的数据!');
const onDelClick = (row) => {
ElMessageBox.confirm('是否要删除选中的数据?', '警告',
{ confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', }).then(() => {
delXmTextresultNew({ xmid: modelParam.value.basicData.xmid, xh: selectRow.value.xh }).then((res: any) => {
delXmTextresultNew({ xmid: modelParam.value.basicData.xmid, xh: row.xh }).then((res: any) => {
if (res.code == 0) {
modelParam.value.commonDescriptionsData = modelParam.value.commonDescriptionsData.filter((item: any) => item.xh != selectRow.value.xh)
modelParam.value.commonDescriptionsData = modelParam.value.commonDescriptionsData.filter((item: any) => item.xh != row.xh)
}
})
})

View File

@ -32,7 +32,7 @@ const columns = ref([
]);
const tableConfig = ref({
border: true, // 边框
height: '81.5vh', // 高度
height: '100%', // 高度
highlightCurrentRow: true, // 高亮当前行
// cellStyle: cellStyleHd
})

View File

@ -3,69 +3,73 @@
<div>
<div class="modifyClass">
<el-button type="primary" @click="onAddClick">增加</el-button>
<el-button type="primary" @click="onDelClick">删除</el-button>
<el-button type="danger" @click="onDelClick">删除</el-button>
</div>
<CustomTable ref="tableRefUp" :data="modelParam.referenceValueDetailsData" :columns="columnsUp"
:enable-column-drag="true" @column-drag-end="handleColumnDragEnd" :config="tableConfig" @row-click="rowClick">
<template #xb="{ row }">
<el-select v-model="row.xb" clearable class="full-width-input">
<el-option v-for="item in optionsXb" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</template>
<template #nl1="{ row }">
<el-input v-model="row.nl1" class="full-width-input"></el-input>
</template>
<template #cp_nldw1="{ row }">
<el-select v-model="row.nldw" clearable class="full-width-input">
<el-option v-for="item in optionsNLDW" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</template>
<template #nl2="{ row }">
<el-input v-model="row.nl2" class="full-width-input"></el-input>
</template>
<template #cp_nldw2="{ row }">
<el-select v-model="row.nldw" clearable class="full-width-input">
<el-option v-for="item in optionsNLDW" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</template>
<template #bblx="{ row }">
<SelectTable v-model:data="row.bblx" :fields="fields" :tableData="dictData.BT" label="label" value="label"
objKey="label" :border="true" class="full-width-input" />
</template>
<template #slzq="{ row }">
<el-select v-model="row.slzq" clearable class="full-width-input">
<el-option v-for="item in dictData.SLZQ" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</template>
<template #zd="{ row }">
<el-input v-model="row.zd" class="full-width-input"></el-input>
</template>
<template #ckxx="{ row }">
<el-input v-model="row.ckxx" class="full-width-input" @input="updateDyck(row)"></el-input>
</template>
<template #cksx="{ row }">
<el-input v-model="row.cksx" class="full-width-input" @input="updateDyck(row)"></el-input>
</template>
<template #alterxx="{ row }">
<el-input v-model="row.alterxx" class="full-width-input"></el-input>
</template>
<template #altersx="{ row }">
<el-input v-model="row.altersx" class="full-width-input"></el-input>
</template>
<template #dyck="{ row }">
<el-text class="mx-1">{{ row.dyck }}</el-text>
</template>
</CustomTable>
<el-row>
仪器特定参考值:
</el-row>
<div style="height: 44%;">
<CustomTable ref="tableRefUp" :data="modelParam.referenceValueDetailsData" :columns="columnsUp"
:enable-column-drag="true" @column-drag-end="handleColumnDragEnd" :config="tableConfig" @row-click="rowClick">
<template #xb="{ row }">
<el-select v-model="row.xb" clearable class="full-width-input">
<el-option v-for="item in optionsXb" :key="item.value" :label="item.label" :value="item.value"></el-option>
</el-select>
</template>
<template #nl1="{ row }">
<el-input v-model="row.nl1" class="full-width-input"></el-input>
</template>
<template #cp_nldw1="{ row }">
<el-select v-model="row.nldw" clearable class="full-width-input">
<el-option v-for="item in optionsNLDW" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</template>
<template #nl2="{ row }">
<el-input v-model="row.nl2" class="full-width-input"></el-input>
</template>
<template #cp_nldw2="{ row }">
<el-select v-model="row.nldw" clearable class="full-width-input">
<el-option v-for="item in optionsNLDW" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</template>
<template #bblx="{ row }">
<SelectTable v-model:data="row.bblx" :fields="fields" :tableData="dictData.BT" label="label" value="label"
objKey="label" :border="true" class="full-width-input" />
</template>
<template #slzq="{ row }">
<el-select v-model="row.slzq" clearable class="full-width-input">
<el-option v-for="item in dictData.SLZQ" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</template>
<template #zd="{ row }">
<el-input v-model="row.zd" class="full-width-input"></el-input>
</template>
<template #ckxx="{ row }">
<el-input v-model="row.ckxx" class="full-width-input" @input="updateDyck(row)"></el-input>
</template>
<template #cksx="{ row }">
<el-input v-model="row.cksx" class="full-width-input" @input="updateDyck(row)"></el-input>
</template>
<template #alterxx="{ row }">
<el-input v-model="row.alterxx" class="full-width-input"></el-input>
</template>
<template #altersx="{ row }">
<el-input v-model="row.altersx" class="full-width-input"></el-input>
</template>
<template #dyck="{ row }">
<el-text class="mx-1">{{ row.dyck }}</el-text>
</template>
</CustomTable>
</div>
<div class="tips"> 仪器特定参考值:</div>
<div class="modifyClass">
<el-button type="primary" @click="">增加</el-button>
<el-button type="primary" @click="">删除</el-button>
<el-button type="danger" @click="">删除</el-button>
</div>
<div style="height: 44%;">
<CustomTable ref="tableRefDown" :data="dataListDown" :columns="columnsDown" :enable-column-drag="true"
@column-drag-end="handleColumnDragEnd" :config="tableConfig" />
</div>
<CustomTable ref="tableRefDown" :data="dataListDown" :columns="columnsDown" :enable-column-drag="true"
@column-drag-end="handleColumnDragEnd" :config="tableConfig" />
</div>
</template>
@ -104,21 +108,21 @@ const fields = ref(
// const dataListUp = ref();
const dataListDown = ref([]);
const columnsUp = ref([
{ prop: 'xmid', label: 'xmid', visible: false, align: 'center' },
{ prop: 'xh', label: '序号', visible: false, align: 'center' },
{ prop: 'xmid', label: 'xmid', visible: false, align: 'center', showOverflowTooltip: false },
{ prop: 'xh', label: '序号', visible: false, align: 'center', showOverflowTooltip: false },
{ prop: 'xb', label: '性别', visible: true, align: 'center', slot: 'xb', width: 80, showOverflowTooltip: false },
{ prop: 'nl1', label: '年龄下限', visible: true, align: 'center', slot: 'nl1', width: 70 },
{ prop: 'nl1', label: '年龄下限', visible: true, align: 'center', slot: 'nl1', width: 70, showOverflowTooltip: false },
{ prop: 'nldw', label: '年龄单位', visible: true, align: 'center', slot: 'cp_nldw1', width: 80, showOverflowTooltip: false },
{ prop: 'nl2', label: '年龄上限', visible: true, align: 'center', slot: 'nl2', width: 70 },
{ prop: 'nl2', label: '年龄上限', visible: true, align: 'center', slot: 'nl2', width: 70, showOverflowTooltip: false },
{ prop: 'nldw', label: '年龄单位', visible: true, align: 'center', slot: 'cp_nldw2', width: 80, showOverflowTooltip: false },
{ prop: 'bblx', label: '标本类型', visible: true, align: 'center', slot: 'bblx', width: 100, showOverflowTooltip: false },
{ prop: 'slzq', label: '生理周期', visible: true, align: 'center', slot: 'slzq', width: 100, showOverflowTooltip: false },
{ prop: 'zd', label: '诊断', visible: true, align: 'center', slot: 'zd', width: 100 },
{ prop: 'ckxx', label: '参考下限', visible: true, align: 'center', slot: 'ckxx', width: 100 },
{ prop: 'cksx', label: '参考上限', visible: true, align: 'center', slot: 'cksx', width: 100 },
{ prop: 'alterxx', label: '危急值下限', visible: true, align: 'center', slot: 'alterxx', width: 100 },
{ prop: 'altersx', label: '危急值上限', visible: true, align: 'center', slot: 'altersx', width: 100 },
{ prop: 'dyck', label: '参考值', visible: true, align: 'center', slot: 'dyck', width: 100 },
{ prop: 'zd', label: '诊断', visible: true, align: 'center', slot: 'zd', width: 100, showOverflowTooltip: false },
{ prop: 'ckxx', label: '参考下限', visible: true, align: 'center', slot: 'ckxx', width: 100, showOverflowTooltip: false },
{ prop: 'cksx', label: '参考上限', visible: true, align: 'center', slot: 'cksx', width: 100, showOverflowTooltip: false },
{ prop: 'alterxx', label: '危急值下限', visible: true, align: 'center', slot: 'alterxx', width: 100, showOverflowTooltip: false },
{ prop: 'altersx', label: '危急值上限', visible: true, align: 'center', slot: 'altersx', width: 100, showOverflowTooltip: false },
{ prop: 'dyck', label: '参考值', visible: true, align: 'center', slot: 'dyck', showOverflowTooltip: false },
]);
const columnsDown = ref([
{ prop: 'xb', label: '性别', visible: true, align: 'center', slot: 'xb', width: 100 },
@ -137,7 +141,7 @@ const columnsDown = ref([
]);
const tableConfig = ref({
border: true, // 边框
height: '35vh', // 高度
height: '100%', // 高度
highlightCurrentRow: true, // 高亮当前行
// cellStyle: cellStyleHd
})
@ -193,4 +197,10 @@ const rowClick = (row: any) => {
::v-deep .el-input__inner {
text-align: center;
}
.tips {
margin-bottom: 5px;
border-bottom: 1px solid #eee;
color: #1f6dd3;
}
</style>

View File

@ -26,7 +26,7 @@
<el-input :model-value="getDyckz(row)" disabled class="full-width-input" />
</template>
<template #action="{ row, $index }">
<el-button type="danger" text @click="onClickDel(row, $index)">删除</el-button>
<el-button type="primary" text @click="onClickDel(row, $index)">删除</el-button>
</template>
</CustomTable>
</div>
@ -54,7 +54,7 @@ const columns = ref([
]);
const tableConfig = ref({
border: true, // 边框
height: '78vh', // 高度
height: 'calc(100% - 30px)', // 高度
highlightCurrentRow: false, // 高亮当前行
actionWidth: 60, // 操作列宽度
// cellStyle: cellStyleHd

View File

@ -212,12 +212,11 @@ watch(yq, (newVal) => {
<style scoped lang="scss">
.sys_box {
height: calc(100% - 58px);
padding-top: 8px;
}
.table-toolbar {
margin-bottom: 8px;
height: 36px;
line-height: 36px;
margin-bottom: 5px;
}
// 三列表格容器

View File

@ -46,7 +46,7 @@
</div>
</template>
<script setup lang="ts">
<script setup lang="ts" name="QualityParameters">
import { ref, watch, nextTick, computed } from 'vue'
import { ElMessage, ElTree, TreeNode, ElMessageBox, ElBadge } from 'element-plus'
import { paramList, paramTree, getdef, updateParam } from '@/api/liswork/xtwh/ComOpt'

View File

@ -1,6 +1,6 @@
<!-- 修改界面 -->
<template>
<el-dialog v-model="visible" :title="title" width="40vw" @open="open" :close-on-click-modal="false" :draggable="true">
<el-dialog v-model="visible" :title="title" width="40vw" :close-on-click-modal="false" :draggable="true">
<span class="text-span">项目信息:</span>
<el-divider style="margin: 5px 0;" />
@ -117,7 +117,7 @@ const columnsRight = ref([
const tableConfig = ref({
border: true, // 边框
height: '40vh', // 高度
highlightCurrentRow: true, // 高亮当前行
highlightCurrentRow: false, // 高亮当前行
// cellStyle: cellStyleHd
})
@ -137,7 +137,15 @@ const handleColumnDragEnd = (data: any) => {
}
const dataList = ref<any>([])
const dataList = ref<any>([
{ reserve: '1', textresult: '', yxjs: '', cjyy: '', zd: '' },
{ reserve: 'H', textresult: '', yxjs: '', cjyy: '', zd: '' },
{ reserve: 'L', textresult: '', yxjs: '', cjyy: '', zd: '' },
{ reserve: 'P', textresult: '', yxjs: '', cjyy: '', zd: '' },
{ reserve: 'Q', textresult: '', yxjs: '', cjyy: '', zd: '' },
{ reserve: 'J', textresult: '', yxjs: '', cjyy: '', zd: '' },
{ reserve: 'N', textresult: '', yxjs: '', cjyy: '', zd: '' },
])
const reserve = (reserve: string) => {
@ -172,7 +180,7 @@ const handleOk = async () => {
}
const open = () => {
const open = (row, dataListRight) => {
if (props.type === '新增') {
dataList.value = [
{ reserve: '1', textresult: '', yxjs: '', cjyy: '', zd: '' },
@ -184,11 +192,15 @@ const open = () => {
{ reserve: 'N', textresult: '', yxjs: '', cjyy: '', zd: '' },
]
} else {
formData.value = row
dataList.value = dataListRight
}
}
defineExpose({ open })
</script>
<style scoped lang="scss">

View File

@ -130,7 +130,8 @@ const onAddClick = () => {
}
const onEditClick = (row) => {
const onEditClick = async (row) => {
modifyRef.value.open(row, dataListRight.value)
modifyVisible.value = true
}