| package com.doumee.dao.business.vo; | 
|   | 
| import com.doumee.config.DataSyncConfig; | 
| import com.doumee.dao.business.model.Shop; | 
| import org.apache.commons.lang3.StringUtils; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.List; | 
| import java.util.Objects; | 
|   | 
| /** | 
|  * Created by IntelliJ IDEA. | 
|  * | 
|  * @Author : Rk | 
|  * @create 2023/7/13 10:40 | 
|  */ | 
| public class ShopTree { | 
|   | 
|     // 保存参与构建树形的所有数据(通常数据库查询结果) | 
|     public List<ShopTreeVo> nodeList = new ArrayList<>(); | 
|     public List<ShopTreeVo> dealedList = new ArrayList<>(); | 
|     public int dealIndex =0; | 
|   | 
|     /** | 
|      *  构造方法 | 
|      *  @param nodeList 将数据集合赋值给nodeList,即所有数据作为所有节点。 | 
|      */ | 
|     public ShopTree(List<ShopTreeVo> nodeList ){ | 
|         this.nodeList = nodeList; | 
|         this.dealedList = new ArrayList<>(); | 
|     } | 
|   | 
|   | 
|     /** | 
|      *   获取需构建的所有根节点(顶级节点) "0" | 
|      *   @return 所有根节点List集合 | 
|      */ | 
|     public List<ShopTreeVo> getRootNode(){ | 
|         // 保存所有根节点(所有根节点的数据) | 
|         List<ShopTreeVo> rootNodeList = new ArrayList<>(); | 
|         // treeNode:查询出的每一条数据(节点) | 
|         for (ShopTreeVo treeNode : nodeList){ | 
|             if (isParentNode(treeNode) ) { | 
|                 // 是,添加 | 
|                 rootNodeList.add(treeNode); | 
|             } | 
|   | 
|         } | 
|         return rootNodeList; | 
|     } | 
|   | 
|     private boolean isParentNode(ShopTreeVo treeNode) { | 
|         if(StringUtils.isBlank(treeNode.getParentIamId())){ | 
|             return  true; | 
|         } | 
|        /* for (Shop s : nodeList){ | 
|             if ( StringUtils.equals(treeNode.getParentIamId(),s.getOrgId())) { | 
|                 // 是,添加 | 
|                 return false; | 
|             } | 
|   | 
|         }*/ | 
|         return false; | 
|     } | 
|   | 
|   | 
|     /** | 
|      *  根据每一个顶级节点(根节点)进行构建树形结构 | 
|      *  @return  构建整棵树 | 
|      */ | 
|     public List<ShopTreeVo> buildTree(){ | 
|         List<ShopTreeVo> treeNodes = new ArrayList<>(); | 
|         // getRootNode():获取所有的根节点 | 
|         for (ShopTreeVo treeRootNode : getRootNode()) { | 
|             // 将顶级节点进行构建子树 | 
|             treeRootNode = buildChildTree(treeRootNode); | 
|             // 完成一个顶级节点所构建的树形,增加进来 | 
|             treeNodes.add(treeRootNode); | 
|         } | 
|         return treeNodes; | 
|     } | 
|   | 
|     private boolean isDealedNode(ShopTreeVo treeRootNode) { | 
|         for (ShopTreeVo s : this.dealedList) { | 
|             // 将顶级节点进行构建子树 | 
|             if(StringUtils.equals(s.getOrgId(),treeRootNode.getOrgId())){ | 
|                return true; | 
|             } | 
|         } | 
|         return false; | 
|     } | 
|   | 
|     /** | 
|      *  递归-----构建子树形结构 | 
|      *  @param  pNode 根节点(顶级节点) | 
|      *  @return 整棵树 | 
|      */ | 
|     public ShopTreeVo buildChildTree(ShopTreeVo pNode){ | 
|         if(isDealedNode(pNode)){ | 
|             System.out.println(pNode.getId()+"==已处理=="+pNode.getName()); | 
|             return pNode; | 
|         } | 
|         // 再递归进行判断当前节点的情况,调用自身方法 | 
|         this.dealedList.add(pNode); | 
|         List<ShopTreeVo> childTree = new ArrayList<>(); | 
|         // nodeList:所有节点集合(所有数据) | 
|         for (ShopTreeVo treeNode : nodeList) { | 
|             // 判断当前节点的父节点ID是否等于根节点的ID,即当前节点为其下的子节点 | 
|             if (StringUtils.isNotBlank(treeNode.getParentIamId())&&StringUtils.equals(treeNode.getParentIamId(),pNode.getOrgId())) { | 
|                 childTree.add(buildChildTree(treeNode)); | 
|             } | 
|         } | 
|         // for循环结束,即节点下没有任何节点,树形构建结束,设置树结果 | 
|         pNode.setChildList(childTree); | 
|         if(childTree.size()>0){ | 
|             System.out.println(pNode.getId()+"==有下级=="+(dealIndex++)+pNode.getName()); | 
|         }else{ | 
|             System.out.println(pNode.getId()+"==无下级=="+(dealIndex++)+pNode.getName()); | 
|         } | 
|         return pNode; | 
|     } | 
|   | 
|   | 
|   | 
| } |