Skip to content

DepartmentTree 使用文档

DepartmentTree 是 Zeze 框架提供的持久化部门树实现,用于构建组织架构、部门层级等树形结构。支持管理员权限管理、部门成员管理、部门层级移动等功能。所有操作都在事务中执行,数据会自动持久化到配置的数据库。

Zeze.Collections.DepartmentTree<
TManager extends Bean,
TMember extends Bean,
TDepartmentMember extends Bean,
TGroupData extends Bean,
TDepartmentData extends Bean>
特性说明
树形结构支持多级部门层级
权限管理支持管理员角色和递归权限检查
成员管理每个部门可管理自己的成员列表
持久化数据自动同步到数据库
事务安全所有操作在事务中执行
热更新支持支持所有 Bean 类型的动态重载
自定义数据5种泛型参数支持自定义数据结构

参数说明
TManager管理员数据类型,存储管理员额外信息
TMember组成员数据类型,根级别的成员
TDepartmentMember部门成员数据类型,各部门的成员
TGroupData组数据类型,根节点的自定义数据
TDepartmentData部门数据类型,各部门的自定义数据

// 在应用启动时创建 Module
Zeze.Application zeze = new Zeze.Application(config);
LinkedMap.Module linkedMapModule = new LinkedMap.Module(zeze);
DepartmentTree.Module deptTreeModule = new DepartmentTree.Module(zeze, linkedMapModule);
// 管理员数据
public class ManagerData extends Bean {
public String title; // 职位
public long assignedTime; // 任命时间
}
// 组成员数据
public class MemberData extends Bean {
public String nickname;
public long joinTime;
}
// 部门成员数据
public class DepartmentMemberData extends Bean {
public String position; // 部门内职位
public long joinTime;
}
// 组数据
public class GroupData extends Bean {
public String groupName;
public String description;
}
// 部门数据
public class DepartmentData extends Bean {
public String location; // 部门位置
public String description;
}
DepartmentTree<ManagerData, MemberData, DepartmentMemberData, GroupData, DepartmentData> orgTree =
deptTreeModule.open(
"company_org",
ManagerData.class,
MemberData.class,
DepartmentMemberData.class,
GroupData.class,
DepartmentData.class
);
zeze.newProcedure(() -> {
// 创建组织
BDepartmentRoot root = orgTree.create();
root.setRoot("admin_account"); // 设置超级管理员
// 设置组数据
GroupData groupData = orgTree.getGroupData(root);
groupData.groupName = "My Company";
groupData.description = "A great company";
// 创建部门
OutLong deptId = new OutLong();
long result = orgTree.createDepartment(0, "技术部", 100, deptId);
// 添加部门管理员
ManagerData manager = orgTree.getOrAddManager(deptId.value, "manager_account");
manager.title = "技术总监";
// 添加部门成员
LinkedMap<DepartmentMemberData> members = orgTree.getDepartmentMembers(deptId.value);
DepartmentMemberData member = members.getOrAdd("employee_001");
member.position = "高级工程师";
return 0;
}, "init_org").call();

方法说明
open(name, managerClass, memberClass, deptMemberClass, groupDataClass, deptDataClass)打开 DepartmentTree
方法返回值说明
create()BDepartmentRoot创建组织根节点
getRoot()BDepartmentRoot获取根节点
selectRoot()BDepartmentRoot获取根节点(只读)
destroy()void销毁整个组织
changeRoot(oldRoot, newRoot)long更换超级管理员
getGroupData(root)TGroupData获取组数据
getGroupMembers()LinkedMap<TMember>获取组成员列表
方法返回值说明
createDepartment(parentId, name, childrenLimit, outId)long创建部门
deleteDepartment(departmentId, recursive)long删除部门
moveDepartment(departmentId)long移动部门到根级别
moveDepartment(departmentId, parentId)long移动部门到指定父部门
getDepartmentTreeNode(departmentId)BDepartmentTreeNode获取部门节点
selectDepartmentTreeNode(departmentId)BDepartmentTreeNode获取部门节点(只读)
getDepartmentData(department)TDepartmentData获取部门数据
getDepartmentMembers(departmentId)LinkedMap<TDepartmentMember>获取部门成员列表
isRecursiveChild(departmentId, child)boolean检查是否为递归子部门
方法返回值说明
getOrAddManager(departmentId, name)TManager获取或添加管理员
getManagerData(root/dept, account)TManager获取管理员数据
deleteManager(departmentId, name)TManager删除管理员
方法返回值说明
checkManagePermission(account, departmentId)long检查管理权限
checkParentManagePermission(account, departmentId)long检查父部门管理权限

1. 如果部门拥有管理员:
- 仅管理员账户拥有该部门的管理权限
2. 如果部门没有管理员:
- 递归检查父部门的管理员设置
- 直到找到有管理员的部门或到达根节点
3. 根节点(Root):
- root 账户总是拥有权限
- 根节点的管理员也拥有权限
// 检查用户是否有部门管理权限
long result = orgTree.checkManagePermission("user_account", departmentId);
if (result == 0) {
// 有权限
} else {
// 无权限
}
// 检查用户是否有父部门管理权限(用于管理下级部门)
long result = orgTree.checkParentManagePermission("user_account", departmentId);

