组装树形,并进行节点状态的设置

2019-10-14  本文已影响0人  bin_lifecycle
1.业务要求
  1. 在新增的时候,如果子节点是被规划过的(planId ! =null),那么该子节点的状态就是被勾选,不能被编辑( _checked=true, _disabled=true ),该子节点的父级节点的状态就设置为未被勾选,不能被编辑( _checked=false, _disabled=true ),如果该父节点上还有父节点就递归查询所有的上级父节点并将所有的上级父节点状态设置为未被勾选,不能被编辑( _checked=false, _disabled=true )

  1.1 效果图:


新增应用规划.gif
  1. 在修改的时候,如果子节点是被规划过的(planId !=null),那么该子节点的状态就是被勾选,不能被编辑( _checked=true, _disabled=true ),
    但是,如果这些被规划过的子节点集合中如果含有自身的规划id传入的规划id相等的节点(child.planId == planId),那么这些特殊的节点的状态设置为被勾选,可以编辑( _checked=true, _disabled=false ),然后这些特殊的被规划的子节点的父级节点需要被查询出来,如果该父级节点下所有被规划的子节点集合都属于传入的planId(规划id)规划中,那么该父级节点的状态就设置为未被勾选,可编辑( _checked=false, _disabled=false ),如果该父级节点下所有被规划的子节点集合中含有不属于传入的planId(规划id)规划的子节点,那么该父级节点的状态设置为未被勾选,不可编辑( _checked=false, _disabled=true ),如果该父级节点上还有父节点就递归查询所有的父级节点,这些父级节点的状态设置规则就和父节节点的状态设置规则一样

  2.1 效果图:


