@@ -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(rawI tems.map(async m => {
const itemsWithMethods = await Promise.all(i tems.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);
@@ -1362,8 +1362,9 @@ async function handleMethodSelect(checked, method, cat) {
existingItem.isPackage = true;
existingItem.packageId = method.packageId;
existingItem.packageName = method.packageName || existingItem.packageName; // #428修复: 确保 packageName 同步
existingItem.expanded = true; // #428修复: 有套餐时默认展开,展示套餐明细
// 预加载套餐明细
loadPackageDetailsForItem(existingItem);
await loadPackageDetailsForItem(existingItem);
}
updateMethodDisplay();
return;
@@ -1399,9 +1400,10 @@ async function handleMethodSelect(checked, method, cat) {
};
selectedItems.value.push(newItem);
// 如果是套餐,预加载套餐明细
// 如果是套餐,预加载套餐明细并默认展开
if (newItem.isPackage && newItem.packageId) {
loadPackageDetailsForItem(newItem) ;
newItem.expanded = true ;
await loadPackageDetailsForItem(newItem);
}
// 自动回填执行科室
@@ -1523,7 +1525,10 @@ async function handleItemSelect(checked, item, cat) {
// Bug #384修复 + #426修复: 展开/收起项目卡片
async function toggleItemExpand ( item ) {
item . expanded = ! item . expanded ;
if ( item . expanded && ( item . isPackage || item . packageName ) && ( ! item . packageDetails || item . packageDetails . length === 0 ) && ! item . packageDetailsLoading ) {
const carrier = getPackageCarrier ( item ) ;
const hasDetails = Array . isArray ( item . packageDetailsDisplay ) && item . packageDetailsDisplay . length > 0
|| Array . isArray ( carrier ? . packageDetails ) && carrier . packageDetails . length > 0 ;
if ( item . expanded && ( item . isPackage || item . packageName ) && ! hasDetails && ! item . packageDetailsLoading ) {
await loadPackageDetailsForItem ( item ) ;
}
if ( item . expanded && shouldShowPackageBody ( item ) ) {