菜单管理与菜谱识别规则
页面入口
DishRecognitionActivity 顶部“菜谱”入口进入 DishMenuManagementActivity。
- 菜单管理页调用现有
/p/api/getMeal 接口,服务端按当前设备和当前餐次返回菜品列表,返回可以为空。
菜单管理页
- 页面展示样式复用识别页“添加菜品”抽屉的分类与菜品卡片效果。
- 分类上方提供“是否打开菜谱识别功能”单选项:
不打开:识别页保持原识别、计价、支付逻辑。
打开:识别页在原逻辑基础上按本地当餐菜谱过滤识别结果。
- 开关持久化到
PreferenceUtils。
- 每次菜谱接口拉取成功后,页面会把本次接口返回的当餐菜谱菜品编码保存到本地,供识别页判断。
识别页规则
- 菜谱识别关闭时,不检查当餐菜谱。
- 菜谱识别打开时,识别结果使用
goodsCode 与本地当餐菜谱编码匹配;本地菜谱编码来自 DishLearningStore.resolveDishCode(dishBean)。
- 命中当餐菜谱:
- 按原规则显示菜名和价格。
- 参与识别金额、自动支付稳定性快照和支付清单。
- 未命中当餐菜谱:
- 显示名称为
未排菜(菜品),括号内保留识别到的菜品名称。
- 识别框颜色为
#431FB0。
- 不参与识别金额,不进入支付清单。
- 不阻断支付;支付时只支付已排菜菜品、手动加菜和固定金额。
空菜谱边界
- 如果接口返回空菜谱且菜谱识别已打开,所有识别菜品都会视为未排菜。
- 此时识别金额为 0;如果存在手动加菜或固定金额,支付仍按现有支付清单规则执行。
菜品管理学习同步
DishManagementActivity 进入页面时先展示现有本地学习记录,不等待网络同步完成。
- 当前页面不再强制同步全部菜品基础库;菜品名称和价格继续复用应用级本地菜品目录。
- 页面进入和点击“同步记录”时,直接按当前已生效的菜谱识别模式同步学习记录。
- 菜谱识别关闭时:
- 不请求当前餐次菜谱。
- 学习记录全量拉取。
- 全部学习记录保存到本地学习目录,并交给 SDK 执行学习数据修正。
- 菜谱识别打开时:
- 先拉取当前餐次菜谱。
- 再拉取学习记录列表。
- 只有
dishesUuid 命中本次当前餐次菜谱编码集合的学习记录,才会保存到本地并参与 SDK 学习。
- 未命中当前餐次菜谱的学习记录直接忽略。
- 学习数据和 SDK 提交成功后,才保存本次菜谱快照。
- 页面名称、价格和搜索优先使用本次菜谱返回的完整菜品数据。
- 如果当前餐次菜谱拉取失败,本次学习记录同步中止,避免误用旧餐次菜谱。
- 如果当前餐次菜谱为空,则本地学习目录会被清空,并按空学习数据修正 SDK。
菜品管理开关切换
- 用户切换“打开/不打开”时,不再立即只保存配置,而是先按目标模式执行完整学习记录同步。
- 切换期间禁用开关和同步入口,避免并行创建多个全量同步会话。
- 同步成功后:
- 提交本地学习目录和 SDK 特征。
- 保存目标开关配置。
- 刷新页面列表。
- 同步失败后:
- staging 目录回滚,原正式学习目录和 SDK 数据保持不变。
- 开关静默恢复原选项。
- 原配置不变。
- SDK 返回未激活时,进入统一激活流程,并保留本次目标模式供激活成功后继续同步。