CRM的低代码实践

概念
- 需求
- 领域
- 效率
关键词
Content
- 为什么要搞低代码?
- 前端社区的低代码实践
- 低代码在CRM中的实践
- CRM中的其他优秀实践
为什么要搞低代码?
- 什么样的业务才算复杂?
- 项目驱动的技术升级
什么样的业务才算复杂业务?
常用建模方式
- 宏观角度:实体关系模型
- 微观角度:业务流程图
通过分析UML的复杂度,可以大体评估出业务的复杂度量级
业务流程图复杂度估算
实体关系图复杂度估算
- 实体数 * 实体复杂度系数
- 关联数 * 关联复杂度系数
- 相加
CRM状况:实体多,关联杂
项目驱动的技术升级
以往项目复杂度
以往项目时间周期
以往项目架构
新项目复杂度
新项目时间周期
保持架构 / 升级架构
思考路径🤔
简单粗暴的讲
- 任务大
- 时间紧
具体的讲
- 复杂度数量级级别提高
- 实体个数30+
- 实体间关联数100+
- 粗略评估复杂度增长约10倍(相比绩效系统
- 项目时间有增加,但没有匹配复杂度的增加
效率跟不上了,技术需要升级了
新复杂度算法
- 原算法
- 实体数 * 实体复杂度系数
- 关联数 * 关联复杂度系数
- 相加
- 技术升级,以降低复杂度系数
- 新算法
- 实体数 * 降低后实体复杂度系数
- 关联数 * 降低后关联复杂度系数
- 技术升级成本
- 相加
对技术提出的要求*
- 以可控的成本降低实体和实体关联的复杂度系数,要求技术不能过于复杂,要有渐进升级的能力
- 对于实体
- 支持实体内部常规业务(CRUD)的快速搭建
- 字段行为可描述可配置,并支持实体内部特定字段的特殊呈现
- 支持实体内部字段间的逻辑联动,以实现普遍的管理动作需求
- 实体关联
- 实体关联可描述可配置
- 实体对实体的引用要灵活
- 支持实体间派生(通过实体A的实例,建立实体B新实例)
这里的技术升级属于“业务架构”?
- 切换技术架构对项目复杂度降低贡献往往是有限的,直接选用大家都熟悉的架构是最高效的。个人不提倡拿技术上的优势太间接对业务产生影响
- 业务架构则对复杂度降低影响有关键贡献,前提是项目的业务足够有特点,比如crm就很有特点
- 业务架构往往具有领域专用特质,可能不会那么通用,需要对具体业务具体分析
- 业务架构可能不会形成特别庞大的整体(相比技术架构),但往往有一些小的设计能产生很大的价值
前端社区的低代码实践


新瓶旧酒


各有理解,扔到知乎上又要吵起来了,但本质上
低代码平台
开发者的新“范式”
低代码core
非开发者的开发能力
提效降本的研发新产品/需求
GUI化
新产品
新需求
活动H5
调查表单
领域专用
可视化报表
整站(越来越少)
低代码平台是低代码内核的GUI化
达到降本提效的效果,趋势是领域专用
罗马不是一天建成的,从纯编码到低代码是有演化过程的。
领域演化举例(FORM
表单组件的硬编码组合
表单逻辑收口
表单组件的硬编码组合
传统方案
简单封装
配置驱动的表单组件
使用插件
配置驱动的表单组件
配置驱动
配置化&插件化
GUI
配置化&插件化
平台化
领域演化举例(FORM
领域示例




在低代码领域专用的背景下,在项目中划分适当的低代码领域是很重要的
低代码在CRM中的实践
在crm中,前端最适合做低代码的领域是FORM&LIST,绝大部分的实体内部业务&实体间关联也发生在此。低代码是crm技术升级的核心。
领域选择
当某领域的业务呈现重复且有固定抽象策略时,且开发者对领域有足够了解时,低代码建设便可以开始了
以form为例,从头到尾实现一个低代码架构,需要提前储备哪些信息?
- 陈列微观要素
- 规划宏观架构
- 归纳架构要点
FORM微观要素
- 插件
- 插件生命周期
- 插件交互事件
- 插件选择&选项
- 插件状态展示
- ...
- 表单
- 表单布局
- 表单事件
- 表单验证
- 表单hooks
- ...
- 元信息
- 配置转换
- ...
- ...

低代码插件化宏观架构
配置化&插件化在crm中是渐进式的,字段的形态都是从特殊到普遍的过程,等字段再从元信息层面支持。避免提前过度抽象。
配置化&插件化在crm中是分层使用的,可以直接使用插件,或者选择性的不使用元信息。
FORM&LIST在crm中是交互收口的,以FORM为例对于用户对所有字段的变更(onChange)交互(onInteract),都可以通过单个回调把控,使逻辑内聚
FORM&LIST在crm中形成了一个最小模版,实现了基础的CRUD,通过copy最小模版并进行二次开发可快速实现新的业务
低代码插件化架构要点

使用(1):配置驱动

使用(2):插件实现

使用(3):集成元信息&权限&hooks



使用(4):定制插件配置

通过修改插件配置,可以实现表单内部字段逻辑联动,面对类似需求,采用相似的形式即可

使用(5):实体关联

通过元信息中字段的配置,描述了这个字段是用来做实体间关联的。前端将元信息配置翻译成插件配置,实现渲染。
一个完善的低代码方案基本满足了之前总结的所有要求
回顾一下对新业务架构的要求*
- 以可控的成本降低实体和实体关联的复杂度系数
- 对于实体
- 支持实体内部常规业务(CRUD)的快速搭建
- 字段行为可描述可配置,并支持实体内部特定字段的特殊呈现
- 支持实体内部字段间的逻辑联动,以实现普遍的管理动作需求
- 实体关联
- 实体关联可描述可配置
- 实体对实体的引用要灵活
- 支持实体间派生(通过实体A的实例,建立实体B新实例)
上面太抽象?具体来讲价值体现*
- 通过元信息&权限的配置,无需开发即可实现一些通用需求:
- FORM&LIST中的字段,无痛增减字段,可制定样式,校验规则
- 无特殊展示的流程,配置即可直接上线
- ...
- 通过低代码开发“范式”,可以快速实现一些特殊需求:
- 表单内部联动
- 表单字段特殊字段校验
- ...
- 良好的渐进式使特殊需求通用化成为可能
距离GUI化还有多远?
- 元信息编辑GUI
- hook编程GUI
- ...(不算太远,但没必要)
GUI化关键组件🤔
EDITOR
结构化数据+存储
DSL
RUNTIME lib
GUI其他服务
PARSER
GUI低代码平台
(产物:DSL)
RUNTIME
不是绝对的
EDITOR
结构化数据+存储
DSL
COMPILE lib
RUNTIME lib
GUI其他服务
PARSER
GUI低代码平台
(产物:结构化数据)
RUNTIME
CI/CD/其他编译服务
(产物:运行时代码)
其他优秀实践
(1)依赖单一结合依赖倒置
单一依赖
业务组件的依赖要尽可能简单,在crm中大部分业务组件仅依赖其业务store,单一依赖原则满足实体间的灵活引用,实体间派生更简单
依赖倒置
通用的业务组件不适配任何业务员store,仅对业务store提出需求,业务store需自行实现interface,以适配业务组件
业务store
提取参数
业务store
通用业务组件
通用业务组件
其实传统的业务组件也未尝不是依赖倒置,只不过中间透一层,在某种场景下不必要
在crm中无需提取参数,直接让store满足interface即可,改动不大,但量变产生质变。贯穿整个crm的开发,收益不小。
单一依赖结合依赖倒置

示例1:通用组件导出

示例2:业务特定组件

特殊到普遍的渐进式抽象在这里仍然适用,不是所有的通用组件一开始都是通用组件,Avoid Hasty Abstractions。先实现的单一依赖,后来发现普遍性很好再做依赖倒置。
其他优秀实践
(2)可描述的模块间副作用

当线索被创建的时候,除了对线索本身产生影响,在服务端, 也有可能对其他模块产生了副作用 ,前端需要对所有副作用有所响应。常规方案中,需要显式的调用一些刷新回调来展示副作用后的最新数据。不过在crm系统越来越复杂之后,发现这种方式有很大的缺点:
- 非常繁琐,可能透传过多,维护成本很大
- 无法清晰 描述模块间的副作用关系

一个实例则是一个图状网络的单点,在具体业务中,我们需要描述:
- 它需要响应模块的副作用(上图的出边,比如B,是[B, C])
- 它会对哪些模块产生副作用(上图的入边,比如B,是[A, B])

对于上面的模块B,需要先描述对A,B副作用的响应:
以及对于自己的副作用,哪些模块需要响应:

这样B的入边和出边就描述好了,看看运行时的case:
- A模块更新,因为A可能影响[A, B, C]模块的数据,B可能受[A, B]的写入副作用影响,两者有交集,说明影响成立,执行影响回调
- 需求
- 实际业务需求驱动技术升级不盲目造轮子
- 领域
- 选择合适领域,调研社区内领域方案,把握领域微观宏观情况,归纳设计要点
- 效率
- 平衡技术升级成本与效率提升的关系,拥抱渐进式不求大而全
关键词回顾
讨论时间
CRM的低代码实践
By shaomingquan
CRM的低代码实践
- 256