@@ -582,15 +582,30 @@ function handleResetSearch() {
// 初始化默认日期范围为近一周
handleResetSearch();
// 🔧 BugFix#426: 懒加载套餐明细
// 🔧 BugFix#426/#430 : 懒加载套餐明细(支持 packageName 解析)
async function loadPackageDetails(row, treeNode, resolve) {
if (! row.packageId) {
let packageId = row.packageId;
if (!packageId && row.packageName) {
try {
const pkgRes = await listCheckPackage({ packageName: row.packageName });
let packages = pkgRes?.data || [];
if (!Array.isArray(packages)) {
packages = packages.records || packages.data || [];
}
if (packages.length > 0) {
packageId = packages[0].id;
}
} catch (err) {
console.error('套餐名称解析失败:', err);
}
}
if (!packageId) {
resolve([]);
return;
}
try {
const res = await request({
url: `/system/check-type/package/${row. packageId}/details`,
url: `/system/check-type/package/${packageId}/details`,
method: 'get'
});
const list = parsePackageDetailsPayload(res);
@@ -624,9 +639,9 @@ function getPackageDetailsList(item) {
return Array.isArray(carrier?.packageDetails) ? carrier.packageDetails : [];
}
/** 有套餐 ID 的已选行才展示右侧套餐区(加载中 / 空 / 明细列表) */
/** 有套餐 ID 或 packageName 的已选行才展示右侧套餐区(加载中 / 空 / 明细列表) */
function shouldShowPackageBody(item) {
return !!getPackageCarrier(item)?.packageId;
return !!( getPackageCarrier(item)?.packageId || item.packageName || item.packageId) ;
}
/** 金额展示:统一两位小数 */
@@ -1058,7 +1073,8 @@ const filteredCategoryList = computed(() => {
const key = dictSearchKey.value.toLowerCase();
return categoryList.value.map(cat => ({
...cat,
items: cat.items.filter(item => (item.name || '').toLowerCase().includes(key))
items: cat.items.filter(item => (item.name || '').toLowerCase().includes(key)),
methods: cat.methods || []
})).filter(cat => cat.items.length > 0);
});
@@ -1365,10 +1381,10 @@ async function handleMethodSelect(checked, method, cat) {
const existingItem = selectedItems.value.find(s => s.id === targetItem.id);
if (existingItem) {
existingItem.selectedMethod = method;
// 从方法中获取套餐信息
if (method.packageId) {
// 从方法中获取套餐信息(支持 packageId 或 packageName 解析)
if (method.packageId || method.packageName ) {
existingItem.isPackage = true;
existingItem.packageId = method.packageId;
existingItem.packageId = method.packageId || existingItem.packageId ;
existingItem.hasChildren = true; // #426修复
existingItem.packageName = method.packageName || existingItem.packageName; // #428修复: 确保 packageName 同步
// 预加载套餐明细
@@ -1405,12 +1421,12 @@ async function handleMethodSelect(checked, method, cat) {
isPackage: !!method.packageId || !!targetItem.packageName,
packageId: method.packageId || targetItem.packageId || null,
packageName: method.packageName || targetItem.packageName || null, // #428修复: 复制 packageName, 确保套餐明细可加载
hasChildren: !!(method.packageId || targetItem.packageId ) // #426修复: 树形表格懒加载展开标记
hasChildren: !!(method.packageId || method.packageName || targetItem.packageId || targetItem.packageName ) // #426修复: 树形表格懒加载展开标记,支持 packageName 解析
};
selectedItems.value.push(newItem);
// 如果是套餐,预加载套餐明细
if (newItem.isPackage && newItem.packageId) {
if (newItem.isPackage && ( newItem.packageId || newItem.packageName) ) {
loadPackageDetailsForItem(newItem);
}
@@ -1548,7 +1564,7 @@ async function toggleItemExpand(item) {
async function selectMethodCheckbox ( checked , item , method ) {
if ( checked ) {
item . selectedMethod = method ;
if ( item . expanded && method . packageId ) {
if ( item . expanded && ( method . packageId || method . packageName ) ) {
loadPackageDetailsForItem ( item ) ;
}
// 动态加载该方法对应的套餐明细
@@ -1613,8 +1629,9 @@ async function loadMethodPackageDetails(item, method) {
/** 检查明细表格中切换检查方法 */
async function onDetailMethodChange ( row , val ) {
row . selectedMethod = val || null ;
if ( val ? . packageId ) {
row . packageId = val . packageId ;
if ( val ? . packageId || val ? . packageName ) {
row . packageId = val . packageId || row . packageId ;
row . packageName = val . packageName || row . packageName ;
row . isPackage = true ;
row . hasChildren = true ; // #426修复
}