营销活动业务逻辑梳理
更新日期:2026-05-22。
本文基于后端 WinTradeCloudService 的营销相关代码梳理,主要覆盖 wt-market、wt-business、wt-user、wt-client、wt-admin 和 wt-quartz 中的营销逻辑。它偏业务阅读,帮助先理解平台、商户和用户分别能做什么,以及优惠在订单里如何真正生效。
一句话结论
当前后端营销中心支持的主线是:平台活动、商户活动、平台券、商户券、平台活动价、商户活动价、活动范围、预算池、成本分摊、补贴确认和活动归档。
代码里没有看到独立的秒杀、拼团、团购、满赠、包邮券等专门活动模型。现有“活动”更像一个营销方案容器,里面可以挂优惠券或活动价,再通过店铺、SKU、预算和使用策略控制生效。
后端支持哪些营销活动
| 类型 | 发起方 | 给用户的表现 | 后端核心对象 | 当前支持程度 |
|---|---|---|---|---|
| 平台活动 | 平台运营 | 首页广告、平台券、平台活动价 | PlatformMarketingActivity |
已支持 |
| 商户活动 | 商铺店家 | 店铺券、店铺活动价 | MerchantMarketingActivity |
已支持 |
| 平台优惠券 | 平台运营 | 用户领取平台券,下单抵扣 | PlatformActivityCoupon、PlatformActivityCouponPool |
已支持 |
| 商户优惠券 | 商铺店家 | 用户领取店铺券,下单抵扣 | MerchantActivityCoupon、MerchantActivityCouponPool |
已支持 |
| 平台活动价 | 平台运营 | 商品直接展示活动价 | PlatformActivityPriceStrategy |
已支持 |
| 商户活动价 | 商铺店家 | 店铺商品直接展示活动价 | MerchantActivityPriceStrategy |
已支持 |
| 活动展示资源 | 平台运营 | Banner 或广告跳转活动 | Banner、Advertise |
已支持,字段可关联平台活动 |
| 平台活动商户参与 | 平台和商户 | 商户参与平台活动后商品才可命中某些平台规则 | PlatformMarketingActivityParticipation |
已支持邀请、报名、审核通过和拒绝 |
核心业务对象
营销中心不是单表逻辑,而是一组对象组合。
| 对象 | 作用 |
|---|---|
| 活动 | 定义活动名称、编码、时间、状态和说明,是所有营销能力的容器 |
| 活动范围 | 限定活动覆盖哪些店铺和 SKU;平台活动标准流程由商户报名审核通过后自动生成范围,手工范围主要用于预置和复核 |
| 优惠券定义 | 定义券类型、门槛、优惠金额、折扣比例、有效期和退券策略 |
| 券池 | 控制发放时间、总数量、每人限领、已领取、已发放、已使用和预算额度 |
| 用券策略 | 控制券适用全部、店铺、SPU、SKU,以及是否允许和其他优惠叠加 |
| 卡券钱包 | 用户领取后形成个人资产,状态从可用、锁定、已使用、过期到退回 |
| 活动价策略 | 控制商品命中固定活动价、折扣活动价或阶梯活动价 |
| 预算池 | 控制活动成本,可有限预算,也可无限预算只记账 |
| 分摊记录 | 把优惠金额分摊到订单项,用于成本、报表和补贴 |
| 补贴确认 | 支撑平台或商户承担营销成本后的人工确认和结算推进 |
平台可以做什么
平台管理员通过 /api/v1/marketing/admin 维护平台侧营销。
- 通过平台活动配置向导创建平台活动,填写活动名称、编码、开始时间、结束时间、说明和
1:1、16:9、2:1三张主宣传图。 - 按需手工补录活动范围,可以绑定参与店铺和参与 SKU;标准流程也可以等商户报名审核通过后自动生成范围。
- 配置展示资源,Banner 和广告位可以关联平台营销活动。
- 配置平台优惠券,包括券组、券定义、用券策略、策略目标和券池。
- 配置平台活动价,指定商户、店铺、SPU 或 SKU,设置活动价或折扣。
- 配置预算池,支持充值、人工调账、冻结、解冻、剩余预算退回和结算后调整。
- 查看发券记录、用券记录、分摊记录、活动价分摊、成本日报和补贴记录。
- 批量邀请商户报名,审核商户提交的参与记录,审核通过后自动补齐平台活动参与店铺和 SKU。
- 推进活动状态,包括启动、暂停、恢复、结束、关闭未使用钱包券、结算归档和取消。
平台活动适合做全站活动、跨店活动、指定店铺活动、指定 SKU 活动和平台补贴类活动。
商铺店家可以做什么
商户通过 /api/v1/merchant/marketing 维护自己的店铺营销。Controller 会按当前商户账号补齐或校验 merchantAccountId,避免操作其他商户数据。
- 创建商户活动,绑定自己的商户账号和店铺。
- 配置商户活动范围,可以绑定本店店铺范围和 SKU 范围。
- 创建商户优惠券组、优惠券、用券策略、策略目标和券池。
- 向用户发放商户券,也可以让用户主动领取商户券。
- 创建商户活动价,让本店商品直接命中活动价。
- 配置商户预算池,商户预存预算可以从商户钱包充值。
- 查看本商户的发券、用券、分摊、预算流水、成本日报和补贴推进记录。
- 对平台活动价中由商户承担的成本进行确认。
商户活动适合做店铺满减券、店铺立减券、店铺折扣券、指定商品券、指定 SKU 活动价和店铺自补贴活动。
商户如何参与平台活动
后端存在 PlatformMarketingActivityParticipation 参与关系,状态包括 INVITED、APPLIED、APPROVED、REJECTED、WITHDRAWN、REMOVED。当前 Controller 已经暴露平台邀请、商户报名、平台审核通过和拒绝的主要动作。
平台活动如果要让某个商户活动承接成本或范围,建议按下面流程操作:
- 平台通过
营销中心 / 平台营销活动配置向导创建平台活动,并通过/platform/activity-participation/invite/batch批量邀请目标商户店铺。 - 邀请记录里的报名页面地址使用
/merchant-marketing/platform-activity-apply-workflow。 - 商户通过
商户营销 / 平台活动报名向导选择INVITED平台活动。 - 商户在向导中创建新的商户活动,或选择已有商户活动;创建商户活动时会关联
platformActivityId。 - 商户选择本店参与平台活动的 SKU 后,通过
/platform/activity-participation/apply提交报名,报名必须包含 SKU。 - 平台通过
/platform/activity-participation/{participationId}/approve审核通过,系统会自动把商户店铺和报名 SKU 写入平台活动范围。 - 平台活动范围和商户活动范围会共同校验,店铺和 SKU 必须同时匹配。
- 如果平台活动价成本由商户承担,还需要商户创建平台活动价成本确认记录。
需要注意:WITHDRAWN 和 REMOVED 状态已在枚举中存在,但当前显式接口主要覆盖邀请、报名、通过和拒绝,退出和移除仍需要结合后续运营需求确认是否补接口。
活动状态规则
平台活动和商户活动共用一套状态。
| 状态 | 含义 |
|---|---|
DRAFT |
草稿,允许编辑和取消 |
WAITING |
待开始,允许启动和取消 |
RUNNING |
进行中,允许领券、发券、活动价生效 |
PAUSED |
已暂停,不允许新增领券和活动价试算 |
ENDED |
已结束,不再领券发券,但已发且未过期的钱包券仍可使用 |
SETTLED |
已结算归档,不再产生新权益 |
CANCELED |
已取消,只允许未开始且无业务引用的活动进入 |
不同业务动作对活动状态的要求不同。
| 动作 | 允许口径 |
|---|---|
| 领券或后台发券 | 活动必须是 RUNNING,在活动时间内,并且启用 |
| 活动价试算 | 活动必须是 RUNNING,在活动时间内,并且启用 |
| 钱包券下单和支付核销 | 活动可以是 RUNNING 或 ENDED,但不能早于活动开始 |
| 活动自动结束 | 到达结束时间后,定时任务会把 RUNNING 或 PAUSED 活动结束 |
| 结算归档 | 活动必须先 ENDED,且钱包券、订单、预算、补贴和结算推进都关闭 |
| 取消活动 | 只允许 DRAFT 或 WAITING,且不能已有发券、用券或预算流水 |
活动范围规则
活动范围有两层。
- 活动级范围:平台活动或商户活动可以配置参与店铺和参与 SKU。
- 优惠券使用范围:优惠券策略可以配置
ALL、SHOP、SPU、SKU或预留的CATEGORY。
后端的实际判断是交集逻辑。
| 场景 | 规则 |
|---|---|
| 平台活动 | 如果配置了 SKU 范围,商品 SKU 必须命中;如果配置了店铺范围,商品店铺必须命中 |
| 商户活动 | 商品必须属于活动绑定的商户店铺,同时满足商户活动的店铺和 SKU 范围 |
| 商户承接平台活动 | 还要存在已审核通过的参与关系,并且平台活动范围也要命中 |
优惠券策略为 ALL |
归属范围内全部商品可用 |
优惠券策略为 SHOP、SPU、SKU |
必须维护策略目标,订单商品要命中目标 |
优惠券策略为 CATEGORY |
枚举预留,当前订单用券逻辑会提示暂不支持分类券 |
配置侧需要注意:
- 平台活动不再要求先手工配置店铺范围和 SKU 范围才能邀请商户。
- 商户报名审核通过后,会把报名店铺和 SKU 自动写入平台活动范围。
- 发布前至少需要存在审核通过报名生成的 SKU 范围,或平台已经手工补录有效 SKU 范围。
- 商户报名不能用空 SKU 表示整店参加。
优惠券规则
当前支持三类券。
| 券类型 | 计算规则 |
|---|---|
FULL_REDUCTION |
满减券,订单适用商品金额达到门槛后抵扣固定金额 |
DIRECT_REDUCTION |
立减券,无门槛或弱门槛,直接抵扣固定金额 |
DISCOUNT |
折扣券,按用户支付比例计算折扣,可配置最大抵扣金额 |
优惠券还有这些关键规则:
| 规则 | 说明 |
|---|---|
| 有效期 | 支持固定起止时间,或领取、发放后若干天有效 |
| 退券策略 | 支持可退并可再次使用、不可退、可退但不可再次使用 |
| 券池库存 | totalQuantity 控制总数量,claimedQuantity 和 grantedQuantity 共同占用数量 |
| 每人限领 | perUserLimit 控制单个用户能领取或被发放的数量 |
| 幂等号 | 当每人可多次领券时,领券请求必须带 requestNo |
| 预算绑定 | 券池必须绑定预算池,否则领券或用券会失败;后台向导要求先保存预算池,再创建或绑定券池 |
| 使用策略 | 每张券必须显式配置启用的用券策略,即使是全场券也要配置 ALL |
| 预算预占 | 如果预算池扣减模式是 ISSUE_RESERVE,领券或发券时预占预算 |
| 支付扣减 | 如果预算池扣减模式是 USE_DEDUCT,支付核销时扣减预算 |
活动价规则
活动价会在商品当前价格计算时生效,发生在优惠券之前。
| 活动价类型 | 计算规则 |
|---|---|
FIXED_PRICE |
固定活动价 |
DISCOUNT_PRICE |
折扣活动价,discountRate 表示用户支付比例 |
TIERED_PRICE |
阶梯活动价,按购买数量区间匹配 |
匹配活动价时,后端会校验这些条件:
- 策略已审核通过。
- 策略、活动维度和人工开关都启用。
- 币种必须是
CNY。 - 商品命中指定 SPU 或 SKU。
- 数量满足最小和最大购买数量。
- 当前时间在策略生效时间内。
- 活动本身处于活动价可用状态。
- 商品命中活动范围。
- 如果平台活动价由商户承担成本,商户必须有已通过的平台活动参与关系和成本确认记录。
活动价优先级目前是:先找商户活动价,再找平台活动价;同一层内选择用户单价最低的策略。命中活动价后,订单项会保存 promotionId 和 promotionData,用于后续分摊、预算和补贴。
优惠叠加规则
订单里优惠的叠加顺序大致是:
- 当前价格先算商品原价、活动价和运费。
- 用户选择商户券后,先按店铺维度扣商户券。
- 用户选择平台券后,再基于剩余商品金额扣平台券。
- 最终重新汇总订单金额。
关键限制如下:
| 限制 | 说明 |
|---|---|
| 平台券数量 | 一个订单最多使用一张平台券 |
| 商户券数量 | 购物车跨店下单时,每个店铺最多一张商户券 |
| SKU 直购 | 最多只能使用一张当前店铺商户券 |
| 重复使用 | 同一张钱包券不能在同一订单里重复传入 |
| 平台券和商户券叠加 | 平台券策略和所有商户券策略都必须允许 allowPlatformMerchantStack |
| 活动价和优惠券叠加 | 策略字段预留了是否允许与活动价叠加,但当前订单校验主要落在平台券和商户券叠加上 |
| 金额分摊 | 优惠金额按适用商品的剩余商品金额比例分摊,四舍五入差额落到金额最大的商品 |
| 商户结算基数 | 商户券或商户承担活动价如果是结算扣减模式,会减少 merchantSettlementBaseAmount |
用户端如何参与
用户端有两类参与方式:主动领券和自动命中活动价。
领券流程
- 用户查询可领取平台券:
GET /api/v1/user/personal/coupon-wallet/claimable/platform/page。 - 用户查询可领取商户券:
GET /api/v1/user/personal/coupon-wallet/claimable/merchant/page。 - 后端返回是否可领取、不可领取原因、活动名、券名、有效期、限领数量和已领数量。
- 用户领取平台券:
POST /api/v1/user/personal/coupon-wallet/claim/platform/{couponPoolId}。 - 用户领取商户券:
POST /api/v1/user/personal/coupon-wallet/claim/merchant/{couponPoolId}。 - 领取成功后生成个人卡券钱包项和卡券流水。
下单用券流程
- 用户先做订单预览,不传优惠券,拿基础金额和店铺拆单。
- 用户查询该订单可用券:
- 购物车:
POST /api/v1/personal/order/cart/available-coupon。 - SKU 直购:
POST /api/v1/personal/order/available-coupon。
- 购物车:
- 后端从用户可用钱包券中筛选可用于当前订单的券,并估算优惠金额。
- 用户选择平台券和商户券后,再调用订单预览接口,传入
platformCouponWalletItemId和merchantCouponWalletItems。 - 后端重新计算优惠后的金额。
- 用户确认下单,创建订单时后端锁定所选优惠券。
- 用户支付时,后端再次校验锁定券、活动状态、预算和活动价锁价。
- 支付成功后,卡券变为已使用,生成用券记录、分摊记录、预算流水和待确认补贴。
活动价参与流程
用户不需要主动选择活动价。商品当前价格接口或订单试算会自动调用活动价匹配逻辑,命中后直接影响商品单价、优惠金额、订单项快照和商户结算基数。
订单取消、超时和退款
| 场景 | 后端处理 |
|---|---|
| 待支付订单取消 | 释放锁定优惠券,释放或关闭对应预算责任 |
| 待支付超时 | 定时任务关闭订单,并释放订单已锁定的营销权益 |
| 支付前营销失效 | 释放优惠券,关闭待支付订单,提示用户重新试算下单 |
| 支付成功后退款 | 根据退券策略决定券是否回到可用、退回不可用或不退券 |
| 活动价退款 | 回滚活动价分摊、预算和补贴相关责任 |
| 补贴异常 | 进入补贴确认、作废、需调账或异常结案流程 |
预算和成本规则
预算池分平台和商户两套,但账务组件统一处理。
| 预算模式 | 说明 |
|---|---|
LIMITED |
有限预算,必须保证可用、预占、已用、冻结、已退回之间平衡 |
UNLIMITED |
无限预算,只记录成本,不实际限制余额 |
ISSUE_RESERVE |
领券或发券时先预占预算 |
USE_DEDUCT |
支付核销时直接扣减预算 |
预算流水支持充值、预占、释放预占、核销预占、直接核销、退款返还、退回预占、退回剩余预算、结算后调整、冻结、解冻和日终对账。
活动成本主要来自三类:
- 平台券抵扣。
- 商户券抵扣。
- 平台或商户活动价优惠。
这些成本都会尽量分摊到订单项,再进入预算流水、成本日报和补贴确认。
配置示例
平台满减券活动
- 平台创建平台活动。
- 配置活动店铺和 SKU 范围,或不配表示全范围。
- 创建平台优惠券,类型选
FULL_REDUCTION,设置门槛和抵扣金额。 - 创建用券策略,范围选
ALL或指定目标。 - 创建券池,设置发放时间、总量、每人限领和预算池。
- 如预算有限,给预算池充值并设置扣减模式。
- 启动活动。
- 用户领取平台券,下单时选择平台券。
商户店铺券活动
- 商户创建商户活动,并选择本店。
- 配置参与 SKU。
- 创建商户优惠券和用券策略。
- 创建商户券池,绑定商户预算池。
- 商户预算池充值。
- 启动活动。
- 用户领取商户券,在该店铺下单时使用。
商品活动价
- 平台或商户创建活动。
- 配置活动范围。
- 创建活动价策略,指定 SPU 或 SKU。
- 选择固定活动价、折扣活动价或阶梯活动价。
- 平台活动价如果由商户承担成本,需要商户确认。
- 启动活动。
- 商品当前价格自动命中活动价,用户无需领券。
目前需要关注的缺口
| 缺口 | 说明 |
|---|---|
| 秒杀、拼团、团购 | 未看到独立模型和接口,当前不能按专门活动规则处理 |
| 分类券 | 枚举已预留,但订单用券逻辑当前提示暂不支持分类券 |
| 平台活动退出和移除 | 状态枚举已预留,但当前显式接口主要覆盖邀请、报名、审核通过和拒绝 |
| 活动价与优惠券叠加 | 字段预留较完整,但订单侧显式叠加校验主要覆盖平台券和商户券 |
| 前端运营 SOP | 补贴确认、异常结案、结算后调整这类人工治理动作还需要业务口径 |
阅读代码时的入口
| 主题 | 主要代码 |
|---|---|
| 平台营销接口 | AdminPlatformMarketingActivityController、AdminPlatformMarketingScopeController、AdminPlatformMarketingCouponController、AdminPlatformMarketingPriceController、AdminPlatformMarketingBudgetController、AdminMarketingSubsidyController |
| 商户营销接口 | MerchantMarketingActivityController、MerchantMarketingScopeController、MerchantMarketingCouponController、MerchantMarketingPriceController、MerchantMarketingBudgetController、MerchantMarketingSubsidyController |
| 用户卡券 | PersonalCouponWalletController、MarketingCouponIssueComponent、PersonalCouponWalletComponent |
| 订单可用券 | PersonalOrderTransactionController、MarketingOrderAvailableCouponComponent |
| 订单锁券和核销 | OrderAbstractServiceImpl、MarketingCouponOrderComponent |
| 活动价 | ProductCurrentPriceServiceImpl、MarketingActivityPriceComponent |
| 活动状态和范围 | MarketingActivityEffectiveComponent、MarketingActivityScopeResolver |
| 预算账务 | MarketingBudgetAccountingComponent |
| 归档和定时任务 | MarketingActivitySettlementComponent、MarketingActivitySettlementGuardComponent、MarketingActivityTask、MarketingCouponTask、MarketingOrderTask、MarketingBudgetTask |