CRM系统化整合从N-1做减法实践 | 京东物流技术团队

news2025/1/11 10:50:33

1 背景

京销易系统已经接入大网、KA以及云仓三个条线商机,每个条线商机规则差异比较大,当前现状是独立实现三套系统分别做支撑。

2 目标

2022年下半年CRM目标是完成9个新条线业务接入,完成销售过程线上化,实现销售规则统一。

3 问题

前端实现数据存储与逻辑代码耦合一起,无法复用,无法扩展,组件化拆分难度大。
组件拆分颗粒度较大,业务功能抽象不充分,缺乏复用性。
代码重复编写,相似功能冗余严重,开发和维护效率低。
代码版本多,接口不统一,开发、运维成本高,难扩展。
每个条线阶段、条线内每个商机阶段推进规则都是通过代码单独实现,开发、维护成本高,规则调整都需要代码调整并上线,时效性低,同时阶段规则维护在代码中,无法直观呈现和规则统一收口,运维难度大。

4 实现

4.1 方案调研

方案调研阶段,针对业务场景,多次组会对于底层实现方案进行充分讨论,列举每个方案优劣势,选择最适合当前业务场景的解决方案,最终选择上图的框架升级方案。

4.2 方案设计

4.2.1 设计思路

快速实现相似业务,减少相似代码,通过前端组件化、后端服务标准化、商机阶段配置化技术手段,支持各条线快速复用和灵活扩展。

4.2.2 前端组件化

1.前端现状
数据存储与逻辑代码耦合在一起,无法复用,无法扩展,组件化拆分难度大。表现为mixins逻辑代码与store数据存储耦合在一起,既降低了代码的可读性,也降低了store数据读写的灵活性。举个栗子,在人员信息集合中,本来可以针对name和sex两个字段在各自的组件进行维护即可,可现实是两个组件不得不调用同一个mixins进行维护。
组件拆分颗粒度较大,业务功能抽象不充分,缺乏复用性。组件的拆分没有一个清晰的界限,没有依据业务功能进行拆分,导致有一些组件不够纯粹,不符合单一职责原则,无法复用。在后期的维护过程中组件逐渐变得臃肿不堪。
代码重复编写,相似功能冗余严重,开发和维护效率低。由于组件无法复用,在后期维护过程中,开发人员对于类似的功能,不得不写了很多相似的代码,致使整个项目代码冗余、重复,慢慢的变得不可维护。
2.解决方案
针对本次商机条线接入功能,采用现有技术方案很难对后续条线依次接入,一个条线一套代码实现,接入周期长人力成本高,按期完成目标是一项不可能完成的挑战。经过技术方案调研,决定搭建一套求同存异(同为各个条线共用部分,异为各个条线单独部分)的前端组件化方案。依据业务功能,抽象出独立业务组件模块,依据条线插拔式组装,搭建出可维护、可扩展、灵活性高的组件积木化方案,在业务扩展性比较强的前端模块架构中优势更加明显。
 


组件积木化方案特点如下:
1.方案采用积木化前端组件搭建,其中任何一个组件都可以被替换(webComponent),任何一个父组件都可以扩展n个子组件。以上图商机信息组件为例,各条线商机信息所包含的字段存在差异,每个条线所对应的商机信息组件不同,最终会根据条线选择对应的组件加载。

2.数据统一管理(store),组件和数据之间为更新和依赖关系,当有组件更新数据时,其他组件也会立即更新,而不用相互传值。以商机详情组件为例,商机详情中修改了商机名称字段,则所有用到商机名称的组件都会得到更新。这需要提前对组件和store进行数据依赖更新的建立,通过computed与store双向依赖和监控机制,当computed监听store数据变化,将变化的数据更新到组件上,组件中通过store的mutaions更新数据到store上。

商机详情组件化抽象示意图如下:

4.2.3 后端标准化后端现状

由于前期未对条线的领域模型和功能模块进行抽象,导致烟囱代码林立;每个条线接入都要重复开发多套代码,各端(PC、移动端)接口不统一,前后端联调对接接口都需要区分多套;各条线独立开发部署,随着系统功能的丰富以及产品线持续增加,个性化需求和缺陷修复极大的消耗了研发资源和精力。同时,无法满足各条线商机阶段推进可定制的业务诉求,大致状态如下图。


