组装树形,并进行节点状态的设置
2019-10-14 本文已影响0人
bin_lifecycle
1.业务要求
- 在新增的时候,如果子节点是被规划过的(planId ! =null),那么该子节点的状态就是
被勾选,不能被编辑( _checked=true, _disabled=true )
,该子节点的父级节点的状态就设置为未被勾选,不能被编辑( _checked=false, _disabled=true )
,如果该父节点上还有父节点就递归查询
所有的上级父节点并将所有的上级父节点状态设置为未被勾选,不能被编辑( _checked=false, _disabled=true )
1.1 效果图:
新增应用规划.gif
- 在修改的时候,如果子节点是被规划过的(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 <> #{planId}
</select>