Fix Bug #408: 门诊医生站:检查标签页:选中检查申请记录后,“检查明细”标签页显示“暂无数据”

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
关羽
2026-05-14 17:19:22 +08:00
parent 560813d009
commit 571f254d0e

View File

@@ -1226,22 +1226,18 @@ function handleRowClick(row) {
selectedItems.value = []; selectedItems.value = [];
activeDetailTab.value = 'applyForm'; activeDetailTab.value = 'applyForm';
request({ url: `/exam/apply/${row.applyNo}`, method: 'get' }).then(async res => { request({ url: `/exam/apply/${row.applyNo}`, method: 'get' }).then(async res => {
// 响应结构判定:Axios拦截器对 code===200 返回 res.dataAjaxResult体 // 响应结构: Axios拦截器对code===200返回res.dataAjaxResult体
// 但某些情况下可能返回完整 Axios 响应 {data: AjaxResult}。 // 结构为 { code: 200, data: examApply实体, items: [明细数组] }
// 用 res.code 判定是否已是 AjaxResult 体,避免二次解包导致 items 丢失。 const items = Array.isArray(res.items) ? res.items : [];
const isAjaxResult = res && typeof res === 'object' && res.code !== undefined; const dataObj = res.data || {};
const ajaxBody = isAjaxResult ? res : (res.data || res);
// items 在 AjaxResult 顶层data 字段是 ExamApply 实体 // 先填充表单字段
const rawItems = Array.isArray(ajaxBody.items) ? ajaxBody.items : []; if (dataObj && typeof dataObj === 'object') Object.assign(form, dataObj);
const detailData = ajaxBody.data || {};
if (detailData && typeof detailData === 'object') Object.assign(form, detailData); if (items.length > 0) {
if (rawItems.length > 0) {
try { try {
// 为每个项目加载检查方法 // 为每个项目加载检查方法
const itemsWithMethods = await Promise.all(rawItems.map(async m => { const itemsWithMethods = await Promise.all(items.map(async m => {
const item = { const item = {
id: m.itemCode, name: m.itemName, id: m.itemCode, name: m.itemName,
price: m.itemFee || 0, quantity: 1, price: m.itemFee || 0, quantity: 1,
@@ -1260,7 +1256,7 @@ function handleRowClick(row) {
if (m.bodyPartCode) { if (m.bodyPartCode) {
try { try {
const methodRes = await searchCheckMethod({ checkType: m.bodyPartCode }); const methodRes = await searchCheckMethod({ checkType: m.bodyPartCode });
// Bug #384修复: 正确解析 API 返回结构 // 正确解析 API 返回结构
let methodData = methodRes?.data?.data || methodRes?.data || methodRes?.rows || methodRes; let methodData = methodRes?.data?.data || methodRes?.data || methodRes?.rows || methodRes;
if (!Array.isArray(methodData) && methodRes?.data && Array.isArray(methodRes.data.data)) { if (!Array.isArray(methodData) && methodRes?.data && Array.isArray(methodRes.data.data)) {
methodData = methodRes.data.data; methodData = methodRes.data.data;
@@ -1270,16 +1266,15 @@ function handleRowClick(row) {
id: md.id, id: md.id,
name: md.name, name: md.name,
code: md.code, code: md.code,
price: m.itemFee || 0, // fallback 到已保存的价格 price: m.itemFee || 0,
packageName: md.packageName || '', packageName: md.packageName || '',
packageId: md.packageId || null, packageId: md.packageId || null,
packagePrice: md.packagePrice || null, // Bug #384修复: 套餐价格 packagePrice: md.packagePrice || null,
serviceFee: md.serviceFee || null serviceFee: md.serviceFee || null
})); }));
// 如果有已保存的检查方法信息,尝试匹配 // 回充已保存的检查方法
if (m.checkMethodId) { 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) { if (item.selectedMethod?.packageId) {
item.isPackage = true; item.isPackage = true;
item.packageId = item.selectedMethod.packageId; item.packageId = item.selectedMethod.packageId;
@@ -1295,22 +1290,27 @@ function handleRowClick(row) {
} }
} catch (err) { } catch (err) {
console.error('加载检查方法失败', err); console.error('加载检查方法失败', err);
// 单个项目加载失败不影响其他项目,继续返回 item
} }
} }
return item; return item;
})); }));
// Bug #408修复: 确保明细数据正确加载到selectedItems
selectedItems.value = itemsWithMethods; selectedItems.value = itemsWithMethods;
// 加载套餐明细(单个失败不影响其他项目和明细显示)
for (const it of selectedItems.value) { for (const it of selectedItems.value) {
if (getPackageCarrier(it)?.packageId) { if (getPackageCarrier(it)?.packageId) {
await loadPackageDetailsForItem(it); try {
await loadPackageDetailsForItem(it);
} catch (e) {
console.error('加载套餐明细失败:', it.name, e);
}
} }
it.expanded = !!getPackageCarrier(it)?.packageId; it.expanded = !!getPackageCarrier(it)?.packageId;
} }
syncCategoryChecked(); syncCategoryChecked();
// Bug #384修复: 回充后更新检查方法显示 // Bug #384修复: 回充后更新检查方法显示
updateMethodDisplay(); updateMethodDisplay();
// 修复【#408】加载申请单详情后自动切换到检查明细页签,确保已加载的明细数据可见 // Bug #408修复: 加载申请单详情后自动切换到检查明细页签,确保已加载的明细数据可见
activeDetailTab.value = 'applyDetail'; activeDetailTab.value = 'applyDetail';
} catch (err) { } catch (err) {
console.error('加载申请单详情失败', err); console.error('加载申请单详情失败', err);