fix: restore mobile report scrolling and published product edits
Independent Staging Quality Gate / validate (push) Has been cancelled
Independent Staging Quality Gate / publish (push) Has been cancelled

Report pages now scroll inside the chat shell lock, and admin product save forks a draft or retires a published plan instead of rejecting with a generic constraint error.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-08-18 17:28:22 +08:00
parent 3c9b0bb32b
commit f4a2ba86ae
13 changed files with 398 additions and 8 deletions
+32
View File
@@ -4065,3 +4065,35 @@
- 相关记录:BUG-179(曾因通用解析器的三条建议兜底污染生时校正,本次删除使其隔离措施不再必要)、BUG-263(「跳到最新」按钮定位曾受 chip 行高度影响)、BUG-249(草稿隔离验证里包含推荐问题填入路径)、BUG-272(同一轮评审的上一项删除)
- 复发自:无
- 修复版本:本地未提交候选
## BUG-274 | 个人报告中心与报告正文在移动端无法下拉
- 状态:resolved(已推入 staging,待部署)
- 首次发现:2026-08-18
- 最近更新:2026-08-18
- 影响面:`/reports` 个人报告中心、`/reports/[reportId]` 报告阅读容器;聊天根滚动锁不放宽。
- 用户现象:移动端打开个人报告页后无法向下滑动阅读。
- 触发条件:全局 `html, body { height: 100%; overflow: hidden }` 仍然锁死根滚动。报告中心只有 `min-height: 100dvh``overflow-x: hidden`,没有被视口卡住的纵向滚动容器。报告正文虽然有独立滚动层,但高度写成 `100dvh`:在移动浏览器里它可能比 `body``100%` 更高,多出来的部分被根滚动锁裁掉,容器自己却还没溢出,所以也滑不动。
- 根因:BUG-153 只给 ready 报告加了 `100dvh + overflow-y: auto`,没有覆盖报告中心,也没有按「父级已经是 `height: 100%`」来锁高度。`overflow-x: hidden` 不会让一个随内容长高的块变成可滚动层。
- 修复:`.report-center-shell``.personal-report-reader` 都改为 `height: 100%; overflow-y: auto`,并补上 `-webkit-overflow-scrolling: touch`。报告正文另加 `touch-action: pan-y`,避免命盘 SVG 把纵向滑动吃掉。
- 验证:报告入口与阅读合同测试锁定两处容器都是 `height: 100% + overflow-y: auto`,且不得再写 `min-height: 100dvh` / `height: 100dvh`
- 防复发:任何跑在聊天根滚动锁里的独立页面,必须有「相对父级视口封顶的高度 + overflow-y: auto」。禁止只用 `min-height: 100dvh` 冒充滚动容器;也不要在 `html, body` 已是 `height: 100%` 时把子层写成未封顶的 `100dvh`
- 相关记录:BUG-153
- 复发自:BUG-153
- 修复版本:已推入 staging,待部署
## BUG-275 | 后台已发布套餐无法修改,也没有删除/下架入口
- 状态:resolved(已推入 staging,待部署)
- 首次发现:2026-08-18
- 最近更新:2026-08-18
- 影响面:`POST /api/admin/products``admin_save_product_draft`、商品管理页;已有订单/订阅的硬删除限制不放宽。
- 用户现象:编辑已发布套餐保存时返回「提交内容不符合业务约束」;列表里没有删除或下架。
- 触发条件:对已发布种子套餐(如 `standard_monthly`)调用 `action=save` 并带上该商品 id;或在后台寻找删除按钮。
- 根因:保存函数只更新 `status='draft'` 的行,已发布 id 会抛 `product_draft_not_found`PostgreSQL `22023`),被统一映射成「提交内容不符合业务约束」。即便命中草稿,审计 `after_value` 仍写入禁止字段 `code`,触发 `admin_audit_logs_after_value_check``23514`),同样被折叠成这句话。界面把所有行都标成「编辑草稿」,也没有 delete/retire API。已发布商品因订单/订阅外键不能硬删除,正确动作是下架。
- 修复:保存已发布/已下架商品时,复用该 code 的现有草稿或创建下一版本草稿,不再改正在售行。新增 `admin_delete_product`:草稿硬删除,已发布改为 `retired``enabled=false`。商品审计字段改为 `productCode`,避免踩兑换码审计的密钥字段禁令。管理页区分修改/发布/删除/下架,并把上述 SQL 异常映射成可读错误。
- 验证:数据库回归用与线上失败请求同形的权益 JSON 保存已发布月卡,必须得到新草稿且原在售行不变;再次保存更新同一草稿;删除草稿后行消失;删除已发布年卡后变为下架。API/UI 合同覆盖 `action=delete`、下架文案与错误映射。
- 防复发:后台商品写路径必须区分草稿与已发布。已发布商品的保存不得要求调用方先手建草稿;删除已发布商品只能下架,不能绕过订单/订阅外键做硬删除。`22023`/`23514` 的商品异常不得再折叠成笼统「业务约束」。写入 `audit.admin_audit_logs` 的 JSON 不得包含 `code`/`token`/`secret`/`key` 键。
- 相关记录:无
- 复发自:无
- 修复版本:已推入 staging,待部署