@RestResource(urlMapping = '/NFM010/*') global with sharing class NFM010Rest { global class AchievementsRest { public Achievements Achievements; } // Integer batchsize = 200; 考量する必要がないと思います。 global class Achievements { public NFMUtil.Monitoring Monitoring; public Achievement[] Achievement; } global class Achievement { public String SoNo; public String QuotationCode; public String ReturnFlag; public String OverviewStatus; public String ContractNO; public String ContractReceivedDate; public String FirstApproveDate; public String SecondApproveDate; public String SoLatestDeliveryDate; public String DeliveryDate; public String InstallDate; // 20200519 LZHU-BNV6QN Start public String CollectionDate; // 20200519 LZHU-BNV6QN End public String Currency_x; public Decimal ContractAmount; public Decimal PaymentAmount; public String PaymentRate; public String DeliveryStatus; public String AssignmentStatus; public String PaymentStatus; public String InstallStatus; public String AuthorizationNo; public String ContractApplicationNo; public String PaymentTerms; public Decimal TimeLimit; public Decimal SalesChannel; // CHAN-BHFAH4 Start public Decimal ContractAmountNoGurantee; // CHAN-BHFAH4 End //注残类型 public String OrderType; } @HttpPost global static void execute() { // 取得接口传输内容 String strData = RestContext.request.requestBody.toString(); AchievementsRest ges = (AchievementsRest) JSON.deserializeStrict(strData, AchievementsRest.class); if (ges == null ) { return; } NFMUtil.Monitoring Monitoring = ges.Achievements.Monitoring; if (Monitoring == null) { return; } BatchIF_Log__c rowData = NFMUtil.saveRowData(Monitoring, 'NFM010', ges.Achievements.Achievement); if (String.isBlank(rowData.Log__c) == false) { executefuture(rowData.Id); } // JSONを戻す RestResponse res = RestContext.response; res.addHeader('Content-Type', 'application/json'); res.statusCode = 200; //String jsonResponse = '{"status": "Success", "Message":' + gedata + '}'; String jsonResponse = '{"status": "Success", "Message":""}'; res.responseBody = blob.valueOf(jsonResponse); return; } @future global static void executefuture(String rowData_Id) { main(rowData_Id); } global static void main(String rowData_Id) { Integer batch_retry_max_cnt = Integer.valueOf(System.Label.batch_retry_max_cnt); BatchIF_Log__c rowData = [Select Id, Name, Log__c, ErrorLog__c, Log2__c, Log3__c, Log4__c, Log5__c, Log6__c, Log7__c, Log8__c, Log9__c, Log10__c, Log11__c, Log12__c, MessageGroupNumber__c, retry_cnt__c from BatchIF_Log__c where RowDataFlg__c = true and Id = :rowData_Id]; String logstr = rowData.MessageGroupNumber__c + ' start\n'; BatchIF_Log__c iflog = new BatchIF_Log__c(); iflog.Type__c = 'NFM010'; iflog.MessageGroupNumber__c = rowData.MessageGroupNumber__c; iflog.Log__c = logstr; iflog.ErrorLog__c = ''; insert iflog; String rowDataStr = NFMUtil.getRowDataStr(rowData); List achievementList = (List) JSON.deserialize(rowDataStr, List.class); if (achievementList == null || achievementList.size() == 0) { return; } // 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 = 'Statu_Achievements__c']; for (BatchIF_Transfer__c t : transferList) { transferMap.put(t.Column__c + t.External_value__c, t.Internal_value__c); } Savepoint sp = Database.setSavepoint(); try { // 更新対応配列とMapなどをセット List oppNoList = new List(); List statu_AchievementsList = new List(); for (Achievement Achievement : achievementList) { if (Achievement.SoNo == null || Achievement.SoNo == '' || Achievement.QuotationCode == null || Achievement.QuotationCode == '' || Achievement.TimeLimit == null ) { // 必須項目がない場合、処理と飛ばす continue; } oppNoList.add(Achievement.QuotationCode); statu_AchievementsList.add(Achievement.QuotationCode + ':' + Achievement.SoNo); } List oppList = [select Id, Opportunity_No__c, Min_FirstApproveDate__c, Note_Residual_Result__c, IsImport__c from Opportunity where Opportunity_No__c in :oppNoList]; Map oppsMap = new Map(); for (Opportunity opp : oppList) { oppsMap.put(opp.Opportunity_No__c, opp); } // 更新対応配列をセット List staList = new List(); Map staUpdateMap = new Map(); staList = [select Id, Name, Opportunity__c, Statu_Achievements_Ext__c, ReturnFlag__c, OverviewStatus__c, ContractNO__c, ContractReceivedDate__c, FirstApproveDate__c, LastApproveDate__c, SoLatestDeliveryDate__c, DeliveryDate__c, InstallDate__c, Collection_Day_Invoice__c, CurrencyIsoCode, ContractAmount__c, ContractAmountNoGurantee__c, PaymentAmount__c, Paid_Amount_Rate__c, X30_Deposit_Day__c, Deposit_In_Full_Day__c, PaymentRate__c, DeliveryStatus__c, AssignmentStatus__c, PaymentStatus__c, InstallStatus__c, AuthorizationNo__c, ContractApplicationNo__c, PaymentTerms__c, UnshippedAmount__c, End_User_price__c from Statu_Achievements__c where Statu_Achievements_Ext__c in :statu_AchievementsList]; for (Statu_Achievements__c statu_Achievements : staList) { staUpdateMap.put(statu_Achievements.Statu_Achievements_Ext__c, statu_Achievements); } Map oppUpdateMap = new Map(); for (Achievement Achievement : achievementList) { if (Achievement.SoNo == null || Achievement.SoNo == '') { // 必須項目がない場合、処理と飛ばす iflog.ErrorLog__c += 'SoNo is required\n'; continue; } if (Achievement.QuotationCode == null || Achievement.QuotationCode == '') { // 必須項目がない場合、処理と飛ばす iflog.ErrorLog__c += 'QuotationCode is required\n'; continue; } if (Achievement.TimeLimit == null) { // 必須項目がない場合、処理と飛ばす iflog.ErrorLog__c += 'TimeLimit is required\n'; continue; } // Boolean returnFlag = (Achievement.ReturnFlag == null || Achievement.ReturnFlag == '') ? false : true; // Date lastApproveDate = NFMUtil.parseStr2Date(Achievement.SecondApproveDate, true); // if (returnFlag && lastApproveDate == null) { // iflog.ErrorLog__c += Achievement.SoNo + ' is (X), please set LastApproveDate\n'; // continue; // } Opportunity opp = oppsMap.get(Achievement.QuotationCode); if (opp == null) { // 更新対象商談がない場合 iflog.ErrorLog__c += '[' + Achievement.SoNo + ']Opportunity[' + Achievement.QuotationCode + ']NotExist\n'; continue; } // 項目転送のセット Statu_Achievements__c sta = new Statu_Achievements__c(); sta.Statu_Achievements_Ext__c = Achievement.QuotationCode + ':' + Achievement.SoNo; if (staUpdateMap.get(sta.Statu_Achievements_Ext__c) == null) { staList.add(sta); staUpdateMap.put(sta.Statu_Achievements_Ext__c, sta); sta.Opportunity__c = opp.Id; logstr += Achievement.QuotationCode + ':' + Achievement.SoNo + ' '; } else { sta = staUpdateMap.get(sta.Statu_Achievements_Ext__c); } //接收无偿出库订单类型 精琢技术 thh 2021-10-14 start if(Achievement.OrderType.equals('ZM16')){ sta.orderType__c = Achievement.OrderType; //接收无偿出库订单类型 精琢技术 thh 2021-10-14 end // CHAN-BCPCA3 判断是否ZM 订单以及赋值具体订单类型 start } else if (!string.isblank(Achievement.SoNo) && Achievement.SoNo.Trim().replaceAll('0', '').StartsWith('6')) { if (!string.isblank(Achievement.paymentStatus) && Achievement.paymentStatus.Trim().contains('退款完成')) { sta.orderType__c = 'ZM17'; } else { sta.orderType__c = 'ZM18'; } } // CHAN-BCPCA3 判断是否ZM 订单以及赋值具体订单类型 end sta.Name = Achievement.SoNo; sta.ReturnFlag__c = (Achievement.ReturnFlag == null || Achievement.ReturnFlag == '') ? false : true; sta.OverviewStatus__c = Achievement.OverviewStatus; sta.ContractNO__c = Achievement.ContractNO; sta.ContractReceivedDate__c = NFMUtil.parseStr2Date(Achievement.ContractReceivedDate, true); sta.FirstApproveDate__c = NFMUtil.parseStr2Date(Achievement.FirstApproveDate, true); sta.LastApproveDate__c = NFMUtil.parseStr2Date(Achievement.SecondApproveDate, true); sta.SoLatestDeliveryDate__c = NFMUtil.parseStr2Date(Achievement.SoLatestDeliveryDate, true); sta.DeliveryDate__c = NFMUtil.parseStr2Date(Achievement.DeliveryDate, true); sta.InstallDate__c = NFMUtil.parseStr2Date(Achievement.InstallDate, true); // 20200519 ZHU-BNV6QN Start //sta.Collection_Day_Invoice__c = sta.InstallDate__c == null ? null : System.today(); sta.Collection_Day_Invoice__c = NFMUtil.parseStr2Date(Achievement.CollectionDate, true); // 20200519 LZHU-BNV6QN End sta.CurrencyIsoCode = Achievement.Currency_x == 'RMB' ? 'CNY' : Achievement.Currency_x; sta.ContractAmount__c = Achievement.ContractAmount; // CHAN-BHFAH4 Start sta.ContractAmountNoGurantee__c = Achievement.ContractAmountNoGurantee; // CHAN-BHFAH4 End sta.PaymentAmount__c = Achievement.PaymentAmount; System.debug(Logginglevel.ERROR, 'Paid_Amount_Rate +++++' + sta.Paid_Amount_Rate__c); if (String.isNotEmpty(Achievement.PaymentRate)) { String payment_Rate = Achievement.PaymentRate.substring(0, Achievement.PaymentRate.lastIndexOf(',')); String payment_Rate_Date = Achievement.PaymentRate.substring(Achievement.PaymentRate.lastIndexOf(',') + 1); System.debug(Logginglevel.ERROR, 'Paid_Amount_Rate _____' + Decimal.valueOf(payment_Rate.subString(0, payment_Rate.length() - 1))); if ((sta.Paid_Amount_Rate__c == null || sta.Paid_Amount_Rate__c < 30) && Decimal.valueOf(payment_Rate.subString(0, payment_Rate.length() - 1)) >= 30.00) { sta.X30_Deposit_Day__c = NFMUtil.parseStr2Date(payment_Rate_Date, true); } if (Decimal.valueOf(payment_Rate.subString(0, payment_Rate.length() - 1)) == 100.00) { sta.Deposit_In_Full_Day__c = NFMUtil.parseStr2Date(payment_Rate_Date, true); } sta.PaymentRate__c = Achievement.PaymentRate.substring(0, Achievement.PaymentRate.lastIndexOf(',')); } sta.DeliveryStatus__c = Achievement.DeliveryStatus; sta.AssignmentStatus__c = Achievement.AssignmentStatus; sta.PaymentStatus__c = Achievement.PaymentStatus; sta.InstallStatus__c = Achievement.InstallStatus; sta.AuthorizationNo__c = Achievement.AuthorizationNo; sta.ContractApplicationNo__c = Achievement.ContractApplicationNo; sta.PaymentTerms__c = Achievement.PaymentTerms; sta.UnshippedAmount__c = Achievement.TimeLimit; // NFMUtil.parseStr2Date(Achievement.TimeLimit, true) #1189の対応、UnshippedAmount__c にセット sta.End_User_price__c = Achievement.SalesChannel; // NFMUtil.getMapValue(transferMap, 'SalesChannel__c', Achievement.SalesChannel, iflog); // 引合の更新、最初の注残 if (opp.Note_Residual_Result__c == '4' // SAP Winの後、ただし有効注残がない && opp.IsImport__c == False // 是否从SFA转移的已结束询价 のデータでなはい && opp.Min_FirstApproveDate__c == null ) { // 有効な注残かどうかの判断 Valid_Statu_Achievements__c if ((sta.OverviewStatus__c == '冻结' || sta.OverviewStatus__c == '无效合同' || sta.ReturnFlag__c) == false) { opp.Contract_Once_Recognize_Day__c = NFMUtil.parseStr2Date(Achievement.FirstApproveDate, true); oppUpdateMap.put(opp.Id, opp); } } } if (staList.size() > 0) { StaticParameter.EscapeNFM001Trigger = true; StaticParameter.EscapeNFM001AgencyContractTrigger = true; StaticParameter.EscapeNFM007Trigger = true; StaticParameter.EscapeOpportunityBefUpdTrigger = true; upsert staList Statu_Achievements_Ext__c; if (oppUpdateMap.size() > 0) { update oppUpdateMap.values(); } } logstr += '\nend'; rowData.retry_cnt__c = 0; } catch (Exception ex) { // エラーが発生した場合 Database.rollback(sp); System.debug(Logginglevel.ERROR, 'NFM010_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage()); System.debug(Logginglevel.ERROR, 'NFM010_' + rowData.MessageGroupNumber__c + ':' + ex.getStackTraceString()); logstr += '\n' + ex.getMessage(); iflog.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + iflog.ErrorLog__c; 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 + '错误次数已经超过自动收信设定的最大次数,请手动收信'; } } update rowData; iflog.Log__c = logstr; if (iflog.Log__c.length() > 131072) { iflog.Log__c = iflog.Log__c.subString(0, 131065) + ' ...'; } if (iflog.ErrorLog__c.length() > 32768) { iflog.ErrorLog__c = iflog.ErrorLog__c.subString(0, 32760) + ' ...'; } update iflog; } }