获取所有上级部门及下级部门¶
本文档内容来源于 http://doc.myapps.cn/docs/common-script/common-script-1f1a4n7bme2cq
脚本说明¶
该脚本用于获取指定部门的所有上级部门和所有下级部门。在MyApps平台中,部门是树形结构,可以通过递归方式遍历获取上级和下级部门。
获取所有上级部门¶
方式1:递归获取所有上级部门¶
(function(){
var departmentId = "部门ID";
var parentDepartments = [];
function getAllParents(deptId){
var department = getDepartmentById(deptId);
if(department != null){
var parentId = department.getParentid();
if(parentId != null && parentId.trim().length > 0){
var parentDept = getDepartmentById(parentId);
if(parentDept != null){
parentDepartments.push({
id: parentDept.getId(),
name: parentDept.getName()
});
getAllParents(parentId); // 递归获取上级的上级
}
}
}
}
getAllParents(departmentId);
return JSON.stringify(parentDepartments);
})();
方式2:循环获取所有上级部门¶
(function(){
var departmentId = "部门ID";
var parentDepartments = [];
var currentDeptId = departmentId;
while(true){
var department = getDepartmentById(currentDeptId);
if(department == null){
break;
}
var parentId = department.getParentid();
if(parentId == null || parentId.trim().length == 0){
break;
}
var parentDept = getDepartmentById(parentId);
if(parentDept != null){
parentDepartments.push({
id: parentDept.getId(),
name: parentDept.getName()
});
currentDeptId = parentId;
}else{
break;
}
}
return JSON.stringify(parentDepartments);
})();
方式3:通过SQL递归查询获取所有上级部门¶
(function(){
var departmentId = "部门ID";
var domainId = getWebUser().getDomainid();
var parentDepartments = [];
function getAllParentsBySQL(deptId){
var sql = "SELECT id, name, parentid FROM t_department WHERE id = '" + deptId + "' AND domainid = '" + domainId + "'";
var dept = findBySQL(sql);
if(dept != null){
var parentId = dept.getItemValueAsString("parentid");
if(parentId != null && parentId.trim().length > 0){
var parentSql = "SELECT id, name, parentid FROM t_department WHERE id = '" + parentId + "' AND domainid = '" + domainId + "'";
var parentDept = findBySQL(parentSql);
if(parentDept != null){
parentDepartments.push({
id: parentDept.getId(),
name: parentDept.getItemValueAsString("name")
});
getAllParentsBySQL(parentId); // 递归
}
}
}
}
getAllParentsBySQL(departmentId);
return JSON.stringify(parentDepartments);
})();
方式4:获取上级部门路径字符串¶
(function(){
var departmentId = "部门ID";
var path = [];
var currentDeptId = departmentId;
while(true){
var department = getDepartmentById(currentDeptId);
if(department == null){
break;
}
path.unshift(department.getName()); // 从前面插入
var parentId = department.getParentid();
if(parentId == null || parentId.trim().length == 0){
break;
}
currentDeptId = parentId;
}
return path.join(" / ");
})();
获取所有下级部门¶
方式1:递归获取所有下级部门¶
(function(){
var departmentId = "部门ID";
var childDepartments = [];
var domainId = getWebUser().getDomainid();
function getAllChildren(deptId){
var sql = "SELECT id, name FROM t_department WHERE parentid = '" + deptId + "' AND domainid = '" + domainId + "'";
var children = queryBySQL(sql);
if(children != null && children.size() > 0){
for(var it = children.iterator(); it.hasNext();){
var child = it.next();
var childId = child.getId();
var childName = child.getItemValueAsString("name");
childDepartments.push({
id: childId,
name: childName
});
getAllChildren(childId); // 递归获取子部门的子部门
}
}
}
getAllChildren(departmentId);
return JSON.stringify(childDepartments);
})();
方式2:获取直接下级部门¶
(function(){
var departmentId = "部门ID";
var domainId = getWebUser().getDomainid();
var sql = "SELECT id, name FROM t_department WHERE parentid = '" + departmentId + "' AND domainid = '" + domainId + "'";
var children = queryBySQL(sql);
var childList = [];
if(children != null && children.size() > 0){
for(var it = children.iterator(); it.hasNext();){
var child = it.next();
childList.push({
id: child.getId(),
name: child.getItemValueAsString("name")
});
}
}
return JSON.stringify(childList);
})();
方式3:获取所有下级部门(包含层级信息)¶
(function(){
var departmentId = "部门ID";
var childDepartments = [];
var domainId = getWebUser().getDomainid();
function getAllChildrenWithLevel(deptId, level){
if(level == null){
level = 0;
}
var sql = "SELECT id, name FROM t_department WHERE parentid = '" + deptId + "' AND domainid = '" + domainId + "'";
var children = queryBySQL(sql);
if(children != null && children.size() > 0){
for(var it = children.iterator(); it.hasNext();){
var child = it.next();
var childId = child.getId();
var childName = child.getItemValueAsString("name");
childDepartments.push({
id: childId,
name: childName,
level: level + 1
});
getAllChildrenWithLevel(childId, level + 1); // 递归
}
}
}
getAllChildrenWithLevel(departmentId, 0);
return JSON.stringify(childDepartments);
})();
同时获取上级和下级部门¶
方式1:获取所有上级和下级部门¶
(function(){
var departmentId = "部门ID";
var domainId = getWebUser().getDomainid();
var result = {
parents: [],
children: []
};
// 获取所有上级部门
function getAllParents(deptId){
var department = getDepartmentById(deptId);
if(department != null){
var parentId = department.getParentid();
if(parentId != null && parentId.trim().length > 0){
var parentDept = getDepartmentById(parentId);
if(parentDept != null){
result.parents.push({
id: parentDept.getId(),
name: parentDept.getName()
});
getAllParents(parentId);
}
}
}
}
// 获取所有下级部门
function getAllChildren(deptId){
var sql = "SELECT id, name FROM t_department WHERE parentid = '" + deptId + "' AND domainid = '" + domainId + "'";
var children = queryBySQL(sql);
if(children != null && children.size() > 0){
for(var it = children.iterator(); it.hasNext();){
var child = it.next();
var childId = child.getId();
var childName = child.getItemValueAsString("name");
result.children.push({
id: childId,
name: childName
});
getAllChildren(childId); // 递归
}
}
}
getAllParents(departmentId);
getAllChildren(departmentId);
return JSON.stringify(result);
})();
方式2:获取部门树形结构¶
(function(){
var departmentId = "部门ID";
var domainId = getWebUser().getDomainid();
function buildDepartmentTree(deptId){
var department = getDepartmentById(deptId);
if(department == null){
return null;
}
var tree = {
id: department.getId(),
name: department.getName(),
children: []
};
// 获取子部门
var sql = "SELECT id, name FROM t_department WHERE parentid = '" + deptId + "' AND domainid = '" + domainId + "'";
var children = queryBySQL(sql);
if(children != null && children.size() > 0){
for(var it = children.iterator(); it.hasNext();){
var child = it.next();
var childId = child.getId();
var childTree = buildDepartmentTree(childId); // 递归构建子树
if(childTree != null){
tree.children.push(childTree);
}
}
}
return tree;
}
var tree = buildDepartmentTree(departmentId);
return JSON.stringify(tree);
})();
扩展示例¶
示例1:获取部门完整路径(从根到当前)¶
(function(){
var departmentId = "部门ID";
var path = [];
var currentDeptId = departmentId;
// 先添加当前部门
var currentDept = getDepartmentById(currentDeptId);
if(currentDept != null){
path.push({
id: currentDept.getId(),
name: currentDept.getName()
});
}
// 向上遍历获取所有上级部门
while(true){
var department = getDepartmentById(currentDeptId);
if(department == null){
break;
}
var parentId = department.getParentid();
if(parentId == null || parentId.trim().length == 0){
break;
}
var parentDept = getDepartmentById(parentId);
if(parentDept != null){
path.unshift({
id: parentDept.getId(),
name: parentDept.getName()
});
currentDeptId = parentId;
}else{
break;
}
}
return JSON.stringify(path);
})();
示例2:判断部门是否为指定部门的上级或下级¶
(function(){
var departmentId1 = "部门ID1";
var departmentId2 = "部门ID2";
// 判断departmentId1是否为departmentId2的上级
function isParent(deptId1, deptId2){
var currentDeptId = deptId2;
while(true){
var department = getDepartmentById(currentDeptId);
if(department == null){
break;
}
var parentId = department.getParentid();
if(parentId == null || parentId.trim().length == 0){
break;
}
if(parentId === deptId1){
return true;
}
currentDeptId = parentId;
}
return false;
}
// 判断departmentId1是否为departmentId2的下级
function isChild(deptId1, deptId2){
var domainId = getWebUser().getDomainid();
function checkChildren(deptId){
var sql = "SELECT id FROM t_department WHERE parentid = '" + deptId + "' AND domainid = '" + domainId + "'";
var children = queryBySQL(sql);
if(children != null && children.size() > 0){
for(var it = children.iterator(); it.hasNext();){
var child = it.next();
var childId = child.getId();
if(childId === deptId1){
return true;
}
if(checkChildren(childId)){ // 递归检查
return true;
}
}
}
return false;
}
return checkChildren(deptId2);
}
var result = {
isParent: isParent(departmentId1, departmentId2),
isChild: isChild(departmentId1, departmentId2)
};
return JSON.stringify(result);
})();
示例3:获取部门的所有同级部门¶
(function(){
var departmentId = "部门ID";
var department = getDepartmentById(departmentId);
if(department != null){
var parentId = department.getParentid();
var domainId = getWebUser().getDomainid();
var siblings = [];
if(parentId != null && parentId.trim().length > 0){
// 获取同级的其他部门(排除自己)
var sql = "SELECT id, name FROM t_department WHERE parentid = '" + parentId + "' AND id != '" + departmentId + "' AND domainid = '" + domainId + "'";
var siblingDepts = queryBySQL(sql);
if(siblingDepts != null && siblingDepts.size() > 0){
for(var it = siblingDepts.iterator(); it.hasNext();){
var sibling = it.next();
siblings.push({
id: sibling.getId(),
name: sibling.getItemValueAsString("name")
});
}
}
}
return JSON.stringify(siblings);
}
return "[]";
})();
示例4:获取部门层级深度¶
(function(){
var departmentId = "部门ID";
var depth = 0;
var currentDeptId = departmentId;
// 向上计算到根部门的层级
while(true){
var department = getDepartmentById(currentDeptId);
if(department == null){
break;
}
var parentId = department.getParentid();
if(parentId == null || parentId.trim().length == 0){
break;
}
depth++;
currentDeptId = parentId;
}
return depth;
})();
示例5:获取部门的所有子孙部门数量¶
(function(){
var departmentId = "部门ID";
var domainId = getWebUser().getDomainid();
var count = 0;
function countAllChildren(deptId){
var sql = "SELECT id FROM t_department WHERE parentid = '" + deptId + "' AND domainid = '" + domainId + "'";
var children = queryBySQL(sql);
if(children != null && children.size() > 0){
count += children.size();
for(var it = children.iterator(); it.hasNext();){
var child = it.next();
countAllChildren(child.getId()); // 递归计数
}
}
}
countAllChildren(departmentId);
return count;
})();
关键函数说明¶
getDepartmentById(departmentId): 根据部门ID获取部门对象department.getParentid(): 获取上级部门IDdepartment.getName(): 获取部门名称department.getId(): 获取部门IDqueryBySQL(sql): 执行SQL查询并返回多条记录findBySQL(sql): 执行SQL查询并返回单条记录getWebUser().getDomainid(): 获取当前用户的域ID
部门表结构说明¶
部门信息通常存储在 t_department 表中,主要字段包括:
- id: 部门ID
- name: 部门名称
- parentid: 上级部门ID(根部门的parentid为空)
- domainid: 域ID
注意事项¶
- ⚠️ 递归深度: 注意递归深度,避免无限递归或栈溢出
- ⚠️ 循环引用: 确保部门数据没有循环引用(A的上级是B,B的上级是A)
- ⚠️ 域ID: 查询时建议加上域ID条件,避免跨域数据
- ⚠️ 空值处理: 部门可能不存在,需要判断
- ⚠️ 性能优化: 如果部门层级很深或数据量很大,注意性能优化
- ⚠️ 数据一致性: 确保部门数据的parentid引用正确
- 部门是树形结构,可以通过递归方式遍历
- 获取上级部门时向上遍历,获取下级部门时向下遍历
- 建议使用递归函数,代码更清晰
使用场景¶
- 获取部门完整路径用于显示
- 获取部门的所有下级部门用于权限控制
- 部门树形结构展示
- 数据权限过滤(根据部门层级)
- 组织架构管理
如需查看完整脚本代码,请访问源文档链接。