如何递归查找上级组织,设置组织负责人为工作流参与人原创
金蝶云社区-吴锐雄
吴锐雄
2人赞赏了该文章 962次浏览 未经作者许可,禁止转载编辑于2023年06月05日 09:42:29

关键词:工作流,参与人,组织


一、需求

向上查找当前组织的上级组织,并且这个组织是二级组织;

设置二级组织的负责人为工作流审核节点的参与人。


二、思路与方案

整体业务逻辑靠插件代码实现。

获取二级组织,可以使用OrgUnitServiceHelper获取一个二级组织列表,里面有全部的二级组织;

查找上级组织,可以使用OrgUnitServiceHelper递归查询上级组织;

如果向上查找的组织id,在二级组织列表集合里面存在,就找到了目标组织。

使用UserServiceHelper可以获取到组织负责人。


三、实现过程


1.工作流审核节点,配置参与人为插件

image.png


image.png

image.png


2.编写插件代码

在工作流插件的calcUserIds事件中,获取上级2级组织

@Override
public List<Long> calcUserIds(AgentExecution execution) {
    // 入参2,表示获取上级2级组织
    List<Long> mainUserForOrg = getSuperOrgManagers(2);
    return mainUserForOrg;
}


获取上级2级组织的

private List<Long> getSuperOrgManagers (int orgIndex) {
    // 获取某一级组织
    List<Long> levelOrg = OrgUnitServiceHelper.getOrgByLevel(OrgViewType.Admin, orgIndex,false,false);

    // 当前组织id
    long currentOrg = UserServiceHelper.getUserMainOrgId(UserServiceHelper.getCurrentUserId());

    // 递归查找目标上级组织
    Long superOrg = getSuperOrg(levelOrg, currentOrg);

    // 获取组织负责人
    List<Long> mainUserForOrg = UserServiceHelper.getManagersOfOrg(superOrg);

    return mainUserForOrg;
}


当组织id在levelOrg集合内时,退出递归,返回目标组织id。

// 递归查找
private Long getSuperOrg (List<Long> levelOrg, long currentOrg) {
    // 获取上级组织
    Map<Long, Long> orgParentMap = OrgUnitServiceHelper.getDirectSuperiorOrg(OrgViewType.Admin, Collections.singletonList(currentOrg));
    Long parentOrgId = orgParentMap.get(currentOrg);
    if (levelOrg.contains(parentOrgId)) {
        // 如果判断成立,表示当前获取到的上级组织属于这个级别的组织,将该上级组织返回
        return parentOrgId;
    } else {
        // 递归调用,查找上上级组织
        return getSuperOrg(levelOrg, parentOrgId);
    }
}

四、效果图

如图,单据提交之后,流程走到了上级2级组织负责人进行审批。

image.png


五、开发环境版本

不限


六、参考资料

OrgUnitServiceHelper文档

UserServiceHelper文档

工作流插件




赞 2