稳定识别再次识别后无法进入支付状态修复记录
变更日期
2026-07-23
问题现象
菜品识别已经进入待支付状态后,不移动餐盘,点击“再次识别”,页面能够重新识别一次,但无法再次进入待支付状态。
现场证据
- 首次进入支付状态前,同一菜品识别快照的稳定计数从 1 增加到 2。
- 点击“再次识别”后,稳定计数被正常清零。
- 未移动餐盘时,稳定画面只触发一次识别,计数停留在 1,之后没有新的识别请求。
- 当前默认“中速支付”需要连续 2 次相同识别结果,因此无法重新进入支付状态。
日志同时证明支付暂停原因和支付流程状态已经退出,本问题不是支付弹窗或暂停标记残留。
根因
“画面稳定后识别”和“自动支付稳定次数”存在状态冲突:
- 稳定识别判定器在同一画面上只允许一次识别,直到餐盘再次发生变化。
- 点击“再次识别”会清空订单稳定计数。
- 自动支付的中速、慢速配置分别需要连续 2 次、3 次相同识别结果。
因此,未移动餐盘时,重置后最多只能得到一次结果,支付稳定计数无法达到阈值。首次能够进入支付状态依赖现场画面细微变化偶然触发多次识别,不具备确定性。
修复内容
FrameStabilityDetector.java
- 新增
rearmForRecognitionConfirmation()。
- 只在上一次稳定识别已经成功提交、且当前没有待提交触发时重新布防。
- 重新布防只允许下一次稳定识别,不会取消识别接受后的单次锁定机制。
DishRecognitionActivity.java
- 每次菜品识别结果完成稳定计数和自动支付状态计算后,判断是否仍需支付确认。
- 稳定识别已开启、自动支付尚未就绪且识别流程允许继续时,重新布防同一稳定画面。
- 达到快速、中速或慢速支付阈值后,
autoPayReady 变为 true,不再重新布防,进入原支付流程。
- 增加支付确认待重试日志,记录当前稳定计数和目标阈值。
FrameStabilityDetectorTest.java
- 同一餐盘不移动时,业务可以请求下一次稳定识别用于支付确认。
- 下一次请求被接受后重新锁定,避免无条件连续触发。
行为结果
- 快速支付阈值 1:第一次稳定识别后进入支付状态。
- 中速支付阈值 2:同一稳定画面自动补充第二次确认,然后进入支付状态。
- 慢速支付阈值 3:同一稳定画面自动完成三次一致结果确认,然后进入支付状态。
- 点击“再次识别”后即使不移动餐盘,也可以重新完成上述确认流程。
- 识别结果不一致时继续按原逻辑重置稳定计数,不会使用支付前的旧结果。
实际变更文件
app/src/main/java/com/cpt/aidishrecognition/ai/FrameStabilityDetector.java
app/src/main/java/com/cpt/aidishrecognition/activity/DishRecognitionActivity.java
app/src/test/java/com/cpt/aidishrecognition/ai/FrameStabilityDetectorTest.java
本次未修改人脸识别、datalibrary、支付接口、设置页和相机配置。
验证结果
- TDD 红灯:新增测试在实现前因缺少
rearmForRecognitionConfirmation() 编译失败。
- 稳定识别专项测试:8 项通过,0 失败。
- 完整单元测试:37 项通过,0 失败,0 错误,0 跳过。
- Debug APK 构建:
BUILD SUCCESSFUL。
git diff --check:通过。
- APK:
app/build/outputs/apk/debug/app-debug.apk。
待真机回归
- 设置中速支付,首次识别达到计数 2 后进入支付状态。
- 不移动餐盘,点击“再次识别”,确认计数再次从 1 到 2 并进入支付状态。
- 设置慢速支付,确认同一稳定画面达到计数 3 后进入支付状态。
- 达到支付状态后保持不操作,确认不会继续发起菜品识别。
结论
该现象是稳定识别单次触发与自动支付多次确认之间的真实流程缺陷。修复后,同一稳定画面可以按支付阈值完成有限次数的识别确认;达到阈值后立即停止识别并进入原支付流程。