fix: 修复6项测试问题并补全配套资源

- 修复油脂类食物推荐量系数 (5.7→2.5) [ToolCalculatorServiceImpl]
- AI营养师接入真实Coze API,替换Mock回复 [ToolAiNutritionistServiceImpl]
- 食物百科详情新增钙/铁/维C/嘌呤/重量基准字段返回 [ToolFoodServiceImpl]
- V2Food模型新增purine、servingSize字段 [V2Food.java]
- 食物百科详情页动态重量标注+新增4项营养展示+替换Figma URL [food-detail.vue]
- 修复营养素列表dataset传参Bug(WeChat camelCase) [nutrition-knowledge.vue]
- 营养素详情页接入后端API+兜底本地数据+替换Figma URL [nutrient-detail.vue]
- 新增数据库迁移脚本及参考初始化数据 [docs/sql/]
- 新增前端占位图标5个 [static/images/]
- 新增开发任务完成报告 [docs/]

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Developer
2026-03-25 14:18:00 +08:00
parent a5de6fb46d
commit ba08abd374
16 changed files with 243 additions and 54 deletions

View File

@@ -0,0 +1,49 @@
-- ============================================================
-- 数据库迁移脚本
-- 版本: v1.0
-- 日期: 2026-03-25
-- 描述: 为 v2_food 表新增嘌呤含量和重量基准字段
-- ============================================================
-- 1. 新增 purine 字段(嘌呤含量,单位 mg
ALTER TABLE v2_food
ADD COLUMN purine DECIMAL(10, 2) DEFAULT NULL COMMENT '嘌呤含量(mg)';
-- 2. 新增 serving_size 字段(营养成分对应重量基准)
ALTER TABLE v2_food
ADD COLUMN serving_size VARCHAR(50) DEFAULT '每100g' COMMENT '营养成分对应的食物重量基准,如"每100g"、"每份(50g)"';
-- 验证
DESC v2_food;
-- ============================================================
-- 参考数据初始化示例(按需执行)
-- 数据来源: https://www.ishen365.com/article/cereal
-- ============================================================
-- 谷薯类
UPDATE v2_food SET calcium = 13, iron = 2.3, vitamin_c = 0, purine = 18.4, serving_size = '每100g' WHERE name = '大米' AND category_name LIKE '%谷%';
UPDATE v2_food SET calcium = 34, iron = 5.1, vitamin_c = 0, purine = 25.0, serving_size = '每100g' WHERE name = '小米' AND category_name LIKE '%谷%';
UPDATE v2_food SET calcium = 38, iron = 5.9, vitamin_c = 0, purine = 22.4, serving_size = '每100g' WHERE name = '玉米' AND category_name LIKE '%谷%';
UPDATE v2_food SET calcium = 31, iron = 3.5, vitamin_c = 0, purine = 17.1, serving_size = '每100g' WHERE name = '面粉' AND category_name LIKE '%谷%';
-- 蔬菜类
UPDATE v2_food SET calcium = 48, iron = 1.2, vitamin_c = 14, purine = 10.1, serving_size = '每100g' WHERE name = '菠菜' AND category_name LIKE '%蔬%';
UPDATE v2_food SET calcium = 36, iron = 0.5, vitamin_c = 4, purine = 5.5, serving_size = '每100g' WHERE name = '西红柿' AND category_name LIKE '%蔬%';
UPDATE v2_food SET calcium = 21, iron = 0.3, vitamin_c = 2, purine = 3.4, serving_size = '每100g' WHERE name = '土豆' AND category_name LIKE '%蔬%';
-- 水果类
UPDATE v2_food SET calcium = 4, iron = 0.6, vitamin_c = 8, purine = 0.9, serving_size = '每100g' WHERE name = '苹果' AND category_name LIKE '%水果%';
UPDATE v2_food SET calcium = 7, iron = 0.2, vitamin_c = 8, purine = 1.9, serving_size = '每100g' WHERE name = '香蕉' AND category_name LIKE '%水果%';
-- 肉蛋类
UPDATE v2_food SET calcium = 11, iron = 2.5, vitamin_c = 0, purine = 122.5, serving_size = '每100g' WHERE name = '猪肉' AND category_name LIKE '%肉%';
UPDATE v2_food SET calcium = 9, iron = 2.3, vitamin_c = 0, purine = 107.6, serving_size = '每100g' WHERE name = '牛肉' AND category_name LIKE '%肉%';
UPDATE v2_food SET calcium = 56, iron = 2.0, vitamin_c = 0, purine = 2.6, serving_size = '每100g' WHERE name = '鸡蛋' AND category_name LIKE '%蛋%';
-- 豆类
UPDATE v2_food SET calcium = 191, iron = 8.2, vitamin_c = 0, purine = 166.5, serving_size = '每100g' WHERE name = '黄豆' AND category_name LIKE '%豆%';
UPDATE v2_food SET calcium = 164, iron = 6.4, vitamin_c = 0, purine = 116.9, serving_size = '每100g' WHERE name = '豆腐' AND category_name LIKE '%豆%';
-- 将所有未设置 serving_size 的记录默认填充
UPDATE v2_food SET serving_size = '每100g' WHERE serving_size IS NULL OR serving_size = '';

View File

@@ -3,7 +3,7 @@
> **版本:** v1.0
> **日期:** 2026-03-25
> **依据:** 《测试问题分析报告_2026-03-22》
> **项目:** 民生汇 - 慢性肾病营养管理小程序
> **项目:** 慢生活- 慢性肾病营养管理小程序
---
@@ -320,7 +320,7 @@ async sendToCoze(content, images = []) {
**建议系统提示词:**
```
你是民生汇小程序的 AI 营养师专注于慢性肾脏病CKD患者的饮食营养指导。
你是慢生活小程序的 AI 营养师专注于慢性肾脏病CKD患者的饮食营养指导。
回复规范:
1. 【一句话建议】用一句话直接回答用户问题

View File

@@ -0,0 +1,94 @@
# 开发任务完成报告 2026-03-25
## 任务总览
| 任务 | 状态 | 说明 |
|------|------|------|
| 任务 0数据库表结构变更 | ✅ 完成 | V2Food.java 新增 purine、servingSize 字段 |
| 任务 1油脂系数 Bug 修复 | ✅ 完成 | 油脂类系数 5.7 → 2.5 |
| 任务 2AI 营养师接入 Coze API | ✅ 完成 | 替换 Mock 回复为 Coze API 调用 |
| 任务 3食物百科详情字段补全 | ✅ 完成 | 新增钙、铁、维生素C、嘌呤、重量基准 |
| 任务 4食物百科详情页前端修复 | ✅ 完成 | 动态重量标注 + Figma URL 替换 + 营养成分扩展 |
| 任务 5营养素列表传参 Bug 修复 | ✅ 完成 | dataset 传参改为直接传参 |
| 任务 6营养素详情页接入后端 API | ✅ 完成 | 优先 API、本地 map 兜底 + Figma URL 替换 |
---
## 详细修改记录
### 任务 0数据库表结构变更
**文件:** `msh_crmeb_22/crmeb-common/src/main/java/com/zbkj/common/model/tool/V2Food.java`
- 在 vitaminC 字段后(约第 70 行)新增:
- `purine` (BigDecimal):嘌呤含量(mg),对应数据库字段 `purine`
- `servingSize` (String):营养成分重量基准,对应数据库字段 `serving_size`
- 类已使用 `@Data` 注解Lombok无需手动添加 getter/setter
### 任务 1油脂系数 Bug 修复
**文件:** `msh_crmeb_22/crmeb-service/src/main/java/com/zbkj/service/service/impl/tool/ToolCalculatorServiceImpl.java`
- 第 516 行:`round(5.7 * energyRatio)``round(2.5 * energyRatio)`
- 验证:文件中仅第 510 行谷薯类保留 `5.7` 系数,油脂类已改为 `2.5`
### 任务 2AI 营养师接入 Coze API
**文件:** `msh_crmeb_22/crmeb-service/src/main/java/com/zbkj/service/service/impl/tool/ToolAiNutritionistServiceImpl.java`
- 新增注入:`ToolCozeService toolCozeService`
- 新增 import`ToolCozeService``CozeChatRequest``CozeBaseResponse`
- `sendMessage()` 方法中:
- 移除 Mock 回复 `"这是一个模拟的AI回复。"`
- 替换为 `toolCozeService.chat(cozeRequest)` 调用
- Bot ID: `7591133240535449654`
- 添加 try-catch 异常处理,失败时设置 `aiResponseStatus("failed")`
### 任务 3食物百科详情字段补全
**文件:** `msh_crmeb_22/crmeb-service/src/main/java/com/zbkj/service/service/impl/tool/ToolFoodServiceImpl.java`
- `getDetail()` 方法中(约第 121 行后)新增 5 个字段返回:
- `calcium``iron``vitaminC``purine``servingSize`
### 任务 4食物百科详情页前端修复
**文件:** `msh_single_uniapp/pages/tool/food-detail.vue`
- **修复点 A** 两处 `"每100g"` 硬编码替换为 `{{ foodData.servingSize || '每100g' }}`
- **修复点 B** `parseNutritionTable` 中新增铁 (iron) 和维生素C (vitaminC) 营养项;`parseKeyNutrients``parseNutritionTable` 的 nutrients 来源改为兼容平铺字段 (`data.nutrients || data.nutritionData || data`)
- **修复点 C** 3 处 Figma 临时 URL 替换为本地占位图路径(`/static/images/icon-share.png``/static/images/icon-search.png`、空字符串)
### 任务 5营养素列表传参 Bug 修复
**文件:** `msh_single_uniapp/pages/tool/nutrition-knowledge.vue`
- 第 39 行:`@click="goToNutrientDetail" :data-nutrient-index="index"``@click="goToNutrientDetail(index)"`
- `goToNutrientDetail` 方法:参数从 `event` 改为直接接收 `index`,移除 `event.currentTarget.dataset.nutrientIndex` 取值逻辑
### 任务 6营养素详情页接入后端 API
**文件:** `msh_single_uniapp/pages/tool/nutrient-detail.vue`
- **修复点 A** `nutrientData` 默认值从硬编码的"钠"数据改为空对象 `{}`
- **修复点 B** `loadNutrientData()` 方法改为 async优先调用 `getNutrientDetail(name)` API失败时使用本地 `nutrientMap` 兜底
- **修复点 C** 3 处 Figma 临时图片 URL 替换为本地占位图路径
---
## 遇到的问题及处理方式
1. **ToolCozeService 接口设计**`chat()` 方法接收 `CozeChatRequest` 对象而非简单的 `(botId, message, userId)` 参数。处理方式:构造完整的 `CozeChatRequest` 对象,设置 `botId``userId``additionalMessages` 等字段。
2. **food-detail.vue 营养数据解析**:后端返回的是平铺字段(如 `data.calcium`),而前端解析方法原本从 `data.nutrients` 子对象取值。处理方式:将 nutrients 来源改为 `data.nutrients || data.nutritionData || data`,兼容两种数据结构。
3. **Figma 临时图片 URL**:多个 Vue 文件中使用了 Figma API 的临时资源 URL。处理方式统一替换为本地静态资源路径`/static/images/xxx.png`),需后续补充实际图标文件。
---
## 后续待办
- [ ] 数据库执行 ALTER TABLE 添加 `purine``serving_size` 字段
- [ ] 补充 `/static/images/` 下的图标文件icon-share.png、icon-search.png、icon-why-important.png、icon-recommendation.png、icon-suggestions.png
- [ ] 后端实现 `getNutrientDetail` 接口(若尚未实现)
- [ ] 用户手动执行 `git push origin main`

View File

@@ -2,7 +2,7 @@
> **日期:** 2026-03-22
> **分析人:** Claude AI
> **项目:** 民生汇 - 慢性肾病营养管理小程序
> **项目:** 慢生活 - 慢性肾病营养管理小程序
---