891 lines
28 KiB
Vue
Raw Normal View History

2025-05-20 16:34:38 +08:00
<template>
<div class="app-container">
<el-row :gutter="10" class="compact-form">
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['system:dict:add']">新增明细</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="Delete" :disabled="delResultFlag" @click="handleDelete" v-hasPermi="['system:dict:remove']">删除明细</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="changeResultFlag" @click="handleUpdate" v-hasPermi="['system:dict:edit']">保存</el-button>
</el-col>
<el-col :span="1.5">
2025-09-17 10:19:20 +08:00
<el-button type="success" plain icon="Edit" @click="handleCheck0" v-hasPermi="['system:dict:import']">初报</el-button>
2025-05-20 16:34:38 +08:00
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Download" @click="handleCheck" v-hasPermi="['system:dict:import']">初审</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="info" plain icon="Upload" @click="handleUnCheck" v-hasPermi="['system:dict:export']">取消初审</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Download" @click="handleCheck" v-hasPermi="['system:dict:import']">审核</el-button>
</el-col>
<el-col :span="1.5">
2025-09-17 10:19:20 +08:00
<el-button type="success" plain icon="Upload" @click="handleUnCheck" v-hasPermi="['system:dict:export']">取消审核</el-button>
2025-05-20 16:34:38 +08:00
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Edit" @click="handleUnCheck" v-hasPermi="['system:dict:export']">预览</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Edit" @click="handleUnCheck" v-hasPermi="['system:dict:export']">打印</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Upload" @click="handleUnCheck" v-hasPermi="['system:dict:export']">上一个</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Download" @click="handleUnCheck" v-hasPermi="['system:dict:export']">下一个</el-button>
</el-col>
</el-row>
<el-row :gutter="10" class="compact-form" >
<el-form :model="queryParams" ref="queryRef" :inline="true" :rules="rules" >
<el-form-item class="compact-form" label="" label-width="0px" prop="ybh" >
<el-col :span="1.5">样本编号</el-col>
<el-col :span="4.5">
<el-input v-model="queryParams.ybh" clearable placeholder="样本编号" prefix-icon="Search" @keyup.enter="handleQueryYbh" @clear="handleQueryYbh" />
</el-col>
<el-col :span="1.5"><div>检验日期</div></el-col>
<el-col :span="3.5">
<el-date-picker v-model="queryParams.jyrq" type="date" label-width="20px" placeholder="检验日期" value-format="YYYY-MM-DD" :clearable="false" @change="handleQuery" ></el-date-picker>
</el-col>
<el-col :span="1.5"><div>部门组别</div></el-col>
<el-col :span="3.5">
<Ddlb
v-model="queryParams.instrGroup"
:options="instrGroupOptions"
placeholder="请选择部门组别"
@change="handleinstrGroupChange"
:value="setInstrGroup"
label-width="40px"
/>
</el-col><el-col :span="1"><div>仪器</div></el-col>
<el-col :span="4">
<Ddlb
v-model="queryParams.yq"
:options="instrOptions"
placeholder="请选择仪器"
@change="handleYqChange"
:value="setInstr"
/>
</el-col>
</el-form-item>
</el-form>
</el-row>
<el-row :gutter="5">
<el-col :span="5" :xs="24">
<div class="compact-form">
2025-09-17 10:19:20 +08:00
<LabPatForm v-model:labPat="labPat" :labPatKey="queryParams" ref="labPatRef" @save="savelabPat" @reset="resetlabPat" />
2025-05-20 16:34:38 +08:00
</div>
</el-col>
<el-col :span="10" :xs="24">
<div class="compact-form">
2025-09-17 10:19:20 +08:00
<LabResultForm
ref="labResultRef"
2025-05-20 16:34:38 +08:00
:tableData="labResuts"
:tableKey="queryParams"
2025-09-17 10:19:20 +08:00
:is-data-refreshed="isDataRefreshed"
@add="addLabResult"
@delete="deleteLabResults"
@edit="editLabResult"
@delfalg="setdelResultFlag"
@changefalg="setchangeResultFlag"
@fetchLabResults="fetchLabResults"
2025-05-20 16:34:38 +08:00
/>
</div>
</el-col>
<el-col :span="9" :xs="24">
<div class="compact-form">
<LabPatListForm
:labPatList="labPatList"
:labPatKey="queryParams"
:total="total"
@select="selectJob"
@search="searchJobs"
@page-change="pageChange"
/>
</div>
</el-col>
2025-09-17 10:19:20 +08:00
<ItemInput
ref="itemDictRef"
v-model="selectedItemValue"
:label-value.sync="selectedItemLabel"
:dict-type="'LAB_ITEM'"
:fetch-dict="fetchLabItemDict"
:dialog-title="'选择检验项目'"
:disabled="false"
:load-on-mount="false"
:table-data.sync="labResuts"
class="hidden-dict-input"
@select="handleItemSelect"
/>
2025-05-20 16:34:38 +08:00
</el-row>
2025-09-17 10:19:20 +08:00
<!-- 引入弹窗组件 -->
<unconfirmlog
v-model:visible="dialogVisible"
:reason-text="currentReason"
@onConfirm="unconfirmlogConfirm"
@onCancel="unconfirmlogCancel"
/>
<CheckUser
v-model:visible="showCheckUser"
:title="checktitle"
:validation-rules="{ userIdMinLength: 4, passwordMinLength: 6 }"
@onConfirm="handleAuthSuccess"
@onCancel="handleAuthCancel"
/>
<uploadwarning
v-model:visible="showuploadwarning"
:msgdata="warningMsgdata"
:showRules=1
@onupload="handleWarningSuccess"
@onCancel="handleWarningCancel"
/>
2025-05-20 16:34:38 +08:00
</div>
</template>
<script setup>
2025-08-20 09:25:12 +08:00
import {
getDate,
queryLabPatList,
queryLabResults,
2025-09-17 10:19:20 +08:00
updateLabPat,
2025-08-20 09:25:12 +08:00
queryLabPat,
2025-09-17 10:19:20 +08:00
check2, uncheck2, unconfirmlog, checkuser, reglimit, queryXmInfo
2025-08-20 09:25:12 +08:00
} from "../../../api/liswork/work/LisWork.js";
2025-05-20 16:34:38 +08:00
import {querylabInstrList,querylabInstrListByLisgroup} from "../../../api/liswork/dict/LabInstr.js";
import {getComDicts, queryComDictListService} from "../../../api/liswork/dict/ComDict.js";
import LabPatForm from './components/labpat.vue'
import LabResultForm from './components/labresult.vue'
import LabPatListForm from './components/labpatlist.vue'
2025-09-17 10:19:20 +08:00
import Unconfirmlog from './components/unconfirmlog.vue'
2025-05-20 16:34:38 +08:00
import Ddlb from './components/ddlb.vue'
2025-09-17 10:19:20 +08:00
import CheckUser from './components/CheckUser.vue'
import uploadwarning from './components/uploadwarning.vue'
import UCKDictInput from './components/DictInput.vue';
import {ElMessage, ElMessageBox} from "element-plus";
import ItemInput from "@/views/liswork/work/components/ItemInput.vue";
2025-05-20 16:34:38 +08:00
2025-09-17 10:19:20 +08:00
const showuploadwarning = ref(false);
2025-05-20 16:34:38 +08:00
const single = ref(true);
const delResultFlag = ref(true);
const changeResultFlag = ref(true);
const loading = ref(true);
const instrGroupOptions = ref([]);
const instrOptions = ref([]);
const labPatList = ref([])
const patdata = reactive({
form: {},
labPat: {
jyrq: '',
yq: '',
ybh: '',
brly:'',
jzbz:'',
brdh:'',
brxm:'',
brxb:'',
nl:null,
nldw:'1',
ksdh:'',
ch:'',
sjys:'',
sqsj:'',
cyrq:'',
dysj:'',
zd:'',
bz:'',
yhdh:'',
hdys:'',
jgbz:'0',
yblx:''
},
rules: {}
});
const { labPat } = toRefs(patdata);
const labResuts = ref([])
const total = ref(0)
const currentLabResults = ref([])
const searchText = ref('')
const pageSize = ref(10)
const currentPage = ref(1)
const setInstrGroup=ref('')
const setInstr=ref('')
const yq0=ref('')
const jyrq0=ref('')
const ybh0=ref('')
2025-09-17 10:19:20 +08:00
const checktitle=ref('操作人身份验证')
const nextstepname=ref('')
const warningMsgdata=ref('')
const checkuserid=ref('')
2025-05-20 16:34:38 +08:00
const querydata = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
jyrq: formatDate(new Date()),
yq: '1',
ybh: '1',
days: 1,
2025-09-17 10:19:20 +08:00
instrGroup:'#',
problemId:0,
yhdh:''
2025-05-20 16:34:38 +08:00
},
rules: {
ybh: [],
jyrq: [],
instrGroup: [],
yq: [],
}
,
});
2025-09-17 10:19:20 +08:00
// 父组件:新增“数据刷新标记”,初始为false
const isDataRefreshed = ref(false);
// 新增:控制标记的重置(避免持续触发子组件缓存更新)
const resetDataRefreshFlag = () => {
// 延迟重置,确保子组件有足够时间接收标记并更新缓存
setTimeout(() => {
isDataRefreshed.value = false;
}, 100);
};
2025-05-20 16:34:38 +08:00
const { queryParams, form, rules } = toRefs(querydata);
//子组件labResult.vue
const labResultRef = ref(null);
//子组件labPatRef.vue
const labPatRef = ref(null);
2025-09-17 10:19:20 +08:00
// 弹窗控制状态
const dialogVisible = ref(false);
const showCheckUser = ref(false);
// 弹窗显示的原因文本
const currentReason = ref('');
// 存储需要传递给API的参数
const apiParams = ref(null);
// 处理弹窗确认(获取返回值后调用API)
const unconfirmlogConfirm = async (inputValue) => {
try {
console.log('用户输入的操作原因:', inputValue);
// 调用API,携带用户输入的原因和之前保存的参数
loading.value = true;
unconfirmlog({...queryParams.value,reason: inputValue}).then(response => {
console.log('response:', response)
loading.value = false;
if(response.code=="0") {
runnextstepname();
}
}) .catch(error => {
console.error('审核失败', error);
loading.value = false;
});
// API调用成功后的处理
console.log('操作成功:', response);
// 可以添加成功提示、刷新数据等逻辑
} catch (error) {
console.error('操作失败:', error);
// 错误处理
} finally {
// 重置参数
apiParams.value = null;
}
};
// 处理弹窗取消
const unconfirmlogCancel = () => {
console.log('用户取消了操作');
// 重置参数
apiParams.value = null;
cancalnextstepname();
};
// 处理验证成功
const handleAuthSuccess = async (userInfo) => {
console.log('验证信息:', userInfo);
// 调用后端接口进行实际验证
loading.value = true;
checkuser({yhdh: userInfo.userId,mm: userInfo.password}).then(response => {
console.log('response:', response)
loading.value = false;
console.log('userInfo:',userInfo);
if(response.code=="0") {
checkuserid.value=userInfo.userId;
runnextstepname();
}
}) .catch(error => {
console.error('验证接口调用失败', error);
loading.value = false;
checkuserid.value='';
});
};
// 处理取消验证
const handleAuthCancel = () => {
console.log('用户取消了验证');
// 执行取消后的操作
cancalnextstepname();
};
// 处理危急值登记
const handleWarningSuccess = async (userInfo) => {
console.log('处理危急值登记:', userInfo);
// 调用后端接口进行实际验证
loading.value = true;
reglimit({...queryParams.value,qrr: userInfo.userId,tzfs: userInfo.uploadTp,phone:userInfo.phone}).then(response => {
console.log('危急值response:', response.code);
loading.value = false;
if(response.code=="0") {
runnextstepname();
}
if(response.code=="4") {
ElMessageBox.confirm(response.msg, '系统提示', { confirmButtonText: '是', cancelButtonText: '否', type: 'warning' }).then(() => {
queryParams.value.problemId=queryParams.value.problemId+1;
handleWarningSuccess(userInfo);
}).catch(() => {
runnextstepname();
});
}
}) .catch(error => {
console.error('处理危急值登记接口调用失败', error);
loading.value = false;
});
};
2025-05-20 16:34:38 +08:00
2025-09-17 10:19:20 +08:00
// 处理取消验证
const handleWarningCancel = () => {
console.log('用户取消了登记');
// 执行取消后的操作
cancalnextstepname();
};
2025-05-20 16:34:38 +08:00
// 页面载入时获取基本默认值参数信息,后面有扩展需要都放这里
const loadYqConfig = async () => {
// 使用 .value 获取响应式数据的值
jyrq0.value='2022-06-19';//formatDate(new Date());
yq0.value='COBAS';
ybh0.value='1';
querydata.queryParams.jyrq = jyrq0.value;
querydata.queryParams.yq = yq0.value;
querydata.queryParams.ybh = ybh0.value;
querydata.queryParams.instrGroup = 'A2';
}
// 加载部门下拉列表
function loadinstrGroupOptions(){
loading.value = true;
getComDicts({zdlb: 'GROUP'}).then(response => {
instrGroupOptions.value = response.data.map(item => ({
id: item.zddh,
text: item.zdmc
}));
loading.value = false;
setInstrGroup.value=querydata.queryParams.instrGroup;
});
loadYqConfig();
}
// 部门组别变化时更新仪器下拉框
const handleinstrGroupChange = (value) => {
queryParams.value.instrGroup = value
// 清空仪器选择并重新加载
// queryParams.value.yq = '';
instrOptions.value = [];
// 加载对应组别的仪器数据
loadinstrOptions();
}
// 仪器变化时的处理函数
const handleYqChange = (value) => {
if (value === null || value === '') {
queryParams.value.yq = yq0.value;
setInstr.value= yq0.value;
}else {
yq0.value=value;
queryParams.value.yq = value;
handleQuery();
}
}
// 加载仪器下拉列表
const loadinstrOptions = () => {
loading.value = true;
querylabInstrListByLisgroup({pageNum: 1, pageSize: 100,lisgroup: queryParams.value.instrGroup})
.then(response => {
if (response.rows) {
instrOptions.value = toRaw(response.rows).map(item => ({
id: item.yq.trimEnd(),
text: item.yqmc
}))
loading.value = false;
setInstr.value=querydata.queryParams.yq;
} else {
throw new Error('仪器响应数据为空');
}
})
.catch(error => {
console.error('仪器数据加载失败', error);
loading.value = false;
});
// console.error('aaa', queryParams.value);
//console.log('test22:', instrOptions.value);
}
//获取服务器时间
const serverDate = computed(() => {
return formatDate(new Date());
});
//切换仪器或检验日期后重置页码
function resetData(){
queryParams.value = {
pageNum: 1,
pageSize: 15,
}
searchText.value = ''
currentPage.value = 1
pageSize.value = 15
}
//载入样本列表(右边labpatlist.vue组件)
const fetchlabPatList = async (search = '', page = 1, size = 15) => {
loading.value = true;
queryParams.value.pageSize = size;
queryParams.value.pageNum = page;
queryLabPatList(queryParams.value).then(response => {
labPatList.value = response.rows;
total.value = response.total;
loading.value = false;
}) .catch(error => {
console.error('列表数据加载失败', error);
loading.value = false;
});
}
//载入样本编辑表单(左边labpat.vue组件)
const fetchLabPat = async () => {
loading.value = true;
queryLabPat(queryParams.value).then(response => {
labPat.value = response.data;
loadingPatLabel();
loading.value = false;
}) .catch(error => {
console.error('列表数据加载失败', error);
loading.value = false;
});
}
//载入样本结果表单(中间labresult.vue组件)
const fetchLabResults = async () => {
loading.value = true;
// console.log('test', queryParams.value);
queryLabResults({jyrq: queryParams.value.jyrq,yq: queryParams.value.yq,ybh: queryParams.value.ybh}).then(response => {
// console.log('RESULT:', response);
labResuts.value = response.data;
loading.value = false;
2025-09-17 10:19:20 +08:00
// 关键:设置“数据刷新标记”为true(删除后数据变化,需更新子组件缓存)
isDataRefreshed.value = true;
// 数据刷新后重置标记
resetDataRefreshFlag();
2025-05-20 16:34:38 +08:00
}) .catch(error => {
console.error('列表数据加载失败', error);
loading.value = false;
});
}
//保存样本表单
const savelabPat = async (labPat) => {
// 实际项目中这里应该是API调用
console.log('保存主表:', labPat)
if (!labPat.id) {
// 新增
labPat.id = Date.now()
labPatList.value.unshift({...labPat})
} else {
// 更新
const index = labPatList.value.findIndex(item => item.id === labPat.id)
if (index !== -1) {
labPatList.value.splice(index, 1, {...labPat})
}
}
alert('保存成功')
}
//重置结果表单
const resetlabPat = () => {
labResuts.value = []
currentLabResults.value = []
}
//新增结果列
const addLabResult = async (LabResult) => {
// 实际项目中这里应该是API调用
console.log('添加明细:', LabResult)
if (!LabResult.xh) {
LabResult.xh = currentLabResults.value.length + 1
}
const index = currentLabResults.value.findIndex(item => item.xh === LabResult.xh)
if (index !== -1) {
currentLabResults.value.splice(index, 1, {...LabResult})
} else {
currentLabResults.value.push({...LabResult})
}
alert('添加成功')
}
//删除结果列
const deleteLabResults = async (xhList) => {
// 实际项目中这里应该是API调用
console.log('删除明细:', xhList)
currentLabResults.value = currentLabResults.value.filter(item => !xhList.includes(item.xh))
alert('删除成功')
}
//修改结果列
const editLabResult = (LabResult) => {
console.log('编辑明细:', LabResult)
// 在表单中填充数据
// 这里不需要做任何事情,因为组件已经绑定了数据
}
//样本列表点击切换样本信息,同步载入左边样本信息表单和中间结果表单
const selectJob = async (job) => {
// 复制选中的job数据到当前编辑状态
// Object.assign(labPat.value, {...job})
queryParams.value.jyrq = job.jyrq;
queryParams.value.yq = job.yq;
queryParams.value.ybh = job.ybh;
2025-09-17 10:19:20 +08:00
2025-05-20 16:34:38 +08:00
checkQuery()
2025-09-17 10:19:20 +08:00
isDataRefreshed.value = true;
2025-05-20 16:34:38 +08:00
//await nextTick();
// 获取对应的明细数据
await fetchLabPat();
await fetchLabResults();
2025-09-17 10:19:20 +08:00
resetDataRefreshFlag();
2025-05-20 16:34:38 +08:00
}
//样本列表检索时刷新列表信息
const searchJobs = async (text, page, size) => {
searchText.value = text
currentPage.value = page
pageSize.value = size
loadlabPatList()
}
//样本列表翻页时刷新列表信息
const pageChange = async (page, size) => {
currentPage.value = page
pageSize.value = size
loadlabPatList()
}
//刷新样本列表方法封装
const loadlabPatList = async () => {
await fetchlabPatList(searchText.value, currentPage.value, pageSize.value)
}
/** 查询服务器时间 */
function getdate() {
getDate().then(response => {
serverDate.value= formatDate(new Date(response.data));
})
}
//日期格式化
function formatDate(date) {
const year = date.getFullYear();
// 月份是从0开始的,所以要加1
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day} 00:00:00`;
}
const setdelResultFlag = (value) =>{
delResultFlag.value=value;
}
const setchangeResultFlag = (value) =>{
changeResultFlag.value=value;
}
//新增
const handleAdd = () => {
2025-09-17 10:19:20 +08:00
// labResultRef.value?.handleAdd();
openItemDictDialog();
2025-05-20 16:34:38 +08:00
};
function handleUpdate(){
}
function handleDelete(){
labResultRef.value?.handleBatchDelete();
}
function loadingPatLabel(){
// labPatRef.value?.loadingLabel();
2025-09-17 10:19:20 +08:00
}
function handleCheck0(){
2025-05-20 16:34:38 +08:00
}
function handleCheck(){
2025-09-17 10:19:20 +08:00
queryParams.value.problemId=0;
nextstepname.value='handleCheck2';
queryParams.value.yhdh=checkuserid.value
if(queryParams.value.yhdh=='') {
checktitle.value='审核人工号密码验证'
showCheckUser.value = true;
}else {
handleCheck2();
}
}
function handleCheck2(){
loading.value = true;
console.log('queryParams:', queryParams.value)
queryParams.value.yhdh=checkuserid.value
check2(queryParams.value).then(response => {
loading.value = false;
if(response.code=="4"&& response.problemId===4) {
console.log('queryParams1111:', queryParams.value)
nextstepname.value='handleCheck2';
queryParams.value.problemId = response.problemId;
// 保存需要传递给API的参数
apiParams.value = queryParams;
// 设置弹窗显示的原因文本
warningMsgdata.value = response.msg;
// 显示弹窗
showuploadwarning.value = true;
}
console.log('response:', response)
}).catch(error => {
console.error('审核失败', error);
loading.value = false;
});
2025-08-20 09:25:12 +08:00
2025-09-17 10:19:20 +08:00
}
function handleUnCheck(){
queryParams.value.problemId=0;
nextstepname.value='handleuncheck2';
queryParams.value.yhdh=checkuserid.value
if(queryParams.value.yhdh=='') {
checktitle.value='取消审核人工号密码验证'
showCheckUser.value = true;
}else {
handleuncheck2();
}
}
function handleuncheck2(){
loading.value = true;
queryParams.value.yhdh=checkuserid.value
uncheck2(queryParams.value).then(response => {
2025-08-20 09:25:12 +08:00
loading.value = false;
2025-09-17 10:19:20 +08:00
if(response.code=="4") {
nextstepname.value='handleuncheck2';
queryParams.value.problemId = response.problemId;
// 保存需要传递给API的参数
apiParams.value = queryParams;
// 设置弹窗显示的原因文本
currentReason.value = response.msg;
// 显示弹窗
dialogVisible.value = true;
}
2025-08-20 09:25:12 +08:00
}) .catch(error => {
2025-09-17 10:19:20 +08:00
console.error('解除审核失败', error);
2025-08-20 09:25:12 +08:00
loading.value = false;
});
2025-05-20 16:34:38 +08:00
}
function handlePrint(){
}
function handleQueryDetail(){
}
//切换仪器或检验日期时载入
const handleQuery= async()=>{
if (checkQuery()===false) return false
// resetData();
await loadlabPatList();
//暂时默认打开1号样本,后面由参数控制
querydata.queryParams.ybh='1';
2025-09-17 10:19:20 +08:00
isDataRefreshed.value = true;
2025-05-20 16:34:38 +08:00
await handleQueryYbh();
2025-09-17 10:19:20 +08:00
resetDataRefreshFlag();
2025-05-20 16:34:38 +08:00
}
//切换样本号时载入
const handleQueryYbh = async()=>{
if (checkQuery()===false) return false
2025-09-17 10:19:20 +08:00
isDataRefreshed.value = true;
2025-05-20 16:34:38 +08:00
await fetchLabPat();
await fetchLabResults();
2025-09-17 10:19:20 +08:00
resetDataRefreshFlag();
2025-05-20 16:34:38 +08:00
}
//主键空置拦截
function checkQuery(){
if (querydata.queryParams.jyrq === ''|| querydata.queryParams.jyrq === null) {
querydata.queryParams.jyrq = jyrq0.value
return false;
}
if (querydata.queryParams.yq === ''|| querydata.queryParams.yq === null) {
querydata.queryParams.yq = yq0.value
return false;
}
if (querydata.queryParams.ybh === ''|| querydata.queryParams.ybh === null) {
querydata.queryParams.ybh = ybh0.value
return false;
}
jyrq0.value=querydata.queryParams.jyrq
yq0.value=querydata.queryParams.yq
ybh0.value=querydata.queryParams.ybh
}
2025-09-17 10:19:20 +08:00
function runnextstepname(){
if(nextstepname.value!=''){
switch(nextstepname.value) {
case 'handleuncheck2':
handleuncheck2();
break;
case 'handleCheck2':
handleCheck2();
break;
default:
// 当所有case都不匹配时执行(可选)
}
}
}
function cancalnextstepname(){
if(nextstepname.value!=''){
switch(nextstepname.value) {
case 'handleuncheck2':
ElMessage({ message: '取消操作,撤销审核失败!', type: 'error' })
break;
case 'handleCheck2':
ElMessage({ message: '取消操作,审核失败!', type: 'error' })
break;
default:
// 当所有case都不匹配时执行(可选)
}
}
}
// -------------------------- 项目选择相关变量 --------------------------
const itemDictRef = ref(null); // DictInput组件引用
const selectedItemValue = ref(""); // 选择的项目编码xmdh
const selectedItemLabel = ref(""); // 选择的项目名称xmmc
// -------------------------- 1. 项目字典API调用方法(传递给DictInput) --------------------------
/**
* 项目字典加载方法:适配DictInput的fetchDict参数格式
* @param {String} dictType - 父组件传递的dict-type(无实际意义,可忽略)
* @returns {Promise<Array>} - 项目字典数据(格式需匹配DictInput要求:{value, label})
*/
// 父组件中:完善的项目字典加载方法
const fetchLabItemDict = async (dictType) => {
// 日志1:确认方法被调用
try {
// 1. 验证必要参数(如当前仪器yq)
if (!queryParams.value.yq) {
console.error("[fetchLabItemDict] 缺少必要参数:yq(仪器)");
ElMessage.error("请先选择仪器");
return [];
}
// 日志2:打印请求参数
const requestParams = {
pageNum: 1,
pageSize: 1000, // 加载足够多的项目
yq: queryParams.value.yq, // 当前选中的仪器
};
// 2. 调用API(确保queryXmInfo是正确的API方法)
const response = await queryXmInfo(requestParams);
// 日志3:打印原始响应
// 3. 验证响应格式
if (!response) {
throw new Error("API返回为空");
}
if (response.code !== "0") { // 假设0为成功状态码
throw new Error(`API返回错误:${response.msg || "未知错误"}`);
}
if (!Array.isArray(response.data)) {
throw new Error(`API返回data不是数组,实际为:${typeof response.data}`);
}
// 4. 格式化数据(适配DictInput的{value, label}结构)
const formattedData = response.data.map((item, index) => {
// 验证项目数据完整性
if (!item.xmdh) {
console.warn(`[fetchLabItemDict] 第${index}条数据缺少xmdh(项目编码):`, item);
}
if (!item.xmmc) {
console.warn(`[fetchLabItemDict] 第${index}条数据缺少xmmc(项目名称):`, item);
}
return {
value: item.xmdh || `未知编码_${index}`, // 确保value存在
label: item.xmmc || `未知名称_${index}`, // 确保label存在
dw: item.dw || "", // 单位(可选)
refs: item.refs || "", // 参考值(可选)
};
});
// 日志4:打印格式化后的数据量
return formattedData;
} catch (error) {
// 日志5:捕获并显示错误
console.error(`[fetchLabItemDict] 加载失败:`, error.message);
ElMessage.error(`项目字典加载失败:${error.message}`);
return []; // 失败时返回空数组,避免弹窗报错
}
};
2025-05-20 16:34:38 +08:00
2025-09-17 10:19:20 +08:00
// -------------------------- 2. 打开项目选择弹窗 --------------------------
const openItemDictDialog = () => {
if (itemDictRef.value && typeof itemDictRef.value.openDictSelector === 'function') {
itemDictRef.value.openDictSelector(); // 确保方法存在再调用
} else {
console.warn("DictInput组件未加载完成或方法未暴露");
}
};
// -------------------------- 3. 处理项目选择结果:传递给labresult子组件新增行 --------------------------
const handleItemSelect = async (selectedItem) => {
// 1. 构造新增行数据
const newRow = {
id: `temp_${Date.now()}_${Math.random().toString(36).substr(2, 8)}`,
xmdh: selectedItem.value,
xmmc: selectedItem.label,
dw: selectedItem.dw || "",
refs: selectedItem.refs || "",
jyrq: queryParams.value.jyrq,
yq: queryParams.value.yq,
ybh: queryParams.value.ybh,
};
// 2. 调用子组件方法新增行(仅一次)
if (labResultRef.value && typeof labResultRef.value.addRowFromDict === 'function') {
await labResultRef.value.addRowFromDict(newRow);
ElMessage.success(`已新增项目:${newRow.xmmc}`);
}
};
2025-05-20 16:34:38 +08:00
//打开页面需要先初始化的内容都放这里
onMounted(() => {
loadYqConfig();
loadinstrGroupOptions(); // 页面加载时获取部门组别数据
loadinstrOptions();
loadlabPatList();
})
2025-09-17 10:19:20 +08:00
2025-05-20 16:34:38 +08:00
</script>
<style scoped lang="scss">
.compact-form .el-form-item {
padding: 5px;
margin-bottom: 5px;
}
.compact-form .el-form-item__label {
padding-bottom: 0px;
}
.card-content {
max-height: 450px; /* 设置最大高度 */
overflow-y: auto; /* 超出高度时显示垂直滚动条 */
padding: 5px; /* 保持与卡片默认一致的内边距 */
}
.clickable:hover {
cursor: pointer; /* 鼠标悬停时显示手型 */
transition: all 0.3s; /* 平滑过渡效果 */
color: blue;
}
2025-09-17 10:19:20 +08:00
.hidden-dict-input {
/* 定位到屏幕左侧外,视觉上不可见 */
position: absolute;
left: -9999px;
top: auto;
/* 防止占用布局空间 */
width: 1px;
height: 1px;
/* 防止意外聚焦 */
outline: none;
}
2025-05-20 16:34:38 +08:00
</style>