跳转至

获取所有上级部门及下级部门

本文档内容来源于 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(): 获取上级部门ID
  • department.getName(): 获取部门名称
  • department.getId(): 获取部门ID
  • queryBySQL(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引用正确
  • 部门是树形结构,可以通过递归方式遍历
  • 获取上级部门时向上遍历,获取下级部门时向下遍历
  • 建议使用递归函数,代码更清晰

使用场景

  • 获取部门完整路径用于显示
  • 获取部门的所有下级部门用于权限控制
  • 部门树形结构展示
  • 数据权限过滤(根据部门层级)
  • 组织架构管理

如需查看完整脚本代码,请访问源文档链接。