/* Schedule: UpdateAgencyProductTargetSchedule 引合いの製品区分をAからBに変更したとき、A目標も対象にしないといけないため、Batch側で修正する目標は全部にしないといけないです。 TODO 今後データ量増加により、変更差分のbatchにする仕組みを考える必要です。 */ global class UpdateAgencyOppProductTargetBatch implements Database.Batchable { String term; Id rtId; global UpdateAgencyOppProductTargetBatch() { Date dateToday = Date.today(); Integer year = dateToday.year(); Integer month = dateToday.month(); if (month < 4) { year -= 1; } term = String.valueOf(year - 1867) + 'P'; rtId = [select Id,DeveloperName from RecordType where IsActive = true and SobjectType = 'Agency_Opportunity__c' and DeveloperName = 'Target'].Id; } public class AggregateResultIterator implements Iterator { AggregateResult [] results {get;set;} // tracks which result item is returned Integer index {get; set;} public AggregateResultIterator(String query) { index = 0; // Fire query here to load the results results = Database.query(query); } public boolean hasNext(){ return results != null && !results.isEmpty() && index < results.size(); } public AggregateResult next(){ return results[index++]; } } public class AggregateResultIterable implements Iterable { private String query; public AggregateResultIterable(String soql){ query = soql; } public Iterator Iterator(){ return new AggregateResultIterator(query); } } global Iterable start(Database.BatchableContext BC) { //Id rtId = [select Id,DeveloperName from RecordType where IsActive = true and SobjectType = 'Agency_Opportunity__c' and DeveloperName = 'Target'].Id; //String query = 'select Id, Agency_Hospital__c, Department_Cateogy__c, Product_Category1__c, Product_Category2__c, Product_Category3__c' + // ' from Agency_Opportunity__c' + // ' where RecordTypeId = :rtId and tem_OCM_Term__c = :term and needBatch__c = true'; // TODO Wangwf and aoop.XXXXX < LastModifiedDate'; String query = 'select Agency_ID__c ' + 'from Agency_Opportunity__c ' + 'where RecordTypeId = \''+rtId+'\' and OCM_Term__c = \''+term+'\' group by Agency_ID__c'; //return Database.getQueryLocator(query); return new AggregateResultIterable(query); } global void execute(Database.BatchableContext BC, List scope) { //Id rtId = [select Id,DeveloperName from RecordType where IsActive = true and SobjectType = 'Agency_Opportunity__c' and DeveloperName = 'Target'].Id; Set agencyIdSet = new Set(); for (AggregateResult so : scope) { String agencyId = (String)so.get('Agency_ID__c'); agencyIdSet.add(agencyId); } List targetList = [select Id, Agency_Hospital_Target__c, Department_Cateogy__c, Product_Category__r.Name2__c from Agency_Opportunity__c where RecordTypeId = :rtId and OCM_Term__c = :term and Agency_ID__c in :agencyIdSet and Is_OPDSIS_Target__c != true]; AggregateResult[] product1Counts = [select Agency_Hospital__c, Department_Cateogy__c, Product_Category1__r.Name2__c pname, count(Id) cnt from Agency_Opportunity__c where Product_Category1__c != null and tem_OCM_Term__c = :term and Agency_ID__c in :agencyIdSet group by Agency_Hospital__c, Department_Cateogy__c , Product_Category1__r.Name2__c]; Map count1 = new Map(); for (AggregateResult product1Count : product1Counts) { String ahl = (String)product1Count.get('Agency_Hospital__c'); String dc = (String)product1Count.get('Department_Cateogy__c'); String name2 = (String)product1Count.get('pname'); //String name2 = (String)p1.get('Name2__c'); //String name2 = (String)((Map)product1Count.get('Product_Category1__r').get('Name2__c')); Integer cnt = (Integer)product1Count.get('cnt'); String key = ahl+':'+dc+':'+name2; count1.put(key, cnt); } AggregateResult[] product2Counts = [select Agency_Hospital__c, Department_Cateogy__c, Product_Category2__r.Name2__c pname, count(Id) cnt from Agency_Opportunity__c where Product_Category2__c != null and tem_OCM_Term__c = :term and Agency_ID__c in :agencyIdSet group by Agency_Hospital__c, Department_Cateogy__c , Product_Category2__r.Name2__c]; Map count2 = new Map(); for (AggregateResult product2Count : product2Counts) { String ahl = (String)product2Count.get('Agency_Hospital__c'); String dc = (String)product2Count.get('Department_Cateogy__c'); String name2 = (String)product2Count.get('pname'); //Map p2 = (Map)product2Count.get('Product_Category2__r'); //String name2 = (String)p2.get('Name2__c'); //String name2 = (String)product2Count.get('Product_Category2__r').get('Name2__c'); Integer cnt = (Integer)product2Count.get('cnt'); String key = ahl+':'+dc+':'+name2; count2.put(key, cnt); } AggregateResult[] product3Counts = [select Agency_Hospital__c, Department_Cateogy__c, Product_Category3__r.Name2__c pname, count(Id) cnt from Agency_Opportunity__c where Product_Category3__c != null and tem_OCM_Term__c = :term and Agency_ID__c in :agencyIdSet group by Agency_Hospital__c, Department_Cateogy__c , Product_Category3__r.Name2__c]; Map count3 = new Map(); for (AggregateResult product3Count : product3Counts) { String ahl = (String)product3Count.get('Agency_Hospital__c'); String dc = (String)product3Count.get('Department_Cateogy__c'); String name2 = (String)product3Count.get('pname'); //Map p3 = (Map)product3Count.get('Product_Category3__r'); //String name2 = (String)p3.get('Name2__c'); //String name2 = (String)product3Count.get('Product_Category3__r').get('Name2__c'); Integer cnt = (Integer)product3Count.get('cnt'); String key = ahl+':'+dc+':'+name2; count3.put(key, cnt); } for (Agency_Opportunity__c target : targetList) { String key = target.Agency_Hospital_Target__c+':'+target.Department_Cateogy__c+':'+target.Product_Category__r.Name2__c; Integer count = 0; if (count1.containsKey(key)) { count += count1.get(key); } if (count2.containsKey(key)) { count += count2.get(key); } if (count3.containsKey(key)) { count += count3.get(key); } target.Product_Category_Opp_Count__c = count; if (count == 0) target.Product_Category_Opp_Count__c = null; } if (targetList.size() > 0) { update targetList; } //Set pcIdSet = new Set(); //for (Agency_Opportunity__c aopp : scope) { // pcIdSet.add(aopp.Product_Category1__c); // pcIdSet.add(aopp.Product_Category2__c); // pcIdSet.add(aopp.Product_Category3__c); // aopp.BatchUpdateDatetime__c = Datetime.now(); //} //if (scope.size() > 0) { // update scope; //} //system.debug(pcIdSet); //List targetList = [select Id, Agency_Hospital_Target__c, Department_Cateogy__c, Product_Category__r.Name2__c from Agency_Opportunity__c // where RecordTypeId = :rtId and OCM_Term__c = :term /*and Product_Category__c in :pcIdSet*/ and Department_Cateogy__c != null]; } global void finish(Database.BatchableContext BC) { //do nothing } }