积木化规则引擎在营销业务玩法中的应用

2021年12月20日 1,728次浏览

罗晔(萝卜)

前言:

关于营销,相信作为电商消费者,大部分人都不陌生,营销是一种运营手段,通过各种玩法刺激消费者下单,核心是让消费者认为花了更少的钱买到了商品,觉得划算!

营销总体分为:1. 传统的营销,比如最典型的优惠券;2. 互动营销,比如微积分玩法帮砍一刀;

本文内容,主要针对传统的营销玩法,阐述规则引擎再营销业务玩法中的应用。

一、业务介绍

现有营销玩法举例:

  • 单品返利

无批次一口价

巨划算

  1. 何为规则引擎
    通过上面几个案例,我们可以看到,图中有两个直观的颜色,红色框和蓝色框,红色框描述的是一种条件,蓝色框描述的是享受的好处(领域语言:权益)。

抽象一下的描述就是:什么东西(事实)满足什么条件(LHS)执行什么动作(RHS)

事实(Fact):可以理解为推理前的已知对象,比如“下单金额”。

LHS(Left Hand Side):可以理解为规则执行需要满足的条件,比如“满500元”。

RHS(Right Hand Side):可以理解为规则执行后的返回对象,比如“返50元优惠券”。

PS:根据规则引擎的抽象描述,从技术层面来说是可以跟业务“解耦”,形成框架的,所以,市面上也有很多开源的规则引擎,至于选型,关键看是否合适和二次开发的成本。

二、营销领域模型

关键领域模型

上图中,活动助力部分,属于引言中提到的互动营销类领域,可以看出,实际上这是一种传统营销活动的扩展。另外,本文涉及的部分,主要是上图中的【营销玩法】【营销工具】及其上下文部分。

  1. 名词解释
    有必要先对上图中的名词,做一些解释,按照DDD的说法,先对齐下“统一语言”(统一语言的重要性,就像大秦统一货币度量衡一样重要)

示例一:crm业务

示例二:

  1. 营销活动、营销玩法和营销工具之间的关系
  • 营销活动:具体的营销内容,包括时间,条件,以及营销行为等。
  • 营销工具:用营销积木块搭建的供小二或店铺创建营销活动的工具,可以供重复使用,用于定制最核心的玩法。表示为:条件集 → 行为集。
  • 营销玩法:相对于营销工具,增加了定义渠道和一些限制。表示为:(渠道,条件集)→ 行为集。

三、营销积木化架构设计

  1. 营销积木化所处的位置(营销活动拆解图)

  1. 营销积木规则引擎场景(红色部分)

  2. 应用架构

四、营销积木化实现

最小粒度积木定义
每个最小粒度的积木,又称为一元元数据,定义为搭建营销工具中的最基本模块,英文全称PromotionBuildingBlocks,简称 PBB。如下图示例,商品满 10 元抽象为 ** 满 * 元积木,又称为一元 ** 满 * 元条件积木。

从上面看,每个最小粒度的积木由积木 ID、积木参数和积木的计算过程三部分组成。

  1. 积木的分类
    目前积木的分类只有三种:资源型积木、条件型积木和行为型积木。定义如下:
    • 资源型积木:在营销优惠计算时需要在运行时获取某个资源值,比如订单中无批次商品的个数、订单中商品指定 itemId 的总金额等等。这类的值统一定义为资源,定义和计算该资源的积木称为资源型积木。
    • 条件型积木:优惠计算时决定能否享受优惠的先决条件,称为条件型积木。
    • 行为型积木:优惠执行时要触发的动作,比如发送优惠券,享受优惠价格等,这种动作的定义和描述称为行为积木。

  2. 逻辑元数据
    逻辑元数据主要用来把积木组装起来,主要包括:

• not,一元逻辑非
• and,二元逻辑与
• or,二元逻辑或
• so,二元因果

以一口价活动按 sku 特性为例,当指定商品 sku 值”V1_1_220933_420279” 在订单中购买满 3 件时就享受 2 元的优惠价格,其中包括了逻辑与和因果关系:

  1. 元数据底层实现类图
    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 积木扩展及场景扩展类图

  1. 元数据语法分析及执行过程

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);
    }
     
    .....
}

五、总结及扩展

  1. 营销积木化定义
    营销积木化主要是指将营销中的“条件集”、“行为集”拆成一个个最小粒度的积木,使用逻辑关系符拼接起来。

  2. 界面化
    目标是将上文提到的元数据积木上层的事情产品化,使得业务方能够通过界面化的方式,完成业务规则逻辑的自由搭建。

  3. 中台化
    根据上文提到的规则引擎定义,规则系统可以“解耦”成独立系统,所以凡是符合“规则行为”的业务,理论上都是可以通过规则引擎系统完成逻辑计算。系统交互示意如下: