From b5b490dabb333159c4959342d29e2f70a3cae2d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=B3=E7=BE=BD?= <关羽@gentronhealth.com> Date: Thu, 14 May 2026 09:17:25 +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"=E6=A3=80?= =?UTF-8?q?=E6=9F=A5=E6=98=8E=E7=BB=86"=E6=A0=87=E7=AD=BE=E9=A1=B5?= =?UTF-8?q?=E6=98=BE=E7=A4=BA"=E6=9A=82=E6=97=A0=E6=95=B0=E6=8D=AE"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因:handleRowClick 中 const resp = res.data || res 对 Axios 拦截器已解包的响应 进行二次解包,导致 resp 被赋为 ExamApply 实体对象(不含 items),后续 items 提取 逻辑始终返回空数组,明细列表无法加载。 修复:用 res.code !== undefined 判定 res 是否已是 AjaxResult 体,若是则直接使用, 否则再执行 res.data 解包。items 和数据提取统一从正确层级取值,避免二次解包。 Co-Authored-By: Claude Opus 4.7 --- .../examination/examinationApplication.vue | 24 ++++++++++--------- 1 file changed, 13 insertions(+), 11 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 d0e52ccc3..aff0cd2c0 100755 --- a/openhis-ui-vue3/src/views/doctorstation/components/examination/examinationApplication.vue +++ b/openhis-ui-vue3/src/views/doctorstation/components/examination/examinationApplication.vue @@ -1136,17 +1136,19 @@ function handleRowClick(row) { selectedItems.value = []; activeDetailTab.value = 'applyForm'; request({ url: `/exam/apply/${row.applyNo}`, method: 'get' }).then(async res => { - const resp = res.data || res; - // Bug #408修复: items 在 AjaxResult 顶层(res.items / resp.items),不在 ExamApply 对象内 - // 防御性提取:优先取顶层 items,兼容嵌套在 resp.data.items 的情况 - let rawItems = res.items || resp.items; - if (!rawItems && resp.data && typeof resp.data === 'object') { - rawItems = resp.data.items; - } - rawItems = rawItems || []; - const d = resp.data || resp; - if (d) Object.assign(form, d); - if (Array.isArray(rawItems) && rawItems.length > 0) { + // 响应结构判定: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); + + // items 在 AjaxResult 顶层,data 字段是 ExamApply 实体 + const rawItems = Array.isArray(ajaxBody.items) ? ajaxBody.items : []; + const detailData = ajaxBody.data || {}; + + if (detailData && typeof detailData === 'object') Object.assign(form, detailData); + + if (rawItems.length > 0) { try { // 为每个项目加载检查方法 const itemsWithMethods = await Promise.all(rawItems.map(async m => {