From 9244000fb027ae246e0580050af1614258231fb7 Mon Sep 17 00:00:00 2001 From: tangw Date: Wed, 17 Sep 2025 10:19:20 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BB=E7=A8=8B=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/liswork/work/LisWork.js | 68 ++- src/utils/request.js | 6 +- src/views/liswork/dict/index.vue | 44 +- .../liswork/work/components/CheckUser.vue | 323 +++++++++++++ .../liswork/work/components/DictInputany.vue | 331 ++++++++++++++ .../liswork/work/components/ItemInput.vue | 229 ++++++++++ src/views/liswork/work/components/labpat.vue | 208 +++++++-- .../liswork/work/components/labresult.vue | 424 +++++++++++++----- .../liswork/work/components/unconfirmlog.vue | 186 ++++++++ .../liswork/work/components/uploadwarning.vue | 340 ++++++++++++++ src/views/liswork/work/index.vue | 416 ++++++++++++++++- 11 files changed, 2344 insertions(+), 231 deletions(-) create mode 100644 src/views/liswork/work/components/CheckUser.vue create mode 100644 src/views/liswork/work/components/DictInputany.vue create mode 100644 src/views/liswork/work/components/ItemInput.vue create mode 100644 src/views/liswork/work/components/unconfirmlog.vue create mode 100644 src/views/liswork/work/components/uploadwarning.vue diff --git a/src/api/liswork/work/LisWork.js b/src/api/liswork/work/LisWork.js index 5311f1b..2c9db26 100644 --- a/src/api/liswork/work/LisWork.js +++ b/src/api/liswork/work/LisWork.js @@ -26,25 +26,32 @@ export function getDate() { }) } -//增加字典数据 -export function addLabPatService(data) { +// +export function changeresult(data) { return request({ - url: '/liswork/add', + url: '/lisworkoper/changeresult', method: 'post', data }) } -//修改字典数据 -export function updateLabPatService(data) { +//修改病人信息 +export function updateLabPat(data) { return request({ - url: '/liswork/update', + url: '/lisworkoper/changepat', method: 'post', data }) } +export function changepatcolumn(query) { + return request({ + url: '/lisworkoper/changepatcolumn', + method: 'get', + params:query + }) +} -// 查询数据列表 +// 查询结果数据列表 export function queryLabResults(query) { return request({ url: '/liswork/resultinfo', @@ -52,7 +59,22 @@ export function queryLabResults(query) { params: query }) } - +// 查询检验项目 +export function queryXmInfo(query) { + return request({ + url: '/liswork/queryxminfo', + method: 'get', + params: query + }) +} +// 查询常用取值 +export function queryXmVal(query) { + return request({ + url: '/liswork/queryxmval', + method: 'get', + params: query + }) +} // 批量删除结果 export function deleteresult(data) { return request({ @@ -71,3 +93,33 @@ export function check2(query) { }) } +//取消审核 +export function uncheck2(query) { + return request({ + url: '/lisworkoper/uncheck2', + method: 'get', + params: query + }) +} +//取消审核 +export function unconfirmlog(query) { + return request({ + url: '/lisworkoper/unconfirmlog', + method: 'get', + params: query + }) +} +export function checkuser(query) { + return request({ + url: '/liswork/checkuserid', + method: 'get', + params: query + }) +} +export function reglimit(query) { + return request({ + url: '/lisworkoper/reglimit', + method: 'get', + params: query + }) +} diff --git a/src/utils/request.js b/src/utils/request.js index 41cf163..9f46a9f 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -1,3 +1,4 @@ +import { createVNode, render } from 'vue'; import axios from 'axios' import { ElNotification , ElMessageBox, ElMessage, ElLoading } from 'element-plus' import { getToken } from '@/utils/auth' @@ -135,6 +136,9 @@ service.interceptors.response.use(res => { //提示并失败 ElMessage({ message: msg, type: 'error' }) return Promise.reject(new Error(msg)) + } else if (code === 4) { + //返回特定值,需要后续处理,表示当前操作需要处理后再调用,problemId是步骤关键参数,需要再次调用时引入 + return Promise.resolve(res.data) } else if (code === 5) { // 1. 提取后端返回的问题ID(根据实际字段名调整) const problemId = res.data.problemId; @@ -184,7 +188,7 @@ service.interceptors.response.use(res => { problemId: problemId }); }); - } else if (code !== 200 && code !== 0) { + } else if (code !== 200 && code !== 0) { ElNotification.error({ title: msg }) return Promise.reject('error') } else { diff --git a/src/views/liswork/dict/index.vue b/src/views/liswork/dict/index.vue index 1b21526..12da3f8 100644 --- a/src/views/liswork/dict/index.vue +++ b/src/views/liswork/dict/index.vue @@ -184,7 +184,6 @@ function handleQueryDetail(){ resetData() } -//提交表单数据 function submitForm() { proxy.$refs["dictRef"].validate(valid => { if (valid) { @@ -210,42 +209,13 @@ function submitForm() { }); } +// 取消操作(保留这一份,删除后面重复的) function cancel() { open.value = false; reset(); } -//提交表单数据 -function submitForm() { - proxy.$refs["dictRef"].validate(valid => { - if (valid) { - if (form.value.zdlb != undefined && form.value.zdlb != '') { - updateComDictService(form.value).then(response => { - proxy.$modal.msgSuccess("修改成功"); - open.value = false; - getList(); - }).catch(error => { - reset(); - }); - } else { - form.value.zdlb = queryParams.value.zdlb; - addComDictService(form.value).then(response => { - proxy.$modal.msgSuccess("新增成功"); - open.value = false; - getList(); - }).catch(error => { - form.value.zdlb = ''; - }); - } - } - }); -} - -function cancel() { - open.value = false; - reset(); -} getTypeList() @@ -383,17 +353,17 @@ getTypeList() diff --git a/src/views/liswork/work/components/DictInputany.vue b/src/views/liswork/work/components/DictInputany.vue new file mode 100644 index 0000000..0883fd7 --- /dev/null +++ b/src/views/liswork/work/components/DictInputany.vue @@ -0,0 +1,331 @@ + + + + + diff --git a/src/views/liswork/work/components/ItemInput.vue b/src/views/liswork/work/components/ItemInput.vue new file mode 100644 index 0000000..fb5931f --- /dev/null +++ b/src/views/liswork/work/components/ItemInput.vue @@ -0,0 +1,229 @@ + + + + + \ No newline at end of file diff --git a/src/views/liswork/work/components/labpat.vue b/src/views/liswork/work/components/labpat.vue index 7d88d21..3059154 100644 --- a/src/views/liswork/work/components/labpat.vue +++ b/src/views/liswork/work/components/labpat.vue @@ -4,62 +4,110 @@ - + - + - + - + - +
年龄
- + - +
- + - + - + - + - + - + - + - + - + - + - + @@ -79,6 +127,8 @@ \ No newline at end of file + diff --git a/src/views/liswork/work/components/unconfirmlog.vue b/src/views/liswork/work/components/unconfirmlog.vue new file mode 100644 index 0000000..69d5a83 --- /dev/null +++ b/src/views/liswork/work/components/unconfirmlog.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/src/views/liswork/work/components/uploadwarning.vue b/src/views/liswork/work/components/uploadwarning.vue new file mode 100644 index 0000000..93ef375 --- /dev/null +++ b/src/views/liswork/work/components/uploadwarning.vue @@ -0,0 +1,340 @@ + + + + + diff --git a/src/views/liswork/work/index.vue b/src/views/liswork/work/index.vue index 5c668a9..67d7f31 100644 --- a/src/views/liswork/work/index.vue +++ b/src/views/liswork/work/index.vue @@ -11,7 +11,7 @@ 保存 - 初报 + 初报 初审 @@ -23,7 +23,7 @@ 审核 - 取消审核 + 取消审核 预览 @@ -77,20 +77,22 @@
- +
-
@@ -106,7 +108,41 @@ />
+ + + + + @@ -115,17 +151,25 @@ import { getDate, queryLabPatList, queryLabResults, - updateLabPatService, + updateLabPat, queryLabPat, - check2 + check2, uncheck2, unconfirmlog, checkuser, reglimit, queryXmInfo } from "../../../api/liswork/work/LisWork.js"; 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' +import Unconfirmlog from './components/unconfirmlog.vue' import Ddlb from './components/ddlb.vue' +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"; + +const showuploadwarning = ref(false); const single = ref(true); const delResultFlag = ref(true); const changeResultFlag = ref(true); @@ -173,6 +217,10 @@ const setInstr=ref('') const yq0=ref('') const jyrq0=ref('') const ybh0=ref('') +const checktitle=ref('操作人身份验证') +const nextstepname=ref('') +const warningMsgdata=ref('') +const checkuserid=ref('') const querydata = reactive({ form: {}, queryParams: { @@ -182,7 +230,9 @@ const querydata = reactive({ yq: '1', ybh: '1', days: 1, - instrGroup:'#' + instrGroup:'#', + problemId:0, + yhdh:'' }, rules: { ybh: [], @@ -192,12 +242,119 @@ const querydata = reactive({ } , }); +// 父组件:新增“数据刷新标记”,初始为false +const isDataRefreshed = ref(false); +// 新增:控制标记的重置(避免持续触发子组件缓存更新) +const resetDataRefreshFlag = () => { + // 延迟重置,确保子组件有足够时间接收标记并更新缓存 + setTimeout(() => { + isDataRefreshed.value = false; + }, 100); +}; const { queryParams, form, rules } = toRefs(querydata); //子组件labResult.vue const labResultRef = ref(null); //子组件labPatRef.vue const labPatRef = ref(null); +// 弹窗控制状态 +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; + }); +}; + +// 处理取消验证 +const handleWarningCancel = () => { + console.log('用户取消了登记'); + // 执行取消后的操作 + cancalnextstepname(); +}; // 页面载入时获取基本默认值参数信息,后面有扩展需要都放这里 const loadYqConfig = async () => { // 使用 .value 获取响应式数据的值 @@ -313,6 +470,10 @@ const fetchLabResults = async () => { // console.log('RESULT:', response); labResuts.value = response.data; loading.value = false; + // 关键:设置“数据刷新标记”为true(删除后数据变化,需更新子组件缓存) + isDataRefreshed.value = true; + // 数据刷新后重置标记 + resetDataRefreshFlag(); }) .catch(error => { console.error('列表数据加载失败', error); loading.value = false; @@ -382,11 +543,14 @@ const selectJob = async (job) => { queryParams.value.jyrq = job.jyrq; queryParams.value.yq = job.yq; queryParams.value.ybh = job.ybh; + checkQuery() + isDataRefreshed.value = true; //await nextTick(); // 获取对应的明细数据 await fetchLabPat(); await fetchLabResults(); + resetDataRefreshFlag(); } //样本列表检索时刷新列表信息 const searchJobs = async (text, page, size) => { @@ -427,7 +591,8 @@ const setchangeResultFlag = (value) =>{ } //新增 const handleAdd = () => { - labResultRef.value?.handleAdd(); + // labResultRef.value?.handleAdd(); + openItemDictDialog(); }; function handleUpdate(){ } @@ -437,19 +602,76 @@ function handleDelete(){ function loadingPatLabel(){ // labPatRef.value?.loadingLabel(); } -function handleCheck(){ - loading.value = true; - console.log('queryParams:', queryParams.value) - check2(queryParams.value).then(response => { +function handleCheck0(){ + +} +function handleCheck(){ + 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; + }); - console.log('response:', response) - loading.value = false; - }) .catch(error => { - console.error('审核失败', error); - loading.value = false; - }); } 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 => { + loading.value = false; + if(response.code=="4") { + nextstepname.value='handleuncheck2'; + queryParams.value.problemId = response.problemId; + // 保存需要传递给API的参数 + apiParams.value = queryParams; + // 设置弹窗显示的原因文本 + currentReason.value = response.msg; + // 显示弹窗 + dialogVisible.value = true; + } + + }) .catch(error => { + console.error('解除审核失败', error); + loading.value = false; + }); } function handlePrint(){ } @@ -462,13 +684,17 @@ const handleQuery= async()=>{ await loadlabPatList(); //暂时默认打开1号样本,后面由参数控制 querydata.queryParams.ybh='1'; + isDataRefreshed.value = true; await handleQueryYbh(); + resetDataRefreshFlag(); } //切换样本号时载入 const handleQueryYbh = async()=>{ if (checkQuery()===false) return false + isDataRefreshed.value = true; await fetchLabPat(); await fetchLabResults(); + resetDataRefreshFlag(); } //主键空置拦截 function checkQuery(){ @@ -488,7 +714,137 @@ function checkQuery(){ yq0.value=querydata.queryParams.yq ybh0.value=querydata.queryParams.ybh } +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} - 项目字典数据(格式需匹配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 []; // 失败时返回空数组,避免弹窗报错 + } +}; + + +// -------------------------- 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}`); + } +}; //打开页面需要先初始化的内容都放这里 onMounted(() => { loadYqConfig(); @@ -497,6 +853,7 @@ onMounted(() => { loadlabPatList(); }) +