public with sharing class NFM009Controller { //CHAN-BSV3GZ SAP返回状态值 start public static String status; // CHAN-BSV3GZ end public class DataBean { public NFMUtil.Monitoring Monitoring; public Forecast_element[] Forecast; } public class Forecast_element { public String QuotationCode; public String SalesPoint; public String ProspectCategory; public String SalesChannel; public String Agent1Code; public String EnduserCode; public String DepartmentCode; public String Currency_x; public String ForecastDate; public String SalesPersonCode; public String SalesPersonName; public String QuotationLevel; public String CLBICCategory; public String Other1; public Detail_element[] Detail; public PresalesPerson_element[] PresalesPerson; } public class Detail_element { public String ItemCode; public String ItemQuantity; } public class PresalesPerson_element{ public String PresalesPersonCode; public String PresalesPersonName; } //@future (callout=true) //public static void calloutFuture(String iflog_Id,List oppIds){ // callout(iflog_Id,oppIds); //} //xinhonglu public static void callout(BatchIF_Log__c iflog, List oppIds){ //public static void callout(String iflog_Id, List oppIds){ if (oppIds == null || oppIds.size() == 0) { return; } //insert iflog; //if(iflog == null){ // return; //} // MessageGroupNumber の取得 //List iflogList = [Select Id, Name, Log__c, ErrorLog__c from BatchIF_Log__c where Id = :iflog_Id]; //BatchIF_Log__c iflog = null; //if (iflogList.size() > 0) { // iflog = iflogList.get(0); // iflog.ErrorLog__c = ''; //} else { // // データ取れってないとは、rollbackされていることです // return; //} String logstr = iflog.Log__c + ' ' + 'NumberOfRecord=' + oppIds.size() +'\n'; DataBean db = new DataBean(); NFMUtil.Monitoring me = new NFMUtil.Monitoring(); Datetime nowDT = Datetime.now(); String nowStr = nowDT.format('yyyyMMddHHmm'); me.Tag = 'MSGH'; me.Sender = 'SFDC'; me.Receiver = 'SAP'; me.MessageType = 'SFDC002'; me.MessageGroupNumber = iflog.Name; me.NumberOfRecord = '' + oppIds.size(); me.TransmissionDateTime = nowStr; me.Text = ''; db.Monitoring = me; BatchIF_Log__c rowData = null; // BatchIF転送表 から、コード変換のMapを作成 Map transferMap = new Map(); List transferList = [select Table__c, Column__c, External_value__c, Internal_value__c from BatchIF_Transfer__c where Dropped_Flag__c = false and Table__c = 'Opportunity']; for (BatchIF_Transfer__c t : transferList) { transferMap.put(t.Column__c + t.Internal_value__c, t.External_value__c); } try{ // 転送データを取得、参照先のデータがあるので、ここで検索必要です。 List oppList = [select Id, Name, CurrencyIsoCode, Owner.Name, Owner.Employee_No__c, Opportunity_No__c, SalesPoint_Code__c, Account.AgencyContract_Management_Code__c, Sales_Root__c, Opportunity_Category__c, Agency1__r.Management_Code__c, Purchase_Type__c, Competitor__c, Close_Forecasted_Date__c, CloseDate, Hospital__c, Hospital__r.Management_Code__c, Account.Id, Account.Management_Code__c, Account.RecordType.DeveloperName, Account.Name, Account.ParentId, Account.Parent.Management_Code__c, OCM_Agent1_Price__c, Agency1__c, Agency2__c, Agency2__r.Management_Code__c, Promise_Class__c, Fund_Basis__c, Authorized_DB_No__c, NotesApprovedNo__c, Sales_Contract_No__c, Salesdepartment_Owner__c, STMS_Package_Sale__c, Equipment_Order_Flg__c from Opportunity where Id IN :oppIds]; System.debug(Logginglevel.DEBUG, 'NFM009_ oppList.size()=' + oppList.size()); System.debug(Logginglevel.DEBUG, 'Opportunity++++1' + oppList.get(0)); // Forecastのデータの設定 db.Forecast = new List(); List oppIdList = new List(); for(Opportunity opp : oppList){ oppIdList.add(opp.Id); } // 商談商品情報を取得 List oppLiList = [select Id, Quantity, PricebookEntry.ProductCode, OpportunityId, Opportunity.Opportunity_No__c, Item_Order__c,ListPrice__c,UnitPrice__c, //CHAN-BX66KN add 2021-01-14 by gwy start PricebookEntry.Product2.SFDA_Status__c,PricebookEntry.Product2.Correspond_Code__r.SFDA_Status__c, PricebookEntry.Product2.SFDA_Approbated_Status__c,PricebookEntry.Product2.Correspond_Code__c ,PricebookEntry.Product2.Correspond_ProductCode__c //CHAN-BX66KN add 2021-01-14 by gwy end from OpportunityLineItem where Opportunity.Id = :oppIdList]; // チームメンバー List oppTMList = [select Id, User.Employee_No__c, User.Name, OpportunityId, Opportunity.Opportunity_No__c from OpportunityTeamMember where OpportunityId in :oppIdList]; Map> oppTZMap = new Map>(); Map> oppLiMap = new Map>(); Map> oppTMMap = new Map>(); for(OpportunityLineItem oli:oppLiList){ if(oppLiMap.containsKey(oli.Opportunity.Opportunity_No__c)){ oppLiMap.get(oli.Opportunity.Opportunity_No__c).add(oli); }else { List oliList = new List(); oliList.add(oli); oppLiMap.put(oli.Opportunity.Opportunity_No__c,oliList); } //gwy 2021-01-14 if((oli.PricebookEntry.Product2.SFDA_Status__c == '停止' && oli.PricebookEntry.Product2.Correspond_Code__r.SFDA_Status__c == '停止') || (oli.PricebookEntry.Product2.SFDA_Status__c == '停止' && String.isBlank(oli.PricebookEntry.Product2.Correspond_Code__c))){ if(oppTZMap.containsKey(oli.Opportunity.Opportunity_No__c)){ oppTZMap.get(oli.Opportunity.Opportunity_No__c).add(oli); }else { List otzList = new List(); otzList.add(oli); oppTZMap.put(oli.Opportunity.Opportunity_No__c,otzList); } } } for(OpportunityTeamMember otm:oppTMList){ if(oppTMMap.containsKey(otm.Opportunity.Opportunity_No__c)){ oppTMMap.get(otm.Opportunity.Opportunity_No__c).add(otm); } else { List otmList = new List(); otmList.add(otm); oppTMMap.put(otm.Opportunity.Opportunity_No__c,otmList); } } for(Opportunity opp : oppList){ //gwy 2021-01-14 if(oppTZMap.containsKey(opp.Opportunity_No__c)){ iflog.ErrorLog__c='Error! QuotationCode[' +opp.Opportunity_No__c+ '] contain inactive product. This DN is skipped.\n'; continue; } Forecast_element fe = new Forecast_element(); db.Forecast.add(fe); fe.QuotationCode = opp.Opportunity_No__c; fe.SalesPoint = opp.SalesPoint_Code__c; fe.SalesPersonCode = opp.Owner.Employee_No__c; fe.SalesPersonName = opp.Owner.Name; fe.Currency_x = opp.CurrencyIsoCode; System.debug(Logginglevel.ERROR, 'NFM009_Account RecordType:' + opp.Account.RecordType.DeveloperName); if (opp.Account.RecordType.DeveloperName == 'AgencyContract') { // 合同编码 fe.EnduserCode = opp.Account.AgencyContract_Management_Code__c; fe.DepartmentCode = opp.Account.AgencyContract_Management_Code__c; System.debug(Logginglevel.ERROR, 'NFM009_AgencyContract EnduserCode:' + fe.EnduserCode); System.debug(Logginglevel.ERROR, 'NFM009_AgencyContract DepartmentCode:' + fe.DepartmentCode); } else { fe.EnduserCode = opp.Hospital__r.Management_Code__c; fe.DepartmentCode = opp.Account.Management_Code__c; System.debug(Logginglevel.ERROR, 'NFM009_Hospital EnduserCode:' + fe.EnduserCode); System.debug(Logginglevel.ERROR, 'NFM009_Hospital DepartmentCode:' + fe.DepartmentCode); } fe.SalesChannel = NFMUtil.getMapValue(transferMap, 'Sales_Root__c', opp.Sales_Root__c, iflog); //20190107 if(opp.Sales_Root__c == '販売店' && String.isBlank(opp.Agency1__c)){ fe.Agent1Code = opp.Hospital__r.Management_Code__c; } else { fe.Agent1Code = opp.Agency1__r.Management_Code__c; } fe.CLBICCategory = NFMUtil.getMapValue(transferMap, 'Opportunity_Category__c', opp.Opportunity_Category__c, iflog); fe.ProspectCategory = NFMUtil.getMapValue(transferMap, 'Purchase_Type__c', opp.Purchase_Type__c, iflog); fe.ForecastDate = NFMUtil.formatDate2Str(opp.CloseDate); fe.QuotationLevel = opp.Competitor__c; fe.Other1 = NFMUtil.getMapValue(transferMap, 'Salesdepartment_Owner__c', opp.Salesdepartment_Owner__c, iflog); fe.Detail = new List(); if(oppLiMap.get(opp.Opportunity_No__c) != null){ for (Integer i = 0; i < oppLiMap.get(opp.Opportunity_No__c).size(); i++) { Detail_element de = new Detail_element(); fe.Detail.add(de); //CHAN-BX66KN update by gwy 2021-02-07 start de.ItemCode = oppLiMap.get(opp.Opportunity_No__c).get(i).PricebookEntry.Product2.Correspond_Code__c == null ? oppLiMap.get(opp.Opportunity_No__c).get(i).PricebookEntry.ProductCode: oppLiMap.get(opp.Opportunity_No__c).get(i).PricebookEntry.Product2.Correspond_ProductCode__c; //CHAN-BX66KN update by gwy 2021-02-07 end de.ItemQuantity = String.valueOf(oppLiMap.get(opp.Opportunity_No__c).get(i).Quantity); } } fe.PresalesPerson = new List(); if(oppTMMap.get(opp.Opportunity_No__c) != null){ for (Integer i = 0; i < oppTMMap.get(opp.Opportunity_No__c).size(); i++) { PresalesPerson_element pe = new PresalesPerson_element(); fe.PresalesPerson.add(pe); pe.PresalesPersonCode = oppTMMap.get(opp.Opportunity_No__c).get(i).User.Employee_No__c; pe.PresalesPersonName = oppTMMap.get(opp.Opportunity_No__c).get(i).User.Name; } } system.debug('fe.PresalesPerson' + fe.PresalesPerson); if(oppLiMap.get(opp.Opportunity_No__c) != null && oppTMMap.get(opp.Opportunity_No__c) != null){ logstr += fe.QuotationCode + 'Detail[' + oppLiMap.get(opp.Opportunity_No__c).size() + ']PresalesPerson[' + oppTMMap.get(opp.Opportunity_No__c).size() + '] '; } } if (db.Forecast.size() > 0) { logstr += '\ncallout count=' + db.Forecast.size(); // 原則非同期ですので、logsを確認する必要がないでしょう。 NFMUtil.Monitoring Monitoring = new NFMUtil.Monitoring(); Monitoring.Tag = db.Monitoring.Tag; Monitoring.Sender = db.Monitoring.Sender; Monitoring.Receiver = db.Monitoring.Receiver; Monitoring.MessageType = db.Monitoring.MessageType; Monitoring.MessageGroupNumber = db.Monitoring.MessageGroupNumber; Monitoring.NumberOfRecord = db.Monitoring.NumberOfRecord; Monitoring.TransmissionDateTime = db.Monitoring.TransmissionDateTime; Monitoring.Text = ''; rowData = NFMUtil.makeRowData(Monitoring, 'NFM009', db); System.debug('+++++rowData+++++' + rowData); execute(rowData, iflog); } // CHAN-BSV3GZ start // 保存 status 状态 logstr += '\nStatus:' + status; //CHAN-BSV3GZ end logstr += '\nend'; if(System.Test.isRunningTest()){ Opportunity opportunityInfos = null; update opportunityInfos; } } catch(Exception ex) { // エラーが発生した場合 System.debug(Logginglevel.ERROR, 'NFM009_' + iflog.Name + ':' + ex.getMessage()); System.debug(Logginglevel.ERROR, 'NFM009_' + iflog.Name + ':' + ex.getStackTraceString()); logstr += ex.getMessage(); iflog.ErrorLog__c += ex.getMessage() + '\n'; iflog.ErrorLog__c += ex.getStackTraceString() + '\n'; } if (rowData != null) { insert rowData; } System.debug(Logginglevel.DEBUG, 'NFM009_' + iflog.Name + ' end'); iflog.Log__c = logstr; //update iflog; //insert iflog; upsert iflog; } public static void execute2(String rowDataId) { List row = [select id, name, MessageGroupNumber__c, retry_cnt__c, RowDataFlg__c, ErrorLog__c, Type__c, Log__c, Log2__c, Log3__c, Log4__c, Log5__c, Log6__c, Log7__c, Log8__c, Log9__c, Log10__c, Log11__c, Log12__c from BatchIF_Log__c where id = :rowDataId]; if (row.size() > 0) execute(row[0], null); } public static void execute(BatchIF_Log__c rowData, BatchIF_Log__c iflog) { //xinhonglu Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt); String rowDataStr = NFMUtil.getRowDataStr(rowData); System.debug('+++11111111--rowData--111111111111+++++(' + rowData+')'); DataBean db = (DataBean) JSON.deserialize(rowDataStr, DataBean.class); String logstr = db.Monitoring.MessageGroupNumber + ' start\n'; Boolean needUpdateIflog = false; if (iflog == null) { needUpdateIflog = true; iflog = new BatchIF_Log__c(); iflog.Type__c = 'NFM009'; iflog.MessageGroupNumber__c = db.Monitoring.MessageGroupNumber; iflog.Log__c = logstr; iflog.ErrorLog__c = ''; } else { logstr = iflog.Log__c; } try{ // CHAN-BSV3GZ start // 原逻辑 //NFMUtil.sendToSap(rowDataStr, NFMUtil.NFM009_ENDPOINT); // 接收 SAP返回状态 status = NFMUtil.sendToSapRet(rowDataStr, NFMUtil.NFM009_ENDPOINT); // CHAN-BSV3GZ end logstr += '\nstatus:' + status; // CHAN-BSV3GZ start // 原代码 // rowData.retry_cnt__c=0; if (status == 'OK') { rowData.retry_cnt__c = 0; } else { if (rowData.retry_cnt__c == null) rowData.retry_cnt__c = 0; if (rowData.retry_cnt__c < batch_retry_max_cnt) { rowData.retry_cnt__c++; LogAutoSendSchedule.assignOneMinute(); } if (rowData.retry_cnt__c >= batch_retry_max_cnt) { rowData.ErrorLog__c = 'status:' + status + '\n错误次数已经超过自动送信设定的最大次数,请手动送信'; } } // CHAN-BSV3GZ end }catch(Exception ex) { // TODO IOException // エラーが発生した場合 System.debug(Logginglevel.ERROR, 'NFM009_' + iflog.Name + ':' + ex.getMessage()); System.debug(Logginglevel.ERROR, 'NFM009_' + iflog.Name + ':' + ex.getStackTraceString()); logstr += ex.getMessage(); iflog.ErrorLog__c += ex.getMessage() + '\n'; iflog.ErrorLog__c += ex.getStackTraceString() + '\n'; if (rowData.retry_cnt__c == null) rowData.retry_cnt__c = 0; if (rowData.retry_cnt__c < batch_retry_max_cnt){ rowData.retry_cnt__c++; LogAutoSendSchedule.assignOneMinute(); } if (rowData.retry_cnt__c >= batch_retry_max_cnt){ rowData.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + rowData.ErrorLog__c+'错误次数已经超过自动送信设定的最大次数,请手动送信'; } } iflog.Log__c = logstr; if (needUpdateIflog) { insert iflog; update rowData; } } }