菜品与菜谱分类统一变更记录
变更日期
2026-09-03
变更目标
将菜品学习、菜谱管理和菜品识别页两个替换入口的分类顺序、显示标签、接口编码及别名归一化集中到同一分类模型,消除页面自行定义和手工对应造成的分类错乱风险。连续现场验收确认两个接口当前均使用 2=素菜、3=荤菜、4=蛋奶坚果、5=水果,公共模型仍按接口字段分别管理。
统一分类契约
| 展示顺序 | 显示标签 | 菜品列表编码 | 菜谱分组 key |
|---|---|---|---|
| 0 | 全部 | 空值 | 无独立分组 |
| 1 | 主食 | 1 |
1 |
| 2 | 荤菜 | 3 |
3 |
| 3 | 素菜 | 2 |
2 |
| 4 | 水果 | 5 |
5 |
| 5 | 蛋奶坚果 | 4 |
4 |
| 6 | 汤饮 | 6 |
6 |
代码变更
公共分类模型
- 新增
DishCategory,集中维护展示顺序、两套接口编码、字符串资源和服务端名称别名。 - 菜品列表接口使用
dishListApiValue;菜谱接口使用menuGroupCode,避免把两个接口的数字协议混为一套。 - “肉类、菜类、汤类”分别归一化为“荤菜、素菜、汤饮”。
全部只表示查询范围;未知分类单独表示为“未分类”,不再静默归入“主食”。- 新增分类字符串资源,页面不再直接保存用户可见分类文案。
菜谱响应
GetDishMenuResponse改为按服务端分类编码保存列表。- 新增动态 Gson 反序列化器,遍历服务端实际返回的分类 key,保留未知分类分组。
- 标准分类始终按照主食、荤菜、素菜、水果、蛋奶坚果、汤饮顺序聚合,未知分组追加在“全部”末尾。
- 网络响应补丁逻辑改为遍历实际分类编码,并为未知编码输出警告日志。
页面入口
NewDishLearningActivity:分类标签、请求参数和响应分类归一化改用DishCategory。DishMenuManagementActivity:使用EnumMap按分类保存菜谱,不再维护六个具名列表或手工关联响应字段。DishRecognitionActivity:“替换菜谱”和“替换后学习”两个入口统一改用DishCategory,删除重复的数组、数字转换和分类switch。- 三个 XML 布局只提供动态标签容器,没有分类硬编码,因此未修改。
缓存与同步
DishMenuStore通过菜单响应的统一聚合接口保存当前菜谱编码。DishManagementSyncPolicy通过同一聚合接口建立菜谱索引。- 两处均不再逐项读取
dishItemList1~6。
测试
新增和更新的单元测试覆盖:
- 分类显示顺序及两个接口各自的
1~6编码关系; - 服务端名称别名归一化;
- 未知分类的安全回退规则;
- 菜谱动态分组解析、缺失分组和未知分组;
- 标准分类有序聚合;
- 菜谱同步策略对全部分组的处理。
执行命令:
./gradlew :app:testDebugUnitTest :app:assembleDebug
git diff --check
执行结果:BUILD SUCCESSFUL;共执行 61 个单元测试,0 个失败、0 个错误、0 个跳过;差异空白检查通过。
验收状态
- 自动化单元测试:通过。
- Debug 编译与 APK 组装:通过。
- 页面独立分类数组、数字映射方法及
dishItemList1~6手工引用检查:无残留。 - 真机分类切换与服务端实际数据展示:待现场回归。
Git 状态
本次未执行暂存、提交、推送、分支切换或其他 Git 写操作。工作区中的其他既有修改未被清理或覆盖。