树形ServiceImpl.java 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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.$str.getProperty($pk.attrName)());
  61. #foreach($field in $fieldList)
  62. #if($field.attrName == 'name' || $field.fieldComment.contains('名称'))
  63. node.setName(entity.$str.getProperty($field.attrName)());
  64. #end
  65. #end
  66. node.setParentId(entity.getParentId() != null ? entity.getParentId() : 0L);
  67. // 扩展属性
  68. Map<String, Object> extra = new HashMap<>();
  69. #foreach($field in $fieldList)
  70. extra.put(${ClassName}Entity.Fields.${field.attrName}, entity.$str.getProperty($field.attrName)());
  71. #end
  72. node.setExtra(extra);
  73. return node;
  74. };
  75. }
  76. /**
  77. * 获取所有父级节点
  78. * @return 父级节点列表
  79. */
  80. @Override
  81. public List<${ClassName}Entity> getParentNodes() {
  82. LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();
  83. // 查询所有父级节点(parentId为null或0的节点)
  84. wrapper.and(w -> w.isNull(${ClassName}Entity::getParentId).or().eq(${ClassName}Entity::getParentId, 0));
  85. wrapper.orderByAsc(${ClassName}Entity::$str.getProperty($pk.attrName)); // 按主键排序
  86. return list(wrapper);
  87. }
  88. /**
  89. * 根据父ID获取子节点
  90. * @param parentId 父级ID
  91. * @return 子节点列表
  92. */
  93. @Override
  94. public List<${ClassName}Entity> getChildrenByParentId(${pk.attrType} parentId) {
  95. LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();
  96. wrapper.eq(${ClassName}Entity::getParentId, parentId);
  97. wrapper.orderByAsc(${ClassName}Entity::$str.getProperty($pk.attrName)); // 按主键排序
  98. return list(wrapper);
  99. }
  100. /**
  101. * 递归删除节点及其子节点
  102. * @param ids 要删除的节点ID列表
  103. * @return 删除结果
  104. */
  105. @Override
  106. @Transactional(rollbackFor = Exception.class)
  107. public boolean removeBatchByIds(List<${pk.attrType}> ids) {
  108. if (CollUtil.isEmpty(ids)) {
  109. return true;
  110. }
  111. // 获取所有要删除的ID(包括子节点)
  112. List<${pk.attrType}> allDeleteIds = new ArrayList<>(ids);
  113. for (${pk.attrType} id : ids) {
  114. List<${pk.attrType}> childIds = getChildIdsRecursive(id);
  115. allDeleteIds.addAll(childIds);
  116. }
  117. // 去重
  118. allDeleteIds = allDeleteIds.stream().distinct().collect(Collectors.toList());
  119. // 批量删除
  120. return super.removeBatchByIds(allDeleteIds);
  121. }
  122. /**
  123. * 递归获取所有子节点ID
  124. * @param parentId 父节点ID
  125. * @return 子节点ID列表
  126. */
  127. private List<${pk.attrType}> getChildIdsRecursive(${pk.attrType} parentId) {
  128. List<${pk.attrType}> childIds = new ArrayList<>();
  129. LambdaQueryWrapper<${ClassName}Entity> wrapper = Wrappers.lambdaQuery();
  130. wrapper.eq(${ClassName}Entity::getParentId, parentId);
  131. wrapper.select(${ClassName}Entity::$str.getProperty($pk.attrName));
  132. List<${ClassName}Entity> children = list(wrapper);
  133. for (${ClassName}Entity child : children) {
  134. ${pk.attrType} childId = child.$str.getProperty($pk.attrName)();
  135. childIds.add(childId);
  136. // 递归获取子节点的子节点
  137. childIds.addAll(getChildIdsRecursive(childId));
  138. }
  139. return childIds;
  140. }
  141. }