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