//create by rentx 2020-10-15 global class UpdateSAPContractNoTextBatch implements Database.Batchable, Database.Stateful { public List tempIds; global UpdateSAPContractNoTextBatch(List tempId) { this.tempIds = tempId; } global UpdateSAPContractNoTextBatch() { this.tempIds = new List(); } global Database.QueryLocator start(Database.BatchableContext bc) { //1.拿到明细2 String stasql = 'SELECT Id,sNo__c,Consumable_product__r.OT_CODE_Text__c,Consumable_order_minor__r.ContractNo__c,SerialLotNo__c,TracingCode__c,Consumable_product__c,Opportunity_No__c from Consumable_order_details2__c where Consumable_product__c != null and ((sNo__c != null and Consumable_order_minor__r.Opportunity__c != null) or Opportunity_No__c=null ) AND Consumable_product__r.OT_CODE_Text__c != null '; if (tempIds != null && tempIds.size() > 0) { stasql += 'AND Id in :tempIds '; } return Database.getQueryLocator(stasql); } global void execute(Database.BatchableContext BC, list codList) { //直接跳过明细2的触发器 StaticParameter.ConsumableAssetHanderTrigger = true; StaticParameter.EscapeOrderDetail2Trigger = true; //使用 消耗品明细2中的 消耗品名称 中的'产品编码.' + 明细2上的机身编码 拼接为保有设备标记为耗材的查询条件 //使用 消耗品明细2中的 消耗品名称 中的'产品编码.' + 明细2上的批次号 拼接为保有设备标记为主机的查询条件 Map codMap = new Map(); for(Consumable_order_details2__c codc : codList) { //耗材 String tempStr = codc.Consumable_product__r.OT_CODE_Text__c + ':' + codc.sNo__c; codMap.put(tempStr,codc); //主机 add by rentx 2020-12-02 if (codc.SerialLotNo__c != null) { String tempStr2 = codc.Consumable_product__r.OT_CODE_Text__c + ':' + codc.SerialLotNo__c; codMap.put(tempStr2,codc); } } //3.根据拼接好的值 查找对应的保有设备 List assList = new List(); assList = [SELECT Id,Product_Serial_No__c,TocodeAndSerialNumber__c,Backorder__r.Opportunity__r.Id,Backorder__r.Id,Backorder__r.ContractNO__c,Product_name_serial__c,SerialNumber,OT_CODE__c FROM Asset WHERE Backorder__c != null AND TocodeAndSerialNumber__c <> null AND TocodeAndSerialNumber__c in :codMap.keySet()]; Map assMap = new Map(); for (Asset ass : assList) { if(assMap.containsKey(ass.TocodeAndSerialNumber__c)) { continue; }else{ assMap.put(ass.TocodeAndSerialNumber__c, ass); } } //4.获取询价 List oppIds = new List(); //存放保有设备的OTCode+机身编码 检索用 和 询价id Map ssMap = new Map(); //存放询价id和拼好的SAP合同号字符串 Map ssMap2 = new Map(); //存放询价id和拼好的询价编码字符串 tcm 20211109 Map ssMap3 = new Map(); for(Asset ass :assMap.values()) { //如果保有设备的注残不为空 且注残上的询价也不为空 并且 OTCode+机身编码 检索用 也不为空 //添加保有设备上的 OTCode+机身编码 检索用 为key 询价的id为value if (ass.Backorder__c != null && ass.Backorder__r.Opportunity__c != null && ass.TocodeAndSerialNumber__c != null) { oppIds.add(ass.Backorder__r.Opportunity__r.Id); //将保有设备的TocodeAndSerialNumber__c作为key,oppid作为value ssMap.put(ass.TocodeAndSerialNumber__c, ass.Backorder__r.Opportunity__r.Id); } } //注残集合 List statuList = new List(); // tcm 添加查询字段 Opp_Number__c 20211109 statuList = [SELECT Id,Opportunity__c,ContractNO__c,Opp_Number__c FROM Statu_Achievements__c WHERE Opportunity__c in :oppIds]; for (String oppid : oppIds) { String str = ''; // tcm 20211110 str2 String str2; //遍历注残 for (Statu_Achievements__c statu : statuList) { if (statu.Opportunity__c == oppId && statu.ContractNO__c != null) { str += statu.ContractNO__c+','; } // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211109 start if (statu.Opportunity__c == oppId && statu.Opp_Number__c != null) { str2 = statu.Opp_Number__c; } // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211109 end } //将 询价id SAP合同号放入map if (str.length() > 0) { ssMap2.put(oppId, str.substring(0,str.length()-1)); } // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211109 start //将 询价id 询价编码放入map if (str2.length() > 0) {ssMap3.put(oppId, str2);} // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211109 end } //遍历查到的所有明细2 拼接明细2对应的保有设备中的 otcode加机身编码,以此为key获取ssmap中value->询价id,以询价id为key 获取ssmap2中的value->SAP合同号 for(Consumable_order_details2__c codc : codList) { String tempStr = codc.Consumable_product__r.OT_CODE_Text__c + ':' + codc.sNo__c; String tempStr2 = codc.Consumable_product__r.OT_CODE_Text__c + ':' + codc.SerialLotNo__c; if (ssMap.containsKey(tempStr) || ssMap.containsKey(tempStr2)) { String oppid = ssMap.get(tempStr); String oppid2 = ssMap.get(tempStr2); if (String.isNotBlank(ssMap2.get(oppid2))) { codc.ContractNo_text__c = ssMap2.get(oppid2); }else if (String.isNotBlank(ssMap2.get(oppid))) { codc.ContractNo_text__c = ssMap2.get(oppid); } // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211110 start //询价编码赋值 if (String.isNotBlank(ssMap3.get(oppid2))) { codc.Opportunity_No__c = ssMap3.get(oppid2); }else if (String.isNotBlank(ssMap3.get(oppid))) { codc.Opportunity_No__c = ssMap3.get(oppid); } // 【委托】ET消耗品系统自动生成出库数量大于当月发货数量 tcm 20211110 end } } if (codList.size() > 0) { update codList; } } global void finish(Database.BatchableContext BC) { } }