(上密码遭人恨。。。。先开放好了)
由于role不同于Profile,带有阶层性质,所以有一些自定义功能要依赖于这种阶层的设定。这样就涉及到role hierarchy的判断问题。
我是一个绝懒之人,所以去网上搜了一下,能找到的方案都或多或少有些缺陷 。
我所提供的方案也是如此,但是想比于浪费太多SOQL查询次数来讲,role的数量不超过50000条已经是足够好了。
// 这里Update一下,其实根本不会有那么多的Role,因为默认500,提票才能达到10000。
Talk is cheap, show you the code.
PS:最近正在建设个人代码库,本身也只是一个简单的示例,之后会放出完全体版本。
也许也会放到Github上。
// @Version 0.1 Author Keal. Email: [email protected] // @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License public class RoleHierarchyHelper { Boolean isEnd = false; Boolean compareResult = false; public static List<UserRole> roleList = [SELECT Id, Name, DeveloperName, ParentRoleId FROM UserRole LIMIT 50000]; public RoleHierarchyHelper() { // pretend Salesforce spasms LOL. It happened. if(roleList == null || roleList.size() == 0) { roleList = [SELECT Id, Name, DeveloperName, ParentRoleId FROM UserRole LIMIT 50000]; } else { system.debug('=======RoleList.size()========' + roleList.size()); } } public Boolean isSubordinate(String currentRoleId, String compareRoleId){ List<UserRole> childRoleList = new List<UserRole>(); Map<Id, UserRole> childRoleMap = new Map<Id, UserRole>(); Set<Id> exeUserRoleIdSet = new Set<Id>(); exeUserRoleIdSet.add(currentRoleId); isEnd = false; compareResult = false; while(!isEnd) { childRoleMap = new Map<Id, UserRole>(); for(UserRole ur: roleList) { if(ur.ParentRoleId != null && exeUserRoleIdSet.contains(ur.ParentRoleId)) { childRoleMap.put(ur.Id, ur); } } if(childRoleMap.size() > 0) { if(childRoleMap.containsKey(compareRoleId)) { isEnd = true; compareResult = true; } else { isEnd = false; exeUserRoleIdSet = new Set<Id>(); exeUserRoleIdSet.addAll(childRoleMap.keyset()); } } else { isEnd = true; compareResult = false; } } return compareResult; } public Boolean isSuperior(String currentRoleId, String compareRoleId) { Map<Id, UserRole> idUserRoleMap = new Map<Id, UserRole>(roleList); Id exeUserRoleId = currentRoleId; UserRole exeUserRole = new UserRole(); isEnd = false; compareResult = false; while(!isEnd) { exeUserRole = idUserRoleMap.get(exeUserRoleId); if(exeUserRole.parentRoleId == null) { isEnd = true; compareResult = false; } else { if(exeUserRole.parentRoleId == compareRoleId) { isEnd = true; compareResult = true; } else { isEnd = false; exeUserRoleId = exeUserRole.parentRoleId; } } } return compareResult; } // TODO isSameLine() }