绑盘机消费流程代码实施设计

版本:V1.2
日期:2026-08-28
需求基线:2026-08-27-consumption-product-requirements.md V0.9.6
视觉基线:方案 B“金额聚焦型”定稿

1. 记录目的

本文件把已确认的产品需求和方案 B 原型转换为代码边界、状态机、数据结构与验证策略,作为本次代码实施的直接依据。

记录原因:当前项目中已经存在一版消费诊断页、读卡扣款和接口 C 代码。如果直接覆盖,容易丢失已验证的硬件实现;先建立实施设计,可以区分“复用、修正、新增”三类改动,并为后续真机问题定位保留依据。

2. 当前代码基线

2.1 可复用能力

2.2 必须修正的差距

  1. 当前页面是单页调试面板,不是方案 B 的三阶段用户页面。
  2. 当前正金额订单需要用户点击“支付”,需求要求订单判断完成后自动进入支付页。
  3. 当前订单协调器在移盘时使未返回的订单响应失效,需求要求查询继续并锁定本次餐盘会话。
  4. 当前移盘会取消尚未开始的支付,需求要求移盘不打断已经进入的业务流程。
  5. 当前语音及页面使用“请刷卡”,需求统一为“请放卡片进行支付”。
  6. 当前仅日志记录交易结果,没有以订单号关联的结构化本地交易记录。
  7. 当前接口 C 失败只展示在页面,没有持久化补传队列。
  8. 当前消费页使用临时硬编码服务地址和模拟一分钱订单,正式实现必须使用设备配置地址并删除模拟订单路径。

3. 实施边界

3.1 本次实现

3.2 本次不实现

4. 状态机设计

业务状态 用户展示状态 主要提示 允许的下一事件
WAITING_TRAY 第一步 请放置餐盘 餐盘识别成功
LOADING_ORDER 第二步 正在确认订单,请稍候 接口 B 成功/失败、餐盘移走
ORDER_FAILED 第二步 用户可理解的订单异常 餐盘移走
WAITING_CARD 第三步等待操作 放卡;遗留卡时先取卡 检测到卡片
READING_ZERO_AMOUNT_CARD 第三步处理中 卡片核验中,请勿移动卡片 读卡成功/失败
READING_BEFOREDEBITINGREADING_AFTER 第三步处理中 结算处理中,请勿移动卡片 成功/失败/结果不确定
REPORTINGCOMPLETEDREPORT_PENDING 第三步完成 结算或核验完成,请取走卡片和餐盘 清场后复位
TRANSACTION_FAILED 第三步异常 结算未完成,取走卡片和餐盘后重试 餐盘移走
TRANSACTION_UNKNOWN 第三步异常 结果待确认,禁止再次支付 餐盘移走

零元路径为 LOADING_ORDER → WAITING_CARD → READING_ZERO_AMOUNT_CARD → REPORTING;读取失败回到 WAITING_CARD,读取成功后不经过 DEBITING/READING_AFTER。正金额路径保持原三阶段。

ConsumptionUiStateMapper 是纯 Java 展示映射边界。ConsumptionFlowStateMachine 仍是唯一业务状态源;页面合并不影响阶段日志、持久化或接口 C。

终态复位规则:餐盘仍在时保持当前结果;餐盘已移走且读卡区无卡时,满足最短展示时间后回到 WAITING_TRAY

5. 餐盘会话规则

6. 交易失败与反馈规则

6.1 不调用接口 C

这些场景必须保存本地交易阶段结果,其中结果不确定和部分扣款必须标记“禁止自动重扣”。

6.2 调用接口 C

6.3 上传失败

7. 本地数据设计

本地数据库以 order_no 为业务关联键,至少保存:

记录原因:页面状态和日志不能承担应用重启后的恢复;结构化记录用于可靠补传、问题核对和避免重复扣款。

8. 增量实施顺序

  1. 状态机及餐盘会话规则,先用纯 Java 单测锁定。
  2. 本地交易仓库、接口 C 请求快照和补传策略。
  3. 读卡阶段进度回调、零元只读分支及交易结果分类。
  4. 方案 B 三页面布局和 Activity 编排。
  5. 应用启动、3分钟定时及网络恢复触发。
  6. 全量单测、Debug 构建、资源检查和真机待验清单。

9. 验证策略

10. 零元只读实现边界

11. 卡片人员与余额展示

12. 页面资源边界