From 036d756fbd25abbbb606de7545bd5f2054009b64 Mon Sep 17 00:00:00 2001 From: yueli Date: Fri, 17 Jul 2026 13:45:38 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=89=8D=E7=AB=AF=20product.vue=20permi?= =?UTF-8?q?ssionMap=20null=E2=86=92=E6=98=BE=E5=BC=8F=E6=9D=83=E9=99=90?= =?UTF-8?q?=E7=A0=81=20+=20fetchMaterialSuggestions=20=E6=94=B9=E7=94=A8?= =?UTF-8?q?=20async/await=20=E4=BF=AE=E5=A4=8D=E9=A6=96=E6=AC=A1=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E7=A9=BA=E7=99=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/stock/inbound/product.vue | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/inventory-web/src/views/stock/inbound/product.vue b/inventory-web/src/views/stock/inbound/product.vue index da3119a..753eb7e 100644 --- a/inventory-web/src/views/stock/inbound/product.vue +++ b/inventory-web/src/views/stock/inbound/product.vue @@ -796,11 +796,9 @@ const permissionMap: Record = { quality_status: 'inbound_product:quality_status', in_quantity: 'inbound_product:in_quantity', stock_quantity: 'inbound_product:stock_quantity', - stock_quantity: 'inbound_product:stock_quantity', - available_quantity: 'inbound_product:available_quantity', available_quantity: 'inbound_product:available_quantity', + warehouse_loc: null, warehouse_location: 'inbound_product:warehouse_location', - warehouse_loc: 'inbound_product:warehouse_location', bom_code: 'inbound_product:bom_code', bom_version: 'inbound_product:bom_version', work_order_code: 'inbound_product:work_order_code', @@ -824,13 +822,19 @@ const visibleColumnProps = ref([]) // 1. 获取唯一缓存 Key const getStorageKey = () => `MOM_INBOUND_PROD_COLS_V2_${userStore.username || 'DEFAULT'}`; -// 2. 检查列权限(依赖 permissionMap) +// 2. 检查列权限 const hasColumnPermission = (prop: string) => { if (userStore.role === 'SUPER_ADMIN' || userStore.username === 'IRIS') { return true } + if (!(prop in permissionMap)) { + return false // 不在映射中 → Default Deny + } const code = permissionMap[prop] - return code ? userStore.hasPermission(code) : false + if (code === null || code === undefined) { + return true // 基础字段,无需权限 + } + return userStore.hasPermission(code) } // 3. 初始化列权限 @@ -1041,15 +1045,21 @@ const rules = { // Material Search & Population Logic // ------------------------------------ -const fetchMaterialSuggestions = (query: string, cb: (results: any[]) => void) => { - const rawQuery = String(query || '') - const safeQuery = rawQuery.replace(/[\x00-\x1F\x7F-\x9F\u200B-\u200D\uFEFF]/g, '').trim() +const fetchMaterialSuggestions = async (query: string, cb: (results: any[]) => void) => { + const safeQuery = String(query || '').replace(/[\x00-\x1F\x7F-\x9F\u200B-\u200D\uFEFF]/g, '').trim() searchLoading.value = true - searchMaterialBase(safeQuery).then((res: any) => { - const items = res.data?.items || res.data || [] - const formatted = items.map((i: any) => ({ ...i, name: i.name || i.material_name, isHistory: false })) - cb(formatted) - }).catch(() => cb([])).finally(() => { searchLoading.value = false }) + try { + const res: any = await searchMaterialBase(safeQuery) + if (res.code === 200 && res.data) { + cb((res.data?.items || res.data || []).map((i: any) => ({ ...i, isHistory: false }))) + } else { + cb([]) + } + } catch (e) { + cb([]) + } finally { + searchLoading.value = false + } } const onMaterialClear = () => {