2.解决方案
通过梳理商机流程与功能可以发现,商机中各条线既有相同的功能模块,也有各自独有的功能,例如商机创建、关闭、激活等流程每个条线差异不大,但是有些相似的功能模块各条线也存在差异,例如大宗的关闭商机与服务+中的关闭商机各自的关闭条件就不一样;那么基于此种业务场景,首先我们需要将主流程抽象出标准服务能力;例如,商机创建流程,我们将其定义为权限校验、参数校验、额外特殊校验、补充信息、模型转换、保存数据、跨区校验、后续额外处理等标准模板服务;每一个步骤方法都是抽象的,后续每个条线都将继承它,可以重写自己的逻辑;这样一个创建商机流程就标准化了。

上述我们是根据业务特性进行的模板抽象固化,但是如何将整个架构按照条线来走呢,这就需要我们将每个条线的流程进行抽象,例如,几乎每个条线都有创建商机、关闭商机、激活商机、修改商机等相同的动作,我们需要将这些抽象成固定的接口;然后各自条线都实现该接口并声明成策略,根据入参的识别自动分流至不同条线策略处理;也就形成了按条线为策略锚点的模式。

所以总体上是利用策略模式 + 模板模式支持各条线快速复用和灵活扩展,整体服务抽象复用及扩展思路形成大致的核心类图如下图:

整个商机的后端架构经过单条线多套接口处理的方式调整为适配所有条线统一接口接入;后端整体架构大致分5层,在核心层其实还会细分逻辑层,代理层以及Mapper 层。

首先我们在这次改造过程中统一了接口层,不在区分PC端接口,JME 端接口,统一以JSF接口形式提供出去;然后借助物流网关配置PC认证以及JME认证并一致以Http协议对接出去,保证了接口层面的统一。在适配层我们是定义了一个策略适配器,它会扫描所有声明了注解@LineType的策略处理器并缓存,然后根据解析入参中的条线进行自动匹配处理器进行分配处理,从而达到请求的自动分配处理。在核心层中其实更多的是模板方法的抽象与封装,将商机的基本查询、基础CMD操作、以及商机相关联信息操作进行分类抽象。将商机的推进机制建立在规则引擎中,将每个条线的推进规则提前配置在规则引擎的规则表中,并在后端服务中统一提供一个推进入口,所有条线都将基于该入口进行推进,达到推进规则明确,入口统一,阶段可配置等可灵活扩展的方式。

通过整体架构的优化和调整后,目前已经可以适配所有条统一接入、商机阶段可配置,推进规则可定义、接口统一等优点,大大节省了研发的接入成本。

4.2.4 商机阶段配置化

1.场景现状
每个销售条线的商机流程阶段及相应规则都存在差异,甚至同一个销售条线也存在多种业务,对应的商机流程阶段也不同,为支持多销售条线的差异化商机业务;要求必须实现每个条线的商机阶段个数是可配置的,并且每个阶段的规则也是可配置。
2.方案选型
如下图中所示,列举了几个条线的商机阶段生命周期,几乎每个条线的商机生命周期都不一样,这里需要说明一下阶段与阶段之间的推进条件是允许不一样的,所以会存在不同条线存在相同的阶段,但其实到达该阶段的前置条件是有可能不一样的,这就要求阶段的规则是可配置的,这也会造成可复用的可能性小。如果通过编码方式去实现每个条线的阶段生命周期会是一个非常复杂的过程,并且也难以维护。经过调研发现,我们的这种场景模型就是通过多个入参条件决定流程走向(通过、不通过)的一种简单形式,相对于多入多出的模式还简单一些,而这种模式正好现在已经有比较好的解决方案(规则引擎),在现有的流程引擎(Flowable、Activity)都有对规则引擎的实现,包括强大的Drools 规则引擎。对比几款规则引擎几乎都可以很好的满足我们的需求,那就要考虑成本问题,毕竟引入一款中间件对系统的维护成本也是比较大的。经过了解部门内部已经对Flowable 已经进行二次封装对外赋能了,所以在这边我们采用了基于Flowable 流程引擎中的DMN来实现,从模型上来说就是输入多个入参,然后根据规则配置进行判断走向,没有多分支相关联,所以选择Flowable 的规则引擎也比较合适。

解决方案:通过规则引擎,配置商机阶段和阶段推进规则,解决各条线商机阶段差异化问题,将变化流程用配置化方式融入到整体流程中。

3.实现效果
在规则引擎中,提供决策表的表达式,决策表分为输入表达式与输出表达式两个主要区域。在输入表达式中,可以定义变量,用于规则输入项(input entries)的表达式。可以通过选择Add Input(添加输入),定义多个输入表达式。在输出表达式中,可以定义选择表执行结果要创建的变量(变量的值将用于输出项表达式,在下面解释)。可以通过选择Add Output(添加输出),定义多个输出表达式。

