MrShi
2025-03-12 69a1b3bf45738f048361ee4ccb6bdc64fce35720
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/platformReport/RegionTreeVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,101 @@
package com.doumee.dao.web.response.platformReport;
import com.doumee.core.haikang.model.param.respose.PageRegionInfoResponse;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
 * åŒºåŸŸæ ‘形结构
 *
 * @Author : JP
 * @create 2024/10/25 10:59
 */
@Data
public class RegionTreeVO {
    public List<PageRegionInfoResponse> nodeList = new ArrayList<>();
    /**
     *  æž„造方法
     *  @param nodeList å°†æ•°æ®é›†åˆèµ‹å€¼ç»™nodeList,即所有数据作为所有节点。
     */
    public RegionTreeVO(List<PageRegionInfoResponse> nodeList ){
        this.nodeList = nodeList;
    }
    /**
     *   èŽ·å–éœ€æž„å»ºçš„æ‰€æœ‰æ ¹èŠ‚ç‚¹ï¼ˆé¡¶çº§èŠ‚ç‚¹ï¼‰ "0"
     *   @return æ‰€æœ‰æ ¹èŠ‚ç‚¹List集合
     */
    public List<PageRegionInfoResponse> getRootNode(){
        // ä¿å­˜æ‰€æœ‰æ ¹èŠ‚ç‚¹ï¼ˆæ‰€æœ‰æ ¹èŠ‚ç‚¹çš„æ•°æ®ï¼‰
        List<PageRegionInfoResponse> rootNodeList = new ArrayList<>();
        // treeNode:查询出的每一条数据(节点)
        for (PageRegionInfoResponse treeNode : nodeList){
            // åˆ¤æ–­å½“前节点是否为根节点,此处注意:若parentId类型是String,则要采用equals()方法判断。
            if (Objects.isNull(treeNode.getParentIndexCode())
                    || StringUtils.equals(treeNode.getParentIndexCode(),"null")
                    || !isValidParentCode(treeNode.getParentIndexCode(),nodeList)) {
                // æ˜¯ï¼Œæ·»åŠ 
                rootNodeList.add(treeNode);
            }
        }
        return rootNodeList;
    }
    private boolean isValidParentCode(String parentIndexCode, List<PageRegionInfoResponse> nodeList) {
        for (PageRegionInfoResponse treeNode : nodeList){
            // åˆ¤æ–­å½“前节点是否为根节点,此处注意:若parentId类型是String,则要采用equals()方法判断。
            if ( StringUtils.equals(treeNode.getIndexCode(),parentIndexCode)) {
                return true;
            }
        }
        return false;
    }
    /**
     *  æ ¹æ®æ¯ä¸€ä¸ªé¡¶çº§èŠ‚ç‚¹ï¼ˆæ ¹èŠ‚ç‚¹ï¼‰è¿›è¡Œæž„å»ºæ ‘å½¢ç»“æž„
     *  @return  æž„建整棵树
     */
    public List<PageRegionInfoResponse> buildTree(){
        // treeNodes:保存一个顶级节点所构建出来的完整树形
        List<PageRegionInfoResponse> treeNodes = new ArrayList<PageRegionInfoResponse>();
         getRootNode();//:获取所有的根节点
        for (PageRegionInfoResponse treeRootNode : getRootNode()) {
            // å°†é¡¶çº§èŠ‚ç‚¹è¿›è¡Œæž„å»ºå­æ ‘
            treeRootNode = buildChildTree(treeRootNode);
            // å®Œæˆä¸€ä¸ªé¡¶çº§èŠ‚ç‚¹æ‰€æž„å»ºçš„æ ‘å½¢ï¼Œå¢žåŠ è¿›æ¥
            treeNodes.add(treeRootNode);
        }
        return treeNodes;
    }
    /**
     *  é€’å½’-----构建子树形结构
     *  @param  pNode æ ¹èŠ‚ç‚¹ï¼ˆé¡¶çº§èŠ‚ç‚¹ï¼‰
     *  @return æ•´æ£µæ ‘
     */
    public PageRegionInfoResponse buildChildTree(PageRegionInfoResponse pNode){
        List<PageRegionInfoResponse> childTree = new ArrayList<>();
        // nodeList:所有节点集合(所有数据)
        for (PageRegionInfoResponse treeNode : nodeList) {
            // åˆ¤æ–­å½“前节点的父节点ID是否等于根节点的ID,即当前节点为其下的子节点
                if (!Objects.isNull(treeNode.getParentIndexCode())&&treeNode.getParentIndexCode().equals(pNode.getIndexCode())) {
                    // å†é€’归进行判断当前节点的情况,调用自身方法
                    childTree.add(buildChildTree(treeNode));
                }
        }
        // for循环结束,即节点下没有任何节点,树形构建结束,设置树结果
        pNode.setChildList(childTree);
        return pNode;
    }
}