global class setOrderShareBatch implements Database.Batchable, Database.Stateful { // public String query; public List accountIdList; public Boolean sharedFlag = false; public Integer total = 0; public Map accountIdMap = new Map(); public Integer accounttotal = 0; global setOrderShareBatch() { } global setOrderShareBatch(Boolean sharedFlag) { this.sharedFlag = sharedFlag; } global setOrderShareBatch(List accountIdList) { this.accountIdList = accountIdList; } global Database.QueryLocator start(Database.BatchableContext bc) { if (accountIdList != null && accountIdList.size() > 0) { return Database.getQueryLocator([SELECT Id,OwnerId,Owner.IsActive,AccountId FROM order WHERE AccountId IN:accountIdList order by createdDate ]); } else if (sharedFlag) { return Database.getQueryLocator([SELECT Id,OwnerId,Owner.IsActive,AccountId FROM order WHERE SharedFlag__c = true order by createdDate ]); } else { return Database.getQueryLocator([SELECT Id,OwnerId,Owner.IsActive,AccountId FROM order order by createdDate ]); } } global void execute(Database.BatchableContext BC, List orderList) { // 获取合同上客户名Id Set accountIdSet = new Set(); for(Order order:orderList){ String accountId = order.AccountId; if (!accountIdMap.containsKey(accountId)) { accountIdSet.add(order.AccountId); accountIdMap.put(accountId,accountId); } accounttotal++; } // 1.根据客户Id,查找关联的所有合同 List getOrderList = [SELECT Id,OwnerId,Owner.IsActive,AccountId FROM order WHERE AccountId IN:accountIdSet ORDER BY AccountId]; // 客户Id 合同所有人Id 合同所有人对应的全部合同Id集合 Map>> accountId_orderOwnerId_orderIdMap = new Map>>(); for (Order order:getOrderList ) { String accountId = order.AccountId; // 合同所有人 他名下的合同Id集合 Map> orderOwnerId_orderIdMap = new Map>(); if (accountId_orderOwnerId_orderIdMap.containsKey(accountId)) { orderOwnerId_orderIdMap = accountId_orderOwnerId_orderIdMap.get(accountId); } List orderIdList = new List(); String orderOwnerId = order.OwnerId; if (orderOwnerId_orderIdMap.containsKey(orderOwnerId)) { orderIdList = orderOwnerId_orderIdMap.get(orderOwnerId); } orderIdList.add(order.Id); orderOwnerId_orderIdMap.put(orderOwnerId, orderIdList); // 客户下 合同所有人与合同Id accountId_orderOwnerId_orderIdMap.put(accountId, orderOwnerId_orderIdMap); } // 根据客户Id,查找客户下 客户团队用户 List accountTeamMemberList = new List(); accountTeamMemberList = [SELECT Id, AccountId, UserId, user.IsActive FROM AccountTeamMember WHERE user.IsActive = true AND AccountId IN:accountIdSet ORDER BY AccountId]; // 排除 合同所有人后 将合同共享给有效的用户 if (accountTeamMemberList.size() > 0) { Map orderShareMap = new Map(); for (AccountTeamMember atm:accountTeamMemberList ) { // String accountId = atm.AccountId; String userId = atm.UserId; if (accountId_orderOwnerId_orderIdMap.containsKey(accountId)) { Map> orderOwnerId_orderIdMap = accountId_orderOwnerId_orderIdMap.get(accountId); for (Id orderOwnerId : orderOwnerId_orderIdMap.keySet()) { if (userId != orderOwnerId) { for (Id orderId:orderOwnerId_orderIdMap.get(orderOwnerId) ) { String kv = orderId+'_' +userId; OrderShare aos = new OrderShare( RowCause = 'Manual', orderId = orderId, UserOrGroupId = userId, OrderAccessLevel = 'Edit'); orderShareMap.put(kv, aos); } } } } } Savepoint sp = Database.setSavepoint(); try { if (orderShareMap.size() > 0) { insert orderShareMap.values(); } if(Test.isRunningTest()){ Integer num = Integer.valueOf('TestError'); } } catch (Exception ex) { Database.rollback(sp); BatchIF_Log__c iflog = new BatchIF_Log__c(); iflog.Type__c = 'OrderShare'; String datetimeStr = String.valueOf(Datetime.now()).replace('-','').replace(' ','').replace(':',''); iflog.MessageGroupNumber__c = datetimeStr; iflog.Log__c = 'Account Id \n'; for (Id accountId :accountIdSet ) { iflog.Log__c += accountId +',\n'; } iflog.ErrorLog__c = ''; insert iflog; } total += orderShareMap.size(); } try { update orderList; if(Test.isRunningTest()){ Integer num = Integer.valueOf('TestError'); } } catch (Exception ex) { BatchIF_Log__c iflog = new BatchIF_Log__c(); iflog.Type__c = 'OrderShare'; String datetimeStr = String.valueOf(Datetime.now()).replace('-','').replace(' ','').replace(':',''); iflog.MessageGroupNumber__c = datetimeStr; iflog.Log__c = 'Order Id \n'; for (order orderId :orderList ) { iflog.Log__c += orderId +',\n'; } iflog.ErrorLog__c = ''; insert iflog; } } global void finish(Database.BatchableContext BC) { System.debug('accountIdMap--->'+accountIdMap); System.debug('total--->'+total); BatchIF_Log__c iflog = new BatchIF_Log__c(); iflog.Type__c = 'OrderShare'; String datetimeStr = String.valueOf(Datetime.now()).replace('-','').replace(' ','').replace(':',''); iflog.MessageGroupNumber__c = datetimeStr; iflog.Log__c = 'Account Count \n'; iflog.Log__c += accountIdMap.size() +'\n'; iflog.Log__c += 'OrderShare Count \n'; iflog.Log__c += total +'\n'; iflog.ErrorLog__c = ''; insert iflog; } }