规则配置如下图:(以服务+条线举例)
服务+ 权授权业务商机推进规则:jd-rule-crm_fwj_chance_authorized_business


服务+ B线上业务商机推进规则:jd-rule-crm_fwj_chance_b_online_business

优势:

  1. 规则统一收口,每个条线商机阶段推进规则可以直观呈现,规则演化轨迹可以追踪,避免问题排查时,通过代码排查方式核对规则,提升运维效率。
  2. 规则调整可以实时生效,避免代码维护和系统上线,提升研发效率。
  3. 一套代码实现所有条线阶段推进,只需要根据条线添加不同的输入即可。

5 效果

5.1 提升效率

消灭烟囱系统,一套系统完成所有条线支撑,实现各条线、各端接口统一。
开发成本低,易扩展,提升研发效率,降低运维成本;
按照领域对商机进行拆分解耦,实现商机领域独立部署,在商机领域内,通过前端组件化、后端服务标准化、商机阶段配置化技术手段,支持各条线快速复用和灵活扩展。接入对比结果来看,研发效率提升显著,同时也降低运维成本。随着标准流程不断抽象,底层基础服务不断完善,后续条线接入的效率在进一步提升,从后续接入的云仓生态、物流科技、价值供应链,供应链金融,新业务-新业务、金融、供应商7个条线来看,平均接入工时维持在30人日左右。
条线接入工时如下:

标准流程和通用基础服务,提升研测过程效率,其中:服务+条线接入测试工时从最初评估的30人日到实际的23人日,测试阶段效率提升23.3%:

大宗条线接入测试评估工时及实际工时,基于服务+接入商机项目的测试经验,大宗商机接入项目测试阶段从原计划30人日降低到10人日,效率提升66.7%:

5.2 提升质量

服务+较原计划提前4工作日交付,大宗较原计划提前11工作日交付,交付演示过程中均未出现任何问题,验收全程未出现影响整体进度的阻塞性问题。
大宗UAT过程中共提出6个问题,其中5个为页面调优等优化项,1个为环境引起的无法勾选问题,未出现任何bug类问题,整体验收过程顺畅无阻。

作者:京东物流 姚再毅 孔祥东 樊平安 杨攀 田雷雷
来源:京东云开发者社区 自猿其说Tech

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/787223.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】—— 分⽀的基本操作

目录 (一)理解分⽀ (二)创建分⽀ (三)切换分⽀ (四)合并分⽀ (五)删除分⽀ 总结 (一)理解分⽀ 本章开始介绍 Git 的杀⼿级功能之…

结构型设计模式:装饰器模式

设计模式专栏目录 创建型设计模式-单例模式/工厂模式/抽象工厂 行为型设计模式:模板设计模式/观察者设计模式/策略设计模式 结构型设计模式:装饰器模式 C#反射机制实现开闭原则的简单工厂模式 目录 设计模式专栏目录设计模式分类设计模式的设计原则装饰…

Java体系总览

一、基础篇 JVM JVM内存结构 堆、栈、方法区、直接内存、堆和栈区别 Java内存模型 内存可见性、重排序、顺序一致性、volatile、锁、final 垃圾回收 内存分配策略、垃圾收集器(G1)、GC算法、GC参数、对象存活的判定 JVM参数及调优 Java对象模型 …

windows环境下docker数据迁移到其他盘

docker安装在C盘,使用一段时间后,C盘爆满。因此想把C盘中的数据迁移到其他盘,以释放C盘空间。分为以下步骤: 1、启动docker软件,打开PowerShell并切换到Docker Compose配置文件的目录。 Docker Compose配置文件的目录…

zabbix监控docker容器

1、安装zabbix-agent2插件 需要被监控的主机安装zabbix-agent2插件,请参考另一篇博客进行安装。原有的zabbix-agent插件不支持docker容器的监控的。agent的功能,agent2也都有 http://t.csdn.cn/dccqw 并在被监控的主机中开放10050端口 firewall-cmd --z…

【雕爷学编程】Arduino动手做(171)---micro:bit 开发板2

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这…

用于事实核查的知识图谱比较推理:问题定义和算法 7.24

