From b5af67d1fecc15d4495346a41ee320f427f29673 Mon Sep 17 00:00:00 2001
From: fengshuonan <sn93@qq.com>
Date: Mon, 27 Jun 2022 18:36:28 +0800
Subject: [PATCH] =?UTF-8?q?=E3=80=907.2.3=E3=80=91=E6=9B=B4=E6=96=B0?=
 =?UTF-8?q?=E8=A7=92=E8=89=B2=E6=8E=88=E6=9D=83=E8=8F=9C=E5=8D=95=E6=8E=A5?=
 =?UTF-8?q?=E5=8F=A3=EF=BC=8C=E8=BF=94=E5=9B=9E=E6=8E=88=E6=9D=83=E5=90=8E?=
 =?UTF-8?q?=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../roses/kernel/system/api/MenuServiceApi.java       | 11 +++++++++++
 .../modular/menu/controller/SysMenuController.java    |  6 +++++-
 .../system/modular/menu/service/SysMenuService.java   |  9 ---------
 .../modular/menu/service/impl/SysMenuServiceImpl.java |  2 ++
 .../modular/role/controller/SysRoleController.java    |  6 +++---
 .../system/modular/role/service/SysRoleService.java   |  9 +++++++++
 .../modular/role/service/impl/SysRoleServiceImpl.java | 11 +++++++++++
 7 files changed, 41 insertions(+), 13 deletions(-)

diff --git a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/MenuServiceApi.java b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/MenuServiceApi.java
index ea48225b6..aafc12a60 100644
--- a/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/MenuServiceApi.java
+++ b/kernel-s-system/system-api/src/main/java/cn/stylefeng/roses/kernel/system/api/MenuServiceApi.java
@@ -25,6 +25,8 @@
 package cn.stylefeng.roses.kernel.system.api;
 
 import cn.stylefeng.roses.kernel.system.api.pojo.login.v3.IndexMenuInfo;
+import cn.stylefeng.roses.kernel.system.api.pojo.menu.MenuAndButtonTreeResponse;
+import cn.stylefeng.roses.kernel.system.api.pojo.role.request.SysRoleRequest;
 
 import java.util.List;
 import java.util.Set;
@@ -90,4 +92,13 @@ public interface MenuServiceApi {
      */
     List<IndexMenuInfo> buildAuthorities(Integer menuFrontType);
 
+
+    /**
+     * 获取角色绑定菜单和按钮权限的树
+     *
+     * @author fengshuonan
+     * @date 2021/8/10 22:23
+     */
+    List<MenuAndButtonTreeResponse> getRoleMenuAndButtons(SysRoleRequest sysRoleRequest);
+
 }
diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/controller/SysMenuController.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/controller/SysMenuController.java
index dbf0066fe..abb56cb58 100644
--- a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/controller/SysMenuController.java
+++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/controller/SysMenuController.java
@@ -31,6 +31,7 @@ import cn.stylefeng.roses.kernel.rule.tree.ztree.ZTreeNode;
 import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
 import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
 import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
+import cn.stylefeng.roses.kernel.system.api.MenuServiceApi;
 import cn.stylefeng.roses.kernel.system.api.pojo.menu.MenuAndButtonTreeResponse;
 import cn.stylefeng.roses.kernel.system.api.pojo.menu.SysMenuRequest;
 import cn.stylefeng.roses.kernel.system.api.pojo.menu.antd.AntdMenuSelectTreeNode;
