结算累加与商米扫码支付设计

日期:2026-09-28

目标

在 SanquanConsumption 的结算页面补齐视频中展示的金额累加能力,并在已连接的商米 T1mini 上通过系统扫码组件采集支付宝付款码,调用现有 /api/consume/orderPay 完成真实支付。

范围

金额累加

商米扫码

支付提交

组件职责

AmountInputController

只管理金额表达式、当前金额项、删除/清空规则和精确合计,不依赖 Android UI 或网络,便于单元测试。

SunmiScannerClient

只负责选择商米扫码 Action、构造 Intent 和解析 Activity 返回结果。它不保存付款码,也不发起支付。

PaymentRequestFactory

只负责根据设备配置、付款码和合计金额构造 ApiModels.PaymentRequest,集中维护 custom_dish、订单类型和消费动作等协议常量,避免请求字段散落在页面代码中。

MainActivity

负责页面状态编排:渲染金额、启动扫码、接收扫码结果、控制单次支付、展示结果、刷新订单及按生命周期取消请求。页面不实现扫码协议解析和金额运算细节。

数据流

  1. 用户点击左侧二维码进入结算页面。
  2. 用户输入金额;每次点击“+”确认当前金额项,控制器持续返回表达式和精确合计。
  3. 用户点击“扫码支付”,页面完成前置校验后启动商米扫码组件。
  4. 扫码组件返回二维码,SunmiScannerClient 校验并规范化付款码。
  5. PaymentRequestFactory 以付款码、合计金额和设备配置生成支付请求。
  6. MainActivity 调用 ApiClient.pay,支付期间拒绝第二次提交。
  7. 成功时清空结算状态、返回记录页并重新加载订单;失败时保留表达式并允许重试。

状态与异常处理

安全边界

验证标准

单元测试

构建检查

./gradlew :app:testDebugUnitTest :app:assembleDebug :app:lintDebug --offline 通过。

T1mini 实机检查

真实扣款成功依赖有效服务端配置、可用的支付宝付款码和联调环境;在缺少这些条件时,只能验证扫码拉起、请求构造及错误处理,不能宣称支付闭环已通过。

明确不包含