From 1da190e7f267bcd3501884f3aeaac7476850fec7 Mon Sep 17 00:00:00 2001
From: EricsHu <hrr145632>
Date: 星期日, 26 十一月 2023 17:53:03 +0800
Subject: [PATCH] 优化菜单查询

---
 src/main/java/com/qxueyou/scc/user/service/impl/UserRoleService.java  |   43 +++++++++++++
 src/main/java/com/qxueyou/scc/sys/service/impl/PriviledgeService.java |   59 +++++++++++++++----
 src/main/java/com/qxueyou/scc/sys/model/SysMenu.java                  |   33 ++++------
 3 files changed, 101 insertions(+), 34 deletions(-)

diff --git a/src/main/java/com/qxueyou/scc/sys/model/SysMenu.java b/src/main/java/com/qxueyou/scc/sys/model/SysMenu.java
index 5957727..c9d387e 100644
--- a/src/main/java/com/qxueyou/scc/sys/model/SysMenu.java
+++ b/src/main/java/com/qxueyou/scc/sys/model/SysMenu.java
@@ -1,30 +1,16 @@
 package com.qxueyou.scc.sys.model;
 
 import java.io.Serializable;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
+import javax.persistence.*;
 import javax.persistence.CascadeType;
-import javax.persistence.Column;
 import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
 import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
 import javax.persistence.Table;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
 
+import org.hibernate.annotations.*;
 import org.hibernate.annotations.Cache;
-import org.hibernate.annotations.CacheConcurrencyStrategy;
-import org.hibernate.annotations.CollectionId;
-import org.hibernate.annotations.GenericGenerator;
-import org.hibernate.annotations.Type;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
@@ -121,10 +107,17 @@
 
 	@OneToMany(mappedBy = "parent")
 	@JsonIgnore
-	private List<SysMenu> children;
+	private List<SysMenu> children=new ArrayList<>();
 
