docs(test-0415): 更新 fix-plan 状态:P0 8 项全部完成
- 顶部新增 commit 清单表 - 每项补 root cause / 修复要点 / 验收 checklist - 当前阻塞项明确归属 Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
196
docs/Testing/test-0415-fix-plan.md
Normal file
196
docs/Testing/test-0415-fix-plan.md
Normal file
@@ -0,0 +1,196 @@
|
|||||||
|
# test-0415 反馈问题 — 修复方案与执行计划
|
||||||
|
|
||||||
|
> 源:`docs/Testing/test-0415.md`
|
||||||
|
> 维护:本文档为执行表,每修一项更新【状态】与【验收】列。
|
||||||
|
> 工作量符号:S ≤ 1d,M = 2–3d,L = 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.0–1.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 的录音上限。
|
||||||
|
- **验收**:
|
||||||
|
- [ ] 微信小程序录 5–15s 中文 → 文本回写输入框
|
||||||
|
- [ ] 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` 拼单层 cdnUrl;AI 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 一键借鉴) | 产品 |
|
||||||
Reference in New Issue
Block a user