hl-api-changelog/changelogs/2026-05/09_fix_admin_product-share-2-regressions.md
API Changelog Bot d83a8175ba fix notice: admin 产品分享 2 项回归 (中文括号 + fee_item 丢数据) 已修 (PR #1924)
PR #1919 接口上线后 QA 实测发现 2 个 P1 回归,PR #1924 已修复 + dev 已部署 +
测试服 round-trip 已验证。前端无需改动 (响应 schema 不变),通知前端心里有数。
2026-05-09 20:52:11 +08:00

2.9 KiB

后端 fix 通知 — admin 产品分享 2 项回归已修复

日期: 2026-05-09 类型: 后端修复 (PR #1919 内部回归) 模块: 产品管理 → 产品列表 → 分享产品(ShareModal) 通知: @mmg 前端是否需改动: 否(响应 schema 不变) 严重性: 高 (P1)→ 已修


⚠️ 关键变化

PR #1919 (Closes #1918) 实现的产品分享接口 POST /admin/product/item/{id}/share 上线后,经测试服真实跑发现 2 个 P1 回归 BUG。PR #1924 (commit e6a54fde) 已修复并合 dev、测试服已部署、QA 已复测通过:

  1. 产品名后缀英文括号 → 中文全角括号(契约/Swagger/前端通知约定的就是中文全角)
  2. fee_item 深拷贝丢数据(原本可能丢 60-70%,现已全量复制)

前端无需做任何改动,响应 schema / 字段 / 语义都不变,只是落库/响应里的实际数据现在符合契约。


BUG #1 — 产品名后缀字符

修前:新产品名(来自admin的分享) (英文半角括号 U+0028 / U+0029) 修后:新产品名来自admin的分享 (中文全角括号 U+FF08 / U+FF09)

前端验收:

  • ShareModal 调 share 接口后跳转到新产品编辑页,标题应显示中文全角括号后缀。
  • 不需要前端代码做任何字符判断/兼容,直接展示后端返回的 newProductName 即可。

BUG #2 — fee_item 深拷贝丢数据

修前:源产品 fee_item N 条 → 新产品仅复制部分(实测 27 → 9,部分类别全丢),原因是 MyBatis-Plus Db.saveBatch 的 KeyGenerator 在批处理 reuse PreparedStatement 场景下时机不可靠,部分行 id 注入失败触发 NOT NULL 约束冲突被静默跳过。

修后:ProductCopyService.copyOneToMany 显式 IdWorker.getId() 预分配雪花 id,根除丢条。同步把 itinerary 节点/酒店/路线点的 setId(null) 也改为预分配,语义统一。

前端验收:

  • 分享后跳转到新产品的"费用项"配置页,条目数应等于源产品费用项条目数,且每条字段一致。

测试服已验证(2026-05-09 20:45+)

POST /admin/product/item/2044704111294672897/share  body {"targetAdminId":1002}
→ 200, newProductName 末字符 U+FF09 ✅
→ DB product.name 落库为「...来自admin的分享」中文全角 ✅
→ DB product_fee_item COUNT(*) = 源产品全量,id 全部 NOT NULL 互不重复 ✅

不影响范围

  • 接口契约(URL / Method / 请求 VO / 响应 VO)零变化
  • 鉴权 / 校验 / 幂等逻辑零变化
  • 其他复制场景(POST /admin/product/item/{id}/copy 老接口)同步受益(同一 copyOneToMany 修复路径)

相关 PR

PR 说明 状态
#1919 实现 admin 分享产品功能 (Closes #1918) 已合 dev,但暴露 2 个回归
#1924 本通知关联:修复 #1919 暴露的 2 个 P1 回归(中文括号 + fee_item 全量复制) 已合 dev + 测试服已部署 + QA 通过

联系人: wx