MenuServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. package com.xjrsoft.module.system.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import cn.hutool.core.util.StrUtil;
  5. import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.github.yulichang.base.MPJBaseServiceImpl;
  8. import com.github.yulichang.toolkit.MPJWrappers;
  9. import com.xjrsoft.common.constant.GlobalConstant;
  10. import com.xjrsoft.common.enums.AuthorizeType;
  11. import com.xjrsoft.common.enums.EnabledMark;
  12. import com.xjrsoft.common.utils.VoToColumnUtil;
  13. import com.xjrsoft.module.organization.entity.UserRoleRelation;
  14. import com.xjrsoft.module.organization.mapper.UserRoleRelationMapper;
  15. import com.xjrsoft.module.system.dto.MenuTreeDto;
  16. import com.xjrsoft.module.system.dto.RoleMenuServeListDto;
  17. import com.xjrsoft.module.system.entity.Authorize;
  18. import com.xjrsoft.module.system.entity.Menu;
  19. import com.xjrsoft.module.system.entity.Subsystem;
  20. import com.xjrsoft.module.system.entity.XjrMenuQuick;
  21. import com.xjrsoft.module.system.mapper.AuthorizeMapper;
  22. import com.xjrsoft.module.system.mapper.MenuMapper;
  23. import com.xjrsoft.module.system.mapper.XjrMenuDeptRelationMapper;
  24. import com.xjrsoft.module.system.mapper.XjrMenuQuickMapper;
  25. import com.xjrsoft.module.system.service.IMenuService;
  26. import com.xjrsoft.module.system.vo.*;
  27. import lombok.AllArgsConstructor;
  28. import org.springframework.stereotype.Service;
  29. import java.util.*;
  30. import java.util.function.Function;
  31. import java.util.stream.Collectors;
  32. /**
  33. * <p>
  34. * 用户 服务实现类
  35. * </p>
  36. *
  37. * @author tzx
  38. * @since 2022-03-16
  39. */
  40. @Service
  41. @AllArgsConstructor
  42. public class MenuServiceImpl extends MPJBaseServiceImpl<MenuMapper, Menu> implements IMenuService {
  43. private final UserRoleRelationMapper userRoleRelationMapper;
  44. private final AuthorizeMapper authorizeMapper;
  45. private final XjrMenuQuickMapper menuQuickMapper;
  46. private final XjrMenuDeptRelationMapper menuDeptRelationMapper;
  47. @Override
  48. public List<MenuVo> getAuthMenuList(MenuTreeDto dto) {
  49. List<Long> roleIds = getUserRoleIds();
  50. return getAuthMenuByRoleIds(roleIds, dto);
  51. }
  52. /**
  53. * 查询用户菜单服务
  54. */
  55. @Override
  56. public List<MenuServeVo> getAuthMenuServe(MenuTreeDto dto) {
  57. List<MenuVo> menuVos = getAuthMenuList(dto);
  58. return getSubMenu(menuVos);
  59. }
  60. /*
  61. 获取所有菜单 标记 accessibility
  62. */
  63. @Override
  64. public List<MenuAllServeVo> getAuthAllMenuServe(MenuTreeDto dto) {
  65. List<Long> roleIdList = new ArrayList<>();
  66. roleIdList.add(1L);
  67. List<MenuServeVo> roleMenuList = getSubMenu(getAuthMenuByRoleIds(roleIdList, dto));
  68. List<MenuServeVo> allMenuList = getSubMenu(getAuthMenuList(dto));
  69. Map<Long, MenuServeVo> allMenuMap = allMenuList.stream()
  70. .collect(Collectors.toMap(MenuServeVo::getId, Function.identity()));
  71. List<MenuAllServeVo> result = roleMenuList.stream()
  72. .map(menu -> convertToMenuAllServeVo(menu, allMenuMap))
  73. .collect(Collectors.toList());
  74. return result;
  75. }
  76. private MenuAllServeVo convertToMenuAllServeVo(MenuServeVo menu, Map<Long, MenuServeVo> allMenuMap) {
  77. MenuAllServeVo menuAllServeVo = new MenuAllServeVo();
  78. menuAllServeVo.setId(menu.getId());
  79. menuAllServeVo.setName(menu.getName());
  80. menuAllServeVo.setMenuVoList(menu.getMenuVoList());
  81. menuAllServeVo.setAccessibility(allMenuMap.containsKey(menu.getId()) ? 1 : 0);
  82. return menuAllServeVo;
  83. }
  84. /**
  85. * 查询角色菜单服务
  86. */
  87. @Override
  88. public List<MenuServeVo> getRoleMenuServe(RoleMenuServeListDto dto) {
  89. // 获取角色菜单
  90. List<MenuVo> menuVos = getAuthMenuByRoleIds(new ArrayList<Long>() {{
  91. add(dto.getRoleId());
  92. }}, new MenuTreeDto() {{
  93. setSystemType(dto.getSystemType());
  94. }});
  95. List<MenuServeVo> result = getSubMenu(menuVos);
  96. // 获取角色快捷菜单
  97. List<XjrMenuQuick> menuQuicks = menuQuickMapper.selectList(Wrappers.lambdaQuery(XjrMenuQuick.class).eq(XjrMenuQuick::getRoleId, dto.getRoleId()));
  98. // 处理数据是否被选中
  99. result.forEach((node) -> {
  100. node.getMenuVoList().forEach((menu) -> {
  101. menuQuicks.stream().filter(x -> x.getMenuId().equals(menu.getId()))
  102. .findAny()
  103. .ifPresent(present -> {
  104. menu.setIsSelect(true);
  105. });
  106. });
  107. });
  108. return result;
  109. }
  110. /**
  111. * 获取用户快捷菜单
  112. *
  113. * @return
  114. */
  115. @Override
  116. public List<Menu> getUserQuick(MenuTreeDto dto) {
  117. Long userId = StpUtil.getLoginIdAsLong();
  118. List<Menu> menus = this.selectJoinList(Menu.class,
  119. MPJWrappers.<Menu>lambdaJoin()
  120. .innerJoin(XjrMenuQuick.class, XjrMenuQuick::getMenuId, Menu::getId)
  121. .eq(XjrMenuQuick::getUserId, userId)
  122. .eq(ObjectUtil.isNotEmpty(dto.getSystemType()), Menu::getSystemType, dto.getSystemType())
  123. .selectAs(XjrMenuQuick::getSystemId, Menu::getSystemId)
  124. .select(Menu.class, x -> VoToColumnUtil.fieldsToColumns(MenuListVo.class).contains(x.getProperty())));
  125. // 取角色菜单
  126. if (menus.size() == 0) {
  127. List<Long> roleIds = getUserRoleIds();
  128. menus = this.selectJoinList(Menu.class,
  129. MPJWrappers.<Menu>lambdaJoin()
  130. .innerJoin(XjrMenuQuick.class, XjrMenuQuick::getMenuId, Menu::getId)
  131. .in(XjrMenuQuick::getRoleId, roleIds)
  132. .eq(ObjectUtil.isNotEmpty(dto.getSystemType()), Menu::getSystemType, dto.getSystemType())
  133. .selectAs(XjrMenuQuick::getSystemId, Menu::getSystemId)
  134. .select(Menu::getId)
  135. .select(Menu.class, x -> VoToColumnUtil.fieldsToColumns(Menu.class).contains(x.getProperty())));
  136. // 去重
  137. menus = menus.stream().distinct().collect(Collectors.toList());
  138. }
  139. return menus;
  140. }
  141. @Override
  142. public List<MenuTreeVo> selectAllist(List<String> deptIdList) {
  143. return menuQuickMapper.selectAllList(deptIdList);
  144. }
  145. /**
  146. * 根据角色获取菜单
  147. *
  148. * @param roleIds
  149. * @return
  150. */
  151. private List<MenuVo> getAuthMenuByRoleIds(List<Long> roleIds) {
  152. return getAuthMenuByRoleIds(roleIds, new MenuTreeDto());
  153. }
  154. /**
  155. * 根据角色获取菜单
  156. *
  157. * @param roleIds
  158. * @param dto
  159. * @return
  160. */
  161. private List<MenuVo> getAuthMenuByRoleIds(List<Long> roleIds, MenuTreeDto dto) {
  162. List<Long> authMenuIdList = null;
  163. // 非超级管理员权限过滤
  164. if (!roleIds.contains(GlobalConstant.SUPER_ADMIN_ROLE_ID)) {
  165. List<Authorize> authorizeList = authorizeMapper.selectList(Wrappers.<Authorize>lambdaQuery()
  166. .eq(Authorize::getAuthorizeType, AuthorizeType.MENU.getCode())
  167. .in(Authorize::getRoleId, roleIds));
  168. if (CollectionUtils.isEmpty(authorizeList)) {
  169. return new ArrayList<>();
  170. }
  171. authMenuIdList = authorizeList.stream().map(Authorize::getObjectId).collect(Collectors.toList());
  172. }
  173. List<String> orderList = new ArrayList<>();
  174. orderList.add("t1.sort_code");orderList.add("t.sort_code");
  175. List<MenuVo> menuVos = this.selectJoinList(MenuVo.class,
  176. MPJWrappers.<Menu>lambdaJoin()
  177. .like(StrUtil.isNotBlank(dto.getTitle()), Menu::getTitle, dto.getTitle())
  178. .like(StrUtil.isNotBlank(dto.getCode()), Menu::getCode, dto.getCode())
  179. .like(StrUtil.isNotBlank(dto.getName()), Menu::getName, dto.getName())
  180. .eq(ObjectUtil.isNotEmpty(dto.getSystemType()), Menu::getSystemType, dto.getSystemType())
  181. .eq(ObjectUtil.isNotEmpty(dto.getDisplay()), Menu::getDisplay, dto.getDisplay())
  182. .in(CollectionUtils.isNotEmpty(authMenuIdList), Menu::getId, authMenuIdList)
  183. .select(Menu::getId)
  184. .select("1 as authorized")
  185. .selectAs(Subsystem::getName, MenuVo::getSystemName)
  186. .select(Menu.class, x -> VoToColumnUtil.fieldsToColumns(MenuTreeVo.class).contains(x.getProperty()))
  187. .leftJoin(Subsystem.class, Subsystem::getId, Menu::getSystemId)
  188. .eq(Menu::getEnabledMark, EnabledMark.ENABLED.getCode())
  189. .orderByAscStr(orderList)
  190. );
  191. List<XjrMentDeptGroupVo> menuDept = menuDeptRelationMapper.getMenuDept();
  192. Map<Long, String> deptNameMap = new HashMap<>();
  193. Map<Long, String> deptIdMap = new HashMap<>();
  194. for (XjrMentDeptGroupVo deptGroupVo : menuDept) {
  195. deptNameMap.put(deptGroupVo.getMenuId(), deptGroupVo.getDeptNames());
  196. deptIdMap.put(deptGroupVo.getMenuId(), deptGroupVo.getDeptIds());
  197. }
  198. for (MenuVo menuVo : menuVos) {
  199. menuVo.setDeptId(deptIdMap.get(menuVo.getId()));
  200. menuVo.setDeptName(deptNameMap.get(menuVo.getId()));
  201. }
  202. return menuVos;
  203. }
  204. /**
  205. * 获取用户角色
  206. *
  207. * @return
  208. */
  209. private List<Long> getUserRoleIds() {
  210. List<UserRoleRelation> relations = userRoleRelationMapper.selectList(Wrappers.lambdaQuery(UserRoleRelation.class)
  211. .select(UserRoleRelation::getRoleId)
  212. .eq(UserRoleRelation::getUserId, StpUtil.getLoginIdAsLong()));
  213. if (CollectionUtils.isEmpty(relations)) {
  214. return new ArrayList<>();
  215. }
  216. return relations.stream().map(UserRoleRelation::getRoleId).collect(Collectors.toList());
  217. }
  218. /**
  219. * 获取子系统菜单
  220. *
  221. * @param menuVos
  222. * @return
  223. */
  224. private List<MenuServeVo> getSubMenu(List<MenuVo> menuVos) {
  225. Map<Long, MenuServeVo> menuVoMap = new HashMap<>();
  226. List<MenuVo> childMenus = new ArrayList<>();
  227. menuVos.forEach((node) -> {
  228. Long parentId = node.getParentId();
  229. //找到所有子系统信息
  230. if (menuVos.stream().noneMatch(x -> StrUtil.equals(x.getId().toString(), String.valueOf(parentId)))) {
  231. if (!menuVoMap.containsKey(node.getSystemId())) {
  232. MenuServeVo ms = new MenuServeVo();
  233. ms.setId(node.getSystemId());
  234. ms.setName(node.getSystemName());
  235. ms.setMenuVoList(new ArrayList<>());
  236. menuVoMap.put(node.getSystemId(), ms);
  237. }
  238. }
  239. if (!StrUtil.isEmptyIfStr(parentId) || !StrUtil.equals(String.valueOf(parentId), String.valueOf(GlobalConstant.FIRST_NODE_VALUE))) {
  240. // 给每条数据设置子系统信息
  241. menuVos.stream().filter(x -> StrUtil.equals(x.getId().toString(), String.valueOf(parentId)))
  242. .findAny()
  243. .ifPresent(parentNode -> {
  244. node.setSystemId(parentNode.getSystemId());
  245. node.setSystemName(parentNode.getSystemName());
  246. });
  247. Long number = menuVos.stream().filter(x -> x.getParentId().equals(node.getId())).count();
  248. if (number == 0) {
  249. childMenus.add(node);
  250. }
  251. }
  252. });
  253. menuVoMap.values().forEach((node) -> {
  254. List<MenuVo> childMenu = childMenus.stream().filter(x -> x.getSystemId().equals(node.getId())).collect(Collectors.toList());
  255. node.setMenuVoList(childMenu);
  256. });
  257. return new ArrayList<>(menuVoMap.values());
  258. }
  259. }