# Quickstart 验证: 商品规格

**Feature**: 013-food-spec | **Date**: 2026-07-15

> 手动端到端验证（项目无自动化测试）。接口契约见 [contracts/api.md](../contracts/api.md)，数据模型见 [data-model.md](../data-model.md)。

## 前置

1. 数据库已执行 `updatesql/sql.md` 中三张规格表的 DDL。
2. 存在一个门店（mdId=3）与至少一个商品（`pos_food` 记录）。
3. 商家账号 token 可用。

## 场景 1：规格模板管理

1. POST /chanting/foodSpec/saveFoodSpec，建"甜度"(单选/必选) + 规格值 无糖(0)/半糖(0)/全糖(0)。
2. GET /chanting/foodSpec/foodSpecPageList?mdId=3 → 列表含该规格及 3 个值。
3. GET /chanting/foodSpec/getSpecs?id={id} → 详情正确。
4. GET /chanting/foodSpec/changeOpen?id={id}&isOpen=false → 再查 getAvailableSpecsList 不含该规格。

**预期**：增删改查、启停、软删均生效；跨门店(mdId=4)查询不可见。

## 场景 2：商品挂规格

1. GET /chanting/foodSpec/getAvailableSpecsList?mdId=3 → 拿到可用规格。
2. POST /chanting/food/setposfood，商品带 foodSpecs=[甜度, 加料]。
3. GET /chanting/food/getfood?id={foodId} → 返回 foodSpecs 含甜度 + 加料。

**预期**：`food_spec_relation` 写入 2 条；`food_sku` JSON 同步更新；重新勾选（减为仅甜度）后关联更新为 1 条。

## 场景 3：列表返回规格

1. GET /chanting/food/getidlist（含该商品）→ 每条商品带 foodSpecs。
2. GET /chanting/food/stallFoodList、/foodSearch 同样带规格。

**预期**：列表注入规格结构完整、仅含启用项；无规格商品返回空规格。

## 场景 4：计价一致性

1. 顾客选 全糖(加价 0) + 珍珠(加价 5) 下单。
2. 检查订单快照 otherPrice = 5；订单单价 = 商品价 + 5。
3. 若参与促销，specPrice = 5 正确叠加。

**预期**：otherPrice / specPrice / 规格加价三者一致，金额 0 误差。

## 场景 5：兼容性

- 仅用旧 `food_sku` JSON（不经关联表）的历史商品：列表/详情仍能返回规格 JSON，不报错。
- 后台 add/edit 编辑商品：规格能正确持久化（FR-011）。
