From 571f254d0e99561fd4ff810e4cf944fea8384463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Thu, 14 May 2026 17:19:22 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20Bug=20#408:=20=E9=97=A8=E8=AF=8A=E5=8C=BB?= =?UTF-8?q?=E7=94=9F=E7=AB=99=EF=BC=9A=E6=A3=80=E6=9F=A5=E6=A0=87=E7=AD=BE?= =?UTF-8?q?=E9=A1=B5=EF=BC=9A=E9=80=89=E4=B8=AD=E6=A3=80=E6=9F=A5=E7=94=B3?= =?UTF-8?q?=E8=AF=B7=E8=AE=B0=E5=BD=95=E5=90=8E=EF=BC=8C=E2=80=9C=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E6=98=8E=E7=BB=86=E2=80=9D=E6=A0=87=E7=AD=BE=E9=A1=B5?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E2=80=9C=E6=9A=82=E6=97=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 --- .../examination/examinationApplication.vue | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/openhis-ui-vue3/src/views/doctorstation/components/examination/examinationApplication.vue b/openhis-ui-vue3/src/views/doctorstation/components/examination/examinationApplication.vue index 06acf38c1..dc50881a1 100755 --- a/openhis-ui-vue3/src/views/doctorstation/components/examination/examinationApplication.vue +++ b/openhis-ui-vue3/src/views/doctorstation/components/examination/examinationApplication.vue @@ -1226,22 +1226,18 @@ function handleRowClick(row) { selectedItems.value = []; activeDetailTab.value = 'applyForm'; request({ url: `/exam/apply/${row.applyNo}`, method: 'get' }).then(async res => { - // 响应结构判定:Axios拦截器对 code===200 返回 res.data(AjaxResult体), - // 但某些情况下可能返回完整 Axios 响应 {data: AjaxResult}。 - // 用 res.code 判定是否已是 AjaxResult 体,避免二次解包导致 items 丢失。 - const isAjaxResult = res && typeof res === 'object' && res.code !== undefined; - const ajaxBody = isAjaxResult ? res : (res.data || res); + // 响应结构: Axios拦截器对code===200返回res.data(AjaxResult体) + // 结构为 { code: 200, data: examApply实体, items: [明细数组] } + const items = Array.isArray(res.items) ? res.items : []; + const dataObj = res.data || {}; - // items 在 AjaxResult 顶层,data 字段是 ExamApply 实体 - const rawItems = Array.isArray(ajaxBody.items) ? ajaxBody.items : []; - const detailData = ajaxBody.data || {}; + // 先填充表单字段 + if (dataObj && typeof dataObj === 'object') Object.assign(form, dataObj); - if (detailData && typeof detailData === 'object') Object.assign(form, detailData); - - if (rawItems.length > 0) { + if (items.length > 0) { try { // 为每个项目加载检查方法 - const itemsWithMethods = await Promise.all(rawItems.map(async m => { + const itemsWithMethods = await Promise.all(items.map(async m => { const item = { id: m.itemCode, name: m.itemName, price: m.itemFee || 0, quantity: 1, @@ -1260,7 +1256,7 @@ function handleRowClick(row) { if (m.bodyPartCode) { try { const methodRes = await searchCheckMethod({ checkType: m.bodyPartCode }); - // Bug #384修复: 正确解析 API 返回结构 + // 正确解析 API 返回结构 let methodData = methodRes?.data?.data || methodRes?.data || methodRes?.rows || methodRes; if (!Array.isArray(methodData) && methodRes?.data && Array.isArray(methodRes.data.data)) { methodData = methodRes.data.data; @@ -1270,16 +1266,15 @@ function handleRowClick(row) { id: md.id, name: md.name, code: md.code, - price: m.itemFee || 0, // fallback 到已保存的价格 + price: m.itemFee || 0, packageName: md.packageName || '', packageId: md.packageId || null, - packagePrice: md.packagePrice || null, // Bug #384修复: 套餐价格 + packagePrice: md.packagePrice || null, serviceFee: md.serviceFee || null })); - // 如果有已保存的检查方法信息,尝试匹配 + // 回充已保存的检查方法 if (m.checkMethodId) { - item.selectedMethod = item.methods.find(md => md.id === m.checkMethodId) || null; - // 从已保存的方法中获取套餐信息 + item.selectedMethod = item.methods.find(md => String(md.id) === String(m.checkMethodId)) || null; if (item.selectedMethod?.packageId) { item.isPackage = true; item.packageId = item.selectedMethod.packageId; @@ -1295,22 +1290,27 @@ function handleRowClick(row) { } } catch (err) { console.error('加载检查方法失败', err); - // 单个项目加载失败不影响其他项目,继续返回 item } } return item; })); + // Bug #408修复: 确保明细数据正确加载到selectedItems selectedItems.value = itemsWithMethods; + // 加载套餐明细(单个失败不影响其他项目和明细显示) for (const it of selectedItems.value) { if (getPackageCarrier(it)?.packageId) { - await loadPackageDetailsForItem(it); + try { + await loadPackageDetailsForItem(it); + } catch (e) { + console.error('加载套餐明细失败:', it.name, e); + } } it.expanded = !!getPackageCarrier(it)?.packageId; } syncCategoryChecked(); // Bug #384修复: 回充后更新检查方法显示 updateMethodDisplay(); - // 修复【#408】:加载申请单详情后自动切换到检查明细页签,确保已加载的明细数据可见 + // Bug #408修复: 加载申请单详情后自动切换到检查明细页签,确保已加载的明细数据可见 activeDetailTab.value = 'applyDetail'; } catch (err) { console.error('加载申请单详情失败', err);