feat: 涉及系统部件懒加载搜索功能
This commit is contained in:
+95
-42
@@ -184,61 +184,114 @@ public class PartNameServiceImpl extends ServiceImpl<PartNameMapper, PartName>
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<PartName> queryList(String nodeName) {
|
public List<PartName> queryList(String nodeName) {
|
||||||
|
// 查询所有节点
|
||||||
LambdaQueryWrapper<PartName> queryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<PartName> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
queryWrapper.eq(PartName::getParentCode, "Part");
|
List<PartName> allNodes = list(queryWrapper);
|
||||||
if (nodeName != null && !nodeName.isEmpty()) {
|
|
||||||
queryWrapper.like(PartName::getName, nodeName);
|
|
||||||
}
|
|
||||||
List<PartName> list = list(queryWrapper);
|
|
||||||
|
|
||||||
List<String> codes = list.stream().map(PartName::getCode).collect(Collectors.toList());
|
// 通过 nodeName 过滤符合条件的节点
|
||||||
// 判断有没有子级
|
List<PartName> matchedNodes = allNodes.stream()
|
||||||
queryWrapper.clear();
|
.filter(node -> node.getName() != null && node.getName().contains(nodeName))
|
||||||
queryWrapper.in(PartName::getParentCode, codes);
|
.collect(Collectors.toList());
|
||||||
if (nodeName != null && !nodeName.isEmpty()) {
|
|
||||||
queryWrapper.like(PartName::getName, nodeName);
|
|
||||||
}
|
|
||||||
List<PartName> childList = list(queryWrapper);
|
|
||||||
|
|
||||||
if (childList.isEmpty()) {
|
if (matchedNodes.isEmpty()) {
|
||||||
list.forEach(e -> e.setLeafFlag(true));
|
return Collections.emptyList();
|
||||||
return list;
|
|
||||||
}
|
}
|
||||||
Map<String, List<PartName>> childMap = childList.stream().collect(Collectors.groupingBy(PartName::getParentCode));
|
|
||||||
list.forEach(item -> {
|
// 用于存储一级节点
|
||||||
List<PartName> partNames = childMap.get(item.getCode());
|
Set<PartName> rootNodes = new HashSet<>();
|
||||||
item.setLeafFlag(partNames == null || partNames.isEmpty());
|
|
||||||
});
|
// 查找每个匹配节点的一级父节点
|
||||||
return list;
|
for (PartName matchedNode : matchedNodes) {
|
||||||
|
PartName currentNode = matchedNode;
|
||||||
|
while (currentNode != null && !currentNode.getParentCode().equals("Part")) {
|
||||||
|
// 查找当前节点的父节点
|
||||||
|
String parentCode = currentNode.getParentCode();
|
||||||
|
currentNode = allNodes.stream()
|
||||||
|
.filter(node -> node.getCode().equals(parentCode))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
// 添加一级节点到结果集
|
||||||
|
if (currentNode != null) {
|
||||||
|
rootNodes.add(currentNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 设置叶子标志的逻辑调整
|
||||||
|
for (PartName node : rootNodes) {
|
||||||
|
Set<String> descendantCodes = getAllDescendantCodes(node.getCode(), allNodes); // 获取所有子孙节点的ID
|
||||||
|
boolean isLeaf = true; // 默认设置为叶子节点
|
||||||
|
|
||||||
|
for (PartName matchedNode : matchedNodes) {
|
||||||
|
if (descendantCodes.contains(matchedNode.getCode())) {
|
||||||
|
isLeaf = false;
|
||||||
|
break; // 如果在子孙节点中找到匹配节点,当前根节点不是叶子节点
|
||||||
|
}
|
||||||
|
}
|
||||||
|
node.setLeafFlag(isLeaf); // 设置叶子标志
|
||||||
|
}
|
||||||
|
|
||||||
|
return new ArrayList<>(rootNodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 方法:获取给定节点ID的所有子孙节点ID
|
||||||
|
private Set<String> getAllDescendantCodes(String parentCode, List<PartName> allNodes) {
|
||||||
|
Set<String> descendantCodes = new HashSet<>();
|
||||||
|
List<PartName> directChildren = allNodes.stream()
|
||||||
|
.filter(node -> node.getParentCode().equals(parentCode))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
for (PartName child : directChildren) {
|
||||||
|
descendantCodes.add(child.getCode());
|
||||||
|
descendantCodes.addAll(getAllDescendantCodes(child.getCode(), allNodes)); // 递归获取子孙节点
|
||||||
|
}
|
||||||
|
|
||||||
|
return descendantCodes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<PartName> getChild(String parentCode, String nodeName) {
|
public List<PartName> getChild(String parentCode, String nodeName) {
|
||||||
|
// 查询所有节点
|
||||||
LambdaQueryWrapper<PartName> queryWrapper = new LambdaQueryWrapper<>();
|
LambdaQueryWrapper<PartName> queryWrapper = new LambdaQueryWrapper<>();
|
||||||
queryWrapper.eq(PartName::getParentCode, parentCode);
|
List<PartName> allNodes = list(queryWrapper);
|
||||||
if (nodeName != null && !nodeName.isEmpty()) {
|
|
||||||
queryWrapper.like(PartName::getName, nodeName);
|
|
||||||
}
|
|
||||||
List<PartName> list = list(queryWrapper);
|
|
||||||
|
|
||||||
List<String> codes = list.stream().map(PartName::getCode).collect(Collectors.toList());
|
// 通过 nodeName 过滤符合条件的节点
|
||||||
// 判断有没有子级
|
List<PartName> matchedNodes = allNodes.stream()
|
||||||
queryWrapper.clear();
|
.filter(node -> node.getName() != null && node.getName().contains(nodeName))
|
||||||
queryWrapper.in(PartName::getParentCode, codes);
|
.collect(Collectors.toList());
|
||||||
if (nodeName != null && !nodeName.isEmpty()) {
|
|
||||||
queryWrapper.like(PartName::getName, nodeName);
|
if (matchedNodes.isEmpty()) {
|
||||||
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
List<PartName> childList = list(queryWrapper);
|
|
||||||
if (childList.isEmpty()) {
|
// 用于存储一级节点
|
||||||
list.forEach(e -> e.setLeafFlag(true));
|
Set<PartName> rootNodes = new HashSet<>();
|
||||||
return list;
|
|
||||||
|
// 查找每个匹配节点的一级父节点
|
||||||
|
for (PartName matchedNode : matchedNodes) {
|
||||||
|
PartName currentNode = matchedNode;
|
||||||
|
while (currentNode != null && !currentNode.getParentCode().equals(parentCode)) {
|
||||||
|
// 查找当前节点的父节点
|
||||||
|
String pCode = currentNode.getParentCode();
|
||||||
|
currentNode = allNodes.stream()
|
||||||
|
.filter(node -> node.getCode().equals(pCode))
|
||||||
|
.findFirst()
|
||||||
|
.orElse(null);
|
||||||
|
}
|
||||||
|
// 添加一级节点到结果集
|
||||||
|
if (currentNode != null) {
|
||||||
|
rootNodes.add(currentNode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Map<String, List<PartName>> childMap = childList.stream().collect(Collectors.groupingBy(PartName::getParentCode));
|
|
||||||
list.forEach(item -> {
|
// 设置叶子标志
|
||||||
List<PartName> partNames = childMap.get(item.getCode());
|
Set<String> rootNodeCodes = rootNodes.stream().map(PartName::getCode).collect(Collectors.toSet());
|
||||||
item.setLeafFlag(partNames == null || partNames.isEmpty());
|
rootNodes.forEach(node -> {
|
||||||
|
node.setLeafFlag(matchedNodes.stream()
|
||||||
|
.noneMatch(n -> rootNodeCodes.contains(n.getParentCode())));
|
||||||
});
|
});
|
||||||
return list;
|
|
||||||
|
return new ArrayList<>(rootNodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
private PartName getFirstLevelNode(PartName node, Map<String, PartName> nodeMap) {
|
private PartName getFirstLevelNode(PartName node, Map<String, PartName> nodeMap) {
|
||||||
|
|||||||
Reference in New Issue
Block a user