Files
msh-system/docs/Testing/test-0415-fix-plan.md
msh-agent 276366f98e docs(test-0415): 更新 fix-plan 状态:P0 8 项全部完成
- 顶部新增 commit 清单表
- 每项补 root cause / 修复要点 / 验收 checklist
- 当前阻塞项明确归属

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-03 02:44:13 +08:00

197 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# test-0415 反馈问题 — 修复方案与执行计划
> 源:`docs/Testing/test-0415.md`
> 维护:本文档为执行表,每修一项更新【状态】与【验收】列。
> 工作量符号S ≤ 1dM = 23dL = 1 周XL = 1 周以上(涉及功能开发/产品对齐)。
> 最近更新2026-05-03 P0 全部完成
## 0. 优先级排序与分阶段
| 阶段 | 目标 | 包含项 | 状态 |
|---|---|---|---|
| **P0** 当前迭代 | 已交付功能的 BUG 修复,影响主链路 | 4-1, 4-2, 4-3, 5-1, 6-1, 6-2, 6-3, 3-1 | ✅ 8/8 已修复,待 QA 现场回归 |
| **P0+** 信息不足 | 反馈描述不清,需测试同学补充信息 | 4-3b | 🟡 阻塞 |
| **P1** 下一迭代 | 性能/体验优化,需要后端/Prompt 调优 | 3-2, 3-3, 3-4, 2-1, 2-2 | ⏳ 待启动 |
| **P2** 待立项 | 整块新功能,需产品/排期对齐 | 1-1打卡任务/福利/邀请), 5-2一键借鉴| 🔴 待 PRD |
## 0.1 已交付 commit 清单fix/test-feedback-0403 分支)
| 项 | Commit | 摘要 |
|---|---|---|
| 4-1 食物图片归一化 | `e9c2404` | `ToolFoodServiceImpl.normalizeImageForOutput` 处理 3 类历史脏数据 |
| 4-2 按分类配置兜底默认图 | `6187a92` | 8 类 emoji+背景色映射,零新增图片资源 |
| 4-3 列表闪烁 | `c089e8c` | 空数组初始化 + `foodLoaded` 骨架占位 |
| 3-1 AI 营养师语音录入 | `82735a5` | 跳过 OSS 上传mp3 被图片接口拒绝),改用 base64 一句话识别 |
| 5-1 社区关注状态不持久 | `5c0beec` | `getDetail``isFollowed` 字段,未登录默认 false |
| 6-1 购物车不可进入 | `33602ea` | `switchTab``navigate`cart 未注册为 tabBar 页) |
| 6-2 联系客服失效 | `f36f8ff` | 小程序也存 `chatUrl`;空值兜底 toast`chatConfig` 缺省值 |
| 6-3 下单流程 | `2c91cfe` | 提交订单与拉起支付分离,跳转支付页支持二次支付 |
---
## 一、打卡模块
### 1-1 任务/福利/邀请功能未开发 — XL**P2**
- **现状**`pages/tool/checkin.vue` 仅有发布打卡。
- **方案**:拆 3 个子需求立项,每个独立设计文档:
- **打卡任务**:每日/每周任务 + 完成进度 + 奖励发放(积分或优惠券)。需要 `v2_checkin_task` 表 + `/api/front/tool/checkin/tasks/*` 接口。
- **福利领取**:连续打卡 N 天解锁福利(优惠券/积分)。复用 `coupon``user_integral` 模块。
- **邀请好友**:分享拉新,被邀请人完成首次打卡发奖。复用现有分享与 H5 路由。
- **测试**:每个子需求按 PRD 编写 E2E 用例Playwright 覆盖。
- **验收**:打卡 → 任务自动达成 → 福利可领 → 邀请链接被新用户使用后返奖。
- **状态**:⏸ 待产品立项
---
## 二、食谱计算器模块
### 2-1 算法推荐准确性无校验 — M**P1**
- **方案**
- 引入「校验规则集」JSON 配置能量±10%、钾≤限值、磷钙比 1.01.5),后端在生成推荐后过滤。
-`/api/front/tool/calculator/validate` 接口给前端 mock 校对。
- 把 5 例标杆病例(医生标注)做单元测试基准。
- **验收**5 例基准全部通过;运行时不再出现钾/磷越限的推荐。
- **状态**:⏳ P1
### 2-2 无操作历史记录 — M**P1**
- **方案**
- 后端建 `v2_calculator_history(user_id, input_json, result_json, created_at)`
- `POST /api/front/tool/calculator/calculate` 同步落库。
- 新增 `GET /history` 与「我的历史」页面,复用列表组件。
- **验收**:计算 3 次后,历史页倒序展示 3 条,详情可重新载入参数。
- **状态**:⏳ P1
---
## 三、AI 营养师模块
### 3-1 语音录入失效 — **已修复 ✓**`82735a5`
- **根因**:录音 mp3 被上传到 `/api/front/upload/imageOuter`(图片专用接口),后端 `uploadValidate` 用图片扩展名白名单校验mp3 被拒。
- **修复**:跳过 OSS 上传,本地读 base64 直接调用 `/api/front/tencent/asr/sentence-recognition`sourceType=1适用 ≤60s 的录音上限。
- **验收**
- [ ] 微信小程序录 515s 中文 → 文本回写输入框
- [ ] iOS / 安卓两端各成功 3 次
- **状态**:✓ 代码已上,待 QA 真机回归
### 3-2 AI 文字回复响应慢 — M**P1**
- **方案**
- 后端流式:检查 `commit 58ea764` 修复是否回归,确保 SSE 不被网关缓冲(`X-Accel-Buffering: no`)。
- 前端:首字节立即停 loading 圈,逐 token 渲染。
- 监控接入:记录 TTFB 与 token/s目标 TTFB < 1.5s。
- **验收**:连续 5 条对话 P95 TTFB < 1.5s;首句出现到完整回复 ≤ 6s。
- **状态**:⏳ P1
### 3-3 TTS 朗读延迟过高 — S**P1**
- **方案**
- 把全文播放改为「分句缓冲,首句生成完即播」。
- Coze TTS 已具备分段返回,前端拼接队列即可。
- **验收**:从点击播放到首句出声 ≤ 1.5s。
- **状态**:⏳ P1
### 3-4 图文问答未基于上传图识别 — M**P1**
- **假设**Coze multimodal 入参未把 `image_url` 透传,或 prompt 里没引用图片。
- **方案**
- 后端 `LLMServiceImpl` 在 message 里附 `content_type=image_url` 多模态字段。
- prompt 模板加入「请基于用户上传的图片回答」指令。
- **验收**上传一张番茄图AI 应识别为番茄并给出对应饮食建议;负样本(非食物图)应回应「不是食物」。
- **状态**:⏳ P1
---
## 四、食物百科 & 健康知识
### 4-1 部分页面图片不显示 — **已修复 ✓**`e9c2404`
- **根因**DB 里食物 `image` 存了 3 类形态:相对 `crmebimage/...`、双层 host 前缀脏数据、AI 生成的纯 OSS URL。前端 `getFoodImage` 只能正确处理纯 http URL前两类显示失败。
- **修复**`ToolFoodServiceImpl.normalizeImageForOutput` 输出端归一化:定位 `crmebimage/` 片段 → 剥前缀 → `prefixImage` 拼单层 cdnUrlAI URL 透传。
- **验收**
- [ ] 列表页 / 详情页 / 相似推荐三处图片全部显示(后端已 01:21 重启)
- [ ] 至少包含 1 条历史脏数据样本验证
- **状态**:✓ 代码与后端均已生效,待现场回归
### 4-2 按分类配置兜底默认图 — **已修复 ✓**`6187a92`
- **根因**:仅 `food-placeholder.svg` 一张通用占位。
- **修复**8 个分类(`grain/vegetable/fruit/meat/seafood/dairy/bean/nut`)各对应 emoji + 浅色背景;`categoryType` 优先匹配,回落到中文 `category` 关键字推断。
- **验收**
- [ ] 故意把数据 image 置空,列表页按分类显示对应 emoji
- [ ] 分类无法识别时回落到通用 🍽️ 浅灰底
- **状态**:✓ 代码已上,待现场回归
### 4-3 列表页面闪烁 — **已修复 ✓**`c089e8c`
- **根因**`foodList` 初始化为 6 条 figma.com mock 数据,首屏先渲染拉不到的 figma 图片,再被 API 替换 → 闪烁。
- **修复**:空数组初始化 + `foodLoaded` 标记 + 骨架占位;同时收纳 `scroll-view` 高度修复BUG-003
- **验收**
- [ ] Chrome DevTools Slow 3G 模式刷新无 figma 残影
- [ ] Offline 模式不展示 mock 数据
- **状态**:✓ 已上 fix/test-feedback-0403
### 4-3b UI 适配 bug — 信息不足
- **方案**:要求测试同学补充:机型/分辨率、截图、复现步骤。否则无法定位。
- **状态**:🟡 等待信息
---
## 五、社区模块
### 5-1 关注功能失效 — **已修复 ✓**`5c0beec`
- **根因**:后端 `getDetail` 仅回传 `isLiked` / `isCollected`**漏 `isFollowed` 字段**。每次进入帖子页按钮都重置为「+ 关注」,用户重复点击 follow → unfollow状态看似无效。
- **修复**:补充 `isFollowed` 查询;未登录场景三个状态都默认 false。
- **验收**A 关注 B → 退出 B 帖子页 → 重进 → 按钮显示「已关注」;再点 → 切回「+ 关注」并持久化。
- **状态**:✓ 代码已上,待后端重启 + 现场回归
### 5-2 一键借鉴打卡仅做跳转 — L**P2**
- **方案**
- 前端:「借鉴」按钮跳到打卡发布页时携带 `referId`
- 后端:发布打卡接口接受 `referId`,在 `v2_checkin` 上记录原始打卡 ID 形成引用关系。
- 列表页展示「借鉴自 @xxx」徽章。
- **验收**B 在 A 的打卡上点「借鉴」→ 发布页预填 A 的食物 → 提交后社区 B 的打卡显示「借鉴自 A」。
- **状态**:⏸ P2
---
## 六、商城模块
### 6-1 购物车不可进入 — **已修复 ✓**`33602ea`
- **根因**`order_addcart` 未注册为 tabBar 页,但商品详情页底部购物车 `<navigator open-type='switchTab'>` 用了 `switchTab` → 静默失败;`pages/user/index.vue` switchTab/navigateTo 黑名单逻辑也搞反了。
- **修复**:商品详情 `open-type='navigate'`;用户中心黑/白名单纠正,仅 `user/index``goods_cate` 走 switchTab。
- **验收**
- [ ] 商品详情底部点购物车图标 → 进 cart 列表页
- [ ] 个人中心其他菜单跳转正常
- **状态**:✓ 代码已上,待现场回归
### 6-2 联系客服失效 — **已修复 ✓**`f36f8ff`
- **根因**:①`chatUrl` 仅 H5/APP-PLUS 写入 vuex小程序拿不到`chatConfig` 缓存为 null 时模板 v-if 取属性报错;③ `chatUrl` 空值时仍跳到 web_page 显示空白。
- **修复**:去掉 `#ifdef``wxChatService` 空值兜底 toast「客服暂未配置」`chatConfig` 取不到给默认对象。
- **验收**
- [ ] 未先访问商城首页直接进「我的」点客服 → 给出明确 toast
- [ ] 访问过商城后客服入口正常打开
- [ ] 微信客服按钮 `open-type='contact'` 在 wx_chat_independent='open' 时生效(需小程序后台配置)
- **状态**:✓ 前端代码已上;如客服仍打不开,需要运营在小程序后台开通客服功能
### 6-3 下单流程 bug — **已修复 ✓**`2c91cfe`
- **根因**`onCreate``orderCreate` 成功后**立即调用** `getOrderPay``requestPayment`,强制弹支付;用户取消后留在 confirm 页,二次支付走的是同一函数链,体验割裂。
- **修复**`onCreate` 改为 `redirectTo /pages/order/order_payment`,由用户主动点「去支付」;`payment()` else 分支同步纠正。`order_payment` 自带重试/取消处理。
- **验收**
- [ ] 提交订单**不弹支付**,跳到 `order_payment`
- [ ] 手动「去支付」→ 弹起支付,取消 → 仍在 `order_payment`,再点「去支付」可重新拉起
- [ ] DB 中只有 1 条 `store_order` 记录(不会重复落单)
- **状态**:✓ 代码已上,待现场回归
---
## 执行节奏
**P0 → P1 → P2** 推进,每修完一项:
1. ~~在 [test-0415.md](./test-0415.md) 行尾追加 `已修复 commit:<sha>`~~ → 改为本文件维护
2. 更新本文件状态列与验收勾选
3. push 到 `fix/test-feedback-0403`,由 QA 现场回归确认
## 当前阻塞 / 下一步
| 阻塞项 | 谁来推 |
|---|---|
| **后端 sophia profile 重启**(让 4-1, 5-1 后端代码生效) | 你IDEA 重启 PID 17597 |
| **QA 现场回归 P0 8 项**(按各项验收勾选清单) | 测试同学 |
| **4-3b UI bug 复现信息**(机型/分辨率/截图) | 测试同学 |
| **P1 启动**3-2, 3-3, 3-4, 2-1, 2-2 | 你确认顺序后我执行 |
| **P2 PRD**1-1 打卡, 5-2 一键借鉴) | 产品 |