diff --git a/inventory-web/src/views/operation/scrap/approval/index.vue b/inventory-web/src/views/operation/scrap/approval/index.vue
index 15854b3..d1aa718 100644
--- a/inventory-web/src/views/operation/scrap/approval/index.vue
+++ b/inventory-web/src/views/operation/scrap/approval/index.vue
@@ -125,7 +125,7 @@
type="warning" plain size="small" :loading="row._executing" @click="openExecute(row)"
>执行报废
撤回
@@ -197,9 +197,19 @@ const rejectLoading = ref(false)
const userNameCache = ref>({})
// --- 权限 ---
+// 执行报废:需「按单报废执行」权限
const canExecute = computed(() =>
userStore.role === 'SUPER_ADMIN' || userStore.hasPermission('scrap_execute')
)
+// ★ 撤回:需「报废审批」权限(原先误用 canExecute)
+//
+// scrap_execute 比 scrap_approval 多授予 INBOUND 角色 —— 若沿用 canExecute,
+// 只具备执行权、无审批权的人也会看到撤回按钮。撤回是对单据的处置动作,
+// 应与审批同权限等级。(申请人在「申请页-我的申请单」有自己的撤回入口,
+// 走的是单据归属校验,不依赖此处。)
+const canWithdraw = computed(() =>
+ userStore.role === 'SUPER_ADMIN' || userStore.hasPermission('scrap_approval')
+)
// --- 工具 ---
const statusText = (status: number) => {