-	public int getOpenType() {
-		return openType;
+	@Transient
+	private Set<SysMenu> childrenList = new HashSet<>();
+
+	public Set<SysMenu> getChildrenList() {
+		return childrenList;
+	}
+
+	public void setChildrenList(Set<SysMenu> childrenList) {
+		this.childrenList = childrenList;
 	}
 
 	public void setOpenType(int openType) {
diff --git a/src/main/java/com/qxueyou/scc/sys/service/impl/PriviledgeService.java b/src/main/java/com/qxueyou/scc/sys/service/impl/PriviledgeService.java
index cb382c1..fa013af 100644
--- a/src/main/java/com/qxueyou/scc/sys/service/impl/PriviledgeService.java
+++ b/src/main/java/com/qxueyou/scc/sys/service/impl/PriviledgeService.java
@@ -8,6 +8,7 @@
 import java.util.List;
 import java.util.Map;
 
+import com.qxueyou.scc.user.model.UserReRoleUser;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
@@ -321,26 +322,60 @@
 	@Override
 	public Result getMenus(User user) {
 
-		String hql = "select DISTINCT m.menuId as index ,m.name as title ,m.url as router ,  m.hover as hover , "
+		String hql = "select DISTINCT m.menuId as index ,m.parentMenuId as parentMenuId ,m.level as level ,m.name as title ,m.url as router ,  m.hover as hover , "
 				+ " m.icon as icon ,m.parentMenuId as parentMenuId ,m.menuOrder as menuOrder from SysMenu m , UserReRoleUser u ,"
 				+ "SysPrivilege s where m.deleteFlag is false and u.deleteFlag is false and s.deleteFlag is false and "
-					+ "u.userId =:userId and u.roleId = s.roleId  and s.menuId = m.menuId order by m.menuOrder ";
+				+ "u.userId =:userId and u.roleId = s.roleId   and s.menuId = m.menuId order by m.menuOrder ";
 
 		List<Map<String, Object>> menuLst = findListWithMapByHql(hql,
 				CollectionUtils.newObjectMap("userId", user.getUserId()));
 		System.out.println(menuLst);
-		for (Map<String, Object> map : menuLst) {
-			map.put("children", CollectionUtils.newList());
+		//鍒濆鍖栦竴绾ц彍鍗�
+		List<Map<String, Object>> firstLevelMenu =new ArrayList<>();
+		for (Map<String, Object> stringObjectMap : menuLst) {
+			Integer level = Integer.parseInt(stringObjectMap.get("level").toString());
+			if (level==0) {
+				//鑾峰彇涓�绾ц彍鍗�
+				firstLevelMenu.add(stringObjectMap);
+			}
+		}
+		// 涓存椂鍒楄〃锛岀敤浜庝繚瀛橀渶瑕佺Щ闄ょ殑鍏冪礌鐨勭储寮�
+		List<Map<String, Object>> elementsToRemove = new ArrayList<>();
+		//閬嶅巻瀛愰泦
+		for (Map<String, Object> map : firstLevelMenu) {
+			getChildrenList(map,menuLst,elementsToRemove);
+		}
+// 绉婚櫎涓存椂鍒楄〃涓殑鍏冪礌
+		menuLst.removeAll(elementsToRemove);
+
+			String hqlRole = "select min(u.type)   from UserRole u , UserReRoleUser r where u.deleteFlag is false and r.deleteFlag is false and r.userId =:userId and u.roleId =r.roleId";
+
+			String maxRoleTypeStr = findUniqueByHql(hqlRole, CollectionUtils.newObjectMap("userId", user.getUserId()));
+			if (StringUtils.isBlank(maxRoleTypeStr)) {
+				return new Result(false, "璇ョ敤鎴锋病鏈夋潈闄�,鐧诲綍澶辫触");
+			}
+			Integer maxRoleType = Integer.valueOf(maxRoleTypeStr);
+			return new Result(true, "success", CollectionUtils.newObjectMap("menuLst", menuLst, "userName", user.getName(),
+					"userId", user.getUserId(), "imgPath", user.getImgPath(), "roleType", maxRoleType));
 		}
 
-		String hqlRole = "select min(u.type)   from UserRole u , UserReRoleUser r where u.deleteFlag is false and r.deleteFlag is false and r.userId =:userId and u.roleId =r.roleId";
+	/**
+	 * 鐢ㄩ�掑綊鑾峰彇瀛愯彍鍗�
+	 * @param sysMenu//涓�绾ц彍鍗�
+	 * @param menuLst //鎵�鏈夎彍鍗�
+	 * @param elementsToRemove //涓存椂鍒楄〃锛岀敤浜庝繚瀛橀渶瑕佺Щ闄ょ殑鍏冪礌鐨勭储寮�
+	 * @return
+	 */
+	public Map<String, Object> getChildrenList(Map<String, Object> sysMenu, List<Map<String, Object>> menuLst ,List<Map<String, Object>> elementsToRemove) {
+			for (Map<String, Object>  sysMenuMap : menuLst) {
+				String menuId = sysMenuMap.get("parentMenuId").toString();
+				String parentMenuId = sysMenu.get("index").toString();
+				if (parentMenuId.equals(menuId)) {
+					sysMenu.put("children",getChildrenList(sysMenuMap, menuLst, elementsToRemove));
+					elementsToRemove.add(sysMenuMap);
 
-		String maxRoleTypeStr = findUniqueByHql(hqlRole, CollectionUtils.newObjectMap("userId", user.getUserId()));
-		if (StringUtils.isBlank(maxRoleTypeStr)) {
-			return new Result(false, "璇ョ敤鎴锋病鏈夋潈闄�,鐧诲綍澶辫触");
-		}
-		Integer maxRoleType = Integer.valueOf(maxRoleTypeStr);
-		return new Result(true, "success", CollectionUtils.newObjectMap("menuLst", menuLst, "userName", user.getName(),
-				"userId", user.getUserId(), "imgPath", user.getImgPath(), "roleType", maxRoleType));
+				}
+			}
+		return sysMenu;
 	}
 }
diff --git a/src/main/java/com/qxueyou/scc/user/service/impl/UserRoleService.java b/src/main/java/com/qxueyou/scc/user/service/impl/UserRoleService.java
index 47ed924..b16bd6b 100644
--- a/src/main/java/com/qxueyou/scc/user/service/impl/UserRoleService.java
+++ b/src/main/java/com/qxueyou/scc/user/service/impl/UserRoleService.java
@@ -1,5 +1,6 @@
 package com.qxueyou.scc.user.service.impl;
 
+import com.qxueyou.scc.admin.classes.model.ClsClass;
 import com.qxueyou.scc.base.model.Result;
 import com.qxueyou.scc.base.service.impl.CommonAppService;
 import com.qxueyou.scc.base.util.ClientUtils;
@@ -17,6 +18,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * 瑙掕壊
@@ -28,6 +30,7 @@
 public class UserRoleService extends CommonAppService implements IUserRoleService {
 	@Autowired
 	UserRoleDAO dao;
+
 
 	/**
 	 * 寰楀埌鑿滃崟
@@ -128,11 +131,47 @@
 
 	@Override
 	public Result queryRoleDetail(String roleId) {
-		List<Map<String, Object>> findMenuLstById = dao.findMenuLstById(roleId);
+		List<Map<String, Object>> findRoleMenuLstById = dao.findMenuLstById(roleId);
 		UserRole userRole = read(UserRole.class, roleId);
+///////////////////////////////////////////////////鏂板鏂规硶
 
+
+ 		StringBuffer hql=new StringBuffer( "select m.name as name ,m.menuId as menuId  ,m.parentMenuId as parentMenuId ,m.level as level  from SysMenu m where deleteFlag is false ");
+//鑾峰彇鎵�鏈夎彍鍗�
+		List<SysMenu> sysMenusAll = new ArrayList<>();
+		List<Map<String, Object>> listWithMapByHql = findListWithMapByHql(hql.toString(), CollectionUtils.newObjectMap());
+		//灏唌ap杞寲鎴怱ysMenu瀹炰綋绫�
+		for (Map<String, Object> stringObjectMap : listWithMapByHql) {
+			SysMenu sysMenu = new SysMenu();
+			sysMenu.setMenuId(stringObjectMap.get("menuId").toString());
+			sysMenu.setName(stringObjectMap.get("name").toString());
+			sysMenu.setParentMenuId(stringObjectMap.get("parentMenuId").toString());
+			sysMenu.setLevel(Integer.parseInt(stringObjectMap.get("level").toString()));
+			sysMenusAll.add(sysMenu);
+		}
+		//鑾峰彇涓�绾ц彍鍗�
+		List<SysMenu> firstMenuList = sysMenusAll.stream().filter
+				//杩囨护鍑轰竴绾ц彍鍗�
+						(s -> s.getLevel()==0)
+				// 杩斿洖list闆嗗悎褰㈠紡
+				.collect(Collectors.toList());
+		// 閬嶅巻涓�绾ц彍鍗�,鏋勯�犺彍鍗曟爲
+		for (SysMenu menu : firstMenuList) {
+			getChildrenList(menu, sysMenusAll);
+		}
+		///////////////////////////////////////////////////鏂板鏂规硶
 		return new Result(true, "success",
-				CollectionUtils.newObjectMap("roleName", userRole.getName(), "menuLst", findMenuLstById));
+				CollectionUtils.newObjectMap("roleName", userRole.getName(), "menuLstAll", firstMenuList,"roleMenuLstById",findRoleMenuLstById));
+	}
+
+	public SysMenu getChildrenList(SysMenu sysMenu, List<SysMenu>  sysMenuList ) {
+		for (SysMenu menu : sysMenuList) {
+			if (menu.getParentMenuId().equals(sysMenu.getMenuId())) {
+
+				sysMenu.getChildrenList().add(getChildrenList(menu, sysMenuList));
+			}
+		}
+		return sysMenu;
 	}
 
 	@Override

--
Gitblit v1.8.0