用于事实核查的知识图谱比较推理:问题定义和算法 摘要介绍问题定义知识段(Knowledge Segment KS)共性不一致性集体共性集体不一致性成对比较推理集体比较推理 知识片段提取Predictate-Predictate Similarity特定边的知识段特定子图知识段 比较…

[巅峰极客2023]wp复现

文章目录 [巅峰极客2023]复现miscwelcomefoundmesong学生物 webunserializesql [巅峰极客2023]复现 misc welcome base64解码 foundme find.DMP文件 使用flag查找工具找到关键字: flag.avif 放入010中看到这个hint,找到好几个avif: 将他…

Shedskin 使用

Shedskin是一个编译器工具,可以将Python代码编译为C语言。先说结论吧,这玩意现在就只是个玩具,因为使用ShedSkin编译的程序不能自由使用Python标准库,目前只支持大约17个常用模块: bisect collections ConfigParser c…

4.python设计模式【建造者模式】

内容: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式与抽象工厂模式相似,也用来创建复杂对象。主要区分是建造者模式着重一步步构造复杂对象,而抽象工厂模式着重于多个系列的产品对象。角色&#xf…

嵌入式做单片机的门槛

我个人认为并不高,如果你非要有个量化的标准,那我觉得初中文凭都能学会并且能以此为生的程度。 文凭嘛,就是一张纸,并代表不了什么。 前几年,我接了一个帮研究生写毕业论文的单子,果然没让我失望&#xf…

实现Android屏幕分享和视频聊天(附源码)

在一些有人际互动的手机APP中,增加语音视频聊天功能是一个常见的需求。而现在,更进一步,在某些场景下,我们需要能将自己的手机屏幕分享给他人,或者是观看他人的手机屏幕。那么,这些常见的功能是如何实现的了…

reset master

1 reset master 执行 reset master; 后 变化1 :位点被重置 变化2 binlog日志被清空 原来的binlog被删除 从 mysql-bin.000001 开始记录。

【ribbon】Ribbon的负载均衡和扩展功能

Ribbon的核心接口 参考:org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration IClientConfig:Ribbon的客户端配置,默认采用DefaultClientConfigImpl实现。IRule:Ribbon的负载均衡策略,默认采用ZoneA…

【GPT4结对编程】word文档导出功能GPT4来实现

需求背景 最近产品增加了一个导出word文档的需求,之前有导出过pdf格式、excel格式、csv格式,但还没导出过word文档。 开源框架调研 我们的后端服务主要是用golang,因此首先想到的是golang相关的开源工具,找到2个。 unioffice …

【网络安全】蜜罐部署实战DecoyMini攻击诱捕

蜜罐部署实战&DecoyMini攻击诱捕 前言一、蜜罐1. 概念2. 蜜罐溯源常见方式3. 蜜罐分类 二、蜜罐项目实战1. 配置DecoyMini1.1 命令行窗口运行1.2 修改配置信息 2. 登录DecoyMini3. 克隆网站3.1 增加仿真网站3.2 增加诱捕器3.3 查看端口监听3.4 克隆成功(蜜罐&am…

Qt : day1

1.聊天界面 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {qDebug() << this->size(); //获取当前页面尺寸this->setFixedSize(500, 600); //设置固定尺寸this->setWindowTitle("聊天框"); //设置窗口…

解决Cannot resolve plugin org.apache.maven.plugins:xxxxxxxx

解决Cannot resolve plugin org.apache.maven.plugins:xxxxxxxx 方法一、检查配置设置 下图中三个方框圈出来的地方设置为自己的下载的maven地址&#xff0c;配置文件地址&#xff0c;仓库地址。刷新maven。 我个人试过没用&#xff0c;不过网上有的朋友用这个方法解决了。 …

CBC字节翻转攻击介绍 例题

知识导入&#xff08;AES-CBC模式&#xff09; 加密过程 1、首先将明文分组(常见的以16字节为一组)&#xff0c;位数不足的使用特殊字符填充。 2、生成一个随机的初始化向量(IV)和一个密钥。 3、将IV和第一组明文异或。 4、用key对3中xor后产生的密文加密。 5、用4中产生的密文…

大厂案例 - 腾讯万亿级 Elasticsearch 架构实践

文章目录 概述提纲益处正文一、Elasticsearch 简介0. 应用领域搜索引擎可观测性安全检测发展现状 1.系统架构集群架构物理数据模型查询 2.腾讯应用现状搜索领日志实时分析时序数据 二、技术挑战1.可用性2.成本3.性能 三、架构设计实践1.可用性优化1.1 解决方案2.2 集群扩展性2.…