diff --git a/changelogs/2026-05/11_fix_admin_product-share-followup-2-fixes.md b/changelogs/2026-05/11_fix_admin_product-share-followup-2-fixes.md new file mode 100644 index 0000000..d41bb23 --- /dev/null +++ b/changelogs/2026-05/11_fix_admin_product-share-followup-2-fixes.md @@ -0,0 +1,90 @@ +# 后端 fix 通知 — 产品分享 2 项 follow-up 修复(企微名兜底 + CUSTOMIZER 加分享权限) + +**日期**: 2026-05-11 +**类型**: 后端修复 (PR #1919 内部 follow-up) +**模块**: 产品管理 → 产品列表 → 分享产品(ShareModal) +**通知**: @mmg +**前端是否需改动**: **否**(响应 schema / 字段名零变化,后端兜底) +**严重性**: P1(用户两次反馈,核心功能不可用) + +--- + +## ⚠️ 关键变化 + +**PR #1933(commit `0a817914`)** 已合 dev + 测试服部署 + QA 双验证通过。修了 PR #1919 上线后用户实测发现的 2 个 P1 问题: + +1. **`customizers` 接口 enterpriseWechatName 后端兜底回落 username** + - 修前:未绑企微的 admin → `enterpriseWechatName: null` → 前端下拉显示空白行 + - 修后:未绑企微 / 脏数据 → `enterpriseWechatName: ` → 下拉显示登录名兜底 + - 已绑企微的 admin 行为不变,仍返中文真名 + +2. **CUSTOMIZER 角色加 PRODUCT_SHARE 权限** + - 修前:CUSTOMIZER 角色 admin 调 `POST /admin/product/item/{id}/share` → `code:403 无产品分享权限 (PRODUCT_SHARE)` + - 修后:Flyway `V20260511_001` 给 CUSTOMIZER 角色加 PRODUCT_SHARE 权限,定制师之间互相分享产品的业务场景可用 + - 老板自己也是定制师身份,所以这是核心需求 + +--- + +## 前端 mmg 完全无需改动 + +ShareModal.vue 当前直接用 `o.enterpriseWechatName` 作为 label,后端字段语义已经从"企微真名(可空)"变成"展示名(企微名/未绑回落 username)",前端零改动即可正常显示。 + +如果你之前考虑过前端加 `fallback chain`(`o.enterpriseWechatName || o.username`),**现在不需要了**,后端兜底已经覆盖。 + +--- + +## ✅ 测试服验证(2026-05-11 10:24 部署) + +### enterpriseWechatName 字段实测(20 条 customizer 抽 5 条) + +| adminId | username | 绑企微 | 接口返 enterpriseWechatName | ✅ | +|---|---|---|---|---| +| 1001 | admin | 无 | `"admin"` | ✅ 兜底 username | +| 1002 | test_admin | 脏数据 | `"test_admin"` | ✅ 兜底 username | +| 2021059720172838914 | wx | 已绑 | `"王骁"` | ✅ 中文真名 | +| 2027579942221352962 | mmg | 已绑 | `"米明光"` | ✅ 中文真名 | +| 2033349910786715649 | lixiaosong | 已绑 | `"小松"` | ✅ 中文真名 | + +**全列表 20 条 customizer,`enterpriseWechatName` 字段 0 个 null。** + +### CUSTOMIZER 调 share 接口实测 + +用 lixiaosong 单 CUSTOMIZER 角色 token 调: +```bash +POST /admin/product/item/2044704111294672897/share body {"targetAdminId":1002} +→ {"code":200,"data":{"newProductId":"2053662735618506754","newProductNo":"C260511001","newProductName":"嗨冰雪3.0南线(6天5晚)(来自lixiaosong的分享)"}} +``` + +### Flyway 落库 + +`flyway_schema_history`:`version=20260511.001` success=1,CUSTOMIZER 角色已绑 PRODUCT_SHARE 权限。 + +--- + +## 不影响范围 + +- 接口路径 / Method / Request / Response schema 零变化 +- 其他持 PRODUCT_SHARE 权限的角色(SUPER_ADMIN / ADMIN)行为不变 +- 没绑企微的 admin 的其他字段(`username` / `avatar`)也不变,前端可继续按需用 + +--- + +## 相关 PR + +| PR | 说明 | 状态 | +|----|------|------| +| #1919 | 实现 admin 分享产品功能(Closes #1918) | ✅ 已合 | +| #1924 | 修复 PR #1919 暴露的 2 个回归(中文括号 + fee_item 全量) | ✅ 已合 + 部署 | +| #1930 | customizers 接口加 enterpriseWechatName 企微姓名字段 | ✅ 已合 + 部署 | +| **#1933** | **本通知**:enterpriseWechatName 兜底 username + CUSTOMIZER 加 PRODUCT_SHARE 权限 | ✅ 已合 + 部署 + QA 通过 | + +--- + +## 历史 changelog 关系 + +- `09_feat_admin_customizers-add-enterprise-wechat-name.md`:首次提到 fallback 建议 — **本通知更新**:后端已兜底,前端无需 fallback +- `09_frontend_notice_admin_share-modal-show-enterprise-wechat-name-P0.md`(P0 紧急,建议 `label = o.enterpriseWechatName`)— **仍然有效**:label 字段名是对的,后端已兜底没值时回落 username + +--- + +**联系人**: wx