# 管理员全模块全权限豁免 ## 功能说明 管理员账号(admin、普通2、最高1 角色)在全部模块拥有所有查看、编辑、新增、删除权限,不再受各模块"归属人/维护人"等硬编码限制约束。 全局权限层(`*:*:*` 权限、数据范围过滤、租户行级过滤)原本已对 admin 放行,本改动解除的是各模块中**归属人/维护人校验**的额外限制。 ## admin 判定方式 前端统一使用(与 `approvalProcess/index.vue`、`safeWorkApproval/index.vue` 既有模式一致): ```js const isAdminUser = computed(() => ["admin", "普通2", "最高1"].some(r => (userStore.roles || []).includes(r)) ); ``` 后端对应 `SecurityUtils.isAdmin(userId)`(`SecurityUtils.java`)= 拥有 `普通2` / `admin` / `最高1` 任一角色。 ## 涉及页面与改动 | 模块 | 页面 | 限制点 | 改动 | |------|------|--------|------| | 销售 | `salesManagement/salesLedger/index.vue` | 编辑/删除按钮仅维护人可操作;非维护人金额列显示 `*****`;合计掩码 | `canEditLedger`/`canDeleteLedger` 加 `\|\| isAdminUser.value`;两个金额 formatter 加 `&& !isAdminUser.value`;`summarizeChildrenTable` 同样豁免 | | 客户 | `basicData/customerFileOpenSea/index.vue` | 公海删除拦截"不可删除他人维护的数据" | 删除 filter 加 `&& !isAdminUser.value` | | 客户 | `basicData/customerFile/index.vue` | 私海删除拦截"公海分配的客户不能删除" | 删除 filter 加 `&& !isAdminUser.value` | | 供应商 | `basicData/supplierManage/components/HomeTab.vue`、`BlacklistTab.vue` | 删除拦截他人维护 | 删除 filter 加 `&& !isAdminUser.value` | | 采购 | `collaborativeApproval/purchaseApproval/index.vue` | 删除拦截他人维护 | 删除 filter 加 `&& !isAdminUser.value` | | 质量 | `qualityManagement/rawMaterialInspection/index.vue`、`processInspection/index.vue`、`finalInspection/index.vue` | 检验/提交按钮仅检验员本人可操作 | disabled 判定加 `&& !isAdminUser.value` | | 客服 | `customerService/feedbackRegistration/index.vue` | 删除拦截他人数据 | 删除 filter 加 `&& !isAdminUser.value` | | 安全 | `safeProduction/dangerInvestigation/index.vue` | 整改按钮仅归属人可操作 | `isRectify` 对 admin 恒为 `false`(按钮不禁用) | | 生产 | `productionManagement/workOrder/index.vue` | 报工仅工单/工序报工人可操作;排产仅工序人员可操作 | `canCurrentUserReport` 加 `isAdminUser.value`;`canScheduleByWorkOrderNo` 对 admin 直接返回 `true` | ## 后端修改点 ### `basic/controller/CustomerPrivatePoolController.java`(客户私海列表) ```java @GetMapping("/listPage") @ApiOperation("客户(私海)列表") public R listPage(CustomerPrivatePoolDto customerPrivatePoolDto, Page page){ // 管理员可查看全部客户,不受归属人限制 if (!SecurityUtils.isAdmin(SecurityUtils.getUserId())) { customerPrivatePoolDto.setBoundId(SecurityUtils.getUserId()); } IPage listPage = customerPrivatePoolService.listPage(page, customerPrivatePoolDto); return R.ok(listPage); } ``` > `CustomerPrivatePoolMapper.xml` 的 `boundId != null` 动态条件天然支持空值跳过,无需改 mapper。 ## 注意事项 - 各页面需在 `