消费页餐盘订单与一卡通消费设计

目标

放盘后调用 POST /api/oneCardTerminal/acquireByPlate 获取订单;订单有效时只启用支付按钮,不自动消费。用户点击支付后播放本地“请刷卡”语音,并串行执行消费前读卡、补贴优先扣款、主钱包补足、消费后复读。订单与三个阶段的信息持续显示在页面上。

已确认规则

接口契约

JSON 请求包含 plate_codeequipment_code;统一响应 data 中读取 order_no 和分单位 amount。设备编号缺失、订单号为空或金额不大于零时不进入扣费。

事务顺序

订单加载完成后先进入等待支付;支付按钮显式授权后才把订单交给读卡器,重复点击和移盘后的点击均无效。

  1. 完整读取一次当前卡,展示 UID、卡号、客户号、双钱包余额和计数。
  2. 使用首次读取的数据生成扣款计划,不再隐藏读卡。
  3. 补贴足够时执行一笔;补贴不足时先扣补贴,再扣主钱包,并分别展示结果。
  4. 无论完整成功、部分成功或失败,都尽量再次读取同一张卡,展示真实余额和计数。

首次读卡失败不发送扣款;扣款一旦开始,整单不自动重试。部分成功或结果不确定进入阻断状态,等待人工核对。

页面展示

语音资源

新增 please_swipe_card.mp3,参考现有资源约 1.1 至 1.3 秒的节奏,输出 16kHz、32kbps、单声道 MP3。用户点击支付且读卡器接受订单后播放一次,并遵守语音开关。

安全边界

验证

覆盖请求解析、订单去重、严格事务顺序、三种钱包组合、失败后复读和防重复消费;再执行 JDK 8 完整测试与 Debug 构建。真实 USB 扣费、双钱包余额、新接口数据和语音响度均待样机验证。

评审清单

经验与反模式

可沉淀经验:真实扣费必须串行记录前读卡、逐钱包扣款和后读卡,并禁止不确定结果自动重试。

拒绝的反模式:并发操作第二个 USB 实例、扣款超时后自动整单重试、把部分成功显示成完全失败。

人工评审状态

本地语音、补贴优先、必要时两笔扣款及整体实现边界均已由用户确认;代码和本地验证已按实施计划完成。