Salesforce用Apex判断Role Hierarchy的简单代码示例

(上密码遭人恨。。。。先开放好了)

由于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()
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据