错误码说明
ErrorManagePermission无管理权限
ErrorDepartmentNotExist部门不存在
ErrorChangeRootNotOwner非所有者无法更换Root
ErrorTooManyChildren子部门数量超过限制
ErrorDepartmentDuplicate部门名称重复
ErrorDeleteDepartmentRemainChildren删除部门时存在子部门
ErrorDepartmentSameParent目标父部门与当前相同
ErrorDepartmentParentNotExist目标父部门不存在
ErrorCanNotMoveToChildren不能移动到自己的子部门

zeze.newProcedure(() -> {
// 创建公司
BDepartmentRoot root = orgTree.create();
root.setRoot("ceo_account");
// 创建一级部门
OutLong techDeptId = new OutLong();
orgTree.createDepartment(0, "技术部", 10, techDeptId);
OutLong hrDeptId = new OutLong();
orgTree.createDepartment(0, "人力资源部", 10, hrDeptId);
// 创建二级部门
OutLong backendTeamId = new OutLong();
orgTree.createDepartment(techDeptId.value, "后端组", 20, backendTeamId);
OutLong frontendTeamId = new OutLong();
orgTree.createDepartment(techDeptId.value, "前端组", 20, frontendTeamId);
return 0;
}, "create_org").call();
zeze.newProcedure(() -> {
// 获取部门成员列表
LinkedMap<DepartmentMemberData> members = orgTree.getDepartmentMembers(departmentId);
// 添加成员
DepartmentMemberData member = members.getOrAdd("employee_001");
member.position = "高级工程师";
member.joinTime = System.currentTimeMillis();
// 移动成员到队首
members.moveAhead("employee_001");
// 移除成员
members.remove("employee_002");
// 遍历部门成员
members.walk((id, data) -> {
System.out.println("Employee: " + id + ", Position: " + data.position);
return true;
});
return 0;
}, "manage_members").call();
zeze.newProcedure(() -> {
// 将部门移动到根级别
long result = orgTree.moveDepartment(departmentId);
// 将部门移动到另一个父部门下
result = orgTree.moveDepartment(departmentId, newParentId);
// 检查是否可以移动(不能移动到自己的子部门)
if (orgTree.isRecursiveChild(departmentId, targetParentId)) {
// 不能移动
}
return 0;
}, "move_dept").call();
zeze.newProcedure(() -> {
// 删除部门(必须没有子部门)
long result = orgTree.deleteDepartment(departmentId, false);
// 递归删除部门及其所有子部门
result = orgTree.deleteDepartment(departmentId, true);
return 0;
}, "delete_dept").call();
zeze.newProcedure(() -> {
// 添加部门管理员
ManagerData manager = orgTree.getOrAddManager(departmentId, "manager_account");
manager.title = "部门经理";
manager.assignedTime = System.currentTimeMillis();
// 获取管理员数据
ManagerData data = orgTree.getManagerData(
orgTree.getDepartmentTreeNode(departmentId),
"manager_account"
);
// 删除管理员
ManagerData removed = orgTree.deleteManager(departmentId, "manager_account");
return 0;
}, "manage_manager").call();

BDepartmentRoot (根节点)
├── root // 超级管理员账户
├── managers // 管理员Map<account, DynamicBean>
├── data // 组数据 (TGroupData)
├── children // 子部门Map<name, departmentId>
└── nextDepartmentId // 下一个部门ID
BDepartmentTreeNode (部门节点)
├── name // 部门名称
├── parentDepartment // 父部门ID (0表示根级别)
├── managers // 管理员Map<account, DynamicBean>
├── data // 部门数据 (TDepartmentData)
└── children // 子部门Map<name, departmentId>
表名用途
_tDepartmentnameBDepartmentRoot存储根节点
_tDepartmentTreename + departmentIdBDepartmentTreeNode存储部门节点
_tLinkedMapNodesdeptId@name + nodeIdLinkedMapNode存储部门成员
BDepartmentRoot (root)
├── children: {"技术部": 1, "人力资源部": 2}
├── [1] 技术部
│ ├── parentDepartment: 0
│ ├── children: {"后端组": 3, "前端组": 4}
│ │
│ ├── [3] 后端组
│ │ └── parentDepartment: 1
│ │
│ └── [4] 前端组
│ └── parentDepartment: 1
└── [2] 人力资源部
└── parentDepartment: 0

  1. 事务要求:所有操作必须在 Procedure 中执行
  2. 名称限制:名称不能包含 @ 字符(保留用于内部)
  3. 依赖 LinkedMap:需要先创建 LinkedMap.Module
  4. 部门 ID 为 0:表示根级别,不能通过 getDepartmentTreeNode(0) 访问
  5. 删除部门:非递归删除时,部门必须没有子部门
  6. 移动部门:不能将部门移动到自己的子部门下
  7. 权限继承:没有管理员的部门会继承父部门的权限设置

ZezeJava/ZezeJava/src/main/java/Zeze/Collections/DepartmentTree.java