23.10 同步/更新组织机构解决方案

一、场景假设

在企业管理中,常常会有多个业务系统同时运作,如HR系统、销售系统、OA系统等等,这就需要实现同步组织机构信息,我们以HR系统为管理组织机构的主系统A,其他系统为子系统B,那么,我们现在要实现以下效果:

1.1 同步组织机构

子系统B没有组织机构信息时,把主系统A的组织机构信息(部门、岗位)同步到子系统B。

1.2 更新组织机构

子系统B已经同步了组织机构,当主系统A的组织机构信息发生变化(增/删/改)时,更新信息到子系统B。

二、解决方案思路

整体思路是利用网关服务器串通两个系统,实现数据同步,所以我们需要准备一个网关服务器。
我们需要考虑3个问题,要实现什么效果?何时执行同步/更新?如何执行同步/更新?

2.1 要实现什么效果?

1、主系统A把部门信息、岗位信息写入中间模版“获取组织机构”,用于获取主系统组织机构信息,并作为业务公式的触发模版,把数据推送到网关服务器。
2、子系统B创建中间模版“写入组织机构”,用于接收由网关服务器下发组织结构数据,并执行业务公式写入子系统B的组织机构中。

2.2 何时执行更新操作?

执行更新操作分2种方式:
1、手动执行更新
2、定时更新

2.3 如何执行更新操作?

主系统A组织机构信息变化分3种情况,新增、修改、删除。
首次同步只存在新增,更新则3种情况都需要考虑。
如图所示:“新增”与“修改”的情况,可以执行“同步组织机构”的业务公式进行更新操作,但是对于“删除”操作,由于数据被删除,我们不能直接得知哪些数据被删除,所以,我们需要找出被删数据。
1、由于主系统A推数据到网关时是按照部门推送的,所以有多少个部门,就推送多少次数据,所以我们需要在主系统A中,新增模版“同步次数”,用于记录主系统A推送的次数,且可以作为数据分组的依据。
2、在主系统A的中间模版“获取组织机构”中增加业务公式,每一轮推送后,“同步次数”+1。
3、在子系统B中,新增模版“查询被删数据”,通过对比新旧2组数据,查询出被删除的组织机构信息,并使用业务公式对其进行禁用(因为删除操作不可逆,所以绝大数情况,不执行删除操作。)
4、模版“查询被删数据”执行禁用被删数据后,同业务公式执行中间模版“写入组织机构”的业务公式。

三、操作步骤

3.1 准备工作

主系统A:http://192.168.1.66:88/10001
子系统B:http://192.168.1.59:88/10001
网关服务器C:http://192.168.1.148:88/10001

3.2 同步组织机构的配置方法

3.2.1 子系统B设计模版“写入组织机构”

3.2.1.1 结构分析

下面是一个比较简单的企业组织结构,企业下有多个部门,在部门下有下级部门、岗位等信息,如何用统一的模版进行管理?
通过观察可以发现,我们只需要分别记录部门信息和该部门的岗位信息就可以把所有组织机构信息管理起来,所以我们接收组织机构信息的模版设计为以下结构:

3.2.1.2 模版样式

主表为部门信息,明细表为该部门的岗位信息。
部门信息包括:
1、更新次数:因为数据是按部门为单位推送,有多少部门就推送多少条数据,此数据项就是为了识别每一个表单属于哪次更新推送过去的。
2、部门编号
3、部门名称
4、部门ID:系统内部生成ID,用于内部逻辑关联
5、上级部门ID
6、是否分支机构
7、是否禁用
岗位信息包括:
1、岗位编号
2、岗位名称
3、岗位ID
4、上级岗位ID
5、岗位描述

3.3 设置网关服务器

网关服务器配置请参考以下参考文档:网关服务器配置方法
a、按照网关服务器配置方法,设置好所需的网关服务器,并注册api模版“写入组织机构”
b、在主系统A中,注册接口模版“写入组织机构”。

3.4 主系统A设计“执行”模版

此模版的作用在于执行业务公式,把主系统A的组织机构信息推送到子系统B的“写入组织机构”模版。
需要推送的数据如下:
1、记录并自动累加“更新次数”
2、所有部门信息
3、每个部门对应的岗位信息

3.4.1 模版样式

由于部门、岗位信息直接通过业务公式查询并赋值,所以不需要设计部门和岗位的数据项,只需要“更新次数”即可。

3.4.2 记录并自动累加“更新次数”

