public with sharing class SetProductTargetBatch implements Database.Batchable { String query; // 现在年度 private Integer currentYear; // 既存目标数据 private Map oppsMap; private Map keysMap; private Map oliMap; // 目标区分 // public String target_category; private RecordType rt; private Map> proportion; // 比重 //public static List amountCategory; public static List pcList; public static Map isCntMap = new Map(); // 初始化,查询赋值 pcList static { pcList = [select depName__c,importantProductGoaIName__c,commodityCode__c,commodityName__c,if_Quantity__c,sort__c from ImportantProductCategory__c order by sort__c]; for (ImportantProductCategory__c pc : pcList) { isCntMap.put(pc.importantProductGoaIName__c + '_' + pc.depName__c, pc.if_Quantity__c); } } // 重点产品API名图 private static Map impProductApiMap = SetProductTargetController.impProductApiMap; /** * 构造器,初始化 */ public SetProductTargetBatch(){ } /** * 开始方法 */ public Database.QueryLocator start(Database.BatchableContext BC) { // 查询中间表,获取当前 年 的信息 key__c 剪切, 第二数据是数字字段名 query = 'select key__c,SAP_Province__c,iYear__c,Owner_System__c,Department__c,Num_Of_OPD__c,Target_Source__c from Key_Product_Goals__c where Is_Processing__c = true'; // iYear__c = \'' + iYear + ' return Database.getQueryLocator(query); } /** * 执行方法,添加保存 */ public void execute(Database.BatchableContext BC, List Key_Product_Goals) { system.debug('SetProductTargetBatch开始。'); init(Key_Product_Goals); system.debug('oppsMap ++++' + oppsMap.size() + oppsMap); system.debug('Key_Product_Goals.size()'); system.debug(Key_Product_Goals.size()); List insertList = new List(); List updateList = new List(); List deleteList = new List(); // 将 查询出来的 中间表数据,赋值为 FALSE List klist = new List(); // Savepoint sp = Database.setSavepoint(); Map oppAmount = new Map(); Map saveAmountCategoryMap = new Map(); for (Key_Product_Goals__c Key_Product_Goal: Key_Product_Goals) { String key = Key_Product_Goal.key__c; list user_Id_target_category = key.split('_'); if(user_Id_target_category.size() < 5){ return; } Key_Product_Goal.Is_Processing__c = false; // string user_Id = user_Id_target_category[0]; string target_category = user_Id_target_category[1]; string importantProductGoaIName = user_Id_target_category[2]; string depName = user_Id_target_category[3]; String target_Source = user_Id_target_category[4]; // 一年分成12条数据 for (Integer i = 0; i < 12; i++) { Integer y = Integer.valueOf(Key_Product_Goal.iYear__c); Integer m = 4 + i; if (m > 12) { y += 1; m -= 12; } String syear = String.valueOf(y); String smonth = String.valueOf(m); if (m < 10) { smonth = '0' + smonth; } String sTagetDay = syear + '-' + smonth + '-01'; Date tagetDay = Date.valueOf(sTagetDay); // 按金额分类顺序处理 // 数据检索Key String tem_key = key + '_' + sTagetDay; system.debug('tem_key++++++ ' + tem_key); Opportunity newopp = new Opportunity(); // 每月数据赋值 if (oppsMap.containskey(tem_key)) { newopp = oppsMap.get(tem_key); if (Key_Product_Goal.Num_Of_OPD__c == null || Key_Product_Goal.Num_Of_OPD__c == 0) { deleteList.add(newopp); continue; } newopp.OwnerId = Key_Product_Goal.Owner_System__c; newopp.Owner_System__c = Key_Product_Goal.Owner_System__c; String tem_depName = (depName == null || depName == '') ? 'GI' : depName; newopp.Proportion__c = proportion.get(tem_depName)[i]; newopp.Num_Of_OPD__c = Key_Product_Goal.Num_Of_OPD__c; oppAmount.put(newopp.Id, Key_Product_Goal.Num_Of_OPD__c); system.debug('待更新'); updateList.add(newopp); if (!saveAmountCategoryMap.containskey(importantProductGoaIName + '_' + depName)) { saveAmountCategoryMap.put(importantProductGoaIName + '_' + depName, importantProductGoaIName + '_' + depName); } } else { if (Key_Product_Goal.Num_Of_OPD__c == null || Key_Product_Goal.Num_Of_OPD__c == 0) { continue; } newopp.Name = Key_Product_Goal.SAP_Province__c + ' ' + importantProductGoaIName; newopp.StageName = '目標'; newopp.OwnerId = Key_Product_Goal.Owner_System__c; // トリガをスルーのため、ここでやります newopp.Owner_System__c = Key_Product_Goal.Owner_System__c; newopp.Opportunity_Category__c = depName; String tem_depName = (depName == null || depName == '') ? 'GI' : depName; newopp.Proportion__c = proportion.get(tem_depName)[i]; newopp.CloseDate = tagetDay; newopp.Num_Of_OPD__c = Key_Product_Goal.Num_Of_OPD__c; newopp.Target_category__c = target_category; newopp.Important_Key_product_category__c = importantProductGoaIName; newopp.SAP_Province__c = Key_Product_Goal.SAP_Province__c; newopp.RecordTypeId = rt.Id; newopp.OCM_Target_period__c = String.valueOf(integer.valueOf(Key_Product_Goal.iYear__c) - 1867 + 'P'); newopp.Target_Source__c = target_Source; insertList.add(newopp); if (!saveAmountCategoryMap.containskey(importantProductGoaIName + '_' + depName)) { saveAmountCategoryMap.put(importantProductGoaIName + '_' + depName, importantProductGoaIName + '_' + depName); } } } } // トリガをスルー StaticParameter.EscapeOpportunityBefUpdTrigger = true; StaticParameter.EscapeOpportunityHpDeptUpdTrigger = true; StaticParameter.EscapeSyncOpportunityTrigger = true; StaticParameter.EscapeNFM001Trigger = true; StaticParameter.EscapeNFM001AgencyContractTrigger = true; StaticParameter.EscapeNFM007Trigger = true; // 更新数据库 if (insertList.size() > 0) { // 添加数据 insert insertList; // 添加自定义日志 // bLog.Log3__c = '添加完成\n'; // update bLog; Map pricebookEntryMap = new Map(); // 搜索产品 for (ImportantProductCategory__c pc : pcList){ String dep = pc.depName__c; Map impmap = getImpProductMap(dep); String soql = 'select Id from PricebookEntry' + ' where IsActive = true ' + ' and Product2.' + impProductApiMap.get(pc.importantProductGoaIName__c) + ' = true'; if (dep != null && dep.length() > 0) { soql += ' and Product2.' + impmap.get(pc.importantProductGoaIName__c) + ' = true'; } soql += ' and CurrencyIsoCode = \'CNY\' limit 1'; System.debug('zheli000:'+soql); List pbes = Database.query(soql); if (pbes.size() < 1) { return; } system.debug('zheli001:'+pc+'~'+pbes[0]); pricebookEntryMap.put(pc.importantProductGoaIName__c + '_' + pc.depName__c, pbes[0]); } system.debug('zheli002:'+insertList+'~'+isCntMap); // 商談新規後、商談商品作成 List oli = new List(); for (Opportunity insOpp : [select Id, Amount,Num_Of_OPD__c,Important_Key_product_category__c,Opportunity_Category__c,Objective__c from Opportunity where Id in :insertList]) { oli.add(new OpportunityLineItem( OpportunityId = insOpp.Id, PricebookEntryId = pricebookEntryMap.get(insOpp.Important_Key_product_category__c + '_' + insOpp.Opportunity_Category__c).Id, Quantity = isCntMap.get(insOpp.Important_Key_product_category__c + '_' + insOpp.Opportunity_Category__c) == false ? 1 : insOpp.Num_Of_OPD__c, UnitPrice = isCntMap.get(insOpp.Important_Key_product_category__c + '_' + insOpp.Opportunity_Category__c) == false ? insOpp.Num_Of_OPD__c : 0 )); } // oli 插入数据 询价产品 system.debug('zheli003:'+oli); insert oli; // 添加自定义数据 // bLog.Log3__c += 'oli 插入完成'; // update bLog; } if (updateList.size() > 0) { // 更新 询价 update updateList; // bLog.Log2__c = '更新完成\n'; // update bLog; List oli = new List(); for (OpportunityLineItem updOli : [select Id, OpportunityId, Opportunity.Important_Key_product_category__c, Opportunity.Opportunity_Category__c from OpportunityLineItem where OpportunityId in : updateList]) { updOli.UnitPrice = isCntMap.get(updOli.Opportunity.Important_Key_product_category__c + '_' + updOli.Opportunity.Opportunity_Category__c) == false ? oppAmount.get(updOli.OpportunityId) : 0; updOli.Quantity = isCntMap.get(updOli.Opportunity.Important_Key_product_category__c + '_' + updOli.Opportunity.Opportunity_Category__c) == false ? 1 : oppAmount.get(updOli.OpportunityId); oli.add(updOli); } // 更新 oli 询价产品 update oli; // 添加自定义数据 // bLog.Log2__c += 'oli 更新完成'; // update bLog; } if (deleteList.size() > 0) {system.debug('=====saveLogic-5');delete deleteList;} upsert Key_Product_Goals; } /** * 完成方法 */ public void finish(Database.BatchableContext BC) { // list ifloglist = [select id , ErrorLog__c, Log__c from BatchIF_Log__c where id = : bLog.id]; // if (ifloglist.size() > 0 ) { // bLog = ifloglist[0]; // } // bLog.Log__c += '\n SSPowerBIBatch end'; // String tmp = bLog.ErrorLog__c; // if (tmp != null && tmp.length() > 65000) { // tmp = tmp.substring(0, 65000); // tmp += ' ...have more lines...'; // bLog.ErrorLog__c = tmp; // } //upsert bLog; } private Map getImpProductMap(String ac) { Map impmap = new Map { '重点产品01' => 'Important_Rroduct_1' + ac +'__c', '重点产品02' => 'Important_Rroduct_2' + ac +'__c', '重点产品03' => 'Important_Rroduct_3' + ac +'__c', '重点产品04' => 'Important_Rroduct_4' + ac +'__c', '重点产品05' => 'Important_Rroduct_5' + ac +'__c', '重点产品06' => 'Important_Rroduct_6' + ac +'__c', '重点产品07' => 'Important_Rroduct_7' + ac +'__c', '重点产品08' => 'Important_Rroduct_8' + ac +'__c', '重点产品09' => 'Important_Rroduct_9' + ac +'__c', '重点产品10' => 'Important_Rroduct_10' + ac +'__c', '重点产品11' => 'Important_Rroduct_11' + ac +'__c', '重点产品12' => 'Important_Rroduct_12' + ac +'__c', '重点产品13' => 'Important_Rroduct_13' + ac +'__c', '重点产品14' => 'Important_Rroduct_14' + ac +'__c', '重点产品15' => 'Important_Rroduct_15' + ac +'__c', '重点产品16' => 'Important_Rroduct_16' + ac +'__c', '重点产品17' => 'Important_Rroduct_17' + ac +'__c', '重点产品18' => 'Important_Rroduct_18' + ac +'__c', '重点产品19' => 'Important_Rroduct_19' + ac +'__c', '重点产品20' => 'Important_Rroduct_20' + ac +'__c', '重点产品21' => 'Important_Rroduct_21' + ac +'__c', '重点产品22' => 'Important_Rroduct_22' + ac +'__c', '重点产品23' => 'Important_Rroduct_23' + ac +'__c', '重点产品24' => 'Important_Rroduct_24' + ac +'__c', '重点产品25' => 'Important_Rroduct_25' + ac +'__c', '重点产品26' => 'Important_Rroduct_26' + ac +'__c', '重点产品27' => 'Important_Rroduct_27' + ac +'__c', '重点产品28' => 'Important_Rroduct_28' + ac +'__c', '重点产品29' => 'Important_Rroduct_29' + ac +'__c', '重点产品30' => 'Important_Rroduct_30' + ac +'__c', '重点产品31' => 'Important_Rroduct_31' + ac +'__c' }; return impmap; } private void init(List Key_Product_Goals){ system.debug('init 11111'); // 每月比重 if (proportion == null) { proportion = new Map>(); String strObjectiveProportionGI = System.Label.ObjectiveProportionGI; List objectiveProportionGI = strObjectiveProportionGI.split(','); List doubleGI = new List(); for (String strGI : objectiveProportionGI) { doubleGI.add(Double.valueOf(strGI)); } proportion.put('GI', doubleGI); String strObjectiveProportionET = System.Label.ObjectiveProportionET; List objectiveProportionET = strObjectiveProportionET.split(','); List doubleET = new List(); for (String strET : objectiveProportionET) { doubleET.add(Double.valueOf(strET)); } proportion.put('ET', doubleET); String strObjectiveProportionBF = System.Label.ObjectiveProportionBF; List objectiveProportionBF = strObjectiveProportionBF.split(','); List doubleBF = new List(); for (String strBF : objectiveProportionBF) { doubleBF.add(Double.valueOf(strBF)); } proportion.put('BF', doubleBF); String strObjectiveProportionGS = System.Label.ObjectiveProportionGS; List objectiveProportionGS = strObjectiveProportionGS.split(','); List doubleGS = new List(); for (String strGS : objectiveProportionGS) { doubleGS.add(Double.valueOf(strGS)); } proportion.put('GS', doubleGS); String strObjectiveProportionURO = System.Label.ObjectiveProportionURO; List objectiveProportionURO = strObjectiveProportionURO.split(','); List doubleURO = new List(); for (String strURO : objectiveProportionURO) { doubleURO.add(Double.valueOf(strURO)); } proportion.put('URO', doubleURO); String strObjectiveProportionGYN = System.Label.ObjectiveProportionGYN; List objectiveProportionGYN = strObjectiveProportionGYN.split(','); List doubleGYN = new List(); for (String strGYN : objectiveProportionGYN) { doubleGYN.add(Double.valueOf(strGYN)); } proportion.put('GYN', doubleGYN); String strObjectiveProportionENT = System.Label.ObjectiveProportionENT; List objectiveProportionENT = strObjectiveProportionENT.split(','); List doubleENT = new List(); for (String strENT : objectiveProportionENT) { doubleENT.add(Double.valueOf(strENT)); } proportion.put('ENT', doubleENT); String strObjectiveProportionOTH = System.Label.ObjectiveProportionOTH; List objectiveProportionOTH = strObjectiveProportionOTH.split(','); List doubleOTH = new List(); for (String strOTH : objectiveProportionOTH) { doubleOTH.add(Double.valueOf(strOTH)); } proportion.put('OTH', doubleOTH); String strObjectiveProportionENG = System.Label.ObjectiveProportionENG; List objectiveProportionENG = strObjectiveProportionENG.split(','); List doubleENG = new List(); for (String strENG : objectiveProportionENG) { doubleENG.add(Double.valueOf(strENG)); } proportion.put('ENG', doubleENG); } //初始化既存目标数据 oppsMap = new Map(); oliMap = new Map(); string target_category = '省重点产品目标'; // 获取目标数据类型 if (rt == null) { rt = [select Id from RecordType where SobjectType = 'Opportunity' and IsActive = true and DeveloperName = 'Target']; } // 获取当前阶段(可能为这一周期与下一周期) Date dateNow = Date.today(); Integer year = dateNow.year(); Integer month = dateNow.month(); if (month < 4) { year -= 1; } currentYear = year; //WLIG-BZVDB4 20210414 ljh update start //string currentPeriod = String.valueOf(year - 1867 + 'P'); list currentPeriods = new list(); string currentPeriod = String.valueOf(year - 1867 + 'P'); currentPeriods.add(currentPeriod); currentPeriod = String.valueOf(year + 1 - 1867 + 'P'); currentPeriods.add(currentPeriod); currentPeriod = String.valueOf(year - 1 - 1867 + 'P'); currentPeriods.add(currentPeriod); //WLIG-BZVDB4 20210414 ljh update end system.debug('init 22222'); // 获取 省 用于搜索所对应询价 list provinces = new list(); // 获取 目标分类 用于搜索所对应询价 List target_Sources = new List(); for (Key_Product_Goals__c Key_Product : Key_Product_Goals) { string key = Key_Product.key__c; list user_Id_target_category = key.split('_'); if (user_Id_target_category.size() < 4) { //Database.rollback(sp); return; } Key_Product.Is_Processing__c = false; string user_Id = user_Id_target_category[0]; provinces.add(user_Id); target_Sources.add(Key_Product.Target_Source__c); } //获取既存Opportunity Opportunity[] opportunitys = [select Id, OwnerId, Opportunity_Category__c, Proportion__c, CloseDate, Amount, Objective__c, Target_category__c, Important_Key_product_category__c, SAP_Province__c, RecordTypeId, OCM_Target_period__c, Owner_System__c, Target_Source__c from Opportunity where Target_category__c = :target_category and RecordTypeId = :rt.Id //WLIG-BZVDB4 20210414 ljh update START //and OCM_Target_period__c = :currentPeriod and OCM_Target_period__c in :currentPeriodS //WLIG-BZVDB4 20210414 ljh update end and SAP_Province__c in :provinces and Target_Source__c in :target_Sources]; system.debug('init 33333' + 'target_category' + target_category + 'currentPeriod' + currentPeriod + 'provinces' + provinces + 'target_Source' + target_Sources); system.debug('既存Opportunitys:'+opportunitys); if(opportunitys.size() <= 0) return; for (Opportunity opp : opportunitys) { if (opp.OwnerId != null && opp.CloseDate !=null){ //数据检索key String key = opp.SAP_Province__c + '_' + opp.Target_category__c + '_' + opp.Important_Key_product_category__c + '_' + opp.Opportunity_Category__c + '_' + opp.Target_Source__c + '_' + String.valueOf(opp.CloseDate); system.debug('=======key'+key); oppsMap.put(key, opp); } } // 获取既存商品作成 AggregateResult[] opportunityLineItems = [select OpportunityId,SUM(NumberOfObjective__c) sum_n,SUM(Objective__c) sum_o from OpportunityLineItem where OpportunityId in :opportunitys group by OpportunityId]; oliMap = new Map(); for (AggregateResult oli : opportunityLineItems) { oliMap.put((String) oli.get('OpportunityId'), oli); } } }