package com.app.mvc.acl.service; import com.app.mvc.acl.dao.SysAclDao; import com.app.mvc.acl.dao.SysAclModuleDao; import com.app.mvc.acl.domain.SysAcl; import com.app.mvc.acl.domain.SysAclModule; import com.app.mvc.acl.domain.SysDept; import com.app.mvc.acl.domain.SysUser; import com.app.mvc.acl.dto.AclDto; import com.app.mvc.acl.dto.AclModuleLevelDto; import com.app.mvc.acl.dto.DeptLevelDto; import com.app.mvc.acl.enums.Status; import com.app.mvc.acl.util.LevelUtil; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; /** * Created by jimin on 16/1/24. */ @Service public class SysTreeService { @Resource private SysAclModuleDao sysAclModuleDao; @Resource private SysAclDao sysAclDao; @Resource private SysCoreService sysCoreService; /** * 全部权限点及权限模块组成的权限树 */ public List<AclModuleLevelDto> aclTree() { List<SysAcl> list = sysAclDao.getAll(); List<AclDto> aclDtoList = Lists.newArrayList(); for (SysAcl acl : list) { aclDtoList.add(AclDto.adapt(acl)); } return aclListToTree(aclDtoList); } /** * 权限模块组成的权限树 */ public List<AclModuleLevelDto> aclModuleTree() { List<SysAclModule> list = sysAclModuleDao.getAll(); List<AclModuleLevelDto> dtoList = Lists.newArrayList(); for (SysAclModule aclModule : list) { dtoList.add(AclModuleLevelDto.adapt(aclModule)); } return aclModuleListToTree(dtoList); } /** * 角色相关的权限树 */ public List<AclModuleLevelDto> roleTree(int roleId) { List<SysAcl> userAclList = sysCoreService.getCurrentUserAclList(); List<SysAcl> roleAclList = sysCoreService.getRoleAclList(roleId); Set<Integer> userAclIdSet = Sets.newHashSet(userAclList.size()); Set<Integer> roleAclIdSet = Sets.newHashSet(roleAclList.size()); for (SysAcl acl : userAclList) { userAclIdSet.add(acl.getId()); } for (SysAcl acl : roleAclList) { roleAclIdSet.add(acl.getId()); } // 求二者并集 Set<SysAcl> aclSet = new HashSet<SysAcl>(roleAclList); aclSet.addAll(userAclList); List<AclDto> aclDtoList = Lists.newArrayList(); for (SysAcl acl : aclSet) { AclDto dto = AclDto.adapt(acl); // 标记用户可操作的权限 if (userAclIdSet.contains(acl.getId())) { dto.setHasAcl(true); } // 标记该角色已选中的权限 if (roleAclIdSet.contains(acl.getId())) { dto.setChecked(true); } aclDtoList.add(dto); } return aclListToTree(aclDtoList); } /** * 当前用户所在供应商的部门树 */ public List<DeptLevelDto> deptTree() { List<SysDept> deptList = sysCoreService.getCurrentUserDeptList(); if (CollectionUtils.isEmpty(deptList)) { return Lists.newArrayList(); } List<DeptLevelDto> dtoList = Lists.newArrayList(); for (SysDept dept : deptList) { dtoList.add(DeptLevelDto.adapt(dept)); } return deptListToTree(dtoList); } /** * 当前用户所在供应商的部门和用户组成的部门树 * TODO: need to use cache */ public List<DeptLevelDto> userTree() { // 获取用户列表 List<SysUser> userList = sysCoreService.getCurrentSupplierUserList(); if (CollectionUtils.isEmpty(userList)) { return Lists.newArrayList(); } // 做成部门树 return userListToTree(userList); } /** * 指定角色未选中的用户列表 */ public List<DeptLevelDto> unselectUserRoleTree(int roleId) { // 获取用户列表 List<SysUser> supplierUserList = sysCoreService.getCurrentSupplierUserList(); List<SysUser> roleUserList = sysCoreService.getRoleUserList(roleId); supplierUserList.removeAll(roleUserList); // 做成部门树 return userListToTree(supplierUserList); } /** * 根据权限点列表计算出对应的整个权限树 */ public List<AclModuleLevelDto> aclListToTree(List<AclDto> aclList) { if (CollectionUtils.isEmpty(aclList)) { return Lists.newArrayList(); } // 做成权限树 List<AclModuleLevelDto> aclModuleLevelList = aclModuleTree(); // aclModuleId -> [acl1, acl2, ...] Multimap<Integer, AclDto> moduleIdAclMap = ArrayListMultimap.create(); for (SysAcl acl : aclList) { if (acl.getStatus() == Status.AVAILABLE.getCode()) { moduleIdAclMap.put(acl.getAclModuleId(), AclDto.adapt(acl)); } } // 将权限点绑定到权树上 bindAclsWithOrder(aclModuleLevelList, moduleIdAclMap); return aclModuleLevelList; } /** * 将权限模块列表转换为权限树 */ public List<AclModuleLevelDto> aclModuleListToTree(List<AclModuleLevelDto> aclModuleList) { if (CollectionUtils.isEmpty(aclModuleList)) { return Lists.newArrayList(); } // level -> [aclModule1, aclModule2, ...] Multimap<String, AclModuleLevelDto> levelModuleMap = ArrayListMultimap.create(); List<AclModuleLevelDto> rootList = Lists.newArrayList(); for (AclModuleLevelDto dto : aclModuleList) { levelModuleMap.put(dto.getLevel(), dto); if (LevelUtil.ROOT.equals(dto.getLevel())) { rootList.add(dto); } } // 按seq从小到大排序 Collections.sort(rootList, aclModuleSeqComparator); // 转换成树形结构 transformAclTree(rootList, LevelUtil.ROOT, levelModuleMap); return rootList; } /** * 将部门列表转换为部门树 */ public List<DeptLevelDto> deptListToTree(List<DeptLevelDto> deptLevelList) { if (CollectionUtils.isEmpty(deptLevelList)) { return Lists.newArrayList(); } // level -> [dept1, dept2, ...] Multimap<String, DeptLevelDto> levelDeptMap = ArrayListMultimap.create(); List<DeptLevelDto> rootList = Lists.newArrayList(); for (DeptLevelDto dto : deptLevelList) { levelDeptMap.put(dto.getLevel(), dto); if (LevelUtil.ROOT.equals(dto.getLevel())) { rootList.add(dto); } } // 按seq从小到大排序 Collections.sort(rootList, new Comparator<DeptLevelDto>() { @Override public int compare(DeptLevelDto o1, DeptLevelDto o2) { return o1.getSeq() - o2.getSeq(); } }); // 转换成树形结构 transformDeptTree(deptLevelList, LevelUtil.ROOT, levelDeptMap); return rootList; } public List<DeptLevelDto> userListToTree(List<SysUser> userList) { if (CollectionUtils.isEmpty(userList)) { return Lists.newArrayList(); } // 做成部门树 List<DeptLevelDto> deptLevelList = deptTree(); // deptId -> [user1, user2, ...] Multimap<Integer, SysUser> deptIdUserMap = ArrayListMultimap.create(); for (SysUser user : userList) { deptIdUserMap.put(user.getDeptId(), user); } // 将用户绑定到部门上 bindUserWithOrder(deptLevelList, deptIdUserMap); return deptLevelList; } /** * 递归处理权限树的每一层 */ private void transformAclTree(List<AclModuleLevelDto> dtoList, String level, Multimap<String, AclModuleLevelDto> levelModuleMap) { for (int i = 0; i < dtoList.size(); i++) { // 遍历该层的每个元素 AclModuleLevelDto aclModuleLevel = dtoList.get(i); // 当前处理的层级值 String nextLevel = LevelUtil.calculateLevel(level, aclModuleLevel.getId()); // 取出下一层的列表 List<AclModuleLevelDto> tempModuleList = (List<AclModuleLevelDto>) levelModuleMap.get(nextLevel); if (CollectionUtils.isNotEmpty(tempModuleList)) { // 排序 Collections.sort(tempModuleList, aclModuleSeqComparator); // 设置 aclModuleLevel.setAclModuleList(tempModuleList); // 进入下一层进行处理 transformAclTree(tempModuleList, nextLevel, levelModuleMap); } } } /** * 递归处理部门树的每一层 */ private void transformDeptTree(List<DeptLevelDto> dtoList, String level, Multimap<String, DeptLevelDto> levelDeptMap) { for (int i = 0; i < dtoList.size(); i++) { // 遍历该层的每个元素 DeptLevelDto deptLevelDto = dtoList.get(i); // 当前处理的层级值 String nextLevel = LevelUtil.calculateLevel(level, deptLevelDto.getId()); // 取出下一层的列表 List<DeptLevelDto> tempDeptList = (List<DeptLevelDto>) levelDeptMap.get(nextLevel); if (CollectionUtils.isNotEmpty(tempDeptList)) { // 排序 Collections.sort(tempDeptList, deptSeqComparator); // 设置 deptLevelDto.setDeptList(tempDeptList); // 进入下一层进行处理 transformDeptTree(tempDeptList, nextLevel, levelDeptMap); } } } /** * 递归将权限点放到对应的权限模块下面,同时保证权限点有序 */ private void bindAclsWithOrder(List<AclModuleLevelDto> aclModuleLevelList, Multimap<Integer, AclDto> moduleIdAclMap) { if (CollectionUtils.isEmpty(aclModuleLevelList)) { return; } for (AclModuleLevelDto dto : aclModuleLevelList) { // 取出权限点列表 List<AclDto> aclDtoList = (List<AclDto>) moduleIdAclMap.get(dto.getId()); if (CollectionUtils.isNotEmpty(aclDtoList)) { // 按seq升序排序 Collections.sort(aclDtoList, aclTypeComparator); // 把排序后的权限点列表绑定到权限模块上 dto.setAclList(aclDtoList); } // 进入下层模块绑定权限点 bindAclsWithOrder(dto.getAclModuleList(), moduleIdAclMap); } } /** * 递归将用户放到对应的部门下面,同时保证用户有序 */ private void bindUserWithOrder(List<DeptLevelDto> deptList, Multimap<Integer, SysUser> deptIdUserMap) { if (CollectionUtils.isEmpty(deptList)) { return; } for (DeptLevelDto dto : deptList) { // 取出用户列表 List<SysUser> userList = (List<SysUser>) deptIdUserMap.get(dto.getId()); if (CollectionUtils.isNotEmpty(userList)) { // 按seq升序排序 Collections.sort(userList, usernameComparator); // 把排序后的用户列表绑定到部门上 dto.setUserList(userList); } // 进入下层模块绑定用户 bindUserWithOrder(dto.getDeptList(), deptIdUserMap); } } public Comparator<AclDto> aclSeqComparator = new Comparator<AclDto>() { @Override public int compare(AclDto o1, AclDto o2) { return o1.getSeq() - o2.getSeq(); } }; public Comparator<AclDto> aclTypeComparator = new Comparator<AclDto>() { @Override public int compare(AclDto o1, AclDto o2) { return o1.getType() - o2.getType(); } }; public Comparator<AclModuleLevelDto> aclModuleSeqComparator = new Comparator<AclModuleLevelDto>() { @Override public int compare(AclModuleLevelDto o1, AclModuleLevelDto o2) { return o1.getSeq() - o2.getSeq(); } }; public Comparator<DeptLevelDto> deptSeqComparator = new Comparator<DeptLevelDto>() { @Override public int compare(DeptLevelDto o1, DeptLevelDto o2) { return o1.getSeq() - o2.getSeq(); } }; public Comparator<SysUser> usernameComparator = new Comparator<SysUser>() { @Override public int compare(SysUser o1, SysUser o2) { return o1.getUsername().compareTo(o2.getUsername()); } }; }