树形ServiceImpl.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package ${package}.${moduleName}.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import ${package}.${moduleName}.entity.${ClassName}Entity;
  8. import ${package}.${moduleName}.mapper.${ClassName}Mapper;
  9. import ${package}.${moduleName}.service.${ClassName}Service;
  10. import lombok.RequiredArgsConstructor;
  11. import org.springframework.stereotype.Service;
  12. import org.springframework.transaction.annotation.Transactional;
  13. import java.util.ArrayList;
  14. import java.util.List;
  15. import java.util.Map;
  16. import java.util.stream.Collectors;
  17. /**
  18. * ${tableComment} Service实现类
  19. *
  20. * @author ${author}
  21. * @date ${datetime}
  22. */
  23. @Service
  24. @RequiredArgsConstructor
  25. public class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {
  26. /**
  27. * 构建树形结构数据
  28. * @param wrapper 查询条件
  29. * @return 树形结构数据
  30. */
  31. @Override
  32. public List<${ClassName}Entity> buildTree(LambdaQueryWrapper<${ClassName}Entity> wrapper) {
  33. // 查询所有数据
  34. List<${ClassName}Entity> allList = list(wrapper);
  35. if (CollUtil.isEmpty(allList)) {
  36. return new ArrayList<>();
  37. }
  38. // 按父ID分组
  39. Map<${pk.attrType}, List<${ClassName}Entity>> groupByParent = allList.stream()
  40. .collect(Collectors.groupingBy(item -> {
  41. // 假设有parentId字段,如果没有请根据实际情况调整
  42. return item.getParentId() != null ? item.getParentId() : 0L;
  43. }));
  44. // 构建树形结构
  45. return buildTreeRecursive(groupByParent, 0L);
  46. }
  47. /**
  48. * 递归构建树形结构
  49. * @param groupByParent 按父ID分组的数据
  50. * @param parentId 父ID
  51. * @return 树形结构数据
  52. */
  53. private List<${ClassName}Entity> buildTreeRecursive(Map<${pk.attrType}, List<${ClassName}Entity>> groupByParent, ${pk.attrType} parentId) {
  54. List<${ClassName}Entity> children = groupByParent.get(parentId);
  55. if (CollUtil.isEmpty(children)) {
  56. return new ArrayList<>();
  57. }
  58. children.forEach(child -> {
  59. List<${ClassName}Entity> subChildren = buildTreeRecursive(groupByParent, child.get${str.capitalizeFirst($pk.attrName)}());
  60. child.setChildren(subChildren);
  61. child.setHasChildren(!CollUtil.isEmpty(subChildren));
  62. });
  63. return children;
  64. }
  65. /**
  66. * 获取所有父级节点
  67. * @return 父级节点列表
  68. */
  69. @Override
  70. public List<${ClassName}Entity> getParentNodes() {
  71. LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();
  72. // 查询所有父级节点(parentId为null或0的节点)
  73. wrapper.and(w -> w.isNull(${ClassName}Entity::getParentId).or().eq(${ClassName}Entity::getParentId, 0));
  74. wrapper.orderByAsc(${ClassName}Entity::getSort); // 假设有sort字段用于排序
  75. return list(wrapper);
  76. }
  77. /**
  78. * 根据父ID获取子节点
  79. * @param parentId 父级ID
  80. * @return 子节点列表
  81. */
  82. @Override
  83. public List<${ClassName}Entity> getChildrenByParentId(${pk.attrType} parentId) {
  84. LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();
  85. wrapper.eq(${ClassName}Entity::getParentId, parentId);
  86. wrapper.orderByAsc(${ClassName}Entity::getSort); // 假设有sort字段用于排序
  87. return list(wrapper);
  88. }
  89. /**
  90. * 递归删除节点及其子节点
  91. * @param ids 要删除的节点ID列表
  92. * @return 删除结果
  93. */
  94. @Override
  95. @Transactional(rollbackFor = Exception.class)
  96. public boolean removeBatchByIds(List<${pk.attrType}> ids) {
  97. if (CollUtil.isEmpty(ids)) {
  98. return true;
  99. }
  100. // 获取所有要删除的ID(包括子节点)
  101. List<${pk.attrType}> allDeleteIds = new ArrayList<>(ids);
  102. for (${pk.attrType} id : ids) {
  103. List<${pk.attrType}> childIds = getChildIdsRecursive(id);
  104. allDeleteIds.addAll(childIds);
  105. }
  106. // 去重
  107. allDeleteIds = allDeleteIds.stream().distinct().collect(Collectors.toList());
  108. // 批量删除
  109. return super.removeBatchByIds(allDeleteIds);
  110. }
  111. /**
  112. * 递归获取所有子节点ID
  113. * @param parentId 父节点ID
  114. * @return 子节点ID列表
  115. */
  116. private List<${pk.attrType}> getChildIdsRecursive(${pk.attrType} parentId) {
  117. List<${pk.attrType}> childIds = new ArrayList<>();
  118. LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();
  119. wrapper.eq(${ClassName}Entity::getParentId, parentId);
  120. wrapper.select(${ClassName}Entity::get${str.capitalizeFirst($pk.attrName)});
  121. List<${ClassName}Entity> children = list(wrapper);
  122. for (${ClassName}Entity child : children) {
  123. ${pk.attrType} childId = child.get${str.capitalizeFirst($pk.attrName)}();
  124. childIds.add(childId);
  125. // 递归获取子节点的子节点
  126. childIds.addAll(getChildIdsRecursive(childId));
  127. }
  128. return childIds;
  129. }
  130. }