新学习商品即时名称与计价 Implementation Plan

执行约束:本对话内联执行,不委派;未经用户授权不提交 Git。按清单逐项验证。

目标:学习成功后以单商品本地入库替代等待全量目录同步,使首次识别显示正确名称和价格。

架构:学习入口保留服务端原始 DishBean;仓库用单线程 I/O 队列先持久化再刷新内存缓存;识别页对缺失 UUID 只发起一次后台目录补全并在补全前禁止该编码计价。全量替换兼容并发增量写入。技术栈:Android Java、SQLite、JUnit 4、Gradle。

执行状态:已完成代码接入、三个目标单测的红绿验证及 Debug 构建;未在用户设备运行会写入其商品目录的仪器测试,真机识别与支付验收待用户安装新包后完成。

Task 1:保留服务端商品资料

文件:DishLearningDish.java、两个学习入口的 mapResponseToDishList、DishLearningDishTest.java。

  1. 先写单测:旧构造兼容,新构造返回原始 DishBean,编码不一致时拒绝关联;运行目标单测确认先失败。
  2. 展示模型加入可选原始商品字段;两个列表映射直接传入服务端对象,矫正学习复制时保留字段;再运行目标测试。

Task 2:单商品入库与全量同步竞态

文件:DishCatalogRepository.java、DishCatalogRepositoryInstrumentedTest.java。

  1. 先编写设备集成测试:新 UUID 名称价格、重启持久性,以及旧全量快照不覆盖并发增量。真机执行留给用户测试阶段。
  2. 增加 upsertServerDishAsync(Context, DishBean, UpsertCallback):校验 UUID/名称,现有 I/O 队列写 SQLite,成功后更新缓存并回调主线程;不改全量同步时间。
  3. 全量同步开始时记录顺序;全量替换事务叠加同步开始后成功写入的商品;失败时清理临时状态,后续同步仍以服务端为权威。
  4. 编译设备测试,运行单测与 Debug 构建。

Task 3:接入两个学习成功路径

文件:NewDishLearningActivity.java、DishRecognitionActivity.java、strings.xml。

  1. 普通学习仅在至少一张图片学习成功后单条入库;入库成功才提示完整成功,失败仅重试商品资料。
  2. 矫正学习同样等待入库后关闭抽屉,随后重绘识别结果和支付状态。
  3. 校验选项编码与原始商品 UUID 一致,运行单测与 Debug 构建。

Task 4:未知 UUID 后台补全与验收

文件:DishRecognitionActivity.java、DishCatalogRepository.java、strings.xml 和相关测试。

  1. 按 UUID 去重后台同步;已有同步时加入或观察,不逐帧重试。
  2. 未命中目录时显示同步中/未同步,不显示 UUID、不参与自动计价;成功后重绘,其他未知编码规则不变。
  3. 验证新菜品/餐具、重复学习、断网、数据库失败、同步竞态、重启、零元价格;检查差异。
  4. 在提示词工程新增 Markdown/HTML 成对变更记录;源码仓不新增文档目录,不执行 Git 写操作。