/**
* 填充类目树
* 例:
* 1. 一级类目 A0-1、B0-1、C0-1
* 2. 二级类目 A1-1、A1-2、B1-1、B1-2、C1-1、C1-2
* 3. 三级类目 A2-1、A2-2、A2-3、A2-4、B2-1、B2-2、B2-3、B2-4、C2-1、C2-2、C2-3、C2-4
* 4. 四级类目 A3-1、A3-2、A3-3、A3-4、A3-5、A3-6、A3-7、A3-8、B3-1、B3-2、B3-3、B3-4、B3-5、B3-6、B3-7、B3-8、C3-1、C3-2、C3-3、C3-4、C3-5、C3-6、C3-7、C3-8
*
* 获取 A3-1, A3-4, B3-3, B2-3, C3-8
* result = []
* slotMap = []
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8]
*
* queue.index = 0
* node = A3-1, parent = A2-1
* slotMap = [A2-1]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1]
* queue.index = 1
* node = A3-4, parent = A2-2
* slotMap = [A2-1, A2-2]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2]
* queue.index = 2
* node = B3-3, parent = B2-2
* slotMap = [A2-1, A2-2, B2-2]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2]
* queue.index = 3
* node = B2-3, parent = B1-2
* slotMap = [A2-1, A2-2, B2-2, B1-2]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2]
* queue.index = 4
* node = C3-8, parent = C2-4
* slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4]
* queue.index = 5
* node = A2-1, parent = A1-1
* slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]
* queue.index = 6
* node = A2-2, parent = A1-1
* slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]
* queue.index = 7
* node = B2-2, parent = B1-1
* slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]
* queue.index = 8
* node = B1-2, parent = 0
* slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, 0]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1]
* queue.index = 9
* node = C2-4, parent = C1-2
* slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, 0, C1-2]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, C1-2]
* queue.index = 10
* node = A1-1, parent = 0
* slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, 0, C1-2]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, C1-2]
* queue.index = 11
* node = B1-1, parent = 0
* slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, 0, C1-2]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, C1-2]
* queue.index = 12
* node = C1-1, parent = 0
* slotMap = [A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, 0, C1-2]
* queue = [A3-1, A3-4, B3-3, B2-3, C3-8, A2-1, A2-2, B2-2, B1-2, C2-4, A1-1, B1-1, C1-2]
*
* @param reqData
* @return
*/
@Override
public List<CategoryTreeVO> queryCategoryGroupTree(CategoryGroupTreeReqData reqData){
List<RemCategoryPO> remCategoryPOList = easyCategoryRemMapper.getListEnable(reqData);
List<CategoryTreeVO> queue = BeanConvertUtils.convertList(remCategoryPOList, CategoryTreeVO.class).stream()
.collect(Collectors.toMap(CategoryTreeVO::getCategoryId, Function.identity(), (f, s) -> s)).values()
.stream().collect(Collectors.toList());
Map<Long, CategoryTreeVO> slotMap = queue.stream()
.collect(Collectors.toMap(CategoryTreeVO::getCategoryId, Function.identity(), (f, s) -> s));
for(int i = 0; i < queue.size(); i++){
CategoryTreeVO node = queue.get(i);
Long pid = node.getParentCategoryId();
if(Objects.isNull(pid)){
continue;
}
CategoryTreeVO parentNode = slotMap.computeIfAbsent(pid,
key -> {
CategoryTreeVO item = Objects.equals(0L, key) ? new CategoryTreeVO() :
BeanConvertUtils.convert(easyCategoryRemMapper.getByCategoryId(key),
CategoryTreeVO.class);
queue.add(item);
return item;
});
List<CategoryTreeVO> children = Optional.ofNullable(parentNode.getChildCategoryList())
.orElse(new ArrayList<>());
children.add(node);
parentNode.setChildCategoryList(children);
}
List<CategoryTreeVO> resultTree = slotMap.get(0L).getChildCategoryList();
return resultTree;
}