1.需求说明:把整个目录树包括目录下的叶子节点(数据),一次性返回。
思路:
a.首先获取到根目录的信息,然后查询到根目录下的数据。
b.由根目录找到根目录下的子目录,然后递归调用
public List<DataClassInfoVo> query(List<DataClassInfoVo> dataObjectClassListOneSort){
for(int i=0;i<dataObjectClassListOneSort.size();i++){
DataClassInfoVo dataClassInfoVo = dataObjectClassListOneSort.get(i);
//一级目录的id
String class_id = dataClassInfoVo.getCLASS_ID();
//一级目录下的右侧数据
List<DataObjectInfo> dataObjectInfoList = dataObjectInfoMapper.selectByClassId(class_id);
//查询一级目录下的子目录
List<DataClassInfoVo> dataObjectClassListSon = dataObjectClassMapper.selectClassListLv2(class_id);
//一个简单的排序过程
dataObjectClassListSon=serviceCatalogBaseSort(dataObjectClassListSon);
//递归调用
List<DataClassInfoVo> dataClassInfoVos = query(dataObjectClassListSon);
dataClassInfoVo.setChildren(dataClassInfoVos);
dataClassInfoVo.setDataObjectInfoList(dataObjectInfoList);
}
return dataObjectClassListOneSort;
}
2.需求说明:模糊搜索数据,获取到数据(可能多条)所在的目录,然后由当前目录,回溯到根目录
使用场景:目录树搜索具体数据,只返回当前目录和父目录,直到根目录
思路:
a.通过字段模糊搜索到数据得到List<Object>数据集合
b.遍历List<Object>各个对象,然后由各个对象递归遍历得到父目录直到根目录,结果放入LinkedHashSet中
c.获取根目录和非根目录,由非根目录找到是在根目录下的一级目录,接着递归调用
//模糊搜索得到数据集合,DataObjectInfo中包含目录id
List<DataObjectInfo> dataObjectInfoList = dataObjectInfoMapper.selectByObjectName(objectName);
//由数据集合得到目录集合,调用transferList方法组装数据
public List<DataClassInfoVo> qryDataClassInfoVo(List<DataObjectInfo> dataObjectInfoList){
List<DataClassInfoVo> dataClassInfoVo = Lists.newArrayList();
Set<DataObjectClass> classIdList = new LinkedHashSet<>();
for(int i=0;i<dataObjectInfoList.size();i++){
DataObjectInfo dataObjectInfo = dataObjectInfoList.get(i);
String class_id = dataObjectInfo.getCLASS_ID();
DataObjectClass dataObjectClass = dataObjectClassMapper.selectClassListLV3(class_id);
qryClass(classIdList,dataObjectClass);
classIdList.add(dataObjectClass);
}
//classIdList组装成List<DataClassInfoVo>格式
List<DataClassInfoVo> dataClassInfoVoList1=Lists.newArrayList();
List<DataClassInfoVo> dataClassInfoVoList = transferList(classIdList,dataClassInfoVoList1,dataObjectInfoList);
return dataClassInfoVoList;
}
//获取一级目录,和非一级目录
public List<DataClassInfoVo> transferList(Set<DataObjectClass> classIdList, List<DataClassInfoVo> dataClassInfoVoList,List<DataObjectInfo> dataObjectInfoList) {
//获取一级目录
List<DataObjectClass> rootClass = classIdList.stream().filter(dataObjectClass -> Assert.isEmpty(dataObjectClass.getPARENT_CLASS_ID())).collect(Collectors.toList());
//获取非一级目录
List<DataObjectClass> sonClass = classIdList.stream().filter(dataObjectClass -> Assert.notEmpty(dataObjectClass.getPARENT_CLASS_ID())).collect(Collectors.toList());
rootClass.forEach(dataObjectClass -> {
DataClassInfoVo dataClassInfoVo = new DataClassInfoVo();
BeanUtil.copyProperties(dataObjectClass,dataClassInfoVo);
qrySon(dataClassInfoVo,sonClass,dataObjectInfoList);
dataClassInfoVoList.add(dataClassInfoVo);
});
return dataClassInfoVoList;
}
//得到当前目录下的子目录,并组装数据
public void qrySon(DataClassInfoVo dataClassInfoVo,List<DataObjectClass> sonClass,List<DataObjectInfo> dataObjectInfoList){
List<DataObjectClass> dataObjectClassList = sonClass.stream().filter(dataObjectClass -> dataObjectClass.getPARENT_CLASS_ID().equals(dataClassInfoVo.getCLASS_ID())).collect(Collectors.toList());
if(Assert.notEmpty(dataObjectClassList)){
List<DataClassInfoVo> sonList=Lists.newArrayList();
dataObjectClassList.forEach(dataObjectClass -> {
DataClassInfoVo son = new DataClassInfoVo();
BeanUtil.copyProperties(dataObjectClass,son);
qrySon(son,sonClass,dataObjectInfoList);
sonList.add(son);
});
dataClassInfoVo.setChildren(sonList);
}
List<DataObjectInfo> collect = dataObjectInfoList.stream().filter(info -> info.getCLASS_ID().equals(dataClassInfoVo.getCLASS_ID())).collect(Collectors.toList());
dataClassInfoVo.setDataObjectInfoList(collect);
}