# Checklist: 算价逻辑 — 专项需求质量审查

**Purpose**: 算价是金钱相关核心逻辑，专项审查确保计算规则的完整性、正确性、无歧义
**Created**: 2026-06-01
**Feature**: 008-promotion-coupon — Phase 5.5 算价接口
**Depth**: Standard | **Actor**: Author (pre-implementation)

---

## 路径计算规则

- [ ] CHK001 — 路径A（走折扣）的计算规则是否覆盖了"部分商品有折扣、部分没有"的场景？ [Completeness, Spec §FR-017]
- [ ] CHK002 — 路径B（走满减）是否明确了"所有商品恢复原价"——即使该商品同时在折扣活动中？ [Clarity, Spec §FR-017]
- [ ] CHK003 — 两条路径都没有命中任何促销活动时（无满减无折扣），路径结果是否一致？是否正确返回原价？ [Edge Case, Gap]
- [ ] CHK004 — 路径A命中折扣但路径B未命中满减门槛时（如订单¥39但满减门槛¥40），路径A是否自动成为最优？ [Edge Case, Spec §FR-018]
- [ ] CHK005 — 路径A和路径B金额完全相等时，默认选哪条？是否有 tie-breaking 规则？ [Edge Case, Gap]

## 第二份半价特殊规则

- [ ] CHK006 — "每2件一组，第2件半价"的规则是否定义了同一商品买奇数件的处理（如买3件：第2件半价，第1、3件原价）？ [Completeness, Spec §Edge Cases]
- [ ] CHK007 — 第二份半价商品买多件时，半价优惠金额的计算公式是否明确？如：商品单价¥20，买4件 → ¥20+¥10+¥20+¥10 = ¥60？ [Clarity, Spec §Edge Cases]
- [ ] CHK008 — 第二份半价与路径计算的关系是否明确？它属于路径A（折扣路径）的一部分，还是独立第三条路径？ [Ambiguity, Spec §互斥规则]
- [ ] CHK009 — 同一商品同时在"第二份半价"和"折扣"活动中时，哪条规则优先？ [Conflict, Gap]

## 新客立减叠加

- [ ] CHK010 — "新客立减"的定义是否明确？是"该门店首次下单的用户"还是"平台新注册用户"？ [Clarity, Spec §FR-004]
- [ ] CHK011 — 新客立减的计算顺序是否明确？是在促销之后、优惠券之前扣减？ [Completeness, Spec §叠加计算顺序]
- [ ] CHK012 — 算价接口如何判断用户是否为"新客"？是否需要传 userId 由后端查询历史订单？ [Completeness, Plan §UserPromotionCalcController]
- [ ] CHK013 — 新客立减后金额为负数或零时如何处理？是否需要设置最低支付金额？ [Edge Case, Gap]

## 优惠券叠加与互斥

- [ ] CHK014 — 互斥券选中后，满减/折扣路径的计算结果如何变化？是否需要在 Response 中返回"如选择此券则促销失效"的提示？ [Completeness, Spec §FR-021]
- [ ] CHK015 — 同享券与满减叠加时，券的门槛是基于"促销后金额"还是"原始金额"？如原始¥45满减后¥33，券要求满30，¥33是否满足？ [Clarity, Spec §FR-020]
- [ ] CHK016 — 商品券作用于指定商品时，是否受该商品已参加折扣活动的影响？如商品已在7折区，再用5折券，是7折基础上再5折（=35折）还是原价直接5折？ [Ambiguity, Spec §FR-008]
- [ ] CHK017 — 用户传了无效/已过期/不满足门槛的 couponId，算价接口是返回错误还是忽略券继续计算？ [Edge Case, Gap]
- [ ] CHK018 — 商品券的 threshold（门槛）是整个订单金额门槛还是该商品本身的金额门槛？ [Ambiguity, Spec §promotion_coupon_rule]

## 算价接口输入/输出

- [ ] CHK019 — 算价接口的 items 参数中 price 字段是否应改为后端根据 productId 查询？前端传入价格是否有被篡改风险？ [Completeness, Plan §UserPromotionCalcController]
- [ ] CHK020 — 算价接口返回的 details 数组是否覆盖了所有优惠类型（满减/折扣/第二份半价/新客立减/满减券/商品券）？ [Coverage, Plan §算价接口 Response]
- [ ] CHK021 — forcePath 参数传入非法值（如"C"或空字符串）时接口行为是否定义？ [Edge Case, Gap]
- [ ] CHK022 — 算价接口是否需要返回"可用券列表"供前端展示？还是只计算传入的单张券？ [Completeness, Gap]

## 金额精度与边界

- [ ] CHK023 — 优惠金额计算结果的小数精度是否定义？如 7折 × ¥18 = ¥12.6，是保留1位还是2位？ [Clarity, Gap]
- [ ] CHK024 — 优惠后金额出现非整数分（如¥33.333）时的舍入规则是否明确（四舍五入/向上取整/截断）？ [Edge Case, Gap]
- [ ] CHK025 — 多重优惠叠加后最终金额为负数或零时的处理规则是否定义？ [Edge Case, Gap]
- [ ] CHK026 — 满减活动有多个档位（满20减5/满40减12/满60减20）时，订单¥45是命中"满40减12"还是需要找最接近的档位？ [Clarity, Spec §Edge Cases]
