熟食消费模式开发设计冻结
1. 冻结的含义
这里的“冻结”不是冻结代码,也不是要求马上提交 Git,而是在开发前把数据字段、上传格式、页面边界和计算规则定成唯一口径。开发人员按此实现,不再在不同类中各自发明字段名或金额算法;如果后续要改,先更新本文件和验收标准。
2. 已冻结决策
2.1 页面与消费模式
- 新增独立页面:
CookedFoodActivity。 - 首页新增“熟食消费”入口,进入
CookedFoodActivity。 - 不继承
WeightActivity,避免把麻辣烫专属控件、固定商品和结算条件带入熟食页。 - 复用底层能力:
BaseActivity、WeightSerialPortManager、ScaleProtocolParser、支付方式弹窗、网络支付和本地订单管理能力。 - 支付请求、单条
custom_dish组装和订单保存抽取为共享支付/订单流程能力,由麻辣烫页和熟食页共同调用,不在CookedFoodActivity复制整段支付代码。 - 熟食页自己维护当前商品、当前重量、稳定状态、购物车和本地熟食明细。
2.2 本地商品数据
- 新增商品类型:
ProductBean.TYPE_COOKED_FOOD = 5。 - 商品 ID 使用本地前缀:
product_cooked_food_。 - 熟食单价含义固定为“元 / 500g”。
- 商品设置至少保存:
id、name、price、type、basisGrams=500、enabled、sort。 - 商品数据库从版本 1 升级到版本 2 时使用
ALTER TABLE,不得删除并重建原商品表。
2.3 本地订单明细
第一期采用订单表独立 JSON 字段,而不是新增明细表。
选择原因:当前应用使用 SQLite 直接保存订单,第一期只要求订单恢复和展示熟食明细,不要求按熟食商品统计;订单 JSON 可以与订单摘要一次写入,改动面和离线风险更小。未来出现商品统计、报表或按行查询需求时,再迁移独立明细表。
Order增加cookedFoodDetails字段。- 订单数据库从当前版本 2 升级到版本 3。
- 新增列:
cooked_food_details TEXT,旧订单默认为空。 - 明细 JSON 版本固定为
1。 categories继续只保存上传摘要,不保存熟食明细。
2.4 明细 JSON
{
"version": 1,
"lines": [
{
"productId": "product_cooked_food_1",
"name": "卤鸡腿",
"unitPrice": "18.00",
"basisGrams": 500,
"weightGrams": 250,
"amount": "9.00"
}
],
"customAmount": "5.00",
"cookedFoodAmount": "9.00",
"totalAmount": "14.00"
}
2.5 上传摘要
在线支付请求和离线补传请求统一使用一条 DishItem:
{
"uuid": "custom_dish",
"number": "1",
"money": "14.00"
}
熟食明细不进入 categories,离线补传不读取 cooked_food_details 构造 dishes。
2.6 金额和重量
- 重量内部统一保存为整数克。
- 计价公式:
weightGrams ÷ 500 × unitPrice。 - 金额统一使用
BigDecimal计算,最终保留两位小数,半入方式舍入。 - 设置价格、购物车单价快照和订单明细金额均保存两位小数。
- 进入页面时要求购物车为空、当前净重为 0;检测到非零重量时提示收银员先归零。
- 当前一件商品允许“先选后称”或“先称后选”;选择商品不自动加入购物车。
- 点击加入必须同时满足商品已确定、重量大于 0、
ParsedResult.isWeightStable()为真。 - 一件商品加入后,下一件开始前先归零;避免两件商品的重量混合。
- 点击加入时必须同时满足:已选商品、重量大于 0、
ParsedResult.isWeightStable()为真。
3. 开发边界
必须改动
HomeActivity:增加熟食入口。- 新增
CookedFoodActivity及页面布局、商品适配器、购物车适配器。 ProductBean、ProductDatabaseHelper:增加熟食类型、字段、DAO 和安全迁移。WeightSetActivity:增加“熟食设置”同级页签及 Fragment。Order、OrderDatabaseHelper、OrderDao:增加独立熟食明细字段和版本迁移。OrderManager、支付请求构造和离线补传:支持单条custom_dish与本地明细分离。
不改动
- 服务端菜品协议和服务端熟食商品模型。
- 现有麻辣烫的称重、汤底和
categories上传策略。 - 现有支付方式和设备称重协议。
4. 进入编码前的唯一检查
- 页面名称和入口:
CookedFoodActivity/ “熟食消费”。 - 商品类型:
TYPE_COOKED_FOOD = 5。 - 计价基准:固定 500g。
- 本地明细:
cooked_food_details独立 JSON 字段。 - 上传载荷:单条
custom_dish,金额字段为money。 - 购物车:按
productId合并,只允许编辑重量。 - 结算:先显示对账单,确认后才进入支付流程。
以上六项已经足够让开发开始,不需要再等待产品层确认。