jiangping
2025-06-26 2edf3f1fd9505cbdd435524d316e7558b25f6760
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
package com.doumee.dao.business.vo;
 
import com.doumee.core.constants.Constants;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.business.model.CompanyMember;
import com.doumee.dao.business.model.Member;
import org.apache.commons.lang3.StringUtils;
import org.yaml.snakeyaml.scanner.Constant;
 
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
 
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/7/13 10:40
 */
public class CompanyTree {
 
    // 保存参与构建树形的所有数据(通常数据库查询结果)
    public List<Company> nodeList = new ArrayList<>();
    public List<CompanyMember> memberList = new ArrayList<>();
 
    public Integer origin = 0; //0自建 1企微
 
 
    /**
     *  构造方法
     *  @param nodeList 将数据集合赋值给nodeList,即所有数据作为所有节点。
     */
    public CompanyTree(List<Company> nodeList, Integer origin){
        this.nodeList = nodeList;
        this.origin = origin;
    }
    public CompanyTree(List<Company> nodeList, Integer origin, List<CompanyMember> memberList ){
        this.nodeList = nodeList;
        this.origin = origin;
        this.memberList=memberList;
    }
 
 
    /**
     *   获取需构建的所有根节点(顶级节点) "0"
     *   @return 所有根节点List集合
     */
    public List<Company> getRootNode(){
        // 保存所有根节点(所有根节点的数据)
        List<Company> rootNodeList = new ArrayList<>();
        // treeNode:查询出的每一条数据(节点)
        for (Company treeNode : nodeList){
            // 判断当前节点是否为根节点,此处注意:若parentId类型是String,则要采用equals()方法判断。
            if(origin== 1){
                if( findParentIdFromList(treeNode.getQwParentId()) == null){
                    treeNode.setQwParentId(null);//去除没获取的父节点的企微父级标识,作为顶节点
                }
                if (StringUtils.isBlank(treeNode.getQwParentId()) || StringUtils.equals(treeNode.getQwId(),"1")) {
                    // 是,添加
                    rootNodeList.add(treeNode);
                }
            }else {
                if (Objects.isNull(treeNode.getParentId())) {
                    // 是,添加
                    rootNodeList.add(treeNode);
                }
            }
        }
        return rootNodeList;
    }
 
    private Company findParentIdFromList(String qwParentId) {
        for(Company c : nodeList){
            if(StringUtils.equals(c.getQwId(),qwParentId)){
                return  c;
            }
        }
        return null;
    }
 
 
    /**
     *  根据每一个顶级节点(根节点)进行构建树形结构
     *  @return  构建整棵树
     */
    public List<Company> buildTree(){
        // treeNodes:保存一个顶级节点所构建出来的完整树形
        List<Company> treeNodes = new ArrayList<Company>();
        // getRootNode():获取所有的根节点
        for (Company treeRootNode : getRootNode()) {
            // 将顶级节点进行构建子树
            treeRootNode = buildChildTree(treeRootNode);
            // 完成一个顶级节点所构建的树形,增加进来
            treeNodes.add(treeRootNode);
        }
        return treeNodes;
    }
 
    /**
     *  递归-----构建子树形结构
     *  @param  pNode 根节点(顶级节点)
     *  @return 整棵树
     */
    public Company buildChildTree(Company pNode){
        List<Company> childTree = new ArrayList<Company>();
        // nodeList:所有节点集合(所有数据)
        for (Company treeNode : nodeList) {
            // 判断当前节点的父节点ID是否等于根节点的ID,即当前节点为其下的子节点
            if(origin==1){
                if (!Objects.isNull(treeNode.getQwParentId())&&treeNode.getQwParentId().equals(pNode.getQwId())) {
                    // 再递归进行判断当前节点的情况,调用自身方法
                    childTree.add(buildChildTree(treeNode));
                }
            } else  {
                if (!Objects.isNull(treeNode.getParentId())&&treeNode.getParentId().equals(pNode.getId())) {
                    // 再递归进行判断当前节点的情况,调用自身方法
                    childTree.add(buildChildTree(treeNode));
 
                }
            }
        }
        // for循环结束,即节点下没有任何节点,树形构建结束,设置树结果
        pNode.setChildList(childTree);
        List<Company> memberList = getMemberNode(pNode.getId());
        if(memberList!=null && memberList.size()>0){
            if(pNode.getChildList() == null){
                pNode.setChildList(memberList);
            }else{
                pNode.getChildList().addAll(memberList);
            }
        }
        if(  pNode.getChildList() == null ||   pNode.getChildList().size() ==0){
            pNode.setHasChildren(Boolean.FALSE);
        }else{
            pNode.setHasChildren(Boolean.TRUE);
        }
        return pNode;
    }
 
    private   List<Company> getMemberNode(Integer id) {
        List<Company> companyList = new ArrayList<>();
        if(memberList!=null && memberList.size()>0){
            for(CompanyMember member :memberList){
                if(member.getCompanyId()!=null && Constants.equalsInteger(member.getCompanyId(),id)){
                    Company com = new Company();
                    com.setObjType(Constants.ONE);
                    com.setName(member.getMemberName());
                    com.setMemberId(member.getMemberId());
                    companyList.add(com);
                }
            }
        }
        return companyList;
    }
 
 
}