由于我们最终需要实现计划任务进行更新组织机构,而计划任务不能执行表单的填表公式,所以我们需要用业务公式计算更新次数。
“执行”模版每保存1次模版就执行一次业务公式,所以,在“保存表单后事件”中需要先执行更新次数最大值+1,以便其他公式能正确取值。
1、新增数据接口,查询更新次数最大值
数据源选择本模版,数据列为更新次数,注意选择降序排序,过滤条件中设置只返回1条数据即可,因为进行降序排序后,第一个值就是最大值。
2、在业务公式中对当前模版“执行”增加“保存表单后事件”,通过上面做的接口,对“更新次数”进行累加操作。
注意:
a、此时要检查数据项“更新次数”是否为整数类型,因为文本类型是无法进行数学运算的。
b、在表单样式中,在单元格中输入0作为默认值,业务公式中,通过匹配条件“更新次数 = 0”匹配出当前表单,然后进行“更新表单”的赋值操作。

3.4.3 查询部门/岗位信息的数据接口

推送组织机构信息前,我们需要先获取当前系统A的组织机构信息,使用全局数据接口。

3.4.3.1 “查询所有部门”数据接口

打开数据接口模版,左侧分类树中选择“全局”,新建接口“查询所有部门”。
数据源:选择“组织机构”(注意:不是“SYS_DEPARTMENT”)
数据列:全部数据项都添加下来,如下图,注意修改列名,便于后续操作时辨认。
过滤条件:全部数据都要取出,不需要设置过滤条件。
设置完后,可以对照系统管理中的组织机构进行调试,检查接口是否正确。

3.4.3.2 “查询岗位信息”数据接口

和“查询部门信息”类似,新建全局数据接口“查询岗位信息”。
数据源:为“组织机构”的明细表“岗位”
数据列:所有数据项,注意设置列名如下图。
过滤条件:添加参数“部门编号”,表达式“自定义参数.部门编号 = 组织机构.代码”
设置好后,进行调试。

3.4.4 推送部门信息、岗位信息

设置完2个关键的接口,就可以回到“执行”模版,在业务公式中,新建“保存表单后事件”,对象为“写入组织机构”模版。
注意事项:
在数据在推送的过程中,我们不能保证数据推送的顺序,有可能会先推送下级部门再推送上级部门,那么在子系统中如果同时写入上下级关系,会导致下级部门找不到上级部门的情况,所以,我们需要先写入所有部门信息,然后再构建上下级关系。
为了方便子系统B写入组织结构的时候更容易过滤数据,在主系统A中,分2次推送组织机构信息,先推送部门信息(不含上级部门ID),再推送完整的部门岗位信息。

3.4.4.1 推送部门信息(不含上级部门)

新建业务公式“写入部门信息”,目标模版为api模版“写入组织机构”。
1、添加同级数据源,选择“查询更新次数最大值”接口,勾选“多记录”(虽然这个数据接口指只会返回一个值,但子级数据源要用多记录,父数据源就要勾选“多记录”)
2、添加“子级数据源”,选择“查询所有部门”接口,勾选“多记录”(组织中有多个部门,必须勾选多记录,否则只返回第一个结果)
3、选择执行“新建表单”操作(必须是新建表单,网关服务器只能在目标模版“新建”,不可以进行“更新”)
4、赋值,要注意是指数据接口返回的值,不需要写入“上级部门ID”

3.4.4.2 推送上级部门信息

判断逻辑和“写入部门信息”一致,我们可以直接复制“写入部门信息”业务公式进行修改。
判断条件不需要修改,只需要修改赋值内容。

3.4.4.3 推送明细表“岗位信息”的公式

在同一条业务公式的明细表“岗位信息”中编辑公式:
1、添加同级数据源,选择“查询岗位信息”接口,设置查询条件的参数,并勾选“多记录”(必须勾选)。
2、添加满足条件“查询岗位”不等于空,防止某个部门没有岗位,导致赋值时报错。
3、选择“插入记录”操作,增加明细表数据要选择“插入操作”。
4、赋值,注意选择接口返回的数据。

3.5 子系统B设计业务公式

通过前面3个步骤,我们已经能把主系统A的组织机构数据获取到子系统B的中间模版“写入组织机构”中。
接下来要针对前面所说的“新增”“修改”“删除”数据分别进行过滤并写入到子系统的组织机构中:
假设:主系统推送了5条数据,我们如何判断哪些部门被删除、哪些部门信息被修改、哪些不能需要新增呢?
我们可以通过与子系统B现有的组织机构进行对比,分别找出新增、修改、删除的数据。
被删除的部门/岗位:为了确保操作可逆,降低风险,子系统中不进行删除操作,只对相关数据进行“禁用”。
被修改的部门/岗位:根据部门编号匹配,进行更新赋值。
新增的部门/岗位:根据部门编号匹配,不存在时新增数据。

