calc-logic.md 4.6 KB

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]