树形ServiceImpl.java 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. package ${package}.${moduleName}.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.lang.tree.Tree;
  4. import cn.hutool.core.lang.tree.TreeNode;
  5. import cn.hutool.core.lang.tree.TreeUtil;
  6. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  7. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  8. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  9. import ${package}.${moduleName}.entity.${ClassName}Entity;
  10. import ${package}.${moduleName}.mapper.${ClassName}Mapper;
  11. import ${package}.${moduleName}.service.${ClassName}Service;
  12. import jakarta.validation.constraints.NotNull;
  13. import lombok.RequiredArgsConstructor;
  14. import org.springframework.stereotype.Service;
  15. import org.springframework.transaction.annotation.Transactional;
  16. import java.util.ArrayList;
  17. import java.util.HashMap;
  18. import java.util.List;
  19. import java.util.Map;
  20. import java.util.function.Function;
  21. import java.util.stream.Collectors;
  22. /**
  23. * ${tableComment} Service实现类
  24. *
  25. * @author ${author}
  26. * @date ${datetime}
  27. */
  28. @Service
  29. @RequiredArgsConstructor
  30. public class ${ClassName}ServiceImpl extends ServiceImpl<${ClassName}Mapper, ${ClassName}Entity> implements ${ClassName}Service {
  31. /**
  32. * 构建树形结构数据
  33. * @param wrapper 查询条件
  34. * @return 树形结构数据
  35. */
  36. @Override
  37. public List<Tree<${pk.attrType}>> buildTree(LambdaQueryWrapper<${ClassName}Entity> wrapper) {
  38. // 查询所有数据
  39. List<${ClassName}Entity> allList = list(wrapper);
  40. if (CollUtil.isEmpty(allList)) {
  41. return new ArrayList<>();
  42. }
  43. // 转换为TreeNode
  44. List<TreeNode<${pk.attrType}>> collect = allList.stream().map(getNodeFunction()).toList();
  45. // 使用TreeUtil构建树形结构,根节点ID为0
  46. #if($pk.attrType == 'Long')
  47. return TreeUtil.build(collect, 0L);
  48. #else
  49. return TreeUtil.build(collect, 0);
  50. #end
  51. }
  52. /**
  53. * 获取TreeNode转换函数
  54. * @return TreeNode转换函数
  55. */
  56. @NotNull
  57. private Function<${ClassName}Entity, TreeNode<${pk.attrType}>> getNodeFunction() {
  58. return entity -> {
  59. TreeNode<${pk.attrType}> node = new TreeNode<>();
  60. node.setId(entity.get${str.capitalizeFirst($pk.attrName)}());
  61. #foreach($field in $fieldList)
  62. #if($field.attrName == 'name' || $field.fieldComment.contains('名称'))
  63. node.setName(entity.get${str.capitalizeFirst($field.attrName)}());
  64. #end
  65. #end
  66. #if($pk.attrType == 'Long')
  67. node.setParentId(entity.getParentId() != null ? entity.getParentId() : 0L);
  68. #else
  69. node.setParentId(entity.getParentId() != null ? entity.getParentId() : 0);
  70. #end
  71. // 扩展属性
  72. Map<String, Object> extra = new HashMap<>();
  73. #foreach($field in $fieldList)
  74. #if(!$field.primaryPk && $field.attrName != 'parentId')
  75. extra.put(${ClassName}Entity.Fields.${field.attrName}, entity.get${str.capitalizeFirst($field.attrName)}());
  76. #end
  77. #end
  78. node.setExtra(extra);
  79. return node;
  80. };
  81. }
  82. /**
  83. * 获取所有父级节点
  84. * @return 父级节点列表
  85. */
  86. @Override
  87. public List<${ClassName}Entity> getParentNodes() {
  88. LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();
  89. // 查询所有父级节点(parentId为null或0的节点)
  90. wrapper.and(w -> w.isNull(${ClassName}Entity::getParentId).or().eq(${ClassName}Entity::getParentId, 0));
  91. wrapper.orderByAsc(${ClassName}Entity::$str.getProperty($pk.attrName)); // 按主键排序
  92. return list(wrapper);
  93. }
  94. /**
  95. * 根据父ID获取子节点
  96. * @param parentId 父级ID
  97. * @return 子节点列表
  98. */
  99. @Override
  100. public List<${ClassName}Entity> getChildrenByParentId(${pk.attrType} parentId) {
  101. LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();
  102. wrapper.eq(${ClassName}Entity::getParentId, parentId);
  103. wrapper.orderByAsc(${ClassName}Entity::$str.getProperty($pk.attrName)); // 按主键排序
  104. return list(wrapper);
  105. }
  106. /**
  107. * 递归删除节点及其子节点
  108. * @param ids 要删除的节点ID列表
  109. * @return 删除结果
  110. */
  111. @Override
  112. @Transactional(rollbackFor = Exception.class)
  113. public boolean removeBatchByIds(List<${pk.attrType}> ids) {
  114. if (CollUtil.isEmpty(ids)) {
  115. return true;
  116. }
  117. // 获取所有要删除的ID(包括子节点)
  118. List<${pk.attrType}> allDeleteIds = new ArrayList<>(ids);
  119. for (${pk.attrType} id : ids) {
  120. List<${pk.attrType}> childIds = getChildIdsRecursive(id);
  121. allDeleteIds.addAll(childIds);
  122. }
  123. // 去重
  124. allDeleteIds = allDeleteIds.stream().distinct().collect(Collectors.toList());
  125. // 批量删除
  126. return super.removeBatchByIds(allDeleteIds);
  127. }
  128. /**
  129. * 递归获取所有子节点ID
  130. * @param parentId 父节点ID
  131. * @return 子节点ID列表
  132. */
  133. private List<${pk.attrType}> getChildIdsRecursive(${pk.attrType} parentId) {
  134. List<${pk.attrType}> childIds = new ArrayList<>();
  135. LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();
  136. wrapper.eq(${ClassName}Entity::getParentId, parentId);
  137. wrapper.select(${ClassName}Entity::$str.getProperty($pk.attrName));
  138. List<${ClassName}Entity> children = list(wrapper);
  139. for (${ClassName}Entity child : children) {
  140. ${pk.attrType} childId = child.get${str.capitalizeFirst($pk.attrName)}();
  141. childIds.add(childId);
  142. // 递归获取子节点的子节点
  143. childIds.addAll(getChildIdsRecursive(childId));
  144. }
  145. return childIds;
  146. }
  147. }