科技零售研发中心:商户智能化配置项目
科技零售研发中心 : 商户智能化配置项目
Created by rockyu(余高峰), last modified on Apr 28, 2022
一、项目背景


- 商户入驻行业众多,资料繁杂,其中包括11种一级行业、61种二级行业 和 100多项入驻资料。导致行业和资料的联动性差,资料管理混乱。
- 近一年商户入驻需求中,增改资料需求占比达52%,人力投入占比极高【数据来源 https://www.tapd.cn/20060141/prong/stories/stories_list】
- 小程序的延迟更新文档,导致后台接口兼容逻辑复杂,存在风险
- 小程序的审核机制
- 小程序的延迟更新【发布后24h才能全部覆盖绝大多数用户】
二、项目方案
基于以上的这些痛点,我们对商户入驻 和 门店入驻的流程进行了分析,并抽象出了三大核心概念,分别是入驻资料配置化、资料数据统一化 和 入驻流程标准化。后面的细节设计也都是围绕这三个核心概念进行

整体设计流程图

2.1 入驻资料配置化
2.1.1 入驻资料结构设计
在整个商户入驻和门店入驻的体系中,最核心的就是入驻资料的管控,基于这个问题,我们把商户入驻的资料拆分成了四个模块
如下图所示:

四个模块:
流程:即整个资料的索引ID,用于区分和隔离不同业务之间的资料。
页面:是具体资料的分类,属于流程的子目录,既可以分类展示资料,也可以分模块展示资料
字段:具体的资料配置信息,用于标注资料的数据类型、数据格式、加解密类型等一系列配置信息
组件:定义字段具体的数据格式。组件抽象多个字段的统一数据格式,具有对数据的校验、解析、适配等多种能力。是整个数据中心的处理中心
2.1.2 资料的环境隔离和版本控制

页面分多环境:把页面维度拆分成了两个关键字段,即环境和数据版本
环境:分为编辑环境、预发布、灰度和线上
数据版本:每个环境都有一个数据版本指针,指向字段表中当前环境是引用的哪些字段版本
资料多版本控制
字段版本:每次在编辑环境编辑字段,都是执行的新增操作,并且数据版本加1,编辑之后的页面数据版本指针将指向新的字段应用
高效的数据同步和数据回滚
基于以上的两种结构,我们的数据同步和数据回滚就都只依赖于页面的数据版本索引变更。
同步:就是把各个页面的各个环境的字段版本更新到最新的引用即可
回滚:就是把各个页面的各个环境的字段版本更新到上一次发布的release版本即可
2.1.3 资料变更流程设计

对于资料流程变更的合规性和安全性,我们新增了一个流程对资料的变更进行管控
- 基础权限控制:只有分配了权限的用户,才能对入驻资料进行配置,并且是按照流程隔开的,即不同的流程有不同的管理员
- 流程互斥锁:考虑到流程资料变更频率非常低,所以加了流程互斥锁,即同一流程只能一个用户进行编辑,排除协同编辑带来的并发问题。
- 编辑:只能在【编辑环境】进行数据的编辑,编辑保存之后处于草稿状态,对预发布及以上的数据都没有影响
- 测试:任何修改了资料的流程,都需要接入测试进行。当前测试即可以是自己,也可以是专业的测试人员,以此来提醒变更资料需要充分测试
- 审批:对于想把编辑后的资料同步到灰度和线上环境的话,必须要走审批流,来告知相关负责人,你有流程变更。
- 发布:按照环境进行数据同步
- 回滚:如果在发布到线上之后,发现有问题,支持回滚到上一个release版本
- 结单:只有结单之后,其他同时才能进行编辑。
2.2 入驻数据统一化
2.2.1 入驻资料的特征抽象
进一步对入驻资料的分析如下:

通过资料的共性提取和行为分析,我们从多项资料中,提取出了不同维度的组件类型,分别是高级组件、基础组件和样式组件,而每一种组件都包含了各种的结构。比如身份证组件、图片组件和省市区组件等。
2.2.2 组件库设计
组件库设计:
结构:定义了数据的标准结构。例如普通的String,Integer,还是一个图片的JSON结构或者JSONArray的数据结构
校验:争对前端上传的数据,进行校验,判断当前数据是否满足组件配置的数据结构
解析:对组件数据结果的解析,例如向下传递的时候,需要把一个大的JSON结构平铺之后,向下传递
适配:对于存量历史的数据结构,能够组装适配成 当前组件合法的数据结构
事件:即一个组件的外部事件,比如去调用一个外部接口来获取数据值域或者对数据进行拓展校验等

如上图所示,争对前端传入的数据包,需要进行以下的操作步骤:
- 识别当前字段是什么组件,以此来加载不同的组件解析器
- 把数据交给组件解析器进行数据的校验、解析、清洗等操作,并发起对应的事件
- 如果中间没有异常,就得到了合法的数据包
- 把数据包进行落库
2.3 入驻流程标准化
基于资料的配置化和数据结构的统一化,我们还需要标准化整个数据流程,来统一定义流程。所以抽象了四个标准化接口

