培养基

This commit is contained in:
wyuu 2025-11-28 18:01:14 +08:00
parent 04c2ffe8de
commit 8a03e58f04
8 changed files with 201 additions and 31 deletions

View File

@ -132,6 +132,46 @@ export function getmediumList(data?: Object) {
params: data
})
}
//获取培养基字典
export function getbactmediumList(data?: Object) {
return request({
url: '/lisworkgerm/getbactmedium',
method: 'get',
params: data
})
}
//新增培养基
export function insertmedium(data?: Object) {
return request({
url: '/lisworkgerm/insertmedium',
method: 'post',
data
})
}
//修改培养基
export function updatemedium(data?: Object) {
return request({
url: '/lisworkgerm/updatemedium',
method: 'post',
data
})
}
//删除培养基
export function deletemedium(data?: Object) {
return request({
url: '/lisworkgerm/deletemedium',
method: 'delete',
params: data
})
}
//删除培养基 Array
export function deletemediums(data?: Object) {
return request({
url: '/lisworkgerm/deletemedium',
method: 'delete',
data
})
}
//微生物报告审核
export function cbebCheck(data?: Object) {
return request({

View File

@ -426,6 +426,7 @@
box-shadow: none;
background: transparent !important;
padding: 0 !important;
padding-left: .3125rem !important;
outline: none;
&:hover {

View File

View File

@ -113,7 +113,7 @@ const visibleChange = (val: any) => {
currentIndex.value = filterData.value.findIndex(item => item[props.value!] === props.data);
if (currentIndex.value >= 0) {
tableRef.value.setCurrentRow(filterData.value[currentIndex.value]);
tableRef.value.setScrollTop(currentIndex.value * 25);
tableRef.value.setScrollTop(currentIndex.value * 30);
}
}, 10);
}
@ -235,7 +235,7 @@ const handleKeydown = (e: any) => {
tableRef.value.setCurrentRow(filterData.value[currentIndex.value]);
// 滚动到当前行
tableRef.value.setScrollTop(currentIndex.value * 25);
tableRef.value.setScrollTop(currentIndex.value * 30);
// 回车确认
if (e.key === "Enter") {

View File

@ -14,7 +14,8 @@
<ArrowUpBold />
</el-icon>
</div>
<el-input v-model="labInfo.ybh" placeholder="样本编号" @keyup.enter="handleQuery" style="width:100%" />
<el-input v-model="queryParams.ybh" placeholder="样本编号" @keyup.enter="handleQuery"
style="width:100%" />
<div class="jtIcon" @click="handleNext">
<el-icon>
<ArrowDownBold />
@ -25,8 +26,9 @@
</el-col>
<el-col :span="6">
<el-form-item label="日期:" prop="jyrq">
<el-date-picker v-model="labInfo.jyrq" type="date" label-width="1.25rem" placeholder="检验日期"
value-format="YYYY-MM-DD" :clearable="false" @change="" style="width:100%"></el-date-picker>
<el-date-picker v-model="ybJyrq" type="date" label-width="1.25rem" placeholder="检验日期"
value-format="YYYY-MM-DD" :clearable="false" @change="jyrqChange"
style="width:100%"></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="6">
@ -73,7 +75,7 @@
@previewHandle="previewHandle" />
</el-tab-pane>
<el-tab-pane label="培养基接种" name="third">
<Pyj :labPat="labInfo" :labPatKey="queryParams" />
<Pyj :labPat="labPat" :labPatKey="queryParams" :userList="userList" />
</el-tab-pane>
<el-tab-pane label="操作记录" name="fourth">
<Record :labPat="labInfo" :labPatKey="queryParams" />
@ -139,6 +141,8 @@
</div>
</el-col>
</el-row>
<!-- 校验用户 -->
<CheckUser ref="checkUserRef" @onConfirm="handleCheckUserConfirm" @onCancel="checkUserCancel" />
<!-- 批量扫码弹窗 -->
<BatchCode ref="batchRef" v-model:labPat="labPat" :labPatKey="queryParams" :dictData="dictData"
:totalCount="labPatList.length" @goNext="handleNext" @goPrev="handlePrev" @goLast="handleLast"
@ -166,6 +170,7 @@ import Combination from '../components/combination/index.vue'
import Clinical from '../components/clinical/index.vue'
import Sample from '../components/sample/index.vue'
import ResultGraph from '../components/resultGraph/index.vue'
import CheckUser from '../work/components/CheckUser.vue';
// 中间部分
import ZbReport from './labresult/zbReport.vue';
import CbReport from './labresult/cbReport.vue';
@ -173,7 +178,7 @@ import Pyj from './labresult/pyj.vue';
import Record from './labresult/record.vue';
// @ts-ignore
import { comDict } from '@/utils/dict'
import { queryLabResults, loadDefault, queryLabPat, instrdconfig, delSample, getGroupInstrdList } from "@/api/liswork/work/LisWork";
import { queryLabResults, loadDefault, queryLabPat, instrdconfig, delSample, getGroupInstrdList, checkuser, updateLabPat } from "@/api/liswork/work/LisWork";
import { wswsamplelistpage, sampleMedInfo } from "@/api/liswork/micro/index";
import { getComDicts, queryComDictListService } from "@/api/liswork/dict/ComDict";
import { ElMessage, ElMessageBox } from "element-plus";
@ -258,11 +263,55 @@ interface QueryParams {
finish?: string | number
autojgbz?: string | number
}
const ybJyrq = ref('')
watch(() => labPat.value, (newValue) => {
queryParams.value.ybh = newValue.ybh;
ybJyrq.value = newValue.jyrq;
}, { deep: true });
const checkUserRef = ref()
const jyrqChange = (val: string) => {
ElMessageBox.confirm(
`确定修改当前样本检验日期?`,
'提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
).then(() => {
if (!queryParams.value.yhdh) {
checkUserRef.value.open();
} else {
updateJyrq()
}
}).catch(() => {
fetchLabPat();
})
};
const handleCheckUserConfirm = (info: { yhdh: string, mm: string }) => {
checkuser({ yhdh: info.yhdh, mm: info.mm }).then((response: any) => {
if (response.code == 0) {
queryParams.value.yhdh = info.yhdh;
updateJyrq()
} else {
fetchLabPat();
}
})
};
const checkUserCancel = () => {
fetchLabPat();
};
// 更新检验日期
const updateJyrq = () => {
// updateLabPat({ ...queryParams.value, ...labPat.value })
};
// 模糊查询
const searchQuery = () => {
let filterMhList = [...originalLabPatList.value];
@ -287,7 +336,6 @@ const searchQuery = () => {
selectJob(firstRow);
} else {
labPat.value = {};
labInfo.value = {};
zbLabResuts.value = [];
highlightRowIndex.value = -1;
}
@ -325,7 +373,6 @@ const handleQueryResult = (params: QueryParams) => {
selectJob(firstRow);
} else {
labPat.value = {};
labInfo.value = {};
zbLabResuts.value = [];
highlightRowIndex.value = -1;
}
@ -348,7 +395,6 @@ const mbStore = useCommonStore();
const yqHandleChange = (val: any) => {
zbLabResuts.value = [];
labPat.value = {}
labInfo.value = {}
mbStore.setLxsrList([]);
getSysList()
fetchlabPatList()
@ -406,7 +452,7 @@ const selectJob = (job: any) => {
}
const zbLabResuts = ref([])
//载入样本结果表单(中间labresult.vue组件)
const fetchLabResults = async () => {
const fetchLabResults = () => {
sampleMedInfo({ jyrq: labInfo.value.jyrq ? labInfo.value.jyrq : queryParams.value.jyrq, yq: labInfo.value.yq, ybh: labInfo.value.ybh }).then((response: any) => {
zbLabResuts.value = response.data;
})
@ -463,11 +509,10 @@ const handleQuery = () => {
// 创建新样本
const handleCreate = () => {
labInfo.value.jyrq = ''
ybJyrq.value = ''
loadDefault({ ...queryParams.value }).then((response: any) => {
if (response.code == 0) {
labPat.value = response.data;
labInfo.value = response.data;
labPat.value.id = `temp_${Date.now()}_${Math.random().toString(36).substr(2, 8)}`;
zbLabResuts.value = [];
labPatListRef.value?.clearCurrentRow();
@ -599,7 +644,6 @@ const changeStatus = (updatedPat: any, flag: boolean) => {
queryLabPat(data).then((response: any) => {
if (response.code == 0) {
labPat.value = response.data;
labInfo.value = response.data;
const index = labPatList.value.findIndex((item: any) => item.ybh == updatedPat.ybh);
if (index !== -1) {
labPatList.value = labPatList.value.map((item, i) =>

View File

@ -17,7 +17,7 @@
<script setup lang="ts">
import { ref, computed, watch, onMounted } from 'vue';
import { getmeddictList } from '@/api/liswork/micro/index';
import { getbactmediumList } from '@/api/liswork/micro/index';
// @ts-ignore
import { getFirstLetter } from '@/utils/pinyin.js'; // 引入拼音处理工具
// 组件参数
@ -50,12 +50,12 @@ const loadDictData = async () => {
try {
isDictLoading.value = true;
const response = await getmeddictList();
const response = await getbactmediumList();
const rawData = response.data.map((item: any, index: number) => {
return {
value: item.ywdh || `未知编码_${index}`, // 确保value存在
label: item.ywmc || `未知名称_${index}`, // 确保label存在
value: item.mediumno || `未知编码_${index}`, // 确保value存在
label: item.mediumname || `未知名称_${index}`, // 确保label存在
};
});
// 为每个字典项添加简拼字段
@ -103,7 +103,7 @@ const openDictSelector = async () => {
}
// 打开弹窗前先加载数据(确保每次打开都是最新的)
// await loadDictData();
await loadDictData();
// 数据加载完成后再显示弹窗
dialogVisible.value = true;
@ -134,7 +134,8 @@ const handleDialogClose = () => {
defineExpose({
openDictSelector, // 暴露打开弹窗的方法
// 可选:暴露其他可能需要的方法(如刷新字典数据)
loadDictData
loadDictData,
handleDialogClose
});
</script>

View File

@ -12,7 +12,30 @@
培养基 {{ tableData?.length }}个
</template>
<template #mediumname="{ row }">
<el-input v-model="row.mediumname" size="small" class="full-width-input" @dblclick="handleInputFocus(row)" />
<el-input v-model="row.mediumname" size="small" class="full-width-input" @change="handleCsjgEnter(row)"
@dblclick="handleInputFocus(row)" />
</template>
<template #sheetdate="{ row }">
<el-date-picker v-model="row.sheetdate" type="datetime" format="YYYY-MM-DD HH:mm:ss"
class="full-width-input no-prefix-icon" value-format="YYYY-MM-DD HH:mm:ss" @change="handleCsjgEnter(row)" />
</template>
<template #sheetuser="{ row }">
<SelectTable v-model:data="row.sheetuser" :fields="ysFields" :tableData="userList" label="nickName"
class="full-width-input" value="userName" objKey="userName" :border="true" size="small"
@getDataValue="handleCsjgEnter(row)" placeholder="" :clearable="false" />
</template>
<template #mediu="{ row }">
<el-input v-model="row.mediu" size="small" class="full-width-input" @change="handleCsjgEnter(row)" />
</template>
<template #comments="{ row }">
<el-input v-model="row.comments" size="small" class="full-width-input" @change="handleCsjgEnter(row)" />
</template>
<template #conidtions="{ row }">
<el-input v-model="row.conidtions" size="small" class="full-width-input" @change="handleCsjgEnter(row)" />
</template>
<template #watchinterval="{ row }">
<el-input v-model="row.watchinterval" size="small" class="full-width-input" @change="handleCsjgEnter(row)" />
</template>
</CustomTable>
<PyjDict ref="pyjRef" :dialogTitle="'培养基选择'" @select="selectItem" />
@ -21,11 +44,15 @@
<script setup lang="ts">
import CustomTable from '@/components/elTable/index.vue';
import { getmediumList } from '@/api/liswork/micro/index';
import { getmediumList, insertmedium, updatemedium, deletemedium, deletemediums } from '@/api/liswork/micro/index';
import { classCom } from '@/utils/classCom';
import { ElMessage, ElMessageBox } from 'element-plus';
import PyjDict from './components/pyjDict.vue';
import SelectTable from '@/components/SelectTable/index.vue';
// @ts-ignore
import useUserStore from '@/store/modules/user'
const autoSize = classCom.useAutoSize()
const userStore = useUserStore()
const props = defineProps({
labPat: {
type: Object,
@ -36,40 +63,84 @@ const props = defineProps({
type: Object,
default: () => { }
},
userList: {
type: Array as PropType<object[]>,
default: () => []
}
});
const { labPat, labPatKey } = toRefs(props);
const checked = ref(false);
const tableRef = ref();
const tableData = ref([]);
const tableData: any = ref([]);
const columns = ref([
{ type: "selection", width: 40, align: 'center', visible: true },
{ label: "培养基", prop: "mediumname", align: 'center', visible: true, width: 80, headerSlot: 'mediumnameHeadTitle', slot: 'mediumname' },
{ label: "接种时间", prop: "sheetdate", align: 'center', visible: true, width: 120 },
{ label: "接种人", prop: "sheetuser", align: 'center', visible: true, width: 60 },
{ label: "培养基结果", prop: "mediu", align: 'center', visible: true, },
{ label: "转种类型", prop: "comments", align: 'center', visible: true, },
{ label: "培养周期(小时)", prop: "conidtions", align: 'center', visible: true, width: 100 },
{ label: "观察间隔(小时)", prop: "watchinterval", align: 'center', visible: true, width: 100 },
{ label: "接种时间", prop: "sheetdate", align: 'center', visible: true, width: 150, slot: 'sheetdate', showOverflowTooltip: false },
{ label: "接种人", prop: "sheetuser", align: 'center', visible: true, width: 80, slot: 'sheetuser' },
{ label: "培养基结果", prop: "mediu", align: 'center', visible: true, slot: 'mediu' },
{ label: "转种类型", prop: "comments", align: 'center', visible: true, slot: 'comments' },
{ label: "培养周期(小时)", prop: "conidtions", align: 'center', visible: true, width: 100, slot: 'conidtions' },
{ label: "观察间隔(小时)", prop: "watchinterval", align: 'center', visible: true, width: 100, slot: 'watchinterval' },
]);
const tableConfig = ref({
border: true,
height: '74vh',
// highlightCurrentRow: true,
})
const pyjRef = ref();
const handleColumnDragEnd = (data: any) => {
columns.value = data.columns;
}
const updateItem: any = ref(null);
const handleCsjgEnter = (row: any) => {
updatemedium(row)
}
const handleInputFocus = (row: any) => {
updateItem.value = row;
pyjRef.value.openDictSelector();
console.log('row', row);
}
const selectItem = (item: any) => {
if (updateItem.value) {
tableData.value.forEach((v: any) => {
if (updateItem.value.gsid == v.gsid) {
v.mediumno = item.value;
v.mediumname = item.label;
updatemedium(v).then((res: any) => {
updateItem.value = null
pyjRef.value.handleDialogClose();
})
}
});
} else {
console.log('labPat==>', labPat.value);
const data = {
mediumno: item.value,
mediumname: item.label,
jyrq: labPat.value.jyrq,
yq: labPat.value.yq,
ybh: labPat.value.ybh,
sheetdate: labPat.value.sqsj,
sheetuser: userStore.name,
}
insertmedium(data).then((res: any) => {
if (res.code == 0) {
tableData.value.push(data)
}
})
}
}
const selectedRows = ref([]);
const ysFields = ref([
{ prop: 'userName', label: '用户代号', width: 80, enablePinyinSearch: true },
{ prop: 'nickName', label: '用户姓名', width: 150, enablePinyinSearch: true },
])
const selectedRows: any = ref([]);
const handleSelectionChange = (selection: any) => {
selectedRows.value = selection;
}
@ -89,7 +160,14 @@ const deleteItem = () => {
type: 'warning',
}
).then(() => {
const arr = selectedRows.value.map((item: any) => item.gsid);
deletemediums(arr).then((res: any) => {
if (res.code == 0) {
ElMessage.success('删除成功');
getbyjList();
selectedRows.value = []
}
})
})
}
@ -125,4 +203,8 @@ watch(() => props.labPat, (newValue) => {
align-items: center;
margin: .3125rem;
}
:deep(.el-input__prefix) {
display: none;
}
</style>

View File

@ -48,6 +48,7 @@ const props = defineProps({
// 组件事件
const emit = defineEmits([
'onConfirm', // 验证成功回调
'onCancel'
]);
// 表单数据
@ -95,6 +96,7 @@ const handleCancel = () => {
ruleForm.value.yhdh = '';
ruleForm.value.mm = '';
ruleFormRef.value.resetFields();
emit('onCancel');
};
defineExpose({