0
点赞
收藏
分享

微信扫一扫

树状数据模式(递归)

--------一次查询所有,不是点一次查询一次

controller接口层

/*
* 获取树列表
* */
    @GetMapping("/treeFacility")
    public AjaxResult treeFacility(TxfOrgWeibaoFacility txfOrgWeibaoFacility) {
        List<TxfOrgWeibaoFacility> txfOrgWeibaoFacilities = txfOrgWeibaoFacilityService.selectTxfOrgWeibaoFacilityList(txfOrgWeibaoFacility);
        return AjaxResult.success(txfOrgWeibaoFacilityService.treeFacility(txfOrgWeibaoFacilities));
    }

service接口层

List<TxfOrgWeibaoFacility> buildTreeFacility(List<TxfOrgWeibaoFacility> txfOrgWeibaoFacilities);

    List<TxfOrgWeibaoFacility> treeFacility(List<TxfOrgWeibaoFacility> txfOrgWeibaoFacilitys);

serviceImpl业务逻辑层

/**
     * 构建前端所需要树结构
     *
     * @param txfOrgWeibaoFacilities 公司维保计划列表
     * @return 树结构列表
     */
    @Override
    public List<TxfOrgWeibaoFacility> buildTreeFacility(List<TxfOrgWeibaoFacility> txfOrgWeibaoFacilities) {
//        构造返回集合对象
        List<TxfOrgWeibaoFacility> returnList = new ArrayList<TxfOrgWeibaoFacility>();//存放返回的树所有对象
        List<String> tempList = new ArrayList<String>();//存放所有的id
        for (TxfOrgWeibaoFacility txfOrgWeibaoFacility : txfOrgWeibaoFacilities) {//遍历所有的公司维保计划对象
            tempList.add(txfOrgWeibaoFacility.getId());//保存所以的id
        }
//        迭代器(容器):得到一个iterator对象,next()可以得到下一个值,hasNext() 判断是否有下一个值
//        hasNext() 判断是否有下一个值,如果有进行遍历
        for (Iterator<TxfOrgWeibaoFacility> iterator = txfOrgWeibaoFacilities.iterator(); iterator.hasNext(); ) {
            TxfOrgWeibaoFacility txfOrgWeibaoFacility = (TxfOrgWeibaoFacility) iterator.next();//得到第一个对象
            // 如果是顶级节点, 遍历该父节点的所有子节点  contains 包含指定数据,
            // 包含说明有子节点为 true, !true不包含说明已经是最高节点
            if (!tempList.contains(txfOrgWeibaoFacility.getParentid())) {//判断是否为顶级节点
                recursionFn(txfOrgWeibaoFacilities, txfOrgWeibaoFacility); //递归
                returnList.add(txfOrgWeibaoFacility);       //说明是顶级节点,进行返回显示
            }
        }
        //如果returnList  没有任何子节点,那就给子节点赋值为整个对象
        if (returnList.isEmpty()) {
            returnList = txfOrgWeibaoFacilities;
        }
        return returnList;
    }

    /**
     * 递归列表,把子节点进行保存在该父节点的对象下的子节点集合中
     */
    private void recursionFn(List<TxfOrgWeibaoFacility> list, TxfOrgWeibaoFacility t) {
        // 得到子节点列表
        List<TxfOrgWeibaoFacility> childList = getChildList(list, t);
        t.setChildren(childList);//保存在当前正在遍历的对象 t 中子节点对象集合中
        for (TxfOrgWeibaoFacility tChild : childList) { //遍历子节点对象集合
            if (hasChild(list, tChild)) {//判断是否还有子节点
                recursionFn(list, tChild);  //有的话 接着递归 孙辈及孙辈一下...
            }
        }
    }

    /**
     * 得到子节点列表  t 为顶级结点,把子节点放在t对象中
     */
    private List<TxfOrgWeibaoFacility> getChildList(List<TxfOrgWeibaoFacility> list, TxfOrgWeibaoFacility t) {
//       创建一个新的集合tlist保存子节点对象
        List<TxfOrgWeibaoFacility> tlist = new ArrayList<TxfOrgWeibaoFacility>();
        Iterator<TxfOrgWeibaoFacility> it = list.iterator();  //得到迭代器对象 基本上没什么区别,只是取数据相对方便 可拿到下一个
        while (it.hasNext()) {  //判断是否还有下个对象  true 进去代码块
            TxfOrgWeibaoFacility n = it.next();   //得到子节点对象
            //非空判断,把下面pid=id的对象进行保存在子节点集合中返回出去!
            if (n.getParentid().equals(t.getId())) {
                tlist.add(n);//不为空且相等说明是子节点,进行添加
            }
        }
//        接着返回子节点列表
        return tlist;
    }

    /**
     * 判断是否有子节点
     */
    private boolean hasChild(List<TxfOrgWeibaoFacility> list, TxfOrgWeibaoFacility t)
    {
//        长度大于零说明还有子节点对象,进行再次add拼接到第一个后面
        return getChildList(list, t).size() > 0 ? true : false;
    }

    @Override
    public List<TxfOrgWeibaoFacility> treeFacility(List<TxfOrgWeibaoFacility> txfOrgWeibaoFacilitys) {
        List<TxfOrgWeibaoFacility> FacilityTrees = buildTreeFacility(txfOrgWeibaoFacilitys);//构建树
        return FacilityTrees.stream().map(TxfOrgWeibaoFacility::new).collect(Collectors.toList());
//        return FacilityTrees;
    }

domain实体

/**
 * 公司维保计划对象 txf_org_weibao_facility
 *
 * @author ruoyi
 * @date 2020-10-11
 */
public class TxfOrgWeibaoFacility extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** ID */
    private String id;

    /** 单位ID */
    @Excel(name = "单位ID")
    private String uqorgid;

    /** 系统ID */
    @Excel(name = "系统ID")
    private String systemid;

    /** 父节点(对应ID字段) */
    @Excel(name = "父节点", readConverterExp = "对=应ID字段")
    private String parentid;

    /** 消防设施编号 */
    @Excel(name = "消防设施编号")
    private String varno;

    /** 消防设施名称 */
    @Excel(name = "消防设施名称")
    private String facility;

    /** 状态  1: 有效 0 无效 */
    @Excel(name = "状态  1: 有效 0 无效")
    private Long intstate;

    /** 创建人 */
    @Excel(name = "创建人")
    private String createuser;

    /** 更新人 */
    @Excel(name = "更新人")
    private String updateuser;

    /** 备注 */
    @Excel(name = "备注")
    private String memo;

    @JsonInclude(JsonInclude.Include.NON_EMPTY)

    private List<TxfOrgWeibaoFacility> Children = new ArrayList<TxfOrgWeibaoFacility>();

    public List<TxfOrgWeibaoFacility> getChildren() {
        return Children;
    }
    public TxfOrgWeibaoFacility() {

    }
    public TxfOrgWeibaoFacility(TxfOrgWeibaoFacility txfOrgWeibaoFacility) {
        this.id = txfOrgWeibaoFacility.getId();
        this.uqorgid = txfOrgWeibaoFacility.getUqorgid();
        this.systemid = txfOrgWeibaoFacility.getSystemid();
        this.parentid = txfOrgWeibaoFacility.getParentid();
        this.facility = txfOrgWeibaoFacility.getFacility();
        this.Children = txfOrgWeibaoFacility.getChildren().stream().map(TxfOrgWeibaoFacility::new).collect(Collectors.toList());

    }
    public void setChildren(List<TxfOrgWeibaoFacility> children) {
        Children = children;
    }
}


举报

相关推荐

0 条评论