# 后端 fix 通知 — 产品分享鉴权改为多角色 union 查 CUSTOMIZER

**日期**: 2026-05-11
**类型**: 后端鉴权逻辑修复 (PR #1919 内部 follow-up)
**模块**: 产品管理 → 产品列表 → 分享产品
**通知**: @mmg
**前端是否需改动**: **否**(接口契约零变化)
**严重性**: P0(用户 3 次反馈,核心功能不可用)

---

## ⚠️ 关键变化

PR #1919 上线后用户实测「自己作为定制师角色 → 点分享 → 后端返 403 无产品分享权限」。

**PR #1934(commit `e6cc3d73`)** 已合 dev + 测试服已部署 + QA 双正例通过。

### 根因
- `PermissionService.hasPermission` 只查 `admin.currentRoleId` **单角色** + Redis 24h 缓存
- admin 可挂多角色,实测 wx 持 8 个角色,但旧逻辑只看 currentRoleId 单角色查权限点
- 与「持 CUSTOMIZER 角色就能分享」的业务直觉不符

### 修复
- `ProductShareService.share` 第一步从 `hasPermission(PRODUCT_SHARE)` 改为
  **`AdminBasicDTO.roleKeys 含 CUSTOMIZER`**(union 多角色)
- 与第二步 `targetAdmin.roleKeys` 校验**同一套数据源**,语义统一
- 删 `PERM_PRODUCT_SHARE` 常量(不再消费该权限点)

### 业务规则
**有 CUSTOMIZER 角色 → 可分享**(union 多角色判断)。
不需要再单独绑定 PRODUCT_SHARE 权限点 — 历史 V_003 / V_001 的权限绑定保留不删,只是不再被消费。

---

## 接口契约零变化

`POST /admin/product/item/{id}/share` 入参 / 响应字段 / 错误码语义 0 改动,前端无需任何变更。

### 错误文案微调

| 旧 | 新 |
|----|-----|
| `无产品分享权限 (PRODUCT_SHARE)` | `无产品分享权限, 仅持定制师角色 (CUSTOMIZER) 可分享产品` |

如果前端 toast 有匹配旧文案的 if-else(不太可能),需要同步调整。直接显示 `message` 字段无需改。

---

## ✅ 测试服已验证(2026-05-11 10:36+)

| 测试主体 | 角色 union | 接口 | 结果 |
|---|---|---|---|
| **wx**(adminId=2021059720172838914) | `ADMIN, CUSTOMER_SERVICE, CUSTOMIZER, MATERIAL_ADMIN, OPERATOR, ROOM_MANAGER, SUPER_ADMIN, VEHICLE_MANAGER` (8 角色) | `POST /admin/product/item/2045018534152478721/share` `{"targetAdminId":1002}` | 200, newProductId=2053665899663024129, "游牧的森林·南线经典（来自wx的分享）" |
| **lixiaosong**(adminId=2033349910786715649) | `CUSTOMIZER` (单角色) | `POST /admin/product/item/2044704111294672897/share` `{"targetAdminId":1002}` | 200, newProductId=2053665998405316609, "嗨冰雪3.0南线（6天5晚）（来自lixiaosong的分享）" |

两个典型 admin 都成功,产品名中文全角括号正确,无回归。

---

## 不影响范围

- 接口路径 / Method / Request / Response schema 零变化
- 第二步 targetAdmin 校验(roleKeys 含 CUSTOMIZER)逻辑不变,继续 union 多角色
- `admin_permission` 表 PRODUCT_SHARE 权限点 + role binding 不删,历史兼容
- 其他业务模块(如订单分配定制师 / 工单等)未受影响

---

## 相关 PR

| PR | 说明 | 状态 |
|----|------|------|
| #1919 | 实现 admin 分享产品功能(Closes #1918) | ✅ 已合 |
| #1924 | 修 #1919 的中文括号 + fee_item 丢数据 | ✅ 已合 + 部署 |
| #1930 | customizers 接口加 enterpriseWechatName | ✅ 已合 + 部署 |
| #1933 | customizers 字段兜底 username + CUSTOMIZER 加 PRODUCT_SHARE 权限 | ✅ 已合 + 部署(但因单 currentRoleId + Redis 缓存原因实际未生效) |
| **#1934** | **本通知**:share 鉴权改为多角色 union 查 CUSTOMIZER(根本性修复) | ✅ 已合 + 部署 + QA 通过 |

---

**联系人**: wx
