MenuServiceImpl.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. package com.imed.costaccount.service.impl;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.date.DateUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.imed.costaccount.common.constants.Constant;
  8. import com.imed.costaccount.common.exception.CostException;
  9. import com.imed.costaccount.common.util.BeanUtil;
  10. import com.imed.costaccount.common.util.PageUtils;
  11. import com.imed.costaccount.mapper.MenuMapper;
  12. import com.imed.costaccount.model.Menu;
  13. import com.imed.costaccount.model.User;
  14. import com.imed.costaccount.model.dto.MenuEditDTO;
  15. import com.imed.costaccount.model.dto.MenuSaveDTO;
  16. import com.imed.costaccount.model.vo.MenuVO;
  17. import com.imed.costaccount.model.vo.NavVO;
  18. import com.imed.costaccount.service.MenuService;
  19. import com.imed.costaccount.service.UserService;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.transaction.annotation.Propagation;
  23. import org.springframework.transaction.annotation.Transactional;
  24. import java.util.*;
  25. import java.util.stream.Collectors;
  26. @Slf4j
  27. @Service("menuService")
  28. public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {
  29. private final UserService userService;
  30. public MenuServiceImpl(UserService userService) {
  31. this.userService = userService;
  32. }
  33. /**
  34. * 保存菜单
  35. *
  36. * @param menuSaveDTO {@link MenuSaveDTO}
  37. * @param user {@linkplain User}
  38. */
  39. @Override
  40. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
  41. public void saveMenu(MenuSaveDTO menuSaveDTO, User user) {
  42. // 校验
  43. this.check(menuSaveDTO.getType(), menuSaveDTO.getParentId());
  44. Menu menu = BeanUtil.convertObj(menuSaveDTO, Menu.class);
  45. menu.setHospId(user.getHospId())
  46. .setModifyTime(System.currentTimeMillis())
  47. .setModifyUserId(user.getId());
  48. this.save(menu);
  49. }
  50. /**
  51. * 分页查询菜单列表
  52. *
  53. * @param page 页码
  54. * @param pageSize 每页数据大小
  55. * @param user 当前登录用户
  56. * @param name
  57. * @return 菜单伪列表
  58. */
  59. @Override
  60. public PageUtils selectList(Integer page, Integer pageSize, User user, String name) {
  61. List<Menu> list = this.list(
  62. new LambdaQueryWrapper<Menu>().eq(Menu::getHospId, user.getHospId())
  63. .like(StrUtil.isNotBlank(name),Menu::getName,name)
  64. .orderByAsc(Menu::getOrderNum)
  65. );
  66. List<MenuVO> menuVOS = list.stream().map(i -> {
  67. MenuVO menuVO = BeanUtil.convertObj(i, MenuVO.class);
  68. menuVO.setModifyTime(DateUtil.formatDateTime(DateUtil.date(i.getModifyTime())));
  69. menuVO.setModifyUserName(userService.getUsernameByIdAndHospId(i.getModifyUserId(), user.getHospId()));
  70. return menuVO;
  71. }).collect(Collectors.toList());
  72. List<MenuVO> roots = menuVOS.stream().filter(i -> i.getParentId() == 0).collect(Collectors.toList());
  73. List<MenuVO> treeVOs = new ArrayList<>();
  74. for (MenuVO i : roots) {
  75. List<MenuVO> menus = this.getMenuTree(i, menuVOS);
  76. treeVOs.addAll(menus);
  77. }
  78. return new PageUtils(treeVOs, 0, 0, 0);
  79. }
  80. /**
  81. * 编辑某个菜单
  82. *
  83. * @param menuDTO {@link MenuEditDTO}
  84. * @param user {@link User}
  85. */
  86. @Override
  87. @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class)
  88. public void updateMenu(MenuEditDTO menuDTO, User user) {
  89. this.check(menuDTO.getType(), menuDTO.getParentId());
  90. Menu byId = this.getById(menuDTO.getId());
  91. if (Objects.isNull(byId)) {
  92. throw new CostException(500, "选择的菜单已被移除");
  93. }
  94. BeanUtil.convertObj(menuDTO, byId);
  95. log.info("byId:{}", byId);
  96. this.updateById(byId);
  97. }
  98. /**
  99. * 递归遍历
  100. *
  101. * @param menuVO
  102. * @param menuVOS
  103. * @return
  104. */
  105. private List<MenuVO> getMenuTree(MenuVO menuVO, List<MenuVO> menuVOS) {
  106. List<MenuVO> list = new ArrayList<>();
  107. list.add(menuVO);
  108. for (MenuVO vo : menuVOS) {
  109. if (vo.getParentId().equals(menuVO.getMenuId())) {
  110. List<MenuVO> children = menuVO.getChildren();
  111. if (CollUtil.isEmpty(children)) {
  112. children = new ArrayList<>();
  113. }
  114. children.add(vo);
  115. menuVO.setChildren(children);
  116. this.getMenuTree(vo, menuVOS);
  117. }
  118. }
  119. return list;
  120. }
  121. /**
  122. * 校验相关 菜单格式
  123. *
  124. * @param parentId 父级id
  125. * @param type 菜单类型
  126. */
  127. private void check(Integer type, Long parentId) {
  128. //上级菜单类型
  129. int parentType = Constant.MenuType.CATALOG.getValue();
  130. if (parentId != 0L) {
  131. Menu parentMenu = this.getById(parentId);
  132. parentType = parentMenu.getType();
  133. }
  134. // 如果当前是 目录、菜单
  135. if (type == Constant.MenuType.CATALOG.getValue() ||
  136. type == Constant.MenuType.MENU.getValue()) {
  137. if (parentType != Constant.MenuType.CATALOG.getValue()) {
  138. throw new CostException("上级菜单只能为目录类型");
  139. }
  140. return;
  141. }
  142. // 如果当前是按钮
  143. if (type == Constant.MenuType.BUTTON.getValue()) {
  144. if (parentType != Constant.MenuType.MENU.getValue()) {
  145. throw new CostException("上级菜单只能为菜单类型");
  146. }
  147. }
  148. }
  149. /**
  150. * 获取当前登录人的菜单列表
  151. *
  152. * @param user {@link User}
  153. * @return
  154. */
  155. @Override
  156. public List<NavVO> getNav(User user) {
  157. Long id = user.getId();
  158. Long hospId = user.getHospId();
  159. // TODO: 2021/8/5 超级管理员(切换人员操作)
  160. List<Menu> list = baseMapper.getNav(id, hospId);
  161. List<NavVO> navVOS = BeanUtil.convertList(list, NavVO.class);
  162. log.info("拷贝后的list:{}", navVOS);
  163. // List<NavVO> parentNavVOs = navVOS.stream().filter(i -> i.getParentId() == 0L).collect(Collectors.toList());
  164. List<NavVO> parentNavVOs = baseMapper.getAllParentNav(id, hospId);
  165. List<NavVO> navVOList = new ArrayList<>();
  166. for (NavVO parentNavVO : parentNavVOs) {
  167. List<NavVO> navs = this.getSon(parentNavVO, navVOS);
  168. navVOList.addAll(navs);
  169. }
  170. navVOList.removeIf(next -> CollUtil.isEmpty(next.getChildren()));
  171. navVOList = navVOList.stream().sorted((Comparator.comparingInt(NavVO::getOrderNum))).collect(Collectors.toList());
  172. return navVOList;
  173. }
  174. private List<NavVO> getSon(NavVO parentNavVO, List<NavVO> list) {
  175. List<NavVO> navVOs = new ArrayList<>();
  176. navVOs.add(parentNavVO);
  177. for (NavVO nav : list) {
  178. if (parentNavVO.getMenuId().equals(nav.getParentId())) {
  179. List<NavVO> children = parentNavVO.getChildren();
  180. if (CollUtil.isEmpty(children)) {
  181. children = new ArrayList<>();
  182. }
  183. children.add(nav);
  184. parentNavVO.setChildren(children);
  185. this.getSon(nav, list);
  186. }
  187. }
  188. return navVOs;
  189. }
  190. }