质控批号

This commit is contained in:
wyuu 2026-01-07 17:27:37 +08:00
parent e6c48e426a
commit 94538e5e2f
7 changed files with 331 additions and 75 deletions

View File

@ -57,3 +57,19 @@ export function deleteQcSample(data?: Object) {
params: data
})
}
// 查询质控批号
export function queryBatch(data?: Object) {
return request({
url: '/qc/query',
method: 'get',
params: data
})
}
// 查询质控批号 获取项目列表
export function queryBatchXm(data?: Object) {
return request({
url: '/qc/queryVal',
method: 'get',
params: data
})
}

View File

@ -364,3 +364,8 @@ aside {
margin-top: 20px;
text-align: right;
}
.el-tree-node__children {
padding-left: 15px !important;
}

View File

@ -1,5 +1,6 @@
<template>
<div class="app-container ">
<div class="tips">检验科条码打印科室:{{ formatDict(queryParams.ksdh, 'DP') }}</div>
<div ref="compactForm">
<el-row :gutter="10" class="compact-form" v-show="showSearch">
<el-form :model="queryParams" ref="queryRef" :inline="true" :size="aotuSize" :rules="queryRules">
@ -47,7 +48,7 @@
<el-button type="danger" :size="aotuSize" plain icon="Edit" @click="selectStatusRows">选中所有未打印</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" :size="aotuSize" plain @click="printPdf">打印</el-button>
<el-button type="success" :size="aotuSize" plain @click="printPdf">打印条码</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="info" :size="aotuSize" plain icon="Upload" @click="openBlock('采样登记')">采样登记</el-button>
@ -61,12 +62,12 @@
<el-col :span="1.5">
<el-button type="warning" :size="aotuSize" plain @click="cancelHandle">条码作废</el-button>
</el-col>
<el-col :span="1.5">
<!-- <el-col :span="1.5">
<el-button type="warning" :size="aotuSize" plain>打印机设置</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" :size="aotuSize" plain>清单打印</el-button>
</el-col>
</el-col> -->
<!-- <right-toolbar v-model:showSearch="showSearch" @updateColumns="updateColumns" @queryTable="handleQuery"
:columns="columns"></right-toolbar> -->
</el-row>
@ -396,7 +397,7 @@ const rightColumns = ref([
const rightTableConfig = ref({
// stripe: true, // 斑马纹
border: true, // 边框
height: '78vh', // 高度
height: '75vh', // 高度
highlightCurrentRow: true, // 高亮当前行
})
@ -566,19 +567,20 @@ onMounted(async () => {
queryParams.userid = (route.query.userid as string) ? (route.query.userid as string) : '';
queryParams.yljg = (route.query.yljg as string) ? (route.query.yljg as string) : '1';
// 进入页面单点登录
const result = await userStore.loginAnonymous({ name: 'admin', yljg: queryParams.yljg })
const result = await userStore.loginAnonymous({ name: queryParams.userid, yljg: queryParams.yljg })
if (result) {
getList()
}
// 加载病人来源字典
const dictRefs = await comDict('PT', 'HOS', 'ST');
const dictRefs = await comDict('PT', 'HOS', 'ST', 'DP');
// 从 ref 中获取实际数据
dictData.value = {
PT: toRaw(dictRefs.PT.value) || [],
HOS: toRaw(dictRefs.HOS.value) || [],
ST: toRaw(dictRefs.ST.value) || [],
DP: toRaw(dictRefs.DP.value) || [],
};
});
@ -718,7 +720,15 @@ const printPdf = () => {
<style scoped lang="scss">
.mytable-style {
height: 78vh;
height: 75vh;
}
.tips {
font-family: SourceHanSansCN, SourceHanSansCN;
font-size: 16px;
color: #409eff;
font-weight: 600;
margin-bottom: 5px;
}
.custom-row-class {

View File

@ -1,5 +1,6 @@
<template>
<div class="app-container">
<div class="tips">报告查询打印:{{ formatDict(queryParams.ksdh, 'DP') }}</div>
<div ref="compactForm">
<el-row :gutter="5" class="compact-form" v-show="showSearch">
<el-form :model="queryParams" ref="queryRef" label-width="100px" :rules="queryRules" style="width: 100%;">
@ -76,12 +77,12 @@
<el-col :span="16" class="right-table">
<el-row :gutter="10" class="mb8 mt10">
<el-col :span="1.5">
<el-button type="primary" plain icon="Edit" @click="selectStatusRows">勾选所有未打印</el-button>
<el-button type="primary" plain icon="Edit" :size="aotuSize" @click="selectStatusRows">勾选所有未打印</el-button>
</el-col>
<el-col :span="1.5">
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Upload" @click="printPdf">打印报告</el-button>
<el-button type="primary" plain icon="Upload" :size="aotuSize" @click="printPdf">打印报告</el-button>
</el-col>
<!-- <right-toolbar v-model:showSearch="showSearch" @updateColumns="updateColumns" @queryTable="handleQuery"
@ -111,25 +112,26 @@
<el-col :span="8" class="right-table">
<!-- <div class="title">检验结果</div> -->
<div class="mb8 mt10">
<el-button type="primary" plain @click="openDB">对比历史</el-button>
<el-select class="ml10" placeholder="请选择复制" style="width: 140px" @change="copyData">
<el-button type="primary" :size="aotuSize" plain @click="openDB">对比历史</el-button>
<el-select class="ml10" placeholder="请选择复制" style="width: 140px" @change="copyData" :size="aotuSize">
<el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<!-- <el-button type="primary">知识库</el-button> -->
</div>
<CustomTable :data="rightTableData" :columns="rightColumns" :config="rightTableConfig" @row-click="xmrowHandle"
ref="rightTableRef">
<template #jgbz="{ row }">
{{ formatJgbz(row.jgbz) }}
</template>
</CustomTable>
<div>
<CustomTable :data="rightTableData" :columns="rightColumns" :config="rightTableConfig"
@row-click="xmrowHandle" ref="rightTableRef">
<template #jgbz="{ row }">
{{ formatJgbz(row.jgbz) }}
</template>
</CustomTable>
</div>
<div class="mt10" v-if="bottomTableData.length > 0"></div>
<CustomTable v-if="bottomTableData.length > 0" :data="bottomTableData" :columns="bottomColumns"
:config="bottomTableConfig">
</CustomTable>
<div>
<CustomTable v-if="bottomTableData.length > 0" :data="bottomTableData" :columns="bottomColumns"
:config="bottomTableConfig">
</CustomTable>
</div>
<div v-if="bottomTableData.length > 0" class="expert-comment" :title="expertComment">
专家评语:{{ expertComment }}
</div>
@ -189,7 +191,7 @@ import { usePrintStore } from '@/store/modules/printStore'
import useUserStore from '@/store/modules/user'
import { useRoute } from 'vue-router'
const route = useRoute()
const aotuSize = classCom.useAutoSize();
const userStore = useUserStore()
const compactForm = ref<HTMLElement | null>(null);
const heightForm = ref(90);
@ -532,7 +534,7 @@ const rightTableConfig = ref(
{
// stripe: true, // 斑马纹
border: true, // 边框
height: '71vh', // 高度
height: '68vh', // 高度
highlightCurrentRow: true, // 高亮当前行
cellStyle: rightCellStyleHd
}
@ -555,7 +557,7 @@ const xmRow = ref<any>({})
// 查询抗生素
const xmrowHandle = (row: any) => {
xmRow.value = row
expertComment.value = row.textresult
expertComment.value = row.textresult ?? ''
const data = {
jyrq: Info.value.jyrq,
yq: Info.value.yq,
@ -572,7 +574,7 @@ const xmrowHandle = (row: any) => {
});
} else {
nextTick(() => {
rightTableConfig.value.height = `71vh`
rightTableConfig.value.height = `68vh`
rightTableRef.value?.doLayout && rightTableRef.value.doLayout();
});
}
@ -823,7 +825,7 @@ const bottomTableConfig = ref(
{
// stripe: true, // 斑马纹
border: true, // 边框
height: '40vh', // 高度
height: '37vh', // 高度
highlightCurrentRow: true, // 高亮当前行
cellStyle: botCellStyleHd
}
@ -855,7 +857,7 @@ onMounted(async () => {
queryParams.brdh = (route.query.brdh as string) ? (route.query.brdh as string) : '';
queryParams.yljg = (route.query.yljg as string) ? (route.query.yljg as string) : '1';
// 进入页面单点登录
const result = await userStore.loginAnonymous({ name: 'admin', yljg: queryParams.yljg })
const result = await userStore.loginAnonymous({ name: queryParams.userid, yljg: queryParams.yljg })
if (result) {
getList()
}
@ -870,6 +872,10 @@ onMounted(async () => {
};
});
const formatDict = (v: string, dictType: string) => {
return dictData.value[dictType]?.find((item: any) => item.value == v)?.label || v;
};
// 计算两个日期的天数差(支持带时分秒)
const getDayDiff = (start: string, end: string): number => {
const startTime = new Date(start).getTime();
@ -939,11 +945,23 @@ const getList = () => {
<style scoped lang="scss">
.mytable-style {
height: 71vh;
height: 68vh;
}
.tips {
font-family: SourceHanSansCN, SourceHanSansCN;
font-size: 16px;
color: #409eff;
font-weight: 600;
margin-bottom: 5px;
}
.compact-form {
border-bottom: 1px solid #E1E9F7;
.el-form-item {
margin-bottom: .625rem;
}
}
.title {
@ -958,7 +976,7 @@ const getList = () => {
display: flex;
justify-content: space-around;
align-items: center;
margin-top: .35rem;
margin-top: .625rem;
background-color: #f0f3f8;
padding: .3rem 2.5rem;
}

View File

@ -20,8 +20,13 @@
</div>
<el-row :gutter="10" class="table-row">
<el-col :span="8" class="table-col left-table">
<CustomTable ref="leftTableRef" :data="tableData" :columns="columns"
:config="{ border: true, highlightCurrentRow: true, height: '100%' }"></CustomTable>
<CustomVxeTable ref="leftTableRef" class="mytable-style" :table-data="tableData" :columns="columns"
:row-config="{ isHover: true, keyField: 'batchno' }"
:scrollYConfig="{ enabled: true, rSize: 30, height: '100%', }">
<template #useflag="{ row }">
<el-checkbox :model-value="row.useflag == 1" readonly></el-checkbox>
</template>
</CustomVxeTable>
</el-col>
<el-col :span="16" class="table-col">
<div style="height:59%" class="mb8">
@ -46,50 +51,59 @@
</el-col>
</el-row>
<el-dialog title="批号" v-model="visible" width="30vw" :close-on-click-modal="false" :draggable="true">
<el-dialog title="批号" v-model="visible" width="30vw" :close-on-click-modal="false" :draggable="true"
@close="handleDialogClose">
<el-form :model="formData" ref="queryRef" :rules="rules" label-position="right" label-width="auto">
<el-form-item label="质控批号" prop="zkph">
<el-input v-model="formData.zkph" />
<el-form-item label="仪器" prop="yq">
<span class="mr20"> {{ formData.yq }}</span>
<el-radio-group v-model="formData.useflag">
<el-radio value="1">在用</el-radio>
<el-radio value="0">停用</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="水平" prop="xmdh">
<el-select v-model="formData.ff" placeholder="请选择">
<el-form-item label="质控批号" prop="zkpph">
<el-input v-model="formData.zkpph" />
</el-form-item>
<el-form-item label="水平" prop="zkph">
<el-select v-model="formData.zkph" placeholder="请选择">
<el-option />
</el-select>
</el-form-item>
<el-form-item label="浓度" prop="ff">
<el-select v-model="formData.ff" placeholder="请选择">
<el-form-item label="浓度" prop="conc">
<el-select v-model="formData.conc" placeholder="请选择">
<el-option />
</el-select>
</el-form-item>
<el-form-item label="批号(瓶子上的)" prop="ff">
<el-input v-model="formData.zkph" />
<el-form-item label="批号(瓶子上的)" prop="batchno">
<el-input v-model="formData.batchno" />
</el-form-item>
<el-form-item label="有效期" prop="ff">
<el-date-picker v-model="formData.jyrq" type="date" value-format="YYYY-MM-DD" />
<el-form-item label="有效期" prop="expiredt">
<el-date-picker v-model="formData.expiredt" type="date" value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item label="启用日期" prop="ff">
<el-date-picker v-model="formData.jyrq" type="date" value-format="YYYY-MM-DD" />
<el-form-item label="启用日期" prop="ksrq">
<el-date-picker v-model="formData.ksrq" type="date" value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item label="结束日期" prop="ff">
<el-date-picker v-model="formData.jyrq" type="date" value-format="YYYY-MM-DD" />
<el-form-item label="结束日期" prop="endda">
<el-date-picker v-model="formData.endda" type="date" value-format="YYYY-MM-DD" />
</el-form-item>
<el-form-item label="质控厂商" prop="ff">
<el-select v-model="formData.ff" placeholder="请选择">
<el-form-item label="质控厂商" prop="qcsrc">
<el-select v-model="formData.qcsrc" placeholder="请选择">
<el-option />
</el-select>
</el-form-item>
<el-form-item label="校准品厂商" prop="ff">
<el-select v-model="formData.ff" placeholder="请选择">
<el-form-item label="校准品厂商" prop="standsrc">
<el-select v-model="formData.standsrc" placeholder="请选择">
<el-option />
</el-select>
</el-form-item>
<el-form-item label="备注" prop="bz">
<el-input v-model="formData.bz" type="textarea" :row="5" />
<el-form-item label="备注" prop="bk">
<el-input v-model="formData.bk" type="textarea" :row="5" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="visible = false">取消</el-button>
<el-button type="primary">确定</el-button>
<el-button type="primary" @click="submit">确定</el-button>
</template>
</el-dialog>
@ -97,37 +111,56 @@
</template>
<script setup lang="ts">
import { queryOldxminfo } from '@/api/liswork/xtwh/xmReqItemVsApi'
import { queryDataFromSample, queryQcSample, } from '@/api/liswork/qualityControl'
import { queryBatch, queryQcSample, queryBatchXm } from '@/api/liswork/qualityControl'
import { templateRef } from '@vueuse/core'
const yq = defineModel<string>()
const visible = ref(false)
const selectedRow = ref()
const formData = ref({})
const rules = ref([])
const queryRef = templateRef('queryRef')
const formData = ref({
yq: yq,
zkpph: '',
zkph: '',
conc: '',
useflag: '1',
batchno: '',
expiredt: '',
ksrq: '',
endda: '',
qcsrc: '',
standsrc: '',
bk: ''
})
const rules = ref({
zkpph: [{ required: true, message: '请输入质控批号', trigger: 'blur' }],
zkph: [{ required: true, message: '请选择水平', trigger: 'change' }],
ksrq: [{ required: true, message: '请选择启用日期', trigger: 'change' }],
})
const tableData = ref([])
const columns = ref([
{ label: '质控批号', prop: 'zkpph', visible: true, align: 'center' },
{ label: '水平', prop: 'zkpph', visible: true, align: 'center' },
{ label: '浓度', prop: 'ld', visible: true, align: 'center' },
{ label: '在用', prop: 'zkbz', visible: true, align: 'center' },
{ label: '启用日期', prop: 'ksrq', visible: true, align: 'center' },
{ label: '停用日期', prop: 'endrq', visible: true, align: 'center' },
{ label: '批号(瓶子上的)', prop: 'zkph', visible: true, align: 'center', width: 100 },
{ label: '有效期', prop: 'endrq', visible: true, align: 'center' },
{ label: '质控来源', prop: 'cv', visible: true, align: 'center' },
{ label: '校准品厂商', prop: 'standsrc', visible: true, align: 'center' },
{ label: '备注', prop: 'qccv', visible: true, align: 'center' },
{ title: '质控批号', field: 'zkpph', width: 80, resizable: true, align: 'center' },
{ title: '水平', field: 'zkph', resizable: true, align: 'center' },
{ title: '浓度', field: 'conc', resizable: true, align: 'center' },
{ title: '在用', field: 'useflag', resizable: true, align: 'center', slotName: 'useflag' },
{ title: '启用日期', field: 'ksrq', width: 90, resizable: true, align: 'center' },
{ title: '停用日期', field: 'endda', width: 90, resizable: true, align: 'center' },
{ title: '批号(瓶子上的)', field: 'batchno', resizable: true, align: 'center', width: 100 },
{ title: '有效期', field: 'expiredt', width: 90, resizable: true, align: 'center' },
{ title: '质控来源', field: 'qcsrc', width: 80, resizable: true, align: 'center' },
{ title: '校准品厂商', field: 'standsrc', width: 80, resizable: true, align: 'center' },
{ title: '备注', field: 'bk', resizable: true, align: 'center', width: 100 },
{ title: '仪器', field: 'yq', resizable: true, align: 'center', },
])
const topTableData = ref([])
const topColumns = [
{ label: '项目代号', prop: 'xmdh', visible: true, slot: 'xmdh', width: 150 },
{ label: '靶值', prop: 'zkbz', visible: true, align: 'center', },
{ label: 'Sd', prop: 'qcusepos', visible: true, align: 'center', },
{ label: 'Sd', prop: 'sd', visible: true, align: 'center', },
{ label: 'Cv', prop: 'cv', visible: true, align: 'center', },
{ label: '开始日期', prop: 'ksrq', visible: true, align: 'center', },
{ label: '结束日期', prop: 'endrq', visible: true, align: 'center', },
{ label: '结束日期', prop: 'stopdate', visible: true, align: 'center', },
{ label: '波长', prop: 'bc', visible: true, align: 'center', },
{ label: '方法', prop: 'ff', visible: true, align: 'center', },
{ label: '试剂', prop: 'sjph', visible: true, align: 'center', },
@ -137,10 +170,10 @@ const bottomTableData = ref([])
const bottomColumns = ref([
{ label: '项目代号', prop: 'xmdh', visible: true, slot: 'xmdh', width: 150 },
{ label: '靶值', prop: 'zkbz', visible: true, align: 'center', },
{ label: 'Sd', prop: 'qcusepos', visible: true, align: 'center', },
{ label: 'Sd', prop: 'sd', visible: true, align: 'center', },
{ label: 'Cv', prop: 'cv', visible: true, align: 'center', },
{ label: '开始日期', prop: 'ksrq', visible: true, align: 'center', },
{ label: '结束日期', prop: 'endrq', visible: true, align: 'center', },
{ label: '结束日期', prop: 'stopdate', visible: true, align: 'center', },
{ label: '波长', prop: 'bc', visible: true, align: 'center', },
{ label: '方法', prop: 'ff', visible: true, align: 'center', },
{ label: '试剂', prop: 'sjph', visible: true, align: 'center', },
@ -166,9 +199,37 @@ const addHandle = () => {
visible.value = true
}
const submit = () => {
queryRef.value.validate((valid: boolean) => {
if (!valid) return false;
})
}
const handleDialogClose = () => {
queryRef.value.resetFields()
formData.value = {
yq: yq,
zkpph: '',
zkph: '',
conc: '',
useflag: '1',
batchno: '',
expiredt: '',
ksrq: '',
endda: '',
qcsrc: '',
standsrc: '',
bk: ''
}
}
const getBatchList = () => {
queryBatch({ yq: yq.value, pageNum: 1, pageSize: 9999 }).then((res: any) => {
tableData.value = res.rows || []
})
}
const getXmList = () => {
queryOldxminfo({ yq: yq.value, }).then((res: any) => {
queryBatchXm({ yq: yq.value, }).then((res: any) => {
topTableData.value = res.data
rowClick(topTableData.value[0])
})
@ -178,6 +239,7 @@ const handleSave = () => { }
watch(yq, (val) => {
if (val) {
getBatchList()
getXmList()
}
}, { immediate: true })

View File

@ -0,0 +1,142 @@
/**
* @file index.vue 质控结果手工录入
* @author: w
* @since: 2026-01-05
*/
<template>
<div class="app-container">
<div class="handle-box mb5">
<el-button type="primary" plain icon="Check" @click="handleSave">保存</el-button>
</div>
<div class="handle-box mb5">
<el-date-picker v-model="jyrq" type="date" value-format="YYYY-MM-DD" />
<span class="tips ml10">颜色说明:</span> <span class="color-red">大于3SD</span> <span class="color-pink">大于2SD</span>
</div>
<el-tabs v-model="activeName" type="card" class="tabs_box">
<el-tab-pane v-for="tab in tabList" :key="tab.key" :label="tab.label" :name="tab.key" />
</el-tabs>
<div class="table-box">
<CustomVxeTable class="mytable-style" ref="tableRef" :table-data="tableData" :columns="columns"
:scrollYConfig="{ enabled: true, rSize: 30, height: '100%', }" :cell-style="cellStyleHd">
<template #xmdh="{ row }">
{{ row.xmdh }} {{ row.xmmc }}
</template>
<template #cs1="{ row }">
<el-input v-model="row.cs1" class="full-width-input" />
</template>
<template #cs2="{ row }">
<el-input v-model="row.cs2" class="full-width-input" />
</template>
<template #cs3="{ row }">
<el-input v-model="row.cs3" class="full-width-input" />
</template>
<template #cs4="{ row }">
<el-input v-model="row.cs4" class="full-width-input" />
</template>
<template #cs5="{ row }">
<el-input v-model="row.cs5" class="full-width-input" />
</template>
<template #cs6="{ row }">
<el-input v-model="row.cs6" class="full-width-input" />
</template>
<template #cs7="{ row }">
<el-input v-model="row.cs7" class="full-width-input" />
</template>
</CustomVxeTable>
</div>
</div>
</template>
<script setup lang="ts">
import { queryOldxminfo } from '@/api/liswork/xtwh/xmReqItemVsApi'
import dayjs from 'dayjs'
const yq = defineModel<string>()
const activeName = ref('1')
const jyrq = ref(dayjs().format('YYYY-MM-DD'))
const tabList = [
{ key: '1', label: '质控1' },
{ key: '2', label: '质控2' }
]
const tableData = ref([])
const columns = ref([
{ field: 'xmdh', title: '质控项目', resizable: true, slotName: 'xmdh', width: 200 },
{ field: 'cs1', title: '次数1', resizable: true, slotName: 'cs1' },
{ field: 'cs2', title: '次数2', resizable: true, slotName: 'cs2' },
{ field: 'cs3', title: '次数3', resizable: true, slotName: 'cs3' },
{ field: 'cs4', title: '次数4', resizable: true, slotName: 'cs4' },
{ field: 'cs5', title: '次数5', resizable: true, slotName: 'cs5' },
{ field: 'cs6', title: '次数6', resizable: true, slotName: 'cs6' },
{ field: 'cs7', title: '次数7', resizable: true, slotName: 'cs7' },
{ field: 'zkbz', title: '靶数', resizable: true, align: 'center' },
{ field: 'qcusepos', title: 'SD', resizable: true, align: 'center' },
])
const cellStyleHd = ({ row, column }: {
row: any;
column: any;
}) => {
const styleRules: any = {
columnMap: { cs1: 'cs1', cs2: 'cs2', cs3: 'cs3', cs4: 'cs4', cs5: 'cs5', cs6: 'cs6', cs7: 'cs7' },
colorRules: [
{ min: 3, color: '#f00 !important' }, // 大于3:红色
{ min: 2, max: 3, color: '#ffc0c0 !important' } // 2~3:粉色
]
}
const targetField = styleRules.columnMap[column.title];
if (!targetField || row.qcusepos === 0) return {};
const deviation = Math.abs(row.zkbz - row[targetField]) / row.qcusepos;
for (const rule of styleRules.colorRules) {
if (deviation > rule.min && (!rule.max || deviation < rule.max)) {
return { background: rule.color };
}
}
return {};
}
const getXmList = () => {
queryOldxminfo({ yq: yq.value, }).then((res: any) => {
tableData.value = res.data
})
}
const handleSave = () => { }
watch(yq, (val) => {
if (val) {
getXmList()
}
}, { immediate: true })
</script>
<style scoped lang="scss">
.table-box {
margin-top: 5px;
height: calc(100% - 175px);
}
.tips {
font-family: SourceHanSansCN, SourceHanSansCN;
font-size: 16px;
color: #409eff;
font-weight: 600;
}
.color-red {
background-color: #f00;
color: #fff;
padding: 2px;
}
.color-pink {
background-color: #ffc0c0;
color: #fff;
padding: 2px;
}
</style>

View File

@ -57,6 +57,8 @@ import SetProject from './components/setProject/index.vue';
import SetParams from './components/setParams/index.vue';
import SetBatch from './components/setBatch/index.vue';
import SetSample from './components/setSample/index.vue';
import SetEnterResult from './components/setEnterResult/index.vue';
const mbStore = useCommonStore();
// ========== TypeScript 类型定义 ==========
@ -115,6 +117,7 @@ const tabList = [
{ key: 'SetParams', label: '质控品参数设置', component: SetParams },
{ key: 'SetSample', label: '质控品样本号对应', component: SetSample },
{ key: 'SetBatch', label: '质控品批号管理', component: SetBatch },
{ key: 'SetEnterResult', label: '质控结果手工录入', component: SetEnterResult },
]
const activeName = ref('SetBatch')