public with sharing class SSPowerBIBatch implements Database.Batchable { public static Integer FIELDMAX = 200; private final List TEST_ID = null; private final Date createDate = null; private BatchIF_Log__c iflog; private static final Integer MAXERRORCNT = 20; // 邮件表单位最大错误信息显示数量 private static final Boolean ALLORNONE = false; // 全部保存 //-------------------------------------------------------------------------------------------------------------------------- public SSPowerBIBatch() { iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Log__c = '备品备份:SSPowerBIBatch start\n'; insert iflog; } public SSPowerBIBatch( Date createDate) { this.createDate = createDate; iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Log__c = '备品备份:SSPowerBIBatch start\n'; insert iflog; } public SSPowerBIBatch(List testId) { TEST_ID = testId; iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Log__c = '备品备份:SSPowerBIBatch start\n'; insert iflog; } public SSPowerBIBatch(List testId , Date createDate) { TEST_ID = testId; this.createDate = createDate; iflog = new BatchIF_Log__c(); iflog.Type__c = 'PushNotification'; iflog.Log__c = '备品备份:SSPowerBIBatch start\n'; insert iflog; } //--------------------------------------------------------------------------------------------------------------------------- public static String makeSql(SS_Batch_Column_Mapping__c setting, Set apiTempSet) { //apiTempSet.add('Id'); for (Integer i = 1; i <= FIELDMAX; i++) { String fromColumn = 'From_Column_' + ('00' + i).right(3) + '__c'; String apiStr = String.valueOf(setting.get(fromColumn)); if (String.isBlank(apiStr) == false && apiTempSet.contains(apiStr) == false) { apiTempSet.add(apiStr); } } String soql = 'Select ' + String.join(new List(apiTempSet), ',') + ' from ' + setting.Name; return soql; } //-------------------------------------------------------------------------------------------------------------------------- public static Object getValue(SObject sobj, String field) { List fieldPathList = field.split('\\.'); Object rtn = null; for (Integer i = 0; i < fieldPathList.size(); i++) { String fieldPath = fieldPathList[i]; if (i == fieldPathList.size() - 1) { rtn = sobj.get(fieldPath); if (rtn != null && String.valueOf(rtn).indexof('a href') >= 0 ) { rtn = string.valueOf(rtn).replaceAll('<.*?>', ''); } } else { sobj = sobj.getSObject(fieldPath); if (sobj == null) { break; } } } return rtn; } //---------------------------------------------------------------------------------------------------------------------------- public Database.QueryLocator start(Database.BatchableContext BC) { System.debug('-------------SSPower_BI_Batch start:'); SS_Batch_Column_Mapping__c oppMapping = SS_Batch_Column_Mapping__c.getValues('Rental_Apply__c'); Set apiTempSet = new Set(); for (Integer i = 1; i <= FIELDMAX; i++) { String lpadI = ('00' + i).right(3); String fromColumn = 'From_Column_' + lpadI + '__c'; String apiStr = String.valueOf(oppMapping.get(fromColumn)); if (String.isBlank(apiStr) == false) { String ssColumn = 'SS_Column_' + lpadI + '__c'; String ssApiStr = String.valueOf(oppMapping.get(ssColumn)); //apiTempSet.add(ssApiStr); } } String soql = makeSql(oppMapping, apiTempSet); if (TEST_ID <> null) { soql += ' where Id IN: TEST_ID'; }else{ // 2020/07/08 taoqz add start // 取消理由:主动取消剔除 soql += ' where Cancel_Reason__c != \'主动取消\''; } // 2020/07/08 taoqz add end return Database.getQueryLocator(soql); } //-------------------------------------------------------------------------------------------------------------------------- public void execute(Database.BatchableContext BC, List oppList) { try { Date today = Date.today(); if (today.day() == 1) { today = Date.newInstance(today.year(), today.month(), 1).addDays(-1); } else { today = Date.newInstance(today.addDays(1).year(), today.addDays(1).month(), 1).addDays(-1); } list ifloglist = [select id , ErrorLog__c from BatchIF_Log__c where id = : iflog.id]; if (ifloglist.size() > 0 ) { iflog = ifloglist[0]; } List insRACList = new List(); List insSSOppId = new List(); // 商談 SS_Batch_Column_Mapping__c oppMapping = SS_Batch_Column_Mapping__c.getValues('Rental_Apply__c'); Schema.SObjectType ssOppType = Schema.getGlobalDescribe().get(String.valueOf(oppMapping.get('SS_TableName__c'))); for (Rental_Apply__c opp : oppList) { Boolean updSelfFlg = false; SObject racObj = ssOppType.newSObject(); for (Integer i = 1; i <= FIELDMAX; i++) { String lpadI = ('00' + i).right(3); String fromColumn = 'From_Column_' + lpadI + '__c';//From_Column_001__c String apiStr = String.valueOf(oppMapping.get(fromColumn)); if (String.isBlank(apiStr) == false) { String ssColumn = 'SS_Column_' + lpadI + '__c'; String ssApiStr = String.valueOf(oppMapping.get(ssColumn)); racObj.put(ssApiStr, getValue(opp, apiStr)); } } racObj.put('createDate__c', today); if (createDate != null) { racObj.put('createDate__c', createDate); } insRACList.add(racObj); insSSOppId.add(opp.Id); } //-------------------------------------------------------------------------------------------------------------------- List raescList = new List(); List raescId = new List(); SS_Batch_Column_Mapping__c oliMapping = SS_Batch_Column_Mapping__c.getValues('Rental_Apply_Equipment_Set__c'); Set apiTempSet = new Set(); String oliSql = makeSql(oliMapping, apiTempSet); oliSql += ' where Rental_Apply__c IN :insSSOppId'; // 2020/07/08 taoqz add start // 取消理由:主动取消剔除 if (TEST_ID == null) { oliSql += ' and Cancel_Reason__c != \'主动取消\''; } // 2020/07/08 taoqz add end Schema.SObjectType ssOliType = Schema.getGlobalDescribe().get(String.valueOf(oliMapping.get('SS_TableName__c'))); for (Rental_Apply_Equipment_Set__c oli : Database.query(oliSql)) { SObject rscObj = ssOliType.newSObject(); for (Integer i = 1; i <= FIELDMAX; i++) { String lpadI = ('00' + i).right(3); String fromColumn = 'From_Column_' + lpadI + '__c'; String apiStr = String.valueOf(oliMapping.get(fromColumn)); if (String.isBlank(apiStr) == false) { String ssColumn = 'SS_Column_' + lpadI + '__c'; String ssApiStr = String.valueOf(oliMapping.get(ssColumn)); rscObj.put(ssApiStr, getValue(oli, apiStr)); } } rscObj.put('createDate__c', today); if (createDate != null) { rscObj.put('createDate__c', createDate); } raescList.add(rscObj); raescId.add(oli.Id); } //--------------------------------------------------------------------------------------------------------------------- List raesdcList = new List(); List raesdcId = new List(); SS_Batch_Column_Mapping__c rentalMapping = SS_Batch_Column_Mapping__c.getValues('Rental_Apply_Equipment_Set_Detail__c'); Set rentalTempSet = new Set(); String rentalSql = makeSql(rentalMapping, rentalTempSet); rentalSql += ' where Rental_Apply_Equipment_Set__c IN :raescId'; // 2020/07/08 taoqz add start // 取消理由:重新分配,分配替代品,主动取消剔除 // 备品用途附属品F=false AND 是第一条备品配套明细=true // 回库确认完毕日:在2019年4月1日以前的剔除 if (TEST_ID == null){ Date arrivalwhday = Date.newInstance(2019, 4, 1); rentalSql += ' and Cancel_Reason__c != \'重新分配\' and Cancel_Reason__c != \'分配代替品\' and Cancel_Reason__c != \'主动取消\''; rentalSql += ' and Loaner_accsessary_F__c = false and Is_First_RAESD_F__c = true'; rentalSql += ' and ( Arrival_wh_day__c >= :arrivalwhday or Arrival_wh_day__c = null) '; } // 2020/07/08 taoqz add end Schema.SObjectType rentalType = Schema.getGlobalDescribe().get(String.valueOf(rentalMapping.get('SS_TableName__c'))); for (Rental_Apply_Equipment_Set_Detail__c oli : Database.query(rentalSql)) { SObject reaObj = rentalType.newSObject(); //raesdcList.add(reaObj); for (Integer i = 1; i <= FIELDMAX; i++) { String lpadI = ('00' + i).right(3); String fromColumn = 'From_Column_' + lpadI + '__c'; String apiStr = String.valueOf(rentalMapping.get(fromColumn)); if (String.isBlank(apiStr) == false) { String ssColumn = 'SS_Column_' + lpadI + '__c'; String ssApiStr = String.valueOf(rentalMapping.get(ssColumn)); reaObj.put(ssApiStr, getValue(oli, apiStr)); } } reaObj.put('createDate__c', today); if (createDate != null) { reaObj.put('createDate__c', createDate); } raesdcList.add(reaObj); raesdcId.add(oli.Id); } String tmp = iflog.ErrorLog__c; if (iflog.ErrorLog__c == null) { tmp = ''; } list ErrorIDlist = new list(); //insert insRACList; Database.SaveResult[] lsr2 = Database.insert(insRACList, false); for (SObject temRental_Apply : insRACList) { if (temRental_Apply.get('id') == null) { ErrorIDlist.add( (ID) temRental_Apply.get('Id__c')); } } for (Integer tIdx = 0; tIdx < lsr2.size(); tIdx++) { Database.SaveResult sr = lsr2[tIdx]; if (!sr.isSuccess()) { String message = ''; for (Database.Error err : sr.getErrors()) { message = '\n\n 错误数据类型:Rental_Apply__c' + '\n 错误信息:' + err.getStatusCode() + ':' + err.getMessage(); break; } tmp += message; } } //insert raescList; Database.SaveResult[] lsr3 = Database.insert(raescList, false); for (SObject temRaes : raescList) { if (temRaes.get('id') == null) { ErrorIDlist.add( (ID) temRaes.get('Id__c')); } } for (Integer tIdx = 0; tIdx < lsr3.size(); tIdx++) { Database.SaveResult sr = lsr3[tIdx]; if (!sr.isSuccess()) { String message = ''; for (Database.Error err : sr.getErrors()) { message = '\n\n 错误数据类型:Rental_Apply_Equipment_Set_Detail__c' + '\n 错误信息:' + err.getStatusCode() + ':' + err.getMessage(); break; } tmp += message; } } //insert raesdcList; Database.SaveResult[] lsr4 = Database.insert(raesdcList, false); for (SObject temraesdc : raesdcList) { if (temraesdc.get('id') == null) { ErrorIDlist.add( (ID) temraesdc.get('Id__c')); } } for (Integer tIdx = 0; tIdx < lsr4.size(); tIdx++) { Database.SaveResult sr = lsr4[tIdx]; if (!sr.isSuccess()) { String message = ''; for (Database.Error err : sr.getErrors()) { message = '\n\n错误数据类型:Rental_Apply_Equipment_Set__c' + '\n 错误信息:' + err.getStatusCode() + ':' + err.getMessage(); break; } tmp += message; } } if (ErrorIDlist.size() > 0 ) { tmp += '\n 更新失败原数据ID:' + ErrorIDlist; } if (tmp != null && tmp.length() > 65000) { tmp = tmp.substring(0, 65000); tmp += ' ...have more lines...'; } iflog.ErrorLog__c = tmp; } catch (Exception ex) { iflog.ErrorLog__c += ex; } update iflog; } //-------------------------------------------------------------------------------------------------------------------------- public void finish(Database.BatchableContext BC) { list ifloglist = [select id , ErrorLog__c, Log__c from BatchIF_Log__c where id = : iflog.id]; if (ifloglist.size() > 0 ) { iflog = ifloglist[0]; } iflog.Log__c += '\n SSPowerBIBatch end'; String tmp = iflog.ErrorLog__c; if (tmp != null && tmp.length() > 65000) { tmp = tmp.substring(0, 65000); tmp += ' ...have more lines...'; iflog.ErrorLog__c = tmp; } upsert iflog; } }