罗晔(萝卜)
前言:
关于营销,相信作为电商消费者,大部分人都不陌生,营销是一种运营手段,通过各种玩法刺激消费者下单,核心是让消费者认为花了更少的钱买到了商品,觉得划算!
营销总体分为:1. 传统的营销,比如最典型的优惠券;2. 互动营销,比如微积分玩法帮砍一刀;
本文内容,主要针对传统的营销玩法,阐述规则引擎再营销业务玩法中的应用。
一、业务介绍
现有营销玩法举例:
- 单品返利
无批次一口价
巨划算
- 何为规则引擎
通过上面几个案例,我们可以看到,图中有两个直观的颜色,红色框和蓝色框,红色框描述的是一种条件,蓝色框描述的是享受的好处(领域语言:权益)。
抽象一下的描述就是:什么东西(事实)满足什么条件(LHS)执行什么动作(RHS)
事实(Fact):可以理解为推理前的已知对象,比如“下单金额”。
LHS(Left Hand Side):可以理解为规则执行需要满足的条件,比如“满500元”。
RHS(Right Hand Side):可以理解为规则执行后的返回对象,比如“返50元优惠券”。
PS:根据规则引擎的抽象描述,从技术层面来说是可以跟业务“解耦”,形成框架的,所以,市面上也有很多开源的规则引擎,至于选型,关键看是否合适和二次开发的成本。
二、营销领域模型
关键领域模型
上图中,活动助力部分,属于引言中提到的互动营销类领域,可以看出,实际上这是一种传统营销活动的扩展。另外,本文涉及的部分,主要是上图中的【营销玩法】【营销工具】及其上下文部分。
- 名词解释
有必要先对上图中的名词,做一些解释,按照DDD的说法,先对齐下“统一语言”(统一语言的重要性,就像大秦统一货币度量衡一样重要)
示例一:crm业务
示例二:
- 营销活动、营销玩法和营销工具之间的关系
- 营销活动:具体的营销内容,包括时间,条件,以及营销行为等。
- 营销工具:用营销积木块搭建的供小二或店铺创建营销活动的工具,可以供重复使用,用于定制最核心的玩法。表示为:条件集 → 行为集。
- 营销玩法:相对于营销工具,增加了定义渠道和一些限制。表示为:(渠道,条件集)→ 行为集。
三、营销积木化架构设计
- 营销积木化所处的位置(营销活动拆解图)
-
营销积木规则引擎场景(红色部分)
-
应用架构
四、营销积木化实现
最小粒度积木定义
每个最小粒度的积木,又称为一元元数据,定义为搭建营销工具中的最基本模块,英文全称PromotionBuildingBlocks,简称 PBB。如下图示例,商品满 10 元抽象为 ** 满 * 元积木,又称为一元 ** 满 * 元条件积木。
从上面看,每个最小粒度的积木由积木 ID、积木参数和积木的计算过程三部分组成。
-
积木的分类
目前积木的分类只有三种:资源型积木、条件型积木和行为型积木。定义如下:
• 资源型积木:在营销优惠计算时需要在运行时获取某个资源值,比如订单中无批次商品的个数、订单中商品指定 itemId 的总金额等等。这类的值统一定义为资源,定义和计算该资源的积木称为资源型积木。
• 条件型积木:优惠计算时决定能否享受优惠的先决条件,称为条件型积木。
• 行为型积木:优惠执行时要触发的动作,比如发送优惠券,享受优惠价格等,这种动作的定义和描述称为行为积木。 -
逻辑元数据
逻辑元数据主要用来把积木组装起来,主要包括:
• not,一元逻辑非
• and,二元逻辑与
• or,二元逻辑或
• so,二元因果
以一口价活动按 sku 特性为例,当指定商品 sku 值”V1_1_220933_420279” 在订单中购买满 3 件时就享受 2 元的优惠价格,其中包括了逻辑与和因果关系:
- 元数据底层实现类图
4.1 元数据类图
• Metadatable:元数据统一接口,继承 OptionalBindable。
• LogicalMetadata:可逻辑操作的抽象类,主要提供各种逻辑操作如 and、or 等。
• MultiplyMetadata:复合元数据,多个 Metadata 的组合,主要用于阶梯型的元数据构造。
• DualMetadata:二元逻辑操作的元数据抽象类,抽象出通用的二元操作的核心能力。
• AndMetadata:二元与逻辑操作的元数据,继承自 DualMetadata,提供与操作的核心能力。
• OrMetadata:二元或逻辑操作的元数据,继承自 DualMetadata,提供或操作的核心能力。
• SoMetadata:基于因果关系的二元元数据,继承自 LogicalMetadata,提供条件到行为的因果关系能力。
• Metadata:核心一元元数据类,提供一元元数据的核心能力,包括 MetaDef、元数据定义类型、参数等。
• OptionalBind:可选绑定类,用于绑定可选的 Metadata。
4.2 元数据定义类
• PromotionBlockMetaDataInfo:元数据信息类,包含元数据 ID、元数据定义类型、描述、参数定义等。
• MetaDef:元数据定义类,包含 PromotionBlockMetaDataInfo。
• ResourceMetaDef:资源型元数据定义类。
• ConditionMetaDef:条件型元数据定义类。
• ActionMetaDef:行为型元数据定义类。
4.3 参数定义类
• ParamsDefine:参数定义抽象类。
• SingleParamsDefine:简单参数定义类。
• MultipleParamsDefine:多参数定义类。
• AliasParamsDefine:别名参数定义类。
4.4 元数据执行器类
• MetaExecutor
• DualMetaExecutor
• AndMetaExecutor
• OrMetaExecutor
• SoMetaExecutor
• MultiplyMetaExecutor
4.5 积木扩展及场景扩展类图
- 元数据语法分析及执行过程
5.1 营销积木自由组装流程及示例
5.1.1 组装流程
Step 1: 获取积木 (元数据) 信息。
Step 2: 积木 (元数据) 参数定义与绑定。
Step 3: 条件和行为进行绑定。
5.1.2 代码示例
1)积木基本信息
2)积木参数说明(无)
3)示例:当购买无批次商品超过 10 件,就享受优惠价格 8 元
// 资源型元数据:无批次商品itemId 件(获取积木信息)
ResourceMetaDef noBatchItemIdCountResource = getMetaDef("market.pbb.resource.supplierNoBatchItemIdCount");
// 无批次商品itemId 件参数定义(无参数)
Metadatable<ResourceMetaDef> itemIdNumResourceMetadatable = MetadataBuilder.bind(noBatchItemIdCountResource);
// 条件型元数据:满多少
ConditionMetaDef amountOverCondition = getMetaDef("market.pbb.condition.amountOver");
// 无批次商品itemId 满多少件参数定义
Metadatable<ConditionMetaDef> numAmountOverCondition = MetadataBuilder.bind(amountOverCondition,
MetadataBuilder.newResourceParameter("amount", itemIdNumResourceMetadatable),
MetadataBuilder.newConstParameter("amountAt", 10)),
MetadataBuilder.newConstParameter("enableMultiple", false));
// 行为型元数据:商品享受优惠价格
ActionMetaDef actionMetaDef = getMetaDef("market.pbb.action.itemEnjoyPromotionPrice");
Metadatable<ActionMetaDef> enjoyPromotionPriceMetadatable = MetadataBuilder.bind(actionMetaDef,
MetadataBuilder.newConstParameter("itemPromotionPrice", 800),
MetadataBuilder.newConstParameter("outBizId", 1));
// 绑定行为和条件
Metadatable<ActionMetaDef> skuAndNumOverCombine = MetadataBuilder.bind(numAmountOverCondition,
enjoyPromotionPriceMetadatable);
4)规则执行
public class ExecutionEngine<OC extends AbstractExecutingContext, EC> {
.....
/**
* 优惠计算
*/
public <T extends MetaDef> boolean calculate(OC context, Metadatable<T> metadata) {
if (metadata == null) {
return false;
}
List<Object> parameters = calculateParameters(context, metadata);
MetaExecutor<OC, EC> executor = buildMetadataExecutor(metadata);
if (executor == null) {
log.warn("can not executor for {}", JSON.toJSONString(metadata));
return false;
}
OperationResultDTO operationResultDTO = new OperationResultDTO();
context.setOperationResult(operationResultDTO);
return executor.calculate(context, parameters);
}
/**
* 优惠执行
*/
public <T extends MetaDef> boolean execute(OC context, Metadatable<T> metadata) {
if (metadata == null) {
return false;
}
List<Object> parameters = calculateParameters(context, metadata);
MetaExecutor<OC, EC> executor = buildMetadataExecutor(metadata);
if (executor == null) {
log.warn("can not executor for {}", JSON.toJSONString(metadata));
return false;
}
OperationResultDTO operationResultDTO = new OperationResultDTO();
context.setOperationResult(operationResultDTO);
return executor.execute(context, parameters);
}
.....
}
五、总结及扩展
-
营销积木化定义
营销积木化主要是指将营销中的“条件集”、“行为集”拆成一个个最小粒度的积木,使用逻辑关系符拼接起来。 -
界面化
目标是将上文提到的元数据积木上层的事情产品化,使得业务方能够通过界面化的方式,完成业务规则逻辑的自由搭建。
-
中台化
根据上文提到的规则引擎定义,规则系统可以“解耦”成独立系统,所以凡是符合“规则行为”的业务,理论上都是可以通过规则引擎系统完成逻辑计算。系统交互示意如下: