一、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;
}