注册接口:用于注册一个唯一的业务ID,所有的业务资料数据都需要挂载在这个业务ID上。
拉取配置接口:拉取配置和数据用于动态渲染,主要是分为两个步骤
拉取配置:拉取资料中心的配置信息,并在前端进行动态渲染
拉取数据:拉取当前业务ID关联的配置信息。并由组件库进行数据适配
保存数据接口:保存页面填写的数据信息到配置系统的库表
1、通过页面和环境拉取配置
2、通过组件校验和清洗数据
3、数据分版本落库
提交数据接口:提交流程所有的页面数据到路由适配器,由路由适配器进行转发
1、页面版本校验,防止在保存和编辑中心存在页面变更的情况
2、页面状态流转
3、提交数据到路由适配器,适配器通过当前流程code执行不同的handler进行入驻
三、技术难点和创新点
3.1 字段的多版本控制

在资料的配置变更过程中,为了提高数据安全和写入效率,引入了数据版本的概念。在页面维度新增了一个dataVersion字段,指向字段表中的dataVersion。
配置编辑:只操作开发环境的页面,并在页面的dataVersion基础上加1,并把新配置的字段追加到字段表尾部。即实现了数据隔离,又提高了写入效率。【dataVersion+1是由版本控制器来协调,保证dataVersion永远都是最新的,防止回滚干扰】
数据同步:只需要把开发环境的dataVerion 同步到 预发布环境即可,无需拷贝字段配置,提高了同步效率
数据回滚:只需要把线上环境的 releasVersion更新到dataVersion,回滚数据指针引用即可。提高了回滚效率,而且支持回滚到历史的任何一个版本
3.2 状态机引擎
在资料配置的流程管控中,首次采用了afterpay_offline_cola_statemachine状态机引擎。此状态机是基于开源的cola-component-statemachine 4.1.0进行改造的,并且推送到了gitlab上。
代码地址: http://gitlab.fenqile.com/afterpay-offline/afterpay_offline_cola_components/tree/master/afterpay_offline_cola_statemachine
使用wiki: http://wiki.fenqile.com/pages/viewpage.action?pageId=133243839
下图为智能化配置的状态机推演图

四、项目成果和意义
增改资料需求无需开发介入,预计可释放30%以上的人力资源
需求上线时间预计缩短至1天
商户入驻小程序资料变更告别版本兼容,支持动态渲染
3.1、paya.oa的资料配置平台成果展示



3.2、小程序页面的成果展示

五、参与的项目组成员
rockyu、breakyang
Attachments:
image2022-4-26_13-22-37.png (image/png)
image2022-4-26_13-22-46.png (image/png)
图片2.png (image/png)
image2022-4-26_13-27-43.png (image/png)
image2022-4-26_13-34-27.png (image/png)
image2022-4-26_13-57-55.png (image/png)
image2022-4-26_13-58-23.png (image/png)
image2022-4-26_14-1-18.png (image/png)
图片3.png (image/png)
图片3.png (image/png)
图片4.png (image/png)
图片5.png (image/png)
image2022-4-26_14-25-40.png (image/png)
图片1.png (image/png)
image2022-4-26_15-40-35.png (image/png)
image2022-4-26_15-41-19.png (image/png)
image2022-4-26_15-49-54.png (image/png)
image2022-4-26_15-51-21.png (image/png)
image2022-4-26_16-4-38.png (image/png)
image2022-4-26_16-8-43.png (image/png)
image2022-4-26_16-48-53.png (image/png)
image2022-4-26_16-50-47.png (image/png)
image2022-4-28_18-54-8.png (image/png)
image2022-4-28_18-54-31.png (image/png)
image2022-4-28_18-54-57.png (image/png)
image2022-4-28_19-5-3.png (image/png)
image2022-4-28_19-6-6.png (image/png)
image2022-4-28_19-9-27.png (image/png)
Document generated by Confluence on Dec 20, 2022 17:18
一、新增页面
新增一个页面,用于存放需要配置的各项数据,相当于一个容器

