# 营销叠加互斥规定--该项目暂时不需要 > 核心业务规则,生成用例时**严禁**违反以下逻辑(以 `/zanmall_order/order/confirm` + `/zanmall_order/order/submit` 当前代码为准): 1. **优惠券规则(作用域互斥)**: - 同一作用域(同店铺券池 / 平台券池)一次只会生效 **1 张券**,不可多张叠加。 - 平台券与店铺券可同时生效(前提各自命中可用条件)。 - 套餐商品(`comboId > 0`)不参与优惠券分摊。 2. **优先级逻辑**: - 用户未手动指定优惠券(`userChangeCoupon != 1`)时,系统默认选择**优惠金额最大**的可用券。 - 用户手动指定(`userChangeCoupon = 1`)时,仅按传入 `couponIds` 选择;也可手动不使用优惠券。 3. **积分与优惠券关系**: - 普通订单中,**优惠券可与积分抵现叠加**(积分开关开启且 `isScorePay = 1`)。 - 积分在会员权益阶段之后计算,提交时会单独锁积分。 4. **一口价互斥**: - 命中一口价(`fixedPriceId != null`)时,不走平台券、会员折扣、积分抵现链路。 - 一口价会重算店铺金额并覆盖此前店铺侧优惠计算结果,不与常规营销链路叠加。 5. **满减送互斥**: - 满减送对以下商品组直接跳过:已命中旧满减、拼团/秒杀/积分类商品、限时折扣、一口价、套餐。 6. **会员折扣链路差异(配置项)**: - 会员价开关关闭(legacy)时:会员折扣可继续叠加在已优惠商品上。 - 会员价开关开启(hybrid)时:已命中营销活动或已使用优惠券的商品不再叠加会员折扣。 7. **运费规则**: - 运费按“店铺 + 运费模板(含供应商维度)”计算后累加。 - 包邮只作用于命中的模板或模板条件,不是“只要有一件包邮就全单免邮”。 8. **确认单链路顺序(普通路径)**: - 先计算店铺侧营销(折扣/套餐、满减、店铺券等),再处理平台券,再处理会员与积分,再汇总运费。 - 若命中一口价,直接进入一口价分支并覆盖店铺金额,不再进入平台券+会员+积分常规链路。 9. **提交单锁定规则**: - 提交单阶段不会重新“试算”营销组合,按确认单结果执行资源锁定。 - 优惠券、积分分别在提交阶段单独锁定,确保与确认单结果一致。 ## 关系速查(按当前接口逻辑) | 活动A | 活动B | 关系 | 条件说明 | | --- | --- | --- | --- | | 优惠券 | 优惠券(同作用域) | ❌ | 同一券池仅生效 1 张 | | 平台券 | 店铺券 | ✅ | 分池计算,可同时生效 | | 优惠券 | 套餐商品 | ⬇️ | 套餐商品不参与券分摊,非套餐可用券 | | 优惠券 | 积分抵现 | ✅ | 积分开关开启且 `isScorePay=1` 时可叠加 | | 会员折扣 | 优惠券 | ⬇️ | legacy 可叠加;hybrid 对已用券商品不叠加 | | 满减送 | 旧满减/限时折扣/套餐/一口价/拼团秒杀积分类 | ❌(同商品组) | 命中互斥条件即跳过满减送 | | 一口价 | 平台券 | ❌ | 一口价分支跳过平台券链路 | | 一口价 | 会员折扣 | ❌ | 一口价分支跳过会员链路 | | 一口价 | 积分抵现 | ❌ | 积分在会员链路内计算,一口价整体跳过 | | 一口价 | 店铺侧营销结果(满减/店铺券/套餐) | ❌(覆盖) | 一口价重算并覆盖此前店铺优惠汇总 | | 提交阶段 | 优惠券锁定 | 执行 | 按确认单结果锁券 | | 提交阶段 | 积分锁定 | 执行 | 按确认单结果锁积分 | | 运费 | 包邮模板 | ⬇️ | 按店铺+模板累加;仅命中模板免运费 | ## 符号定义 - `✅`:可叠加(同一条 confirm 链路会连续生效,且无显式跳过/覆盖) - `❌`:互斥(代码显式跳过,或后置计算覆盖前置结果) - `⬇️`:条件叠加(依赖配置开关、活动命中、商品类型、券作用域等) ## 可配置项(影响叠加结果) - `memberPriceSwitchConfig(enabled/failOpenLegacy)`:控制会员折扣走 legacy 还是 hybrid。 - `SCORE_CONFIG(shoppingScoreSwitch/useRatioLimit/shoppingUseScoreRatio)`:控制积分抵现开关、比例与上限。 - `会员权益 rightsType/freeFeeType`:控制会员包邮是否命中。 - `userChangeCoupon + couponIds`:控制是否手动指定优惠券。