质控批号
This commit is contained in:
parent
e6c48e426a
commit
94538e5e2f
@ -57,3 +57,19 @@ export function deleteQcSample(data?: Object) {
|
|||||||
params: data
|
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
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
@ -364,3 +364,8 @@ aside {
|
|||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.el-tree-node__children {
|
||||||
|
padding-left: 15px !important;
|
||||||
|
}
|
||||||
@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container ">
|
<div class="app-container ">
|
||||||
|
<div class="tips">检验科条码打印科室:{{ formatDict(queryParams.ksdh, 'DP') }}</div>
|
||||||
<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" :size="aotuSize" :rules="queryRules">
|
<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-button type="danger" :size="aotuSize" 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" :size="aotuSize" plain @click="printPdf">打印</el-button>
|
<el-button type="success" :size="aotuSize" plain @click="printPdf">打印条码</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button type="info" :size="aotuSize" plain icon="Upload" @click="openBlock('采样登记')">采样登记</el-button>
|
<el-button type="info" :size="aotuSize" plain icon="Upload" @click="openBlock('采样登记')">采样登记</el-button>
|
||||||
@ -61,12 +62,12 @@
|
|||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button type="warning" :size="aotuSize" plain @click="cancelHandle">条码作废</el-button>
|
<el-button type="warning" :size="aotuSize" plain @click="cancelHandle">条码作废</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="1.5">
|
<!-- <el-col :span="1.5">
|
||||||
<el-button type="warning" :size="aotuSize" plain>打印机设置</el-button>
|
<el-button type="warning" :size="aotuSize" plain>打印机设置</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button type="warning" :size="aotuSize" plain>清单打印</el-button>
|
<el-button type="warning" :size="aotuSize" plain>清单打印</el-button>
|
||||||
</el-col>
|
</el-col> -->
|
||||||
<!-- <right-toolbar v-model:showSearch="showSearch" @updateColumns="updateColumns" @queryTable="handleQuery"
|
<!-- <right-toolbar v-model:showSearch="showSearch" @updateColumns="updateColumns" @queryTable="handleQuery"
|
||||||
:columns="columns"></right-toolbar> -->
|
:columns="columns"></right-toolbar> -->
|
||||||
</el-row>
|
</el-row>
|
||||||
@ -396,7 +397,7 @@ const rightColumns = ref([
|
|||||||
const rightTableConfig = ref({
|
const rightTableConfig = ref({
|
||||||
// stripe: true, // 斑马纹
|
// stripe: true, // 斑马纹
|
||||||
border: true, // 边框
|
border: true, // 边框
|
||||||
height: '78vh', // 高度
|
height: '75vh', // 高度
|
||||||
highlightCurrentRow: true, // 高亮当前行
|
highlightCurrentRow: true, // 高亮当前行
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -566,19 +567,20 @@ onMounted(async () => {
|
|||||||
queryParams.userid = (route.query.userid as string) ? (route.query.userid as string) : '';
|
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';
|
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) {
|
if (result) {
|
||||||
getList()
|
getList()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 加载病人来源字典
|
// 加载病人来源字典
|
||||||
const dictRefs = await comDict('PT', 'HOS', 'ST');
|
const dictRefs = await comDict('PT', 'HOS', 'ST', 'DP');
|
||||||
|
|
||||||
// 从 ref 中获取实际数据
|
// 从 ref 中获取实际数据
|
||||||
dictData.value = {
|
dictData.value = {
|
||||||
PT: toRaw(dictRefs.PT.value) || [],
|
PT: toRaw(dictRefs.PT.value) || [],
|
||||||
HOS: toRaw(dictRefs.HOS.value) || [],
|
HOS: toRaw(dictRefs.HOS.value) || [],
|
||||||
ST: toRaw(dictRefs.ST.value) || [],
|
ST: toRaw(dictRefs.ST.value) || [],
|
||||||
|
DP: toRaw(dictRefs.DP.value) || [],
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -718,7 +720,15 @@ const printPdf = () => {
|
|||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.mytable-style {
|
.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 {
|
.custom-row-class {
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
|
<div class="tips">报告查询打印:{{ formatDict(queryParams.ksdh, 'DP') }}</div>
|
||||||
<div ref="compactForm">
|
<div ref="compactForm">
|
||||||
<el-row :gutter="5" class="compact-form" v-show="showSearch">
|
<el-row :gutter="5" class="compact-form" v-show="showSearch">
|
||||||
<el-form :model="queryParams" ref="queryRef" label-width="100px" :rules="queryRules" style="width: 100%;">
|
<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-col :span="16" class="right-table">
|
||||||
<el-row :gutter="10" class="mb8 mt10">
|
<el-row :gutter="10" class="mb8 mt10">
|
||||||
<el-col :span="1.5">
|
<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>
|
||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="1.5">
|
<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>
|
</el-col>
|
||||||
|
|
||||||
<!-- <right-toolbar v-model:showSearch="showSearch" @updateColumns="updateColumns" @queryTable="handleQuery"
|
<!-- <right-toolbar v-model:showSearch="showSearch" @updateColumns="updateColumns" @queryTable="handleQuery"
|
||||||
@ -111,25 +112,26 @@
|
|||||||
<el-col :span="8" class="right-table">
|
<el-col :span="8" class="right-table">
|
||||||
<!-- <div class="title">检验结果</div> -->
|
<!-- <div class="title">检验结果</div> -->
|
||||||
<div class="mb8 mt10">
|
<div class="mb8 mt10">
|
||||||
<el-button type="primary" plain @click="openDB">对比历史</el-button>
|
<el-button type="primary" :size="aotuSize" plain @click="openDB">对比历史</el-button>
|
||||||
<el-select class="ml10" placeholder="请选择复制" style="width: 140px" @change="copyData">
|
<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-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
|
||||||
</el-select>
|
</el-select>
|
||||||
<!-- <el-button type="primary">知识库</el-button> -->
|
<!-- <el-button type="primary">知识库</el-button> -->
|
||||||
</div>
|
</div>
|
||||||
|
<div>
|
||||||
<CustomTable :data="rightTableData" :columns="rightColumns" :config="rightTableConfig" @row-click="xmrowHandle"
|
<CustomTable :data="rightTableData" :columns="rightColumns" :config="rightTableConfig"
|
||||||
ref="rightTableRef">
|
@row-click="xmrowHandle" ref="rightTableRef">
|
||||||
<template #jgbz="{ row }">
|
<template #jgbz="{ row }">
|
||||||
{{ formatJgbz(row.jgbz) }}
|
{{ formatJgbz(row.jgbz) }}
|
||||||
</template>
|
</template>
|
||||||
</CustomTable>
|
</CustomTable>
|
||||||
|
</div>
|
||||||
<div class="mt10" v-if="bottomTableData.length > 0"></div>
|
<div class="mt10" v-if="bottomTableData.length > 0"></div>
|
||||||
<CustomTable v-if="bottomTableData.length > 0" :data="bottomTableData" :columns="bottomColumns"
|
<div>
|
||||||
:config="bottomTableConfig">
|
<CustomTable v-if="bottomTableData.length > 0" :data="bottomTableData" :columns="bottomColumns"
|
||||||
</CustomTable>
|
:config="bottomTableConfig">
|
||||||
|
</CustomTable>
|
||||||
|
</div>
|
||||||
<div v-if="bottomTableData.length > 0" class="expert-comment" :title="expertComment">
|
<div v-if="bottomTableData.length > 0" class="expert-comment" :title="expertComment">
|
||||||
专家评语:{{ expertComment }}
|
专家评语:{{ expertComment }}
|
||||||
</div>
|
</div>
|
||||||
@ -189,7 +191,7 @@ import { usePrintStore } from '@/store/modules/printStore'
|
|||||||
import useUserStore from '@/store/modules/user'
|
import useUserStore from '@/store/modules/user'
|
||||||
import { useRoute } from 'vue-router'
|
import { useRoute } from 'vue-router'
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
|
const aotuSize = classCom.useAutoSize();
|
||||||
const userStore = useUserStore()
|
const userStore = useUserStore()
|
||||||
const compactForm = ref<HTMLElement | null>(null);
|
const compactForm = ref<HTMLElement | null>(null);
|
||||||
const heightForm = ref(90);
|
const heightForm = ref(90);
|
||||||
@ -532,7 +534,7 @@ const rightTableConfig = ref(
|
|||||||
{
|
{
|
||||||
// stripe: true, // 斑马纹
|
// stripe: true, // 斑马纹
|
||||||
border: true, // 边框
|
border: true, // 边框
|
||||||
height: '71vh', // 高度
|
height: '68vh', // 高度
|
||||||
highlightCurrentRow: true, // 高亮当前行
|
highlightCurrentRow: true, // 高亮当前行
|
||||||
cellStyle: rightCellStyleHd
|
cellStyle: rightCellStyleHd
|
||||||
}
|
}
|
||||||
@ -555,7 +557,7 @@ const xmRow = ref<any>({})
|
|||||||
// 查询抗生素
|
// 查询抗生素
|
||||||
const xmrowHandle = (row: any) => {
|
const xmrowHandle = (row: any) => {
|
||||||
xmRow.value = row
|
xmRow.value = row
|
||||||
expertComment.value = row.textresult
|
expertComment.value = row.textresult ?? ''
|
||||||
const data = {
|
const data = {
|
||||||
jyrq: Info.value.jyrq,
|
jyrq: Info.value.jyrq,
|
||||||
yq: Info.value.yq,
|
yq: Info.value.yq,
|
||||||
@ -572,7 +574,7 @@ const xmrowHandle = (row: any) => {
|
|||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
rightTableConfig.value.height = `71vh`
|
rightTableConfig.value.height = `68vh`
|
||||||
rightTableRef.value?.doLayout && rightTableRef.value.doLayout();
|
rightTableRef.value?.doLayout && rightTableRef.value.doLayout();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -823,7 +825,7 @@ const bottomTableConfig = ref(
|
|||||||
{
|
{
|
||||||
// stripe: true, // 斑马纹
|
// stripe: true, // 斑马纹
|
||||||
border: true, // 边框
|
border: true, // 边框
|
||||||
height: '40vh', // 高度
|
height: '37vh', // 高度
|
||||||
highlightCurrentRow: true, // 高亮当前行
|
highlightCurrentRow: true, // 高亮当前行
|
||||||
cellStyle: botCellStyleHd
|
cellStyle: botCellStyleHd
|
||||||
}
|
}
|
||||||
@ -855,7 +857,7 @@ onMounted(async () => {
|
|||||||
queryParams.brdh = (route.query.brdh as string) ? (route.query.brdh as string) : '';
|
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';
|
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) {
|
if (result) {
|
||||||
getList()
|
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 getDayDiff = (start: string, end: string): number => {
|
||||||
const startTime = new Date(start).getTime();
|
const startTime = new Date(start).getTime();
|
||||||
@ -939,11 +945,23 @@ const getList = () => {
|
|||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
.mytable-style {
|
.mytable-style {
|
||||||
height: 71vh;
|
height: 68vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tips {
|
||||||
|
font-family: SourceHanSansCN, SourceHanSansCN;
|
||||||
|
font-size: 16px;
|
||||||
|
color: #409eff;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.compact-form {
|
.compact-form {
|
||||||
border-bottom: 1px solid #E1E9F7;
|
border-bottom: 1px solid #E1E9F7;
|
||||||
|
|
||||||
|
.el-form-item {
|
||||||
|
margin-bottom: .625rem;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.title {
|
.title {
|
||||||
@ -958,7 +976,7 @@ const getList = () => {
|
|||||||
display: flex;
|
display: flex;
|
||||||
justify-content: space-around;
|
justify-content: space-around;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin-top: .35rem;
|
margin-top: .625rem;
|
||||||
background-color: #f0f3f8;
|
background-color: #f0f3f8;
|
||||||
padding: .3rem 2.5rem;
|
padding: .3rem 2.5rem;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -20,8 +20,13 @@
|
|||||||
</div>
|
</div>
|
||||||
<el-row :gutter="10" class="table-row">
|
<el-row :gutter="10" class="table-row">
|
||||||
<el-col :span="8" class="table-col left-table">
|
<el-col :span="8" class="table-col left-table">
|
||||||
<CustomTable ref="leftTableRef" :data="tableData" :columns="columns"
|
<CustomVxeTable ref="leftTableRef" class="mytable-style" :table-data="tableData" :columns="columns"
|
||||||
:config="{ border: true, highlightCurrentRow: true, height: '100%' }"></CustomTable>
|
: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>
|
||||||
<el-col :span="16" class="table-col">
|
<el-col :span="16" class="table-col">
|
||||||
<div style="height:59%" class="mb8">
|
<div style="height:59%" class="mb8">
|
||||||
@ -46,50 +51,59 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</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 :model="formData" ref="queryRef" :rules="rules" label-position="right" label-width="auto">
|
||||||
<el-form-item label="质控批号" prop="zkph">
|
<el-form-item label="仪器" prop="yq">
|
||||||
<el-input v-model="formData.zkph" />
|
<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>
|
||||||
<el-form-item label="水平" prop="xmdh">
|
<el-form-item label="质控批号" prop="zkpph">
|
||||||
<el-select v-model="formData.ff" placeholder="请选择">
|
<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-option />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="浓度" prop="ff">
|
<el-form-item label="浓度" prop="conc">
|
||||||
<el-select v-model="formData.ff" placeholder="请选择">
|
<el-select v-model="formData.conc" placeholder="请选择">
|
||||||
<el-option />
|
<el-option />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="批号(瓶子上的)" prop="ff">
|
<el-form-item label="批号(瓶子上的)" prop="batchno">
|
||||||
<el-input v-model="formData.zkph" />
|
<el-input v-model="formData.batchno" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="有效期" prop="ff">
|
<el-form-item label="有效期" prop="expiredt">
|
||||||
<el-date-picker v-model="formData.jyrq" type="date" value-format="YYYY-MM-DD" />
|
<el-date-picker v-model="formData.expiredt" type="date" value-format="YYYY-MM-DD" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="启用日期" prop="ff">
|
<el-form-item label="启用日期" prop="ksrq">
|
||||||
<el-date-picker v-model="formData.jyrq" type="date" value-format="YYYY-MM-DD" />
|
<el-date-picker v-model="formData.ksrq" type="date" value-format="YYYY-MM-DD" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="结束日期" prop="ff">
|
<el-form-item label="结束日期" prop="endda">
|
||||||
<el-date-picker v-model="formData.jyrq" type="date" value-format="YYYY-MM-DD" />
|
<el-date-picker v-model="formData.endda" type="date" value-format="YYYY-MM-DD" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="质控厂商" prop="ff">
|
<el-form-item label="质控厂商" prop="qcsrc">
|
||||||
<el-select v-model="formData.ff" placeholder="请选择">
|
<el-select v-model="formData.qcsrc" placeholder="请选择">
|
||||||
<el-option />
|
<el-option />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="校准品厂商" prop="ff">
|
<el-form-item label="校准品厂商" prop="standsrc">
|
||||||
<el-select v-model="formData.ff" placeholder="请选择">
|
<el-select v-model="formData.standsrc" placeholder="请选择">
|
||||||
<el-option />
|
<el-option />
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="备注" prop="bz">
|
<el-form-item label="备注" prop="bk">
|
||||||
<el-input v-model="formData.bz" type="textarea" :row="5" />
|
<el-input v-model="formData.bk" type="textarea" :row="5" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<el-button @click="visible = false">取消</el-button>
|
<el-button @click="visible = false">取消</el-button>
|
||||||
<el-button type="primary">确定</el-button>
|
<el-button type="primary" @click="submit">确定</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
@ -97,37 +111,56 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { queryOldxminfo } from '@/api/liswork/xtwh/xmReqItemVsApi'
|
import { queryBatch, queryQcSample, queryBatchXm } from '@/api/liswork/qualityControl'
|
||||||
import { queryDataFromSample, queryQcSample, } from '@/api/liswork/qualityControl'
|
import { templateRef } from '@vueuse/core'
|
||||||
|
|
||||||
|
|
||||||
const yq = defineModel<string>()
|
const yq = defineModel<string>()
|
||||||
const visible = ref(false)
|
const visible = ref(false)
|
||||||
const selectedRow = ref()
|
const selectedRow = ref()
|
||||||
const formData = ref({})
|
const queryRef = templateRef('queryRef')
|
||||||
const rules = ref([])
|
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 tableData = ref([])
|
||||||
const columns = ref([
|
const columns = ref([
|
||||||
{ label: '质控批号', prop: 'zkpph', visible: true, align: 'center' },
|
{ title: '质控批号', field: 'zkpph', width: 80, resizable: true, align: 'center' },
|
||||||
{ label: '水平', prop: 'zkpph', visible: true, align: 'center' },
|
{ title: '水平', field: 'zkph', resizable: true, align: 'center' },
|
||||||
{ label: '浓度', prop: 'ld', visible: true, align: 'center' },
|
{ title: '浓度', field: 'conc', resizable: true, align: 'center' },
|
||||||
{ label: '在用', prop: 'zkbz', visible: true, align: 'center' },
|
{ title: '在用', field: 'useflag', resizable: true, align: 'center', slotName: 'useflag' },
|
||||||
{ label: '启用日期', prop: 'ksrq', visible: true, align: 'center' },
|
{ title: '启用日期', field: 'ksrq', width: 90, resizable: true, align: 'center' },
|
||||||
{ label: '停用日期', prop: 'endrq', visible: true, align: 'center' },
|
{ title: '停用日期', field: 'endda', width: 90, resizable: true, align: 'center' },
|
||||||
{ label: '批号(瓶子上的)', prop: 'zkph', visible: true, align: 'center', width: 100 },
|
{ title: '批号(瓶子上的)', field: 'batchno', resizable: true, align: 'center', width: 100 },
|
||||||
{ label: '有效期', prop: 'endrq', visible: true, align: 'center' },
|
{ title: '有效期', field: 'expiredt', width: 90, resizable: true, align: 'center' },
|
||||||
{ label: '质控来源', prop: 'cv', visible: true, align: 'center' },
|
{ title: '质控来源', field: 'qcsrc', width: 80, resizable: true, align: 'center' },
|
||||||
{ label: '校准品厂商', prop: 'standsrc', visible: true, align: 'center' },
|
{ title: '校准品厂商', field: 'standsrc', width: 80, resizable: true, align: 'center' },
|
||||||
{ label: '备注', prop: 'qccv', visible: true, align: 'center' },
|
{ title: '备注', field: 'bk', resizable: true, align: 'center', width: 100 },
|
||||||
|
{ title: '仪器', field: 'yq', resizable: true, align: 'center', },
|
||||||
])
|
])
|
||||||
const topTableData = ref([])
|
const topTableData = ref([])
|
||||||
const topColumns = [
|
const topColumns = [
|
||||||
{ label: '项目代号', prop: 'xmdh', visible: true, slot: 'xmdh', width: 150 },
|
{ label: '项目代号', prop: 'xmdh', visible: true, slot: 'xmdh', width: 150 },
|
||||||
{ label: '靶值', prop: 'zkbz', visible: true, align: 'center', },
|
{ 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: 'Cv', prop: 'cv', visible: true, align: 'center', },
|
||||||
{ label: '开始日期', prop: 'ksrq', 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: 'bc', visible: true, align: 'center', },
|
||||||
{ label: '方法', prop: 'ff', visible: true, align: 'center', },
|
{ label: '方法', prop: 'ff', visible: true, align: 'center', },
|
||||||
{ label: '试剂', prop: 'sjph', visible: true, align: 'center', },
|
{ label: '试剂', prop: 'sjph', visible: true, align: 'center', },
|
||||||
@ -137,10 +170,10 @@ const bottomTableData = ref([])
|
|||||||
const bottomColumns = ref([
|
const bottomColumns = ref([
|
||||||
{ label: '项目代号', prop: 'xmdh', visible: true, slot: 'xmdh', width: 150 },
|
{ label: '项目代号', prop: 'xmdh', visible: true, slot: 'xmdh', width: 150 },
|
||||||
{ label: '靶值', prop: 'zkbz', visible: true, align: 'center', },
|
{ 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: 'Cv', prop: 'cv', visible: true, align: 'center', },
|
||||||
{ label: '开始日期', prop: 'ksrq', 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: 'bc', visible: true, align: 'center', },
|
||||||
{ label: '方法', prop: 'ff', visible: true, align: 'center', },
|
{ label: '方法', prop: 'ff', visible: true, align: 'center', },
|
||||||
{ label: '试剂', prop: 'sjph', visible: true, align: 'center', },
|
{ label: '试剂', prop: 'sjph', visible: true, align: 'center', },
|
||||||
@ -166,9 +199,37 @@ const addHandle = () => {
|
|||||||
visible.value = true
|
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 = () => {
|
const getXmList = () => {
|
||||||
queryOldxminfo({ yq: yq.value, }).then((res: any) => {
|
queryBatchXm({ yq: yq.value, }).then((res: any) => {
|
||||||
topTableData.value = res.data
|
topTableData.value = res.data
|
||||||
rowClick(topTableData.value[0])
|
rowClick(topTableData.value[0])
|
||||||
})
|
})
|
||||||
@ -178,6 +239,7 @@ const handleSave = () => { }
|
|||||||
|
|
||||||
watch(yq, (val) => {
|
watch(yq, (val) => {
|
||||||
if (val) {
|
if (val) {
|
||||||
|
getBatchList()
|
||||||
getXmList()
|
getXmList()
|
||||||
}
|
}
|
||||||
}, { immediate: true })
|
}, { immediate: true })
|
||||||
|
|||||||
@ -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>
|
||||||
@ -57,6 +57,8 @@ import SetProject from './components/setProject/index.vue';
|
|||||||
import SetParams from './components/setParams/index.vue';
|
import SetParams from './components/setParams/index.vue';
|
||||||
import SetBatch from './components/setBatch/index.vue';
|
import SetBatch from './components/setBatch/index.vue';
|
||||||
import SetSample from './components/setSample/index.vue';
|
import SetSample from './components/setSample/index.vue';
|
||||||
|
import SetEnterResult from './components/setEnterResult/index.vue';
|
||||||
|
|
||||||
|
|
||||||
const mbStore = useCommonStore();
|
const mbStore = useCommonStore();
|
||||||
// ========== TypeScript 类型定义 ==========
|
// ========== TypeScript 类型定义 ==========
|
||||||
@ -115,6 +117,7 @@ const tabList = [
|
|||||||
{ key: 'SetParams', label: '质控品参数设置', component: SetParams },
|
{ key: 'SetParams', label: '质控品参数设置', component: SetParams },
|
||||||
{ key: 'SetSample', label: '质控品样本号对应', component: SetSample },
|
{ key: 'SetSample', label: '质控品样本号对应', component: SetSample },
|
||||||
{ key: 'SetBatch', label: '质控品批号管理', component: SetBatch },
|
{ key: 'SetBatch', label: '质控品批号管理', component: SetBatch },
|
||||||
|
{ key: 'SetEnterResult', label: '质控结果手工录入', component: SetEnterResult },
|
||||||
]
|
]
|
||||||
const activeName = ref('SetBatch')
|
const activeName = ref('SetBatch')
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user