熟食称重“先放后选”交互设计

项目:SellWeight日期:2026-09-20状态:代码已实施并通过自动化验证,待真机验收执行模式:常规 Codex

1. 目标与冻结流程

把当前“先选或先称,再点加入购物车”改为唯一主路径,并保证每件商品都完成取走和归零闭环。

用户主动归零并等待稳定 → 放置商品 → 等待重量稳定 → 点击商品 → 直接加入购物车 → 取走商品 → 用户主动归零 → 等待稳定零位 → 开始下一件

2. 已确认决策

  1. 采用独立状态机方案 B。
  2. 称重前必须收到有效、稳定、协议确认的零位数据。
  3. 正重量稳定后点击商品直接入车,不再二次点击“加入购物车”。
  4. 首次成功点击后立即锁定本轮,防止连续点击重复入车。
  5. 提示包含商品、重量、本次新增金额、取走商品和手动归零指引;同商品合并时不显示累计行金额。
  6. 实时价格布局不改,未选择商品时保持 0.00 元。
  7. 系统绝不自动归零;页面归零命令只能由用户明确点击归零入口触发。
  8. 称重未闭环时,定值商品、手动金额和结算入口暂时不可用。
  9. 串口重量、状态转换和 UI 更新统一在主线程处理。
  10. 默认拒绝去皮和非 kg 单位;无活动称重周期时秤故障不阻断定值、手动金额及已完成订单结算。
  11. 账单打开和真正发起支付前都检查称重周期。
  12. 购物车、支付、订单和上传协议不变。

3. 范围与非目标

本次只调整称重熟食的操作顺序、状态判断、商品点击、提示、线程一致性和必要门禁,并补充状态机测试。

4. 状态机

状态含义商品点击结果
WAITING_SCALE尚未收到有效秤数据提示设备未就绪
WAITING_ZERO_STABLE未确认稳定零位提示保持秤盘为空、手动归零并等待稳定
READY_TO_PLACE稳定零位,可以放商品提示先放置商品
WEIGHT_CHANGING正重量但尚未稳定提示等待重量稳定
READY_TO_SELECT正重量且稳定立即加入购物车
WAITING_REMOVE_ZERO本轮已入车,等待取走和用户归零提示取走商品并手动归零,不重复入车
SCALE_ERROR无效、负重、去皮、单位异常、溢出、超时或断开禁止称重入车;无活动周期时可继续定值流程

稳定零位

必须同时满足:数据有效、BCC 有效、未溢出、符号为正或零、单位为 kg、非去皮模式、快照未过期、isWeightStable() 为真、isZeroWeight() 为真,并且规范化业务重量为 0g。页面展示仅是输出,不参与状态判定。

状态转换

WAITING_SCALE → WAITING_ZERO_STABLE → READY_TO_PLACE WAITING_ZERO_STABLE --有效但未稳定归零→ 保持当前状态 WAITING_ZERO_STABLE --用户主动归零→ 保持当前状态并等待新秤帧 READY_TO_PLACE → WEIGHT_CHANGING → READY_TO_SELECT READY_TO_SELECT --点击商品并入车→ WAITING_REMOVE_ZERO WAITING_REMOVE_ZERO --用户主动归零→ 保持当前状态并等待新秤帧 WAITING_REMOVE_ZERO --稳定零位→ READY_TO_PLACE 任意有效业务状态 --异常帧→ SCALE_ERROR

5. 点击即入车

  1. 检查支付会话未进行中,且状态严格为 READY_TO_SELECT。
  2. 读取同一份不可变重量快照。
  3. 先切换到 WAITING_REMOVE_ZERO,立即关闭本轮后续点击。
  4. 按商品和快照计算本次新增金额,新建或合并购物车行;合并时以购物车总额差值作为提示金额。
  5. 更新合计并提示:卤牛肉 250g 已加入,¥12.50;请取走商品并手动归零。
  6. 后续点击只提示取走商品并手动归零,不再次使用本轮重量。
  7. 入车成功和进入等待归零状态均不得自动调用归零命令。

若购物车写入发生异常,必须回滚并恢复到待选商品状态,不能留下半完成状态。

6. 页面行为

7. 用户主动归零规则

本方案不再规定“任何非零读数都禁止发送归零命令”。是否允许特定重量下归零,由用户主动操作和秤体自身安全能力共同决定。

8. 线程一致性

串口先按协议边界组装完整帧,再生成带规范化整数克、单位、去皮、稳定、零位和采集时间的不可变重量快照;重量字段、状态转换、商品点击和 UI 刷新统一在主线程执行。过期快照不能入车,状态机不引用 Activity、View、数据库或串口对象。

9. 验收重点

  1. 稳定零位前不能入车;启动时秤上有物必须先取走、由用户主动归零。
  2. 零重量点击商品提示先放商品;不稳定时提示等待稳定。
  3. 稳定后点击一次立即入车,提示商品、重量、本次新增金额、取走商品和手动归零。
  4. 同一轮连续点击多个商品,购物车只能增加一次。
  5. 系统不会自动归零;用户未归零或尚未收到稳定零位时不能开始下一轮。
  6. 负重量、溢出、无效帧和校验失败不能变成可选商品状态。
  7. 去皮、非 kg 单位和过期快照不能入车;无活动周期时秤故障不阻断定值流程。
  8. 账单打开后再放商品,确认支付必须被二次检查拦截。
  9. 称重未闭环时,定值、手动金额和结算均被阻止。
  10. 稳定归零后,定值、手动金额、购物车和支付行为保持原样。

10. 测试设计

11. 影响范围

代码变更预计集中在 CookedFoodActivity、新增纯状态机类、熟食布局、字符串/语音资源和单元测试。数据库、订单明细与支付协议不变。

12. 风险与回滚

13. 书面复核

方案 B 及确认项已写入本文。归零口径为:系统不自动归零,只提示用户;归零必须由用户主动触发;收到新的有效稳定零位后才进入下一轮。代码已按本设计实施,并通过 90 个 JVM 单元测试和 Debug 构建;真实秤体协议、快照超时及刷卡、扫码、人脸支付二次门禁仍待真机验收,验收结果以对应变更记录为准。