由于role不同于Profile,带有阶层性质,所以有一些自定义功能要依赖于这种阶层的设定。这样就涉及到role hierarchy的判断问题。

我是一个绝懒之人,所以去网上搜了一下,能找到的方案都或多或少有些缺陷 。

我所提供的方案也是如此,但是想比于浪费太多SOQL查询次数来讲,role的数量不超过50000条已经是足够好了。
// 这里Update一下,其实根本不会有那么多的Role,因为默认500,向Salesforce技术支持提票才能达到10000。

Talk is cheap, show you the code.
PS:最近正在建设个人代码库,本身也只是一个简单的示例,之后会放出完全体版本。
也许也会放到Github上。

 

 1 // @Version 0.1 Author Keal. Email: brain_qiu@hotmail.com
 2 // @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
 3 public class RoleHierarchyHelper {
 4     Boolean isEnd = false;
 5     Boolean compareResult = false;
 6     public static List<UserRole> roleList = [SELECT Id, Name, DeveloperName, ParentRoleId FROM UserRole LIMIT 50000];
 7     
 8     public RoleHierarchyHelper() {
 9         // pretend Salesforce spasms LOL. It happened.
10         if(roleList == null || roleList.size() == 0) {
11             roleList = [SELECT Id, Name, DeveloperName, ParentRoleId FROM UserRole LIMIT 50000];            
12         } else {
13             system.debug('=======RoleList.size()========' + roleList.size());
14         }
15     }
16     
17     public Boolean isSubordinate(String currentRoleId, String compareRoleId){
18                 
19         List<UserRole> childRoleList = new List<UserRole>();
20         Map<Id, UserRole> childRoleMap = new Map<Id, UserRole>();
21         Set<Id> exeUserRoleIdSet = new Set<Id>();
22         exeUserRoleIdSet.add(currentRoleId);
23         
24         isEnd = false;
25         compareResult = false;
26         while(!isEnd) {
27             childRoleMap = new Map<Id, UserRole>();
28             for(UserRole ur: roleList) {
29                 if(ur.ParentRoleId != null && exeUserRoleIdSet.contains(ur.ParentRoleId)) {
30                     childRoleMap.put(ur.Id, ur);
31                 }
32             }
33             
34             if(childRoleMap.size() > 0) {
35                 if(childRoleMap.containsKey(compareRoleId)) {
36                     isEnd = true;
37                     compareResult = true;    
38                 } else {
39                     isEnd = false;
40                     exeUserRoleIdSet = new Set<Id>();
41                     exeUserRoleIdSet.addAll(childRoleMap.keyset());            
42                 }
43                 
44             } else {
45                 isEnd = true;
46                 compareResult = false;
47             }
48         }
49         return compareResult;
50     }
51     
52     public Boolean isSuperior(String currentRoleId, String compareRoleId) {
53         Map<Id, UserRole> idUserRoleMap = new Map<Id, UserRole>(roleList);
54         Id exeUserRoleId = currentRoleId;
55         UserRole exeUserRole = new UserRole();
56         
57         isEnd = false;
58         compareResult = false;
59         while(!isEnd) {
60             exeUserRole = idUserRoleMap.get(exeUserRoleId);
61             if(exeUserRole.parentRoleId == null) {
62                 isEnd = true;
63                 compareResult = false;
64             } else {
65                 if(exeUserRole.parentRoleId == compareRoleId) {
66                     isEnd = true;
67                     compareResult = true;
68                 } else {
69                     isEnd = false;
70                     exeUserRoleId = exeUserRole.parentRoleId;
71                 }
72             }
73         }
74         return compareResult;
75     }
76     // TODO isSameLine()
77 }

 

posted on 2017-03-06 23:00  夏晚  阅读(474)  评论(0编辑  收藏  举报