DishCatalogRepository 菜品目录仓库说明

1. 作用

DishCatalogRepository 是项目内菜品基础资料的统一入口,负责把服务端菜品列表同步到本地,并向识别、管理、替换菜品等业务页面提供按菜品编码查询的能力。

核心职责:

2. 关键文件

3. 初始化流程

应用启动时,CptApplication.onCreate() 会调用:

DishCatalogRepository.getInstance().initializeAndWarmUp(this);

当前实现会完成:

  1. 创建 DishCatalogDatabaseHelper
  2. 打开本地数据库 dish_catalog.db
  3. 在后台线程读取本地 dish_catalog
  4. 将已有菜品放入 dishCache

说明:

4. 同步流程

主动全量同步入口:

DishCatalogRepository.getInstance().syncAllAsync(context, callback);

同步前置条件:

同步过程:

  1. 调用 RetrofitRequest.getDishList(...)
  2. 按页请求,每页 3000
  3. 将每页结果追加到临时列表
  4. 全部页面拉取完成后,在后台线程执行 replaceAll(...)
  5. 清空旧的 dish_catalog
  6. 将新的菜品目录写入 SQLite
  7. 刷新内存缓存 dishCache
  8. 记录最近同步时间 dish_catalog_last_sync_time
  9. 通过 SyncCallback 回到主线程通知结果

按需同步入口:

DishCatalogRepository.getInstance().syncIfNeededAsync(context, callback);

默认同步间隔是 6 小时。如果距离上次同步未超过 6 小时,并且内存缓存不为空,就直接回调成功,不再请求接口。

5. 本地数据结构

本地数据库:

主要字段:

6. 查询逻辑

常用查询入口:

DishCatalogRepository.getInstance().findDishByGoodsCode(goodsCode);

查询顺序:

  1. 如果 goodsCode 为空,直接返回 null
  2. 先查内存缓存 dishCache
  3. 缓存未命中时,按 dish_uuid 查询 SQLite
  4. 如果传入值是纯数字,再按 dish_id 兜底查询 SQLite
  5. 查询成功后回填内存缓存

这个方法主要服务于:

7. 与菜品学习编码的关系

仓库保存和查询时都使用:

DishLearningStore.resolveDishCode(dish)

编码规则:

  1. 优先使用接口返回的 dishUuid
  2. 如果 dishUuid 为空,则回退使用 dishId 字符串

因此,DishCatalogRepository 中的 goodsCode 本质上就是菜品学习和识别流程中的统一菜品编码。

8. 维护注意事项