库表设计
CREATE TABLE
t_dynamic_config_page
(Fid
int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',Fpage_code
varchar(50) NOT NULL DEFAULT '' COMMENT '页面code',Fflow_code
varchar(50) NOT NULL DEFAULT '' COMMENT '流程code',Fpage_name
varchar(50) NOT NULL DEFAULT '' COMMENT '页面名称',Fpage_describe
varchar(255) NOT NULL DEFAULT '' COMMENT '页面描述',Fpage_type
varchar(50) NOT NULL DEFAULT '' COMMENT '页面类型',Fpage_params
varchar(1024) NOT NULL DEFAULT '' COMMENT '页面的全局参数json格式',Fsubmit_action
varchar(1024) NOT NULL DEFAULT '' COMMENT '页面的跳转事件',Fnext_page_code
varchar(50) NOT NULL DEFAULT '' COMMENT '成功之后的跳转页',Fpage_seq
int(11) NOT NULL DEFAULT '0' COMMENT '页面排序',Fdata_version
int(11) NOT NULL DEFAULT '0' COMMENT '数据版本号',Fversion
int(11) NOT NULL DEFAULT '0' COMMENT '乐观锁版本号',Fenv
int(11) NOT NULL DEFAULT '100' COMMENT '环境',Foperator
varchar(32) NOT NULL DEFAULT '' COMMENT '操作人',Fcreate_time
datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '创建时间',Fmodify_time
datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '修改时间',Fjg_auto_test_id
varchar(256) NOT NULL DEFAULT '',Flock_task_id
int(11) NOT NULL DEFAULT '0' COMMENT '锁页任务id',Frelease_data_version
int(11) NOT NULL DEFAULT '0' COMMENT 'f数据发布版本号',Fshow_field_key
varchar(255) NOT NULL DEFAULT '' COMMENT '在前端展示的字段key',Frelease_version
int(11) NOT NULL DEFAULT '0' COMMENT '页面发布版本号',
PRIMARY KEY (Fid
) USING BTREE,
UNIQUE KEYuniq_Fpage_code
(Fpage_code
,Fenv
) USING BTREE,
KEYidx_Fflow_code
(Fflow_code
,Fenv
) USING BTREE,
KEYidx_Fmodify_time
(Fmodify_time
) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=326 DEFAULT CHARSET=utf8 COMMENT='先享后付业务系统|动态配置页面表|20220108';
具体设计
在页面上对组件进行拖拽,然后配置每一个字段的属性,最终保存到t_dynamic_config_field (动态字段配置表)
表结构
CREATE TABLE t_dynamic_config_field
(Fid
int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',Fpage_code
varchar(50) NOT NULL DEFAULT '' COMMENT '页面code',Ffield_key
varchar(50) NOT NULL DEFAULT '' COMMENT '字段code',Ffield_name
varchar(50) NOT NULL DEFAULT '' COMMENT '字段名称',Ffield_describe
varchar(255) NOT NULL DEFAULT '' COMMENT '字段描述',Ffield_module_type
varchar(50) NOT NULL DEFAULT '' COMMENT '字段组件类型',Ffield_format
varchar(50) NOT NULL DEFAULT '' COMMENT '字段格式 邮箱,手机号等',Ffield_value_type
varchar(50) NOT NULL DEFAULT '' COMMENT '字段值类型',Ffield_value_regex
varchar(255) NOT NULL DEFAULT '' COMMENT '字段值正则校验',Ffield_default_value
varchar(255) NOT NULL DEFAULT '' COMMENT '字段默认值',Ffield_required
int(11) NOT NULL DEFAULT '0' COMMENT '字段是否必填 0表示不必填 1表示必填 2表示按照规则必填',Ffield_required_rule
varchar(1024) NOT NULL DEFAULT '' COMMENT '字段是否必填的规则,当Ffield_required=2的时候生效',Ffield_hide
int(11) NOT NULL DEFAULT '0' COMMENT '字段是否隐藏 0表示不隐藏 1表示隐藏',Ffield_show_rule
varchar(1024) NOT NULL DEFAULT '' COMMENT '字段展示规则 Ffield_hide=1生效',Ffield_hint_msg
varchar(255) NOT NULL DEFAULT '' COMMENT '字段不合法提示文案',Ffield_function
varchar(255) NOT NULL DEFAULT '' COMMENT '自定义规则函数(保留字段)',Ffield_event
varchar(255) NOT NULL DEFAULT '' COMMENT '方法事件(保留字段)',Fdata_version
int(11) NOT NULL DEFAULT '0' COMMENT '数据版本号',Fversion
int(11) NOT NULL DEFAULT '0' COMMENT '版本号',Foperator
varchar(32) NOT NULL DEFAULT '' COMMENT '操作人',Fcreate_time
datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '创建时间',Fmodify_time
datetime NOT NULL DEFAULT '1970-01-01 00:00:00' COMMENT '修改时间',Ffield_seq
int(11) NOT NULL DEFAULT '0' COMMENT '字段排序',Fjg_auto_test_id
varchar(256) NOT NULL DEFAULT '',Ffield_value_range
varchar(1024) NOT NULL DEFAULT '' COMMENT '字段的值域范围',Ffield_flag
int(11) NOT NULL DEFAULT '0' COMMENT '字段标记 0表示买吖字段 1表示中台扩展字段',Ffield_type
int(11) NOT NULL DEFAULT '0' COMMENT '字段类型 0表示可编辑 1表示只读 2表示只展示',Ffield_disable
int(11) NOT NULL DEFAULT '0' COMMENT '字段是是否禁用 0表示不禁用 1表示禁用 2表示按照规则禁止',Ffield_disable_rule
varchar(1024) NOT NULL DEFAULT '' COMMENT '字段是否禁用的规则,当Ffield_disable=2的时候生效',
PRIMARY KEY (Fid
) USING BTREE,
UNIQUE KEY uniq_Fpage_code_Ffield_key
(Fpage_code
,Fdata_version
,Ffield_key
),
KEY idx_Fmodify_time
(Fmodify_time
) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12839 DEFAULT CHARSET=utf8 COMMENT='先享后付业务系统|动态配置元素字段表|20220108';

COMMENTS | NOTHING