DishRecognitionActivity 自动识别 / 自动支付需求整理

1. 背景

DishRecognitionActivity 当前已具备以下基础能力:

页面上已增加两个按钮:

本文件用于整理这两个能力在 DishRecognitionActivity 内的完整业务规则,补齐边界场景,作为下一步开发实现依据。

2. 需求目标

实现一套可预测、可恢复、防误触发的自动化流程:

3. 状态定义

建议把状态拆成两层,避免后续逻辑混乱。

3.1 用户意图状态

3.2 运行态状态

3.3 暂停原因集合

建议不要只用一个布尔值控制暂停,而是维护“暂停原因集合”,例如:

这样在多个弹框叠加时,不会出现“先来的弹框还没关闭,后来的弹框关闭后却误恢复自动流程”的问题。

4. 初始状态

进入 DishRecognitionActivity 后,初始状态统一定义为:

说明:

5. 核心业务规则

5.1 自动识别规则

  1. 页面初次进入后,自动识别默认开启。
  2. 当存在任一暂停原因时,自动识别暂停。
  3. 暂停解除后:
  4. 自动识别关闭时:

5.2 自动支付规则

  1. 自动支付初始默认关闭。
  2. 自动支付依赖自动识别,自动识别关闭时,自动支付必须关闭。
  3. 当识别结果“连续 5 次不改变”时,自动支付进入打开状态。
  4. 当识别结果发生变化时,自动支付立即关闭。
  5. 当存在任一暂停原因时,自动支付暂停。
  6. 自动支付一旦真正发起支付请求,必须立即进入支付中状态,直到收到支付结果前不得再次触发。
  7. 当识别结果中存在任一未识别菜品时,自动支付不得进入开启状态。
  8. 底部支付按钮需与支付状态同步;自动支付不可用时按钮不可点击并显示灰色,可用时恢复当前可点击样式。

5.3 弹框/遮罩暂停规则

以下场景出现时,自动识别和自动支付都必须暂停:

恢复规则:

5.4 支付完成后的复位规则

拿到支付结果后,无论成功还是失败,页面都回到初始状态:

说明:

6. 识别稳定性判定规则

“连续 5 次不改变”需要明确什么叫“不改变”,建议定义如下:

识别结果快照一致,需同时满足:

稳定计数规则:

  1. 第一次拿到有效识别结果时:
  2. 新结果与上一次快照相同:
  3. 新结果与上一次快照不同:
  4. stableRecognitionCount >= 5 时:

建议补充:

7. 订单变更规则

除了“识别结果变化”,以下变化也应视为“当前订单发生变化”,需要关闭自动支付并重新计数:

原因:

因此建议定义统一事件:

触发后执行:

8. 建议补充的边界场景

你给出的 4 条规则已经覆盖了主流程,但还没有完全覆盖以下场景,建议补充进需求。

8.1 用户手动点击开关

需要明确:

建议实现为:

8.2 弹框关闭后的恢复策略

需要明确:

原因:

8.3 支付进行中防重入

需要明确:

8.4 空订单 / 空识别结果

需要明确:

8.5 页面生命周期

需要明确:

建议不要跨前后台保留“已稳定 4 次”之类的中间态。

8.6 支付失败后的处理

需要明确:

这里有两种方案:

如果按你目前描述,建议本期采用方案 A,并在文档中明确“支付成功和失败都清单复位”。

9. 推荐统一状态机

建议按以下状态流转实现:

  1. INITIAL
  2. RECOGNIZING
  3. RECOGNITION_PAUSED
  4. AUTO_PAY_READY
  5. PAYING
  6. PAYMENT_RESULT
  7. RESETTING

10. 最终需求口径

以下内容可直接作为开发需求。

10.1 开关默认值

10.2 暂停规则

10.3 自动支付开启规则

10.4 订单变更规则

以下任一情况都视为订单变更:

订单变更后统一执行:

10.5 自动支付触发限制

自动支付只有在以下条件同时满足时才允许真正发起:

10.6 支付中的规则

10.7 支付结果后的规则

11. 开发实现建议

建议在代码里显式拆出以下方法,避免逻辑散落:

建议额外增加日志埋点,便于联调:

12. 结论

你原来的 4 条规则已经覆盖了主路径,但还缺少以下关键约束:

建议按本文件的完整口径执行,这样下一步编码时状态边界会清晰很多,也能避免自动支付误触发。