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

View File

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