组织树的一些操作

查询树的时候可以使用mybatis的collection递归查询

public class OrgTree{

    private String orgId;// 部门代码
    private String orgName;// 部门中文名称
    private List<OrgTree> children;//
    public String getOrgName() {
        return orgName;
    }
    public void setOrgName(String orgName) {
        this.orgName= orgName;
    }
    public String getOrgId() {
        return orgId;
    }
    public void setOrgId(String orgId) {
        this.orgId= orgId;
    }
    public List<OrgTree> getChildren() {
        return children;
    }
    public void setChildren(List<OrgTree> children) {
        this.children = children;
    }
}
    <resultMap id="orgZtreeMap" type="com.tyz.commons.entity.OrgTree">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="orgId" property="orgId" jdbcType="VARCHAR"/>
        <result column="orgName" property="orgName" jdbcType="VARCHAR"/>
        <collection column="orgId" property="children" ofType="OrgTree" javaType="java.util.ArrayList" select="findOrgByparentId"></collection>
    </resultMap>
    <select id="querySdpOrgAll" parameterType="map" resultMap="orgZtreeMap">
        select 
        orgId,orgName,orgId ,orgName 
        from org_table  where
            orgId  = 0
    </select>
    <!-- 再递归查询出一级部门下的所有子部门 -->
    <select id="findOrgByparentId" resultMap="orgZtreeMap" parameterType="string">
        select orgId,orgName,orgId ,orgName from org_table  where superiorId= #{orgId,jdbcType=VARCHAR}
    </select>

但这样数据量大的时候回比较慢
换成先查询所有,然后在java里进行转换

    <sql id="org_column_list">
        orgId,orgName,superiorId
    </sql>
    <select id="querySdpOrgAll" resultMap="MiddleOrgResultMap">
        select 
        <include refid="org_column_list"/>
        from org_table 
    </select>

实体

public class OrganizationRes {
    private String orgId;// 部门代码
    private String orgName;// 部门中文名称
    private String superiorId;// 上级部门id
    private List<OrganizationRes> subordinateOrg;// 下属部门(对象集合)

    public String getOrgId() {
        return orgId;
    }

    public void setOrgId(String orgId) {
        this.orgId = orgId;
    }

    public String getOrgName() {
        return orgName;
    }

    public void setOrgName(String orgName) {
        this.orgName = orgName;
    }

    public String getSuperiorId() {
        return superiorId;
    }

    public void setSuperiorId(String superiorId) {
        this.superiorId = superiorId;
    }

}

    public List<OrganizationRes> getSubordinateOrg() {
        return subordinateOrg;
    }

public void setSubordinateOrg(List<OrganizationRes> subordinateOrg) {
    this.subordinateOrg = subordinateOrg;
}

    /** 
     * 获取组织树
     * @return 
     */  
public void getMiddleOrgTree(){
//获取组织架构树
List<OrganizationRes > list=OrgDao.findAll();
List<OrganizationRes > ztree= buildTreeByRecursive(list);
}
    /** 
     * 使用递归方法建树 
     * @param treeNodes 
     * @return 
     */  
public List<OrganizationRes > buildTreeByRecursive(List<OrganizationRes > treeNodes) {
      List<OrganizationRes > trees = new ArrayList<OrganizationRes >();  
        //遍历所有的
        for (OrganizationRes treeNode : treeNodes) {  
            //如果为null则为最顶层节点
            if (StringUtils.isEmpty(treeNode.getSuperiorId())) {  
                trees.add(findChildren(treeNode,treeNodes));  
            }  
        }  
        return trees; 
}
    /** 
     * 递归查找子节点 
     * @param parentNode 父节点
     * @param treeNodes 
     * @return 
     */  
    public OrganizationRes findChildren(OrganizationRes parentNode,List<OrganizationRes> treeNodes) {  
        for (OrganizationRes it : treeNodes) {  
            //遍历到上级的id与某条数据的上级id一致时,证明该上级是这条数据的上级
            if(parentNode.getOrgId().equals(it.getSuperiorId())) {  
                if (parentNode.getSubordinateOrg() == null) {  
                    parentNode.setSubordinateOrg(new ArrayList<OrganizationRes>());  
                }  
              //使用递归添加下级数据
               parentNode.getSubordinateOrg().add(findChildren(it,treeNodes));  
            }  
        }  
        return parentNode;  
    }  

另一种方式的树形式Ztree

    /**
     *  checked:false
     *      id:"CTZ"
     *      orgid:"CTZ"
     *      orgname:"中国通周"
     *      pId:"0"
     */
    @Override
    public void getOrgZtree() {
            List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
            List<OrganizationRes> orgList = OrgDao.findAll();
            Map<String,Object> map=null;
            for (OrganizationRes organizationRes : orgList) {
                map=new HashMap<String,Object>();
                map.put("id", organizationRes.getOrgId());
                map.put("pId", StringUtils.isBlank(organizationRes.getSuperiorId())?"0":organizationRes.getSuperiorId());
                map.put("orgname", organizationRes.getOrgName());
                map.put("orgcode", organizationRes.getOrgCode());
                map.put("checked", true);//是否默认选中
                resultList.add(map);
            }
    }

根据组织id获取下级

 /**
     * 根据组织id获取下级
     */
    @Override
    public void getOrgZtreeByOrgCode() {
            String orgid = "2530";
            List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
            List<OrganizationRes> orgList = orgDao.findAll();
            OrganizationRes organization=new OrganizationRes();
            for (OrganizationRes organizationRes : orgList) {
                if(orgid.equals(organizationRes.getOrgId())) {
                    BeanUtils.copyProperties(organizationRes, organization);
                //递归查找子节点
                    findChildren(organization, orgList);
                    break;
                }
            }
            this.buildOrgByRecursive(organization, resultList, new HashMap<String,Object>(),0);
        
    }
    /**
     * 将组织树转换为list 符合ztree格式
     * @param organization
     * @param list
     */
    public void buildOrgByRecursive(OrganizationRes organization,List<Map<String,Object>> list, Map<String, Object> map,int index) {
            map=new HashMap<String,Object>();
            map.put("id", organization.getOrgId());
            if(index>0) {
                map.put("pId", organization.getSuperiorId());
            }else {
                map.put("pId", "0");
            }
            map.put("orgname", organization.getOrgName());
            map.put("orgcode", organization.getOrgCode());
            map.put("checked", true);
            list.add(map);
            List<OrganizationRes> subList = organization.getSubordinateOrg();
            if(subList!=null&&subList.size()>0) {
                for (OrganizationRes organizationRes : subList) {
                    this.buildOrgByRecursive(organizationRes, list, map,1);
                }
            }
    }

查询上级

     <select id="findSuperiorId" parameterMap="map" resultMap="MiddleOrgResultMap">
     SELECT 
        O.*
        FROM (   
            SELECT   
                @r AS _orgId,  
         
                (SELECT @r := superiorId FROM sdp_middle_org WHERE orgId = _orgId) AS 2v2,   
                @l := @l + 1 AS lvl   
            FROM   
                (SELECT @r := #{orgId,jdbcType=VARCHAR}) vars,   
                sdp_middle_org h   
            WHERE @r is not null) O1   
        JOIN sdp_middle_org O  
        ON O1._orgId = O.orgId
     </select>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343