MenuServiceImpl.java 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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. List<Menu> list = this.list(new LambdaQueryWrapper<Menu>().eq(Menu::getHospId, user.getHospId()).ne(Menu::getType, 2).orderByAsc(Menu::getOrderNum));
  158. list.removeIf(i -> i.getType() != 0);
  159. // 用户具体不同的是菜单不同
  160. List<Menu> menus = baseMapper.getNav(user.getId(), user.getHospId());
  161. list.addAll(menus);
  162. List<NavVO> navVOS = BeanUtil.convertList(list, NavVO.class);
  163. List<NavVO> vos = navVOS.stream().filter(i -> i.getParentId() == 0)
  164. .peek(o -> {
  165. List<NavVO> son = this.getSon(o, navVOS);
  166. if (CollUtil.isNotEmpty(son)) {
  167. o.setChildren(son);
  168. }
  169. })
  170. .collect(Collectors.toList());
  171. // 移除目录下菜单为空的层级
  172. vos.removeIf(next -> CollUtil.isEmpty(next.getChildren()));
  173. return vos;
  174. }
  175. private List<NavVO> getSon(NavVO parentNavVO, List<NavVO> list) {
  176. return list.stream().filter(o -> parentNavVO.getMenuId().equals(o.getParentId()))
  177. .peek(i -> {
  178. List<NavVO> son = this.getSon(i, list);
  179. if (CollUtil.isNotEmpty(son)) {
  180. i.setChildren(son);
  181. }
  182. })
  183. .collect(Collectors.toList());
  184. }
  185. }