SysMenuServiceImpl.java 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. package com.ctsi.SysMenu.service.impl;
  2. import cn.hutool.core.util.StrUtil;
  3. import com.baomidou.mybatisplus.core.metadata.IPage;
  4. import com.baomidou.mybatisplus.extension.conditions.update.LambdaUpdateChainWrapper;
  5. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  6. import com.ctsi.SysMenu.entity.SysMenu;
  7. import com.ctsi.SysMenu.entity.SysMenuSearchPO;
  8. import com.ctsi.SysMenu.mapper.SysMenuMapper;
  9. import com.ctsi.SysMenu.service.SysMenuService;
  10. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.stereotype.Service;
  13. import java.util.*;
  14. /**
  15. * 菜单;(sys_menu)表服务实现类
  16. * @author : machaoyi
  17. * @date : 2024-1-10
  18. */
  19. @Service
  20. public class SysMenuServiceImpl implements SysMenuService{
  21. @Autowired
  22. private SysMenuMapper sysMenuMapper;
  23. /**
  24. * 通过ID查询单条数据
  25. *
  26. * @param id 主键
  27. * @return 实例对象
  28. */
  29. public SysMenu queryById(Long id){
  30. return sysMenuMapper.selectById(id);
  31. }
  32. /**
  33. * 分页查询
  34. *
  35. * @param sysMenu 筛选条件
  36. * @param current 当前页码
  37. * @param size 每页大小
  38. * @return
  39. */
  40. public Page<SysMenuSearchPO> paginQuery(SysMenu sysMenu, long current, long size){
  41. //1. 构建动态查询条件
  42. MPJLambdaWrapper<SysMenu> queryWrapper = new MPJLambdaWrapper<>();
  43. if(StrUtil.isNotBlank(sysMenu.getMenuTitle())){
  44. queryWrapper.eq(SysMenu::getMenuTitle, sysMenu.getMenuTitle());
  45. }
  46. if(StrUtil.isNotBlank(sysMenu.getMenuCode())){
  47. queryWrapper.eq(SysMenu::getMenuCode, sysMenu.getMenuCode());
  48. }
  49. if(StrUtil.isNotBlank(sysMenu.getMenuName())){
  50. queryWrapper.eq(SysMenu::getMenuName, sysMenu.getMenuName());
  51. }
  52. if(StrUtil.isNotBlank(sysMenu.getMenuIcon())){
  53. queryWrapper.eq(SysMenu::getMenuIcon, sysMenu.getMenuIcon());
  54. }
  55. queryWrapper.orderByAsc("ORDER_BY");
  56. //2. 执行分页查询
  57. Page<SysMenuSearchPO> pagin = new Page<>(current , size , true);
  58. IPage<SysMenuSearchPO> selectResult = sysMenuMapper.selectJoinPage(pagin , SysMenuSearchPO.class, queryWrapper);
  59. selectResult.setRecords(buildTree(selectResult.getRecords()));
  60. pagin.setPages(selectResult.getPages());
  61. pagin.setTotal(selectResult.getTotal());
  62. pagin.setRecords(selectResult.getRecords());
  63. //3. 返回结果
  64. return pagin;
  65. }
  66. /**
  67. * 新增数据
  68. *
  69. * @param sysMenu 实例对象
  70. * @return 实例对象
  71. */
  72. public SysMenu insert(SysMenu sysMenu){
  73. sysMenuMapper.insert(sysMenu);
  74. return sysMenu;
  75. }
  76. /**
  77. * 更新数据
  78. *
  79. * @param sysMenu 实例对象
  80. * @return 实例对象
  81. */
  82. public SysMenu update(SysMenu sysMenu){
  83. //1. 根据条件动态更新
  84. LambdaUpdateChainWrapper<SysMenu> chainWrapper = new LambdaUpdateChainWrapper<SysMenu>(sysMenuMapper);
  85. if(StrUtil.isNotBlank(sysMenu.getMenuTitle())){
  86. chainWrapper.set(SysMenu::getMenuTitle, sysMenu.getMenuTitle());
  87. }
  88. if(StrUtil.isNotBlank(sysMenu.getMenuCode())){
  89. chainWrapper.set(SysMenu::getMenuCode, sysMenu.getMenuCode());
  90. }
  91. if(StrUtil.isNotBlank(sysMenu.getMenuName())){
  92. chainWrapper.set(SysMenu::getMenuName, sysMenu.getMenuName());
  93. }
  94. if(StrUtil.isNotBlank(sysMenu.getMenuIcon())){
  95. chainWrapper.set(SysMenu::getMenuIcon, sysMenu.getMenuIcon());
  96. }
  97. //2. 设置主键,并更新
  98. chainWrapper.eq(SysMenu::getId, sysMenu.getId());
  99. boolean ret = chainWrapper.update();
  100. //3. 更新成功了,查询最最对象返回
  101. if(ret){
  102. return queryById(sysMenu.getId());
  103. }else{
  104. return sysMenu;
  105. }
  106. }
  107. /**
  108. * 通过主键删除数据
  109. *
  110. * @param id 主键
  111. * @return 是否成功
  112. */
  113. public boolean deleteById(Long id){
  114. int total = sysMenuMapper.deleteById(id);
  115. return total > 0;
  116. }
  117. public static List<SysMenuSearchPO> buildTree(List<SysMenuSearchPO> nodeList) {
  118. Map<Long, SysMenuSearchPO> nodeMap = new LinkedHashMap<>();
  119. // 将节点放入 Map 中,方便通过 id 查找
  120. for (SysMenuSearchPO node : nodeList) {
  121. nodeMap.put(node.getId(), node);
  122. }
  123. List<SysMenuSearchPO> tree = new ArrayList<>();
  124. // 逐个节点构建树
  125. for (SysMenuSearchPO node : nodeList) {
  126. if (node.getParentId() == 0) {
  127. // 根节点
  128. tree.add(buildTreeRecursively(node, nodeMap, node.getId()));
  129. }
  130. }
  131. return tree;
  132. }
  133. private static SysMenuSearchPO buildTreeRecursively(SysMenuSearchPO parentNode, Map<Long, SysMenuSearchPO> nodeMap, Long parentId) {
  134. List<SysMenuSearchPO> children = new ArrayList<>();
  135. // 查找当前节点的子节点
  136. nodeMap.forEach((id, node) -> {
  137. if (Objects.equals(node.getParentId(), parentId)) {
  138. children.add(buildTreeRecursively(node, nodeMap, node.getId()));
  139. }
  140. });
  141. // 将子节点设置到父节点
  142. parentNode.setChildren(children);
  143. return parentNode;
  144. }
  145. }