fix: 修复物料列表跳转联动与弹窗定位逻辑
This commit is contained in:
@ -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>
|
||||
|
||||
|
||||
@ -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')
|
||||
|
||||
Reference in New Issue
Block a user