fix: 修复物料列表跳转联动与弹窗定位逻辑

This commit is contained in:
DXC
2026-04-27 14:41:26 +08:00
parent b002c50d81
commit 9fa471f68a
2 changed files with 37 additions and 34 deletions

View File

@ -1587,47 +1587,48 @@ const resetAdvancedFilter = () => {
}; };
onMounted(() => { onMounted(() => {
// 1. 修复背景联动:直接对 reactive 对象赋值
if (route.query.keyword) {
queryParams.keyword = route.query.keyword as string;
queryParams.searchField = 'all';
}
// 先根据权限初始化列显示状态 // 先根据权限初始化列显示状态
initColumnPermissions(); initColumnPermissions();
// 此时 getList 会带着正确的 keyword 向后端请求过滤后的数据
getList(); getList();
getOptionsList(); getOptionsList();
// 【优化】:处理外部跳转自动打开编辑弹窗 // 2. 修复弹窗锁定逻辑
console.log('--- 准备检测外部跳转参数 ---', route.query); console.log('--- 准备检测外部跳转参数 ---', route.query);
if (route.query.edit_id) { if (route.query.edit_id) {
const editId = Number(route.query.edit_id); const editId = Number(route.query.edit_id);
console.log('检测到 edit_id:', editId); const searchKeyword = (route.query.keyword as string) || '';
console.log('检测到 edit_id:', editId, '使用 keyword 搜索:', searchKeyword);
// 为了防止 API 不支持直接传 id我们改用 keyword 搜索(因为大部分 list 接口都支持 keyword // 改用 keyword 而不是无效的 id 去向后端请求数据,确保目标物料在返回的列表中
// 或者直接请求列表,拿到第一页数据进行比对 listMaterialBase({ page: 1, pageSize: 50, keyword: searchKeyword }).then((res: any) => {
listMaterialBase({ page: 1, pageSize: 50, id: editId }).then((res: any) => { let rawData = res?.data?.list ?? res?.data?.items ?? res?.data ?? [];
// 1. 尝试获取各种可能的数据结构 if (!Array.isArray(rawData) && typeof rawData === 'object' && rawData !== null) {
let rawData = res?.data?.list ?? res?.data?.items ?? res?.data ?? []; rawData = [rawData];
}
const rows = Array.isArray(rawData) ? rawData : [];
// 2. 如果后端聪明地直接返回了单条数据(对象),把它包装成数组 // 3. 去掉危险的 rows[0] 兜底,严格匹配 ID
if (!Array.isArray(rawData) && typeof rawData === 'object' && rawData !== null) { const targetRow = rows.find((r: any) => r.id === editId);
rawData = [rawData];
}
// 3. 终极兜底,确保 rows 绝对是数组 if (targetRow) {
const rows = Array.isArray(rawData) ? rawData : []; console.log('找到精准目标物料,准备弹窗:', targetRow);
console.log('兼容处理后的数组数据:', rows); setTimeout(() => {
handleEdit(targetRow);
// 4. 寻找目标行并弹窗 }, 800);
const targetRow = rows.find((r: any) => r.id === editId) || rows[0]; } else {
console.warn('未能在搜索结果中匹配到对应 ID 的物料,可能 keyword 与 ID 不匹配');
if (targetRow) { }
console.log('找到目标物料,准备弹窗:', targetRow); }).catch((error: any) => {
setTimeout(() => { console.error('自动获取物料详情失败', error);
handleEdit(targetRow); });
}, 800); }
} else {
console.warn('未在返回数据中找到该物料');
}
}).catch((error: any) => {
console.error('自动获取物料详情失败', error);
});
}
}); });
</script> </script>

View File

@ -1414,7 +1414,9 @@ const openMaterialInNewTab = () => {
const routeUrl = router.resolve({ const routeUrl = router.resolve({
path: '/material', path: '/material',
query: { query: {
edit_id: form.base_id edit_id: form.base_id,
// 【新增】:优先传递规格型号,如果没有则传名称,用于背景表格过滤
keyword: form.spec_model || form.material_name || ''
} }
}) })
window.open(routeUrl.href, '_blank') window.open(routeUrl.href, '_blank')