|
@@ -2,8 +2,10 @@ package com.persagy.account.manage;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.Comparator;
|
|
|
+import java.util.HashSet;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Set;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -11,11 +13,11 @@ import org.springframework.stereotype.Component;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
|
|
|
import com.google.common.collect.Lists;
|
|
|
import com.persagy.account.pojo.dto.SaasAccountRole;
|
|
|
import com.persagy.account.pojo.dto.SaasFunction;
|
|
|
import com.persagy.account.pojo.dto.SaasMenu;
|
|
|
-import com.persagy.account.pojo.dto.SaasProduct;
|
|
|
import com.persagy.account.pojo.dto.SaasRole;
|
|
|
import com.persagy.account.pojo.dto.SaasRoleMenu;
|
|
|
import com.persagy.account.pojo.vo.auth.SaasMenuFunctionPageVO;
|
|
@@ -98,7 +100,7 @@ public class SaasRoleMenuHandler {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 查询账号菜单功能权限树,菜单定义和角色定义编码相同,所以这里应该同步传递
|
|
|
+ * 查询账号菜单功能权限树
|
|
|
*
|
|
|
* @param accountId
|
|
|
* @param accountBelong
|
|
@@ -110,31 +112,102 @@ public class SaasRoleMenuHandler {
|
|
|
* @return 空集合或数据菜单树
|
|
|
*/
|
|
|
public List<SaasMenu> querySaasMenuTree(String accountId, String accountBelong, String groupCode, String projectId, String appId, boolean isAdmin, boolean isMenu) {
|
|
|
- // 1.获取此账号对应菜单集合
|
|
|
- List<SaasMenu> menuTree = null;
|
|
|
if (isAdmin) {
|
|
|
+ // 这里是所有的菜单项,直接转为菜单树即可
|
|
|
LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().appIdEq(appId).menuTypeEq(SaasCommonConstant.STR_STATUS_0).builderQueryWrapper();
|
|
|
- menuTree = this.saasMenuService.list(queryWrapper);
|
|
|
- } else {
|
|
|
- menuTree = this.saasMenuService.querySaasMenuTree(accountId, groupCode, appId, null, SaasCommonConstant.STATUS_1);
|
|
|
+ List<SaasMenu> menuTree = this.saasMenuService.list(queryWrapper);
|
|
|
+ if (CollectionUtil.isEmpty(menuTree)) {
|
|
|
+ return Lists.newArrayList();
|
|
|
+ }
|
|
|
+ // 转为菜单树
|
|
|
+ List<SaasMenu> topMenus = new ArrayList<SaasMenu>();
|
|
|
+ for (int i = menuTree.size() - 1; i >= 0; i--) {
|
|
|
+ SaasMenu saasMenu = menuTree.get(i);
|
|
|
+ if (StringUtil.isBlank(saasMenu.getParentId())) {
|
|
|
+ topMenus.add(saasMenu);
|
|
|
+ menuTree.remove(i);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<SaasMenu> parents = topMenus.stream().sorted(Comparator.comparing(SaasMenu::getMenuSort)).collect(Collectors.toList());
|
|
|
+ this.setMenuChildrens(accountId, accountBelong, groupCode, projectId, menuTree, parents, isAdmin, !isMenu);
|
|
|
+ return parents;
|
|
|
}
|
|
|
- if (CollectionUtil.isEmpty(menuTree)) {
|
|
|
+ // 这里查询出来的仅是最末级的菜单,需要往上递归查询出父级,再形成菜单树
|
|
|
+ List<SaasMenu> menuTree = this.saasMenuService.querySaasMenuTree(accountId, groupCode, appId, null, SaasCommonConstant.STATUS_1);
|
|
|
+ return this.setMenuChildrens(menuTree, appId, accountId, accountBelong, groupCode, projectId, isAdmin, !isMenu);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据末级菜单集合,这里不往上递归查询形成树,因为涉及到排序,所以这里先查询出顶级树,根据条件剔除菜单
|
|
|
+ *
|
|
|
+ * @param authMenus 自动剔除无法看到的菜单
|
|
|
+ * @param appId
|
|
|
+ * @param accountId
|
|
|
+ * @param accountBelong
|
|
|
+ * @param groupCode
|
|
|
+ * @param projectId
|
|
|
+ * @param isAdmin
|
|
|
+ * @param menuAndFun
|
|
|
+ */
|
|
|
+ public List<SaasMenu> setMenuChildrens(List<SaasMenu> authMenus, String appId, String accountId, String accountBelong,
|
|
|
+ String groupCode, String projectId, boolean isAdmin, boolean menuAndFun) {
|
|
|
+ if (CollectionUtil.isEmpty(authMenus)) {
|
|
|
return Lists.newArrayList();
|
|
|
}
|
|
|
- // 2.转为菜单树
|
|
|
- List<SaasMenu> topMenus = new ArrayList<SaasMenu>();
|
|
|
- for (int i = menuTree.size() - 1; i >= 0; i--) {
|
|
|
- SaasMenu saasMenu = menuTree.get(i);
|
|
|
- if (StringUtil.isBlank(saasMenu.getParentId())) {
|
|
|
- topMenus.add(saasMenu);
|
|
|
- menuTree.remove(i);
|
|
|
+ Set<String> lastMenuIds = new HashSet<String>();
|
|
|
+ for (SaasMenu saasMenu : authMenus) {
|
|
|
+ lastMenuIds.add(saasMenu.getId());
|
|
|
+ }
|
|
|
+ // 1.获取顶级菜单树
|
|
|
+ LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().appIdEq(appId).builderQueryWrapper();
|
|
|
+ queryWrapper.apply("(PARENT_ID IS NULL OR TRIM(PARENT_ID) = '')");
|
|
|
+ queryWrapper.orderByAsc(SaasMenu::getMenuSort); // 默认菜单升序排序
|
|
|
+ List<SaasMenu> topMenu = this.saasMenuService.list(queryWrapper);
|
|
|
+ this.setMenuChildrens(topMenu, lastMenuIds, accountId, accountBelong, groupCode, projectId, isAdmin, menuAndFun);
|
|
|
+ return topMenu;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据权限ID集合,形成菜单树
|
|
|
+ *
|
|
|
+ * @param menuList
|
|
|
+ * @param lastMenuIds
|
|
|
+ * @param accountId
|
|
|
+ * @param accountBelong
|
|
|
+ * @param groupCode
|
|
|
+ * @param projectId
|
|
|
+ * @param isAdmin
|
|
|
+ * @param menuAndFun
|
|
|
+ */
|
|
|
+ private void setMenuChildrens(List<SaasMenu> menuList, Set<String> lastMenuIds, String accountId, String accountBelong,
|
|
|
+ String groupCode, String projectId, boolean isAdmin, boolean menuAndFun) {
|
|
|
+ for (int i = menuList.size() - 1; i >= 0; i--) {
|
|
|
+ SaasMenu saasMenu = menuList.get(i);
|
|
|
+ // 获取下级
|
|
|
+ LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().parentIdEq(saasMenu.getId()).builderQueryWrapper();
|
|
|
+ queryWrapper.orderByAsc(SaasMenu::getMenuSort); // 默认菜单升序排序
|
|
|
+ List<SaasMenu> childrens = this.saasMenuService.list(queryWrapper);
|
|
|
+ if (CollectionUtil.isEmpty(childrens) && !lastMenuIds.contains(saasMenu.getId())) {
|
|
|
+ menuList.remove(i); //移除
|
|
|
+ } else {
|
|
|
+ childrens = CollectionUtil.isEmpty(childrens) ? Lists.newArrayList() : childrens;
|
|
|
+ saasMenu.setChildrens(childrens);
|
|
|
+ // 再次查询
|
|
|
+ this.setMenuChildrens(childrens, lastMenuIds, accountId, accountBelong, groupCode, projectId, isAdmin, menuAndFun);
|
|
|
+
|
|
|
+ // 最后还需判断一次,递归回路删除上级菜单信息
|
|
|
+ if (CollectionUtil.isEmpty(saasMenu.getChildrens()) && !lastMenuIds.contains(saasMenu.getId())) {
|
|
|
+ menuList.remove(i); //移除
|
|
|
+ } else {
|
|
|
+ // 最后查询出来权限点
|
|
|
+ if (StringUtil.isNotBlank(saasMenu.getMenuUrl())) {
|
|
|
+ this.saasProductHandler.queryMenuProductAuths(saasMenu, accountId, accountBelong, groupCode, projectId, isAdmin, menuAndFun, menuAndFun);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
- List<SaasMenu> parents = topMenus.stream().sorted(Comparator.comparing(SaasMenu::getMenuSort)).collect(Collectors.toList());
|
|
|
- this.setMenuChildrens(accountId, accountBelong, groupCode, projectId, menuTree, parents, isAdmin, !isMenu);
|
|
|
- return parents;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* 生成菜单树
|
|
|
* @param accountId 为null时,isAdmin 为true
|
|
@@ -152,7 +225,7 @@ public class SaasRoleMenuHandler {
|
|
|
parent.setMenuId(parent.getId());
|
|
|
}
|
|
|
if (StringUtil.isNotBlank(parent.getMenuUrl())) {
|
|
|
- this.saasProductHandler.queryMenuProductAuths(parent, accountId, accountBelong, groupCode, projectId, isAdmin, menuAndFun);
|
|
|
+ this.saasProductHandler.queryMenuProductAuths(parent, accountId, accountBelong, groupCode, projectId, isAdmin, menuAndFun, menuAndFun);
|
|
|
}
|
|
|
|
|
|
List<SaasMenu> childrens = null;
|
|
@@ -198,68 +271,6 @@ public class SaasRoleMenuHandler {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 删除菜单,级联删除,角色、菜单、功能三者关联关系数据
|
|
|
- *
|
|
|
- * @param menuId
|
|
|
- * @param productId
|
|
|
- * @param updateProduct 是否更新产品关联菜单字段
|
|
|
- * @return
|
|
|
- */
|
|
|
- @Transactional
|
|
|
- public boolean deleteSaasMenu(String menuId, String productId, boolean updateProduct) {
|
|
|
- if (StringUtil.isBlank(menuId)) {
|
|
|
- return true;
|
|
|
- }
|
|
|
- boolean result = this.saasMenuService.removeById(menuId);
|
|
|
- if (result) {
|
|
|
- if (updateProduct) {
|
|
|
- // 更新产品是否已关联菜单字段
|
|
|
- SaasProduct saasProduct = new SaasProduct();
|
|
|
- saasProduct.setId(productId);
|
|
|
- saasProduct.setProductMenu(SaasCommonConstant.STR_STATUS_0);
|
|
|
- result = this.saasProductService.updateById(saasProduct);
|
|
|
- }
|
|
|
- // 1.删除此菜单下功能
|
|
|
- LambdaQueryWrapper<SaasFunction> funWrapper = new SaasFunction.Builder().createQueryWrapper().menuIdEq(menuId).builderQueryWrapper();
|
|
|
- this.saasFunctionService.remove(funWrapper);
|
|
|
- // 2.删除此功能对应的菜单、角色关系数据
|
|
|
- LambdaQueryWrapper<SaasRoleMenu> roleMenuWrapper = new SaasRoleMenu.Builder().createQueryWrapper().menuIdEq(menuId).builderQueryWrapper();
|
|
|
- this.saasRoleMenuService.remove(roleMenuWrapper);
|
|
|
- // 级联删除此菜单下的所有子菜单和对应的功能点信息
|
|
|
- this.casDeleteChildrenMenu(menuId);
|
|
|
- return true;
|
|
|
- }
|
|
|
- throw new BusinessException("菜单信息删除失败");
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 级联删除所有的子菜单和对应的权限信息
|
|
|
- * @param menuId
|
|
|
- * @param productId
|
|
|
- */
|
|
|
- @Transactional
|
|
|
- public void casDeleteChildrenMenu(String parentId) {
|
|
|
- LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().parentIdEq(parentId).builderQueryWrapper();
|
|
|
- List<SaasMenu> saasMenus = this.saasMenuService.list(queryWrapper.select(SaasMenu::getId, SaasMenu::getProductId));
|
|
|
- if (CollectionUtil.isEmpty(saasMenus)) {
|
|
|
- return;
|
|
|
- }
|
|
|
- for (SaasMenu saasMenu : saasMenus) {
|
|
|
- boolean updateProduct = false;
|
|
|
- if (StringUtil.isNotBlank(saasMenu.getProductId())) {
|
|
|
- // 判断此产品是否仅被此菜单使用
|
|
|
- queryWrapper = new SaasMenu.Builder().createQueryWrapper().productId(saasMenu.getProductId()).builderQueryWrapper();
|
|
|
- int count = this.saasMenuService.count(queryWrapper);
|
|
|
- if (count < 2) {
|
|
|
- updateProduct = true;
|
|
|
- }
|
|
|
- }
|
|
|
- // 删除此菜单
|
|
|
- this.deleteSaasMenu(saasMenu.getId(), saasMenu.getProductId(), updateProduct);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
* 删除功能,级联删除菜单、功能关系
|
|
|
*
|
|
|
* @param funId
|
|
@@ -346,4 +357,109 @@ public class SaasRoleMenuHandler {
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 创建菜单,同时设置产品是否已关联菜单
|
|
|
+ * @param saasMenu
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public boolean createSaasMenu(SaasMenu saasMenu) {
|
|
|
+ boolean result = this.saasMenuService.save(saasMenu);
|
|
|
+ if (result && StringUtil.isNotBlank(saasMenu.getProductId())) {
|
|
|
+ this.saasProductService.updateProductByMenu(saasMenu.getProductId(), SaasCommonConstant.STR_STATUS_1, saasMenu.getId());
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新菜单
|
|
|
+ *
|
|
|
+ * @param saasMenu
|
|
|
+ * @param orgProductId 原纪录的产品ID
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public boolean updateSaasMenu(SaasMenu saasMenu, String orgProductId) {
|
|
|
+ boolean result = false;
|
|
|
+ if (StringUtil.isAllBlank(saasMenu.getProductId(), orgProductId)) {
|
|
|
+ result = this.saasMenuService.updateById(saasMenu);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotBlank(orgProductId) && StringUtil.isBlank(saasMenu.getProductId())) {
|
|
|
+ // 判断此产品是否仅被此菜单使用
|
|
|
+ LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().productId(saasMenu.getProductId()).builderQueryWrapper();
|
|
|
+ int count = this.saasMenuService.count(queryWrapper);
|
|
|
+ if (count < 2) {
|
|
|
+ this.saasProductService.updateProductByMenu(orgProductId, SaasCommonConstant.STR_STATUS_0, null);
|
|
|
+ }
|
|
|
+ // 更新此菜单信息
|
|
|
+ LambdaUpdateWrapper<SaasMenu> updateWrapper = new SaasMenu.Builder().idEq(saasMenu.getId()).builderUpdateWrapper();
|
|
|
+ updateWrapper.setSql("PRODUCT_ID = NULL");
|
|
|
+ result = this.saasMenuService.update(saasMenu, updateWrapper);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ // 更新产品是否已关联菜单字段
|
|
|
+ result = this.saasMenuService.updateById(saasMenu);
|
|
|
+ this.saasProductService.updateProductByMenu(saasMenu.getProductId(), SaasCommonConstant.STR_STATUS_1, saasMenu.getId());
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 删除菜单,级联删除,角色、菜单、功能三者关联关系数据
|
|
|
+ *
|
|
|
+ * @param menuId
|
|
|
+ * @param productId
|
|
|
+ * @param updateProduct 是否更新产品关联菜单字段
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public boolean deleteSaasMenu(String menuId, String productId, boolean updateProduct) {
|
|
|
+ if (StringUtil.isBlank(menuId)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ boolean result = this.saasMenuService.removeById(menuId);
|
|
|
+ if (result) {
|
|
|
+ if (updateProduct) {
|
|
|
+ this.saasProductService.updateProductByMenu(productId, SaasCommonConstant.STR_STATUS_0, null);
|
|
|
+ }
|
|
|
+ // 1.删除此菜单下功能
|
|
|
+ LambdaQueryWrapper<SaasFunction> funWrapper = new SaasFunction.Builder().createQueryWrapper().menuIdEq(menuId).builderQueryWrapper();
|
|
|
+ this.saasFunctionService.remove(funWrapper);
|
|
|
+ // 2.删除此功能对应的菜单、角色关系数据
|
|
|
+ LambdaQueryWrapper<SaasRoleMenu> roleMenuWrapper = new SaasRoleMenu.Builder().createQueryWrapper().menuIdEq(menuId).builderQueryWrapper();
|
|
|
+ this.saasRoleMenuService.remove(roleMenuWrapper);
|
|
|
+ // 级联删除此菜单下的所有子菜单和对应的功能点信息
|
|
|
+ this.casDeleteChildrenMenu(menuId);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ throw new BusinessException("菜单信息删除失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 级联删除所有的子菜单和对应的权限信息
|
|
|
+ * @param menuId
|
|
|
+ * @param productId
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ public void casDeleteChildrenMenu(String parentId) {
|
|
|
+ LambdaQueryWrapper<SaasMenu> queryWrapper = new SaasMenu.Builder().createQueryWrapper().parentIdEq(parentId).builderQueryWrapper();
|
|
|
+ List<SaasMenu> saasMenus = this.saasMenuService.list(queryWrapper.select(SaasMenu::getId, SaasMenu::getProductId));
|
|
|
+ if (CollectionUtil.isEmpty(saasMenus)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ for (SaasMenu saasMenu : saasMenus) {
|
|
|
+ boolean updateProduct = false;
|
|
|
+ if (StringUtil.isNotBlank(saasMenu.getProductId())) {
|
|
|
+ // 判断此产品是否仅被此菜单使用
|
|
|
+ queryWrapper = new SaasMenu.Builder().createQueryWrapper().productId(saasMenu.getProductId()).builderQueryWrapper();
|
|
|
+ int count = this.saasMenuService.count(queryWrapper);
|
|
|
+ if (count < 2) {
|
|
|
+ updateProduct = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 删除此菜单
|
|
|
+ this.deleteSaasMenu(saasMenu.getId(), saasMenu.getProductId(), updateProduct);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|