salesforce共享规则通过代码实现

一、salesforce共享规则

1.权限共享(客户和商机除外)

global void privilegeSharing(Map<String,String> shareMap,String AccessLevel)
    {
    //shareMap:key:客户id,value:用户id
    //AccessLevel: edit:读写/read:只读
          privilegeSharing('Account_Analysis__Share','Account__c',shareMap,AccessLevel);//客户整体分析1
          privilegeSharing('Account_Analysis_Details__Share','Account_Analysis__r.Account__c',shareMap,AccessLevel);//客户整体分析产品
          privilegeSharing('Account_BOM__Share','Account_BOM_Account__c',shareMap,AccessLevel);//客户机型分析1
          privilegeSharing('Model_Details__Share','Model_Details_Account_BOM__r.Account_BOM_Account__c',shareMap,AccessLevel);//客户机型分析产品
          privilegeSharing('OpportunityItems__Share','OpportunityItems_Opportunity__r.AccountId',shareMap,AccessLevel);//商机产品
          privilegeSharing('Monthly_Forecast__Share','Account__c',shareMap,AccessLevel);//客户月度预测1
          privilegeSharing('KeyProduct_Forecast__Share','Customer__c',shareMap,AccessLevel);//重点物料销售数量预测
          privilegeSharing('ForeCast__Share','Account__c',shareMap,AccessLevel);//客户滚动预测
          privilegeSharing('Action_Plan__Share','Action_Plan_Account__c',shareMap,AccessLevel);//Action_Plan
          privilegeSharing('Custom_Visit__Share','Custom_Visit_Account__c',shareMap,AccessLevel);//客户拜访
          
          
    }
  global void privilegeSharing(String obj_name,String field_name,Map<String,String> shareMap,String AccessLevel)
  {
          Set<String> accIdSet=new Set<String>();
          List<Sobject> objectList = new List<SObject>();
          String sql = '';
            sql = 'select Id from '
            +obj_name.replace('__Share', '__c')
            +' where '+ field_name+' in ('
            +DaoHelper.changeString(shareMap.keySet())
            +')';
          
                      System.debug('sql===>'+sql);
          objectList = Database.query(sql);    
          List<SObject> upsert_sobject = new List<SObject>();
          
            for(String shareid:shareMap.values())
            {
              for(SObject sobj:objectList)
                {
                  try
                  {
                    //获取相应对象
                    Schema.SObjectType targetType = Schema.getGlobalDescribe().get(obj_name);
                    sObject obj = targetType.newSObject();
                    obj.put('AccessLevel', AccessLevel); //设置记录id
                    //获得当前map的集合放回string集合 并且赋值
                    obj.put('ParentId',sobj.id);
                    obj.put('RowCause', 'Manual');//类型:为手动共享
                    obj.put('UserOrGroupId', shareid);
                    upsert_sobject.add(obj);
                  }
                  catch(Exception e)
                  {
                    System.debug(e.getMessage());
                  }
                } 
            }               
          Database.SaveResult[] upsertResult = Database.insert(upsert_sobject, false);
          System.debug('数据处理结果:'+upsertResult);
          for (Database.SaveResult result : upsertResult) {
            if(!result.isSuccess()){
              System.debug(JSON.serialize(result.errors));
            }
          }
  }

2.客户和商机权限共享

List<AccountShare> accountLists = new List<AccountShare>();
List<OpportunityShare> oppShareList = new List<OpportunityShare>();

AccountShare accountShare = new AccountShare();
	accountShare.AccountId = account.Id;//客户id
	accountShare.UserOrGroupId = account.International_Customer_Sales__c;//用户id或小组id
	accountShare.AccountAccessLevel = 'read';//只读权限
	accountShare.OpportunityAccessLevel = 'read';
	accountLists.add(accountShare);
OpportunityShare oppShare = new OpportunityShare();   
	oppShare.OpportunityId = opp.Id; //商机id
	oppShare.UserOrGroupId = opp.Account.International_Customer_Sales__c;//用户id或小组id
	oppShare.RowCause= 'Manual';//类型:为手动共享
	oppShare.OpportunityAccessLevel='read';//edit:读写/read:只读
	oppShareList.add(oppShare);
if (accountLists.size() > 0) {
     Database.SaveResult[] upsertResult1 = Database.insert(accountLists, false);
     System.debug('客户数据处理结果:'+upsertResult1);
     
   }
if (oppShareList.size()>0) {
     Database.SaveResult[] upsertResult2 = Database.insert(oppShareList, false);
     System.debug('商机数据处理结果:'+upsertResult2); 
   }

3. 取消权限共享(不包含商机)

//权限回收===>>调用
//shareMap:key:客户id,value:用户id
//AccessLevel: edit:读写/read:只读
 privilegeRecovery('BD_Plan__Share','parent.Account__c',userIdMap);//防守机会
 
    public static void privilegeRecovery(String obj_name,String filterApi,Map<String,String> shareMap)
    {
        try
        {
           //获取相应对象
            Schema.SObjectType targetType = Schema.getGlobalDescribe().get(obj_name);
            sObject obj = targetType.newSObject();
            String sql  = '';
            if (obj_name=='AccountShare') {
                sql = 'select Id,UserOrGroupId,'+filterApi+'  from AccountShare '+
                            ' where RowCause = \'' + 'Manual' + '\' and '+filterApi;
            }else{
                sql = 'select Id,ParentId,UserOrGroupId,'+filterApi+'  from  ' 
                +obj_name+' where RowCause = \'' + 'Manual' + '\' and '+filterApi;
            }
            
            if(shareMap.keySet()!=null && shareMap.size() > 0)
            {
                sql += ' in (' + DaoHelper.changeString(shareMap.keySet()) +')' + 'and UserOrGroupId in (' + DaoHelper.changeString(shareMap.values()) +')';
                List<SObject> obj_list = Database.query(sql);
                List<SObject> delete_list = new List<SObject>();
                for(Sobject temp:obj_list){
                    //String filter=(String)temp.get(filterApi);
                    List<String> field_list = filterApi.split('\\.');
                    SObject acc=temp;
                    if(field_list.size()>1){
                        for(Integer index=0;index<field_list.size()-1;index++){
                            acc = acc.getSObject(field_list.get(index));
                        }
                    }
                    String filter= (String)acc.get(field_list.get( field_list.size()-1) );
                    String value=(String)temp.get('UserOrGroupId');
                    if(shareMap.get(filter)==value){
                        delete_list.add(temp);
                    }
                }
                System.debug('delete_list:'+delete_list);
                Database.delete(delete_list, false);    
            } 
        }
        catch(Exception e)
        {
            System.debug(e.getMessage());
        }       
    }

4.取消商机权限共享

List<OpportunityShare> oppShareList = [select  Id,UserOrGroupId,OpportunityId 
                                                                from OpportunityShare  
                                                                where RowCause = 'Manual'  
                                                                and UserOrGroupId =:accOld.International_Customer_Sales__c 
                                                                and OpportunityId in: OppSet];
if (oppShareList.size()>0) {
delete oppShareList;
}

5.通用方法DaoHelper.changeString()代码

public static String changeString(Set<String> strSet)
    {
        String SOQL_IDs = '';
        for (String id : strSet) {
            String id_in_quotes = '\''+id+'\'';
            if (SOQL_IDs!='') { SOQL_IDs+=','; }
            SOQL_IDs += id_in_quotes;
        }        
        if(SOQL_IDs == ''){SOQL_IDs = null;}
        return SOQL_IDs;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值