/** * 1.新しい商品追加された場合、UniqueKey__c にて、新しいrecord生成されます(upsert)。 * 2.UniqueKey__c:OLY财年,第三分类,新4.5分类 ET_Product_ScoreTable_Batch bat = new ET_Product_ScoreTable_Batch (); Database.executeBatch(bat); */ global without sharing class ET_Product_ScoreTable_Batch implements Database.Batchable, Database.Stateful{ //private BatchEmailUtil.BatchErrorBean eb = new BatchEmailUtil.BatchErrorBean(); // 邮件发送ERRORBEAN //private static final Integer MAXERRORCNT = 500; // 邮件表单位最大错误信息显示数量 global Integer totalCount = 0; // 总件数 global Integer executedCount = 0; global Integer successCount = 0; // 成功件数 global Integer failedCount = 0; // 失败件数 global Set createdList; global Set updatedList; global Set failedList; global Boolean isAllFlag = false; global Integer testSkip = 0; global ET_Product_ScoreTable_Batch(){ createdList = new Set (); updatedList = new Set (); failedList = new Set (); testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; testSkip++; } global Database.QueryLocator start(Database.BatchableContext BC){ System.debug('********** ET_Product_ScoreTable_Batch .start'); Date systemDate = system.today(); systemDate = systemDate.addDays(-Integer.valueof(System.Label.ET_Date_Calculate)); //system.debug('systemDate ' + systemDate); Set s = new Set{'停止','有効','有効(再申請中)','失効(期限内生産済在庫対応)'}; Product2 p = [SELECT Plan_Term__c FROM Product2 WHERE Is_ET_APP__c = TRUE AND Category3__c <> '' AND SFDA_Status__c IN :s LIMIT 1]; String term = p.Plan_Term__c.left(4); /* * 按年筛选本次 Batch 产生/更新的行 */ Product_Score_Table__c [] psts = [ SELECT Id FROM Product_Score_Table__c WHERE OCM_Term__c = :term ]; /* * 清除表中临时统计信息 */ for(Product_Score_Table__c pst: psts) { pst.put('Is_Disabled__c', true); } update psts; //商品取得 String query = 'SELECT Id, Family, Plan_Term__c, SFDA_Status__c, Is_ET_APP__c, Asset_Model_No__c,' + ' Category3__c, Category4__c, Category5__c, Plan_Category3__c, Plan_Category4__c' + ' FROM Product2' + ' where Is_ET_APP__c = true '; // if (true != this.isAllFlag) { // query += ' and LastModifiedDate >= :systemDate '; // } // query += ' and SFDA_Status__c in :s'; return Database.getQueryLocator(query); } global void execute(Database.BatchableContext BC, List productList){ totalCount += productList.size(); System.debug('ET_Product_ScoreTable_Batch execute start'); Set validStatus = new Set{'停止','有効','有効(再申請中)','失効(期限内生産済在庫対応)'}; //upsert产品得分表 //List pstUpsertList = new List(); Map pstUpsertList = new Map(); Set unDisabledList = new Set(); //system.debug(productList.size()); if(!productList.isEmpty()){ for (Product2 pd : productList){ Product_Score_Table__c pst = new Product_Score_Table__c(); //计画财年 151P, 152P 产品的计画财年前三码+P pst.OCM_Term__c = pd.Plan_Term__c.left(4); //第1分类 pst.Category1__c = pd.Family; //重点第3分类 pst.Plan_Category3__c = pd.Plan_Category3__c; //重点第4分类 pst.Plan_Category4__c = pd.Plan_Category4__c; //第3分类 pst.Category3__c = pd.Category3__c; //第4分类 pst.Category4__c = pd.Category4__c; //UniqueKey : 151P+第三分类+第4分类 pst.UniqueKey__c = pst.OCM_Term__c + ':' + pst.Category3__c + ':' + pst.Category4__c; if ('吸引活检针' == pd.Category4__c && 'EUS' == pd.Category3__c) { if (pd.Asset_Model_No__c.startsWith('NA-U200H')) { pst.Category4__c = '吸引活检针-EZ3P'; pst.Plan_Category4__c = '吸引活检针-EZ3P'; pst.UniqueKey__c = pst.OCM_Term__c + ':' + pst.Category3__c + ':吸引活检针-EZ3P'; } else { pst.Category4__c = '吸引活检针-EZ3P以外'; pst.Plan_Category4__c = '吸引活检针-EZ3P以外'; pst.UniqueKey__c = pst.OCM_Term__c + ':' + pst.Category3__c + ':吸引活检针-EZ3P以外'; } } else if ('先端系粘膜切开刀' == pd.Category4__c && 'ESD' == pd.Category3__c) { if (pd.Asset_Model_No__c.startsWith('KD-655')) { pst.Category4__c = '先端系粘膜切开刀-DualJ'; pst.Plan_Category4__c = '先端系粘膜切开刀-DualJ'; pst.UniqueKey__c = pst.OCM_Term__c + ':' + pst.Category3__c + ':先端系粘膜切开刀-DualJ'; } else { pst.Category4__c = '先端系粘膜切开刀-DualJ以外'; pst.Plan_Category4__c = '先端系粘膜切开刀-DualJ以外'; pst.UniqueKey__c = pst.OCM_Term__c + ':' + pst.Category3__c + ':先端系粘膜切开刀-DualJ以外'; } } //是否无效 if (unDisabledList.contains(pst.UniqueKey__c)) { pst.Is_Disabled__c = false; } else { if (validStatus.contains(pd.SFDA_Status__c)) { unDisabledList.add(pst.UniqueKey__c); pst.Is_Disabled__c = false; } else { pst.Is_Disabled__c = true; } } //pstUpsertList.add(pst); pstUpsertList.put(pst.UniqueKey__c,pst); } } for(Product_Score_Table__c tmpObj : [SELECT Id, UniqueKey__c, Is_Disabled__c FROM Product_Score_Table__c WHERE UniqueKey__c IN :pstUpsertList.keySet()]){ if (false == tmpObj.Is_Disabled__c) { pstUpsertList.remove(tmpObj.UniqueKey__c); } else { Product_Score_Table__c pstUpsertItem = pstUpsertList.get(tmpObj.UniqueKey__c); if (unDisabledList.contains(tmpObj.UniqueKey__c)) { pstUpsertItem.Is_Disabled__c = false; } else { pstUpsertItem.Is_Disabled__c = true; } pstUpsertList.put(tmpObj.UniqueKey__c, pstUpsertItem); } } if(!pstUpsertList.isEmpty()){ //System.debug('pstUpsertList.size '+pstUpsertList.size()); Database.UpsertResult [] results = Database.upsert(pstUpsertList.values(), Product_Score_Table__c.UniqueKey__c,false ); //System.debug('results.size '+results.size()); for(Integer index = 0; index < results.size(); index++) { if(results[index].isSuccess()) { if(results[index].isCreated()) { createdList.add(results[index].getId()); } else if(!createdList.contains(results[index].getId())){ updatedList.add(results[index].getId()); } else { // do nothing } } else{ for (Database.Error err : results[index].getErrors()) { String message = 'UniqueKey :' + pstUpsertList.values()[index].UniqueKey__c + ' ; ' + err.getStatusCode() + '; ' + err.getFields() + ' ; ' + err.getMessage(); failedList.add(message); } } } } executedCount += productList.size(); System.debug('ET_Product_ScoreTable_Batch execute end'); } global void finish(Database.BatchableContext BC){ System.debug('ET_Product_ScoreTable_Batch finish method start'); String title = '产品得分表Batch'; String messagesPlanText = ''; String tempText = ''; for(string s : createdList){ successCount += 1; //messagesPlanText += s+' 已建立\n'; } for(string s : updatedList){ successCount += 1; //messagesPlanText += s+' 已更新\n'; } for(string s : failedList){ failedCount += 1; messagesPlanText += s+'\n'; } BatchEmailUtil eb = new BatchEmailUtil(); String[] emailList = new String[] {}; // 失败件数为0 寄出成功的mail if (failedCount == 0 && totalCount == executedCount) { String emailLabel = 'BatchNotify'; for (OrgWideEmailAddress tmpEmailObj : [SELECT Id, Address, DisplayName FROM OrgWideEmailAddress WHERE DisplayName = :emailLabel]) { emailList.add(tmpEmailObj.Address); } eb.successMail(emailList, null, title, executedCount); } else { if (totalCount != executedCount) { messagesPlanText += '有一部分Batch没有运行, 请确认系统管理员。\n'; } eb.failedMail(title, messagesPlanText, totalCount, executedCount, failedCount); } eb.send(); System.debug('ET_Product_ScoreTable_Batch finish method end'); } }