# 营销叠加互斥规定--该项目暂时不需要

> 核心业务规则，生成用例时**严禁**违反以下逻辑（以 `/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`：控制是否手动指定优惠券。