修改应用规划.gif
2.代码:新增和修改应用规划的代码
/**
     * 方法说明:在规划管理中对IP段进行选择时,下拉框IP段的查询
     * 下拉框选择IP
     * 1、根据planType(规划类型)判断需要查询的场景
     * 0:查询用于应用规划的IP段
     * 1、新增时查询,查询planId为null,保证topoGraphKind和topoGraphId对应即可
     * 2、修改时查询,在新增查询结果的前提下,还需要将之前已选的IP也查出来
     * 1:查询用于业务规划的IP段
     * 1、新增时查询,查询条件中的PlanId必须为已选的应用规划Id,同时保证topoGraphKind和topoGraphId对应
     * 2、修改时查询,在新增查询结果的前提下,还需要将之前已选的IP也查出来
     * 2:查询用于站点IP规划的IP段
     * 1、新增时查询,查询条件中的planId必须是已选业务规划的Id,同时保证topoGraphKind和topoGraphId对应
     * 2、修改时查询,在新增查询结果的前提下,还需要将之前已选的IP也查出来
     *
     * @param map
     * @return java.util.List<com.sccl.modules.data.ipsegment.domain.IpsegmentVo>
     * @throws
     * @author wangbin
     * @date 2019/9/27 18:30
     */
    @Override
    public List<IpsegmentVo> findIp4Editor(Map map) {
        // 待查询的IP类型
        Integer planType = (Integer) map.get("planType");
        Integer topoGraphKind = (Integer) map.get("topoGraphKind");
        String planId = (String) map.get("planId");
        if (planType == null) {
            // 如果没传planType,则默认给0,表示需要查询用于应用规划的IP
            map.put("planType", 0L);
        } else {
            map.put("palnType", Long.valueOf(planType));
        }
        if (topoGraphKind != null) {
            map.put("topoGraphKind", Long.valueOf(topoGraphKind));
        }
        //查询特定的IP段集合
        List<IpsegmentVo> list = ipsegmentMapper.findIp4Editor(map);
        //创建IP段树集合
        List<IpsegmentVo> tree = new ArrayList<IpsegmentVo>();
        //某个子节点关联到的所有上级节点的集合
        List<IpsegmentVo> parentNodeList = new ArrayList<>();
        //创建Map集合,建立节点和自身id的关系
        Map<String, IpsegmentVo> permissionMap = new HashMap<>();
        for (IpsegmentVo item : list) {
            //将每一个权限点和自己的id建立键值对的关系
            permissionMap.put(item.getId(), item);
        }
        for (IpsegmentVo item : list) {
            //把每一个节点看成是子节点
            IpsegmentVo child = item;
            //父id为空的作为顶级节点
            if (StringUtils.isBlank(item.getParentSegmentId())) {
                //顶级节点的父节点id是null,直接添加到权限集合返回
                tree.add(item);
            } else {
                //通过子节点的pid作为键(即作为父节点的id)来获取对应的父节点
                IpsegmentVo parent = permissionMap.get(child.getParentSegmentId());
                if (parent != null) {
                    //子节点的planId不为空,说明子节点被规划了
                    if (StringUtils.isNotBlank(child.getPlanId())) {
                        //传入的规划planId为空,说明是新增规划
                        if (StringUtils.isBlank(planId)) {
                            child.set_checked(true);//选中
                            child.set_disabled(true);//不可编辑
                            parent.set_checked(false);//未被选中
                            parent.set_disabled(true);//不可编辑
                            //如果父节点上还存在父节点,父ID不为null
                            if (StringUtils.isNotBlank(parent.getParentSegmentId())) {
                                //递归查父节点的父节点,并设置与父节点相同的状态
                                queryParentNode(parent, permissionMap);
                            }
                        } else {
                            //传入的规划planId不为空,说明是修改规划
                            //子节点的planid不为空,大部分节点状态还是和新增一样设置
                            child.set_checked(true);//选中
                            child.set_disabled(true);//不可编辑
                            parent.set_checked(false);//未被选中
                            parent.set_disabled(true);//不可编辑
                            //如果规划的子节点和传入的规划id相同
                            if (child.getPlanId().equals(planId)) {
                                child.set_checked(true);//选中
                                child.set_disabled(false);//可编辑
                                //todo:查询父节点下规划的子节点是否都属于传入的参数planId中
                                //todo:如果含有不属于该planId下规划的子节点,该父节点不可编辑,不可选中
                                Map param = new HashMap();
                                param.put("parentSegmentId", parent.getId());
                                param.put("planId", planId);
                                List<IpsegmentVo> childrenNodes = this.findChildrenNode(param);
                                //被规划的子节点含有不同的规划
                                if (childrenNodes.size() != 0) {
                                    parent.set_checked(false);//不被选中
                                    parent.set_disabled(true);//不可编辑
                                } else {
                                    //被规划的子节点都是同一个规划
                                    parent.set_checked(false);//不被选中
                                    parent.set_disabled(false);//可编辑
                                }
                                //如果父节点上还存在父节点,父ID不为null
                                if (StringUtils.isNotBlank(parent.getParentSegmentId())) {
                                    //递归查父节点的父节点,并设置与父节点相同的状态
                                    queryParentNodeFoeEdit(parent,permissionMap,param);
                                }
                            }
                        }
                    }
                    //整合父节点和子节点的关系
                    parent.getChildren().add(child);
                }
            }
        }
        System.out.println(tree);
//        //list转set(去重)
//        Set<IpsegmentVo> treeSet = new HashSet<>(tree);
//        //set转list(去重后的数组)
//        tree = new ArrayList<>(treeSet);
        return tree.stream().distinct().collect(Collectors.toList());//对返回的树(List)去重
    }

    /**
     * 方法说明:查询父节点下规划的子节点是否都在一个planId的规划下
     *
     * @param map
     * @return
     * @throws
     * @author wangbin
     * @date 2019/10/14 14:38
     */
    @Override
    public List<IpsegmentVo> findChildrenNode(Map map) {
        List<IpsegmentVo> list = ipsegmentMapper.findChildrenNode(map);
        return list;
    }


    /**
     * 方法说明:新增规划时向上递归查询父节点,设置父节点状态
     * @author wangbin
     * @date 2019/10/14 16:01
     * @param child
     * @param permissionMap
     * @return void
     * @throws
     */
    private void queryParentNode(IpsegmentVo child, Map permissionMap) {
        //通过子节点的pid作为键(即作为父节点的id)来获取对应的父节点,从Map集合中拿
        IpsegmentVo parent = (IpsegmentVo) permissionMap.get(child.getParentSegmentId());
        if (parent != null) {
            parent.set_checked(false);//未被选中
            parent.set_disabled(true);//不可编辑
            //如果父节点上还存在父节点,父ID不为null
            if (StringUtils.isNotBlank(parent.getParentSegmentId())) {
                queryParentNode(parent, permissionMap);
            }
            //整合父节点和子节点的关系
//            parent.getChildren().add(child);
        }
    }
    /**
     * 方法说明:修改规划时向上递归查询父节点,设置父节点状态
     * @author wangbin
     * @date 2019/10/14 16:01
     * @param child
     * @param permissionMap
     * @param paramMap
     * @return void
     * @throws
     */
    private void queryParentNodeFoeEdit(IpsegmentVo child,Map permissionMap, Map paramMap) {
        //通过子节点的pid作为键(即作为父节点的id)来获取对应的父节点,从Map集合中拿
        IpsegmentVo parent = (IpsegmentVo) permissionMap.get(child.getParentSegmentId());
        if (parent != null) { ;
            paramMap.put("parentSegmentId",parent.getId());
            //查询不属于传入的规划id的被规划的子节点集合
            List<IpsegmentVo> childrenNodes = this.findChildrenNode(paramMap);
            //被规划的子节点含有不同的规划
            if (childrenNodes.size() != 0) {
                parent.set_checked(false);//不被选中
                parent.set_disabled(true);//不可编辑
            } else {
                //被规划的子节点都是同一个规划
                parent.set_checked(false);//不被选中
                parent.set_disabled(false);//可编辑
            }
            //如果父节点上还存在父节点,父ID不为null
            if (StringUtils.isNotBlank(parent.getParentSegmentId())) {
                queryParentNodeFoeEdit(parent,permissionMap,paramMap);
            }
        }
    }
#查询IP段集合
 <select id="findIp4Editor" parameterType="Map" resultType="IpsegmentVo">
        select t.*,
        (select count(1)
        from t_da_ipsegment ip
        where ip.parent_segment_id = t.id
        and ip.del_flag = 0) children_count,
        (case t.plan_type when 0 then
        (select dap.name
        from t_da_application_plan dap
        where dap.del_flag = 0
        and dap.id = t.plan_id) else
        (select dbp.name
        from t_da_business_plan dbp
        where dbp.del_flag = 0
        and dbp.id = t.plan_id) end) plan_name
        from t_da_ipsegment t
        where t.del_flag = 0
        <if test="topoGraphKind != null">and t.topo_graph_kind = #{topoGraphKind}</if>

        <if test="planType != 0L">
          and t.parent_segment_id in (select id from t_da_ipsegment di
          where di.del_flag = 0 and di.plan_id = #{parentPlanId})
        </if>
    </select>
#查询父节点下未被规划到传入的规划id(planId)的被规划子节点集合
#SQL 语句 mybatis下的xml
 <select id="findChildrenNode" parameterType="Map" resultType="IpsegmentVo">
        select t.*  from t_da_ipsegment t
        where t.del_flag = 0
        and t.parent_segment_id = #{parentSegmentId}
        and t.plan_id is not null
        and t.plan_id &lt;&gt; #{planId}
    </select>
上一篇下一篇

猜你喜欢

热点阅读