@@ -59,6 +60,9 @@ public class SysMenuController {
     @Resource
     private SysMenuService sysMenuService;
 
+    @Resource
+    private MenuServiceApi menuServiceApi;
+
     /**
      * 添加系统菜单
      *
@@ -196,7 +200,7 @@ public class SysMenuController {
      */
     @GetResource(name = "新版角色分配菜单和按钮界面使用的接口(v2)", path = "/sysMenu/menuAndButtonTreeChildrenV2")
     public ResponseData<List<MenuAndButtonTreeResponse>> menuAndButtonTreeChildrenV2(SysRoleRequest sysRoleRequest) {
-        List<MenuAndButtonTreeResponse> treeResponseList = sysMenuService.getRoleMenuAndButtons(sysRoleRequest);
+        List<MenuAndButtonTreeResponse> treeResponseList = menuServiceApi.getRoleMenuAndButtons(sysRoleRequest);
         return new SuccessResponseData<>(treeResponseList);
     }
 
diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/SysMenuService.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/SysMenuService.java
index 7874ac344..7f20cdc72 100644
--- a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/SysMenuService.java
+++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/SysMenuService.java
@@ -25,7 +25,6 @@
 package cn.stylefeng.roses.kernel.system.modular.menu.service;
 
 import cn.stylefeng.roses.kernel.rule.tree.ztree.ZTreeNode;
-import cn.stylefeng.roses.kernel.system.api.pojo.menu.MenuAndButtonTreeResponse;
 import cn.stylefeng.roses.kernel.system.api.pojo.menu.SysMenuRequest;
 import cn.stylefeng.roses.kernel.system.api.pojo.menu.antd.AntdMenuSelectTreeNode;
 import cn.stylefeng.roses.kernel.system.api.pojo.menu.antd.AntdSysMenuDTO;
@@ -146,14 +145,6 @@ public interface SysMenuService extends IService<SysMenu> {
      */
     List<LayuiMenuAndButtonTreeResponse> getMenuAndButtonTree(SysRoleRequest sysRoleRequest, Boolean lateralFlag);
 
-    /**
-     * 获取角色绑定菜单和按钮权限的树
-     *
-     * @author fengshuonan
-     * @date 2021/8/10 22:23
-     */
-    List<MenuAndButtonTreeResponse> getRoleMenuAndButtons(SysRoleRequest sysRoleRequest);
-
     /**
      * 获取当前用户的某个应用下的菜单
      *
diff --git a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/impl/SysMenuServiceImpl.java b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/impl/SysMenuServiceImpl.java
index 7acf0526b..b9fdf6b4a 100644
--- a/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/impl/SysMenuServiceImpl.java
+++ b/kernel-s-system/system-business-menu/src/main/java/cn/stylefeng/roses/kernel/system/modular/menu/service/impl/SysMenuServiceImpl.java
@@ -71,6 +71,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
@@ -433,6 +434,7 @@ public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> impl
     }
 
     @Override
+    @Transactional(isolation = Isolation.READ_UNCOMMITTED)
     public List<MenuAndButtonTreeResponse> getRoleMenuAndButtons(SysRoleRequest sysRoleRequest) {
         List<MenuAndButtonTreeResponse> menuTreeNodeList = CollectionUtil.newArrayList();
 
diff --git a/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/controller/SysRoleController.java b/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/controller/SysRoleController.java
index 17fee595e..a2028e617 100644
--- a/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/controller/SysRoleController.java
+++ b/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/controller/SysRoleController.java
@@ -33,6 +33,7 @@ import cn.stylefeng.roses.kernel.rule.pojo.response.SuccessResponseData;
 import cn.stylefeng.roses.kernel.scanner.api.annotation.ApiResource;
 import cn.stylefeng.roses.kernel.scanner.api.annotation.GetResource;
 import cn.stylefeng.roses.kernel.scanner.api.annotation.PostResource;
+import cn.stylefeng.roses.kernel.system.api.pojo.menu.MenuAndButtonTreeResponse;
 import cn.stylefeng.roses.kernel.system.api.pojo.role.dto.SysRoleDTO;
 import cn.stylefeng.roses.kernel.system.api.pojo.role.request.SysRoleRequest;
 import cn.stylefeng.roses.kernel.system.modular.role.entity.SysRole;
@@ -189,9 +190,8 @@ public class SysRoleController {
      * @date 2021/8/11 9:58
      */
     @PostResource(name = "角色绑定或取消绑定菜单和按钮", path = "/sysRole/grantMenusAndButtons")
-    public ResponseData<?> grantMenusAndButtons(@RequestBody @Validated(SysRoleRequest.grantMenusAndButtons.class) SysRoleRequest sysRoleRequest) {
-        sysRoleService.grantMenusAndButtons(sysRoleRequest);
-        return new SuccessResponseData<>();
+    public ResponseData<List<MenuAndButtonTreeResponse>> grantMenusAndButtons(@RequestBody @Validated(SysRoleRequest.grantMenusAndButtons.class) SysRoleRequest sysRoleRequest) {
+        return new SuccessResponseData<>(sysRoleService.grantMenusAndButtonsAndGetResult(sysRoleRequest));
     }
 
     /**
diff --git a/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/service/SysRoleService.java b/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/service/SysRoleService.java
index ad4fa2b17..b73f7e8a9 100644
--- a/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/service/SysRoleService.java
+++ b/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/service/SysRoleService.java
@@ -27,6 +27,7 @@ package cn.stylefeng.roses.kernel.system.modular.role.service;
 import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
 import cn.stylefeng.roses.kernel.rule.pojo.dict.SimpleDict;
 import cn.stylefeng.roses.kernel.system.api.RoleServiceApi;
+import cn.stylefeng.roses.kernel.system.api.pojo.menu.MenuAndButtonTreeResponse;
 import cn.stylefeng.roses.kernel.system.api.pojo.role.dto.SysRoleDTO;
 import cn.stylefeng.roses.kernel.system.api.pojo.role.request.SysRoleRequest;
 import cn.stylefeng.roses.kernel.system.modular.role.entity.SysRole;
@@ -158,4 +159,12 @@ public interface SysRoleService extends IService<SysRole>, RoleServiceApi {
      * @date 2022/6/21 9:55
      */
     void grantMenusAndButtons(SysRoleRequest sysRoleRequest);
+
+    /**
+     * 授权菜单和按钮集合,并获取结果
+     *
+     * @author fengshuonan
+     * @date 2022/6/27 17:08
+     */
+    List<MenuAndButtonTreeResponse> grantMenusAndButtonsAndGetResult(SysRoleRequest sysRoleRequest);
 }
diff --git a/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/service/impl/SysRoleServiceImpl.java b/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/service/impl/SysRoleServiceImpl.java
index 69f10bcd2..c7f817d18 100644
--- a/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/service/impl/SysRoleServiceImpl.java
+++ b/kernel-s-system/system-business-role/src/main/java/cn/stylefeng/roses/kernel/system/modular/role/service/impl/SysRoleServiceImpl.java
@@ -46,6 +46,7 @@ import cn.stylefeng.roses.kernel.system.api.UserServiceApi;
 import cn.stylefeng.roses.kernel.system.api.constants.SystemConstants;
 import cn.stylefeng.roses.kernel.system.api.exception.SystemModularException;
 import cn.stylefeng.roses.kernel.system.api.exception.enums.role.SysRoleExceptionEnum;
+import cn.stylefeng.roses.kernel.system.api.pojo.menu.MenuAndButtonTreeResponse;
 import cn.stylefeng.roses.kernel.system.api.pojo.role.dto.SysRoleDTO;
 import cn.stylefeng.roses.kernel.system.api.pojo.role.dto.SysRoleMenuButtonDTO;
 import cn.stylefeng.roses.kernel.system.api.pojo.role.dto.SysRoleMenuDTO;
@@ -426,6 +427,10 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
 
         // 如果是新增绑定菜单
         if (selectBindFlag) {
+            // 获取所有菜单的父级节点,把选中状态的菜单的所有父级节点都选择上
+            Set<Long> allParentMenuId = menuServiceApi.getMenuAllParentMenuId(new HashSet<>(grantMenuIdList));
+            grantMenuIdList.addAll(allParentMenuId);
+
             // 批量保存绑定的菜单集合
             List<SysRoleMenu> sysRoleMenus = new ArrayList<>();
             for (Long menuId : grantMenuIdList) {
@@ -449,6 +454,12 @@ public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> impl
         }
     }
 
+    @Override
+    public List<MenuAndButtonTreeResponse> grantMenusAndButtonsAndGetResult(SysRoleRequest sysRoleRequest) {
+        this.grantMenusAndButtons(sysRoleRequest);
+        return menuServiceApi.getRoleMenuAndButtons(sysRoleRequest);
+    }
+
     @Override
     public List<SysRoleDTO> getRolesByIds(List<Long> roleIds) {
         ArrayList<SysRoleDTO> sysRoleResponses = new ArrayList<>();