以标签业务为例阐述领域化分析过程
一、复杂多变的产品业务需求
梳理当前业务中标签相关的信息点
- 企业标签
- 企业所有成员可见
- 打在客户身上
- 创建方是: 企微管家 PC 后台,企业微信,从 OPEN 过来的外部系统
- 素材标签
- 企业内所有成员可见
- 打在组合素材上
- 创建方是:企微管家 PC 后台
- 自动标签
- 企业所有成员可见
- 打在客户身上,员工不能手动打,大数据根据客户行为,识别客户意向与偏好并打标签
- 按场景区分是否可以打自动标签:比如客户列表-批量打标签功能不展示
- 标签的定义,来自于模板创建
- 大数据根据客户行为来自动给客户打标签
- 创建方是:企微管家 PC 后台
- 业务标签
- 不同业务线可根据业务需要创建自己的业务标签;不同业务线创建的标签互不可见,可满足不同业务线间标签数据隔离要求
- 管理组可见; 打在客户身上
- 部分成员可使用可见和可使用的权限判定不同
- 需要和企业微信规则组关联;打标时,客户/员工参数需转明文
- 没有接入企微的标签变更回调,使用缓存+过期时间得到相对较好的访问体验
- 创建方是: 企微管家 PC 后台,企业微信
- 外部标签
- 企业内所有成员可见;打在客户上
- 创建方是:外部系统-xxx
- (按场景区分是否可以打标签)客户列表-批量打标签功能不展示/不能打 xxx 标签
- 支持各个业务的筛选
- 标签数据不同步企业微信
- 工单标签
- 企业所有成员可见
- 打在企业上,最终转化为打在客户好友上
- 需要在添加客户回调处,进行打标 check
- 创建方是:内部工单系统
二、领域分析
1. 确定业务场景
1.1. 业务现状
- 基于标签开展的业务场景
- 给客户打标签(实际是员工给客户打标签,属于员工维度数据,而非客户维度,下文所指客户无特殊说明也指的是客户员工好友关系)
- 给群打标签
- 根据标签筛选客户(筛选结果用群发等各种场景)
- 根据标签筛选客户群(筛选结果用群发等各种场景)
- 提供开放平台接口能力
- 当前标签现状
1.2. 业务痛点
- 业务实现强依赖企业微信(无论是标签的定义,还是打标签的行为,都是先在企微得到结果后,再执行企微管家 saas 平台的业务逻辑)
- 企业标签、自动标签、业务标签、给客户打标签等等
- 在企微管家中维护标签定义时(新增企业标签),先调用企业微信接口新增标签,返回成功时才会保存到本地 db 中;
- 同样,在企微管家给客户打标签时,先调用企业微信接口打标签,返回成功时才会将标签保存到客户好友上。
- 企微性能瓶颈
- 企业微信的 API 接口(标签定义、打标签)存在调用次数限流(1 万次/分,15 万次/小时)、并发请求限流(并发频率约 15 tps)等限制,致使企微管家的性能难以突破瓶颈。
- 一次企微接口调用耗时 300~500 ms(KA 场景下通常耗时更久),阻塞式调用的情况下,企微管家相关功能的接口响应能力难以达到预期。
- 标签 id 体系复杂
- 企业微信的标签在企业微信的不同应用(三方/代开发/自建)下,标签 id 会各不相同(明文密文等不同的形态),业务侧对接存在理解成本。
- 业务对接需求
- 越来越多标签对接的需求,如二方系统工单 CRM 标签对接,三方系统如 xx 外部系统标签、智能外呼标签等。
- 每种标签的业务能力存在部分差异,如:xx 外部系统标签数据只与微盛系统互通,而不与企业微信互通。工单 CRM 标签需要支持当添加客户时自动打上工单 crm 标签等。
1.3. 即将或已接入的外部系统标签
- 智能外呼标签(AiOutBoundTag):
- 用于和外部系统标签打通,实现客户标签的展示与筛选
- 工单 CRM 标签(CompanyTag):
- 用于和内部工单系统标签大同,实现自动给新添加的好友打上指定标签
- 外部标签:
- 用于和外部系统标签打通,实现客户标签的展示与筛选,但数据不同步给企业微信
1.4. 微盛标签体系需要具备以下能力
- 微盛标签定义,可以和企微解耦,且同步企业微信的过程需要异步化
- 微盛打标签,可以和企微解耦,且同步企业微信的过程需要异步化
- 微盛标签 id 需要归一化
- 易扩展、易接入的对接外部系统标签能力
2. 标签系统概念语义
2.1. 标签系统概念语义
- 标签系统
- 标签
2.2. 标签(Tag)
- 什么是标签
- 标签,就是对一个系统对象的某个维度特征的描述,从而能够基于标签进行快速筛选。
- 标签组
- 一个企业会有很多标签,为了方便管理,通常会以组将标签进行归总。
- 标签的目标对象(作用对象)
- 标签不是孤立存在的,当一个标签被定义后,紧接着需要声明它能够作用的目标业务对象,就是打标签的落脚点。
- 这个对象,可以是群、员工、企业等等实体对象,也可以是客户(好友关系)等关系对象,即标签理论上可以作用在任何业务对象上。
- 示例图
2.3. 标签系统
- 系统对外能力
- 根据某种给定的规则,将外部系统的标签,承接到系统内
- 根据某种约定的规则,将系统内的标签,同步给外部系统
- 系统自身能力
- 标签定义
- 标签业务应用
- 标签系统架构
3. 标签的业务意义
- 有了目标对象,就可以承载标签的两个重要业务意义,打标签和标签筛选。
4. 标签定义的分类
- 适用于同一种业务目标对象的标签,从业务理解的角度上,通常我们会将他们定义为一类标签,这就是标签定义的分类。
5. 标签定义的业务类型
上面说了标签定义的分类,实际上同一类标签定义,因为业务场景的需要,也能再区分出不同的特性类型。
- 企业标签
- 作用对象可以是任何业务对象,但是标签的使用者,是全企业成员
- 业务标签
- 作用对象可以是任何业务对象,但是标签的使用者,是部分组织架构成员
- 自动标签
- 作用对象可以是任何业务对象,但是标签的定义者和使用者,不是员工,而是数据平台(是大数据平台根据行为,基于规则生成的标签定义,作用到目标对象上)
上面三种现有的标签的区别,无非是标签的定义侧不同,或者标签的对应的数据权限不同,这就是业务场景下的类型。
6. 标签定义的场景
- 标签定义
- 就是构建标签基础数据。
- 定义场景
- 示例:工单标签
- 拆解:工单系统定义标签,标签打在企业上,到企微管家,实际是作用在客户上
- 过程: 扩展一种定义的实现 CrmDefiniteTag,定义是来自外部的
- 目标对象:是客户,需要企业到客户的转换
7. 打标签
上面说了标签定义,有了标签定义,有了目标业务对象,就到了打标签这个业务场景了。
打标签两个要素:触发规则、生效规则
- 触发规则
- Check 是否需要调用打标签
- 场景相关,默认不会执行打标签,有需要才会接入
- 工单标签:绑定的是添加客户回调场景,生效规则是从工单转换来的那些标签
- 生效规则
- Check 打什么标签
- 主动调用:默认生效,要打的标签,就在参数里
- 定时触发:比如自动标签,根据规则解析生效,生效规则决定了打什么标签
- 业务流程
8. 标签的生命周期
9. 标签生效的平台边界
- 标签一旦被定义下来,默认就在企微管家 saas 平台下生效了(无论在企微是否生效)。
- 同时,目前的业务场景,通常也会在企业微信平台同步生效。
- 扩展点:标签支持随时开启/接入新的生效平台 (KA 私有化场景)
10. 不同平台的标签类型
- 对于企业微信的同一个标签,用不同的密钥或者接口,拿到的标签 id 并不相同。
- 同样,不排除其他的外部平台,对于同一个标签,也有不同的 id 形态。
- 主要是为了兼容企业微信的三方应用标签(三方应用 accesstoken 获取)、客户联系标签(客户联系 accesstoken 获取)
11. 外部平台标签的接入
- 接入示例
- 接入思路
- 通常外部平台的标签体系,也是基于标签组,标签 id,标签名称的,所以对接的核心其实就是,把标签定义建立映射关系,再具体点,就是绑定标签 id。
12. 平台间标签的对接规则
- 既然可以对接新的生效平台,就涉及对接的匹配规则。
- 扩展点:对接的规则,是可以自定义扩展的。
- 比如对于企微的对接,不同的密钥或者接口:
三、领域设计
1. 领域的核心能力(Domain Core Ability)
- 标签定义
- 打标签
- 标签筛选(标签选择器)
- 标签数据同步第三方系统
- 外部系统标签同步微盛
- 标签 id 归一
可以简单理解为领域服务对外提供的核心业务接口
2. 领域对象的能力 (Domain Entity Ability)
- 标签 TagEntity
- 判断一个标签的目标对象是谁(客户、客户群、素材等等)
- 判断一个标签的业务类型(企业标签、自动标签、业务标签等等)
充血模型/贫血模型
3. 领域服务的能力 (Domain Service Ability)
- TagService 的标签查询
- 查我是管理员的业务标签
- 查我所在管理组的业务标签
- 带权限查所有业务标签
- 不带权限查所有业务标签
比充血实体的粒度更粗
四、工程实践
1. 工程实践主要路径
- 业务场景的拆分和归纳
- 业务流程的分解
- 技术细节的落地
2. 业务场景的拆分和归纳
2.1. 业务场景拆分归纳思路
- 整理用例
- 梳理所有当前业务的实现,转成领域化的通用语言(目标对象,操作人,业务场景)
- 执行流程
- 技术保障的阶段,以及实现所有业务需要的阶段节点和执行步骤,用业务扩展点来支撑。
- 示例
2.2. 示例一:标签选择器
- 标签选择组件中,展示什么样的数据?
- 什么样的业务场景,什么样的当前用户,看到的是哪些标签?
- 创建员工活码场景,分管用户,活码的员工是自己,看到的是“所有企业标签”+“我作为管理范围内的员工,所在的管理组,管理的业务标签”
- 创建员工活码场景,分管用户,活码的员工不仅仅是自己,看到的是“所有企业标签”+“我作为管理员,所在的管理组,管理的业务标签”
- 基于 Business+Use Case+Scenario 实现的业务扩展点
- 营销+创建员工活码+自己
- 营销+创建员工活码+不仅仅是自己
- 对应的领域服务能力
- 查我是管理员的业务标签
- 查我所在管理组的业务标签
2.3. 示例二:标签定义
- 基于 Business+Use Case+Scenario 实现的业务扩展点
- 企微管家+群标签+default
- 企微管家+客户标签+企业标签
- 企微管家+客户标签+业务标签
- 对应的领域能力
- 目标对象
- 业务类型
2.4. 其他示例
- 标签的接入
- 平台/租户+类型+映射规则
- 标签对外部平台的透出
- 平台+accesstoken
- 标签的加密
- 租户+类型+规则
- …
3. 业务流程分解
3.1. 业务流程分解思路
- 过程分解+结构化思维
- 形成业务流程上的执行节点
- Pipeline 式的代码结构
- 设计模式的使用
- 流程引擎
3.2. 示例一:标签定义的执行流程
- 执行步骤
- 业务校验
- 类型转换
- 加解密
- 业务逻辑执行
- 同步至外部平台
- 发布事件通知
- 结果集处理
- 代码示例
4. 技术细节落地
- 细节点
- 事务处理
- 缓存
- 重试
- 补偿
- 对账
- 异常处理
- …
- 解决办法
- 通用的交给框架
- 遵循代码规范
- Case by case
五、小结
作者: 春晓