1. 概述
树数据集主要是用来构建部门之间的关系,每个部门需要提供一个原始的标记字段和父标记字段,后端在同步的时候根据这两个字段来建立一种树结构。
但客户有时在更新设计器版本时,会出现同步树数据集失败的情况,主要是因为树数据集配置错误或者本身并不是一个完整的树结构。
下面举几种比较完备的树结构,来告诉大家构建树数据集时需要注意哪些事项。
2. 树结构及注意事项
2.1 树结构(类型一)
2.1.1 数据表
2.1.2 树数据集
上面是一个就是一个完整的树数据集,以“部门 ID”为原始标记字段,“上级 ID”是父标记字段。
例如:
第二行的意思是“人力资源部”的原始标记为 11,其父部门是标记为 1 的部门(然后可以根据这个标记来查询它的父部门是总部)。
第一行表示总部的标记是 1,父标记为空,表示它是根部门,没有父部门,通常如果一个部门没有父部门,那么父部门标记为空。
遍历这个数据集后,能得到所有的部门信息,职位信息;根据“上级 ID”,到“部门 ID”这一列去查找相应的部门名称,从而可以构建父部门。
2.1.3 注意事项
需要注意的是:“上级 ID”中出现的标记(除了是空),都必须在“部门ID”中找到对应的标记,可以看到上图中所有的“上级 ID”都能在“部门 ID”中找到对应的值。
如果出现下图的这种情况,“上级 ID”为 2,但是在部门 ID中找不到是 2 的部门信息,这样就没办法构建上级ID为2的部门信息,这样就认为树是不完整的,同步数据集的同步动作直接返回,不进行同步操作。
那么在日志里面会报如下形式的错误:
意思是找不到标记 2 对应的部门!
2.2 树结构(类型二)
2.2.1 数据表
2.2.2 树数据集
这个以“部门名称”和“上级名称”来构建树,这个所谓的标记字段只是为了标记部门直接的层级关系,不会参与业务处理。
这其中也要要求“上级名称”中的标记字段要能在“部门名称”中找到对应的部门,如果找不到,则直接退出,拒绝同步。
2.2.3 注意事项
注意事项同上。“上级名称”中出现的标记(除了是空),都必须在“部门名称”中找到对应的标记,否则就认为树是不完整的,同步数据集的同步动作直接返回,不进行同步操作。
2.3 树结构(类型三)
2.3.1 数据表
2.3.2 树数据集
同样的是使用“部门 ID”和“上级 ID”来做标记,同样需要保证“上级 ID”列的能在“部门 ID”中能够找的到,否则也会拒绝同步。
根据“部门ID”和“上级ID”来构建树。
2.3.3 注意事项
确保树数据集是正确的充要条件:
a. 父标记字段中出现的值(除了是空),在原始标记字段中都能找到对应的值。
b. 原始标记字段相同的行,其部门名和父标记这两列也必须相同,如上图数据表中的最后两行。
c. 父标记和部门名相同的行,其原始标记列必须相同,如上图数据表中的最后两行。
如果出现下图的这些情况会报错:
1)报错信息如下:
一个确定的部门有两个父部门,显然不是树结构。
一旦一个部门的标记相同,就代表这个部门是确定的,那么这个部门的“上级 ID”和“部门 ID”必须相同。
如下图中 lyon 和 loy 的部门标记都为 d,但是他们的父部门竟然不相同,显然是数据错了,改正过来就行了。
2)报错信息如下:
一个标记对应的部门名称不同也是错误的,这样也会拒绝同步的。
3)报错信息如下:
意思就是在父部门确定的情况下,部门名称是唯一的,那么部门标记也是唯一的;上图说明部门标记不唯一。
部门名称是可以相同的,比如销售部有个子部门叫性能组,研发部也可以有个子部门叫性能组。
但是当父部门确定的情况下,部门名是不能重复的。
例如:lyon 和 loy 所在的部门都是性能组,且父部门标记都是d,那就表明两个人在同一个部门,那么部门标记就应该相同,上图的两个员工部门标记不相同,那么也会报错,拒绝同步。即在父部门确定的情况下,根据部门名能唯一的确定一个部门。
4)实际情况中还有一种是互为上下级的情况,这种结构或者说数据有时候会在一些实行扁平化管理的公司出现,即A部门是B部门的上级,B部门又是A部门的上级,这样的两个部门在组织同步的时候也会失败,但很少见。
3. 补充说明
原始字段和父标记字段中不能出现 0、,0000000 类似的字段,因为这些标记会被解析成 0,而 0 是程序中的保留字段,是所有部门的 ID,所以要尽量避免.
在构建树结构的时候,如果一个部门没有父部门,那么父部门就空着,不要随便写。
另外,在设计器升级之前一定要备份 JAR 包文件。