3.5.1 新增模版“对比部门信息”

这个模版用于记录主系统新推送的数据,与当前系统组织机构进行对比,并且通过数据接口,把对比的结果返回给中间模版。
模版设计如下图:
主表记录数据推送的次数,用于匹配条件;
2个明细表分别获取当前系统组织机构的部门信息,另一个明细表记录推送来的数据。
数据接口:
1、查询被删部门编号
如图所示,我们可以通过多数据源左关联,找出被删除的部门。
数据源:左边选择“当前部门信息”,右边选择“新部门信息”,中间选择“左关联”,在数据项关联中按照截图中设置。
数据列:返回部门编号和部门名称,部门编号为默认返回值。
过滤条件:如图,匹配更新次数并且新部门信息为空。
2、检查当前部门信息是否为空 上面的接口在调试的时候,我们会发现,当前部门信息为空,即当前系统没有组织机构的时候,关联查询会报错,所以我们要增加一个接口,用于判断当前部门这个明细表是否为空,如果是空,就不执行“查询被删部门”接口对应的逻辑。
数据源:选择本模版的明细表“当前部门信息”
数据列:选择任意一个数据项,对其进行“计数”,如果计数=0,说明明细表为空。
过滤条件:只需要匹配更新次数

3.5.2 新增模版“对比岗位信息”

和部门信息类似,用于记录和对比岗位信息,但是每个表单只能记录1个部门的岗位信息。
模版设计如下图:
与“对比部门信息”不同的是,主表中增加了“部门编号”数据项。
数据接口:
和对比部门信息一样,需要2个接口。
1、查询被删岗位编号
2、检查当前岗位信息是否为空

3.5.3 “写入组织机构”的业务公式设计

“写入组织机构”模版是接收网关推送过来的数据的,我们处理这些数据的顺序应该是怎么样?
我们需要把数据分别写入上述的2个对比信息的中间表,然后通过接口查询出被删部门的编号,再对其禁用,最后把其他数据都写入子系统的组织机构中。
a、数据写入对比模版
目标模版为“对比部门信息”模版,对主表进行“新建表单”操作,赋值“更新次数”。
对明细表“当前部门信息”进行“插入操作”,添加同级数据源,选择数据接口“查询所有部门信息”,把当前系统的部门信息赋值到明细表中。
对明细表“新部门信息”进行“插入操作”,用本表单的部门信息进行赋值。
b、禁用被删部门
按顺序添加2个同级数据源,并设置参数“更新次数”,要注意“查询被删部门编号”接口必须设置为“多记录”。
因为部门数量为0的时,第二个接口会报错,所以我们要通过判断第一个接口的返回值判断,“部门数量”不等于0时,才继续下面的操作。
对“SYS_DEPARTMENT”执行“更新表单”操作,根据接口返回的部门编号进行匹配,将对应的部门的“是否禁用”数据项赋值为“常量.是”。
c、更新组织机构
更新组织机构,我们需要先写入部门信息,再构建上下级关系,正如前面说到主系统A为什么要分步推送信息一样,因为数据在推送的过程中,可能会先推送下级部门再推送上级部门,如果同时写入上下级关系,会导致下级部门可能找不到上级部门的情况,所以分为2步。
更新部门信息:
更新部门信息比较简单,目标模版为“SYS_DEPARTMENT”,用“上级部门ID”数据项作为执行条件,对主表进行“更新表单”操作,根据“部门编号”匹配,然后给“上级部门编号”以外的其他数据项进行赋值。
更新上级部门:
新增一个“情况”页,命名为“更新上级部门”,执行条件和“更新部门信息”相反,当“上级部门ID”不为空的时候执行,构建上下级关系。
更新部门岗位:
注意明细表需要执行“插入记录”操作。
更新上级岗位:

手动/自动执行更新

4.1 手动更新

组织机构一般不会频繁更新,我们可以手动进行更新。
在主系统A的“执行”模版,新建并保存表单,即可立即执行一次“更新组织机构”。

4.2 设置计划任务

如果需要系统定期执行更新,则需要找到在主系统A中注册的API模版“写入制止机构”,在总表上方有“同步服务设置”按钮,点击打开即可直接对本API模版进行计划任务设置。
设置计划任务的开始时间、频率,勾选“启用”即可定时更新组织机构。
2022-08-15
40 42