@RestResource(urlMapping = '/NFM206/*') global with sharing class NFM206Rest { global class GeDatas { public NFMUtil.Monitoring Monitoring; public NFM206Rest.GeData[] GeData; } global class GeData { public String NotesApprovedNo; // 合同申请决裁编码 public String Assistant_Applied_Date; // 助理:合同DB申请日(SPO的起草日期) public String Opportunity_No; // 询价编码 public String OCM_Agent1_Price_DB; // OCM-Agent1(合同DB)_元(SPO的合同金额) public String Contract_DB_SalesDept_complite_day; // 销售部:合同DB审批结束日 public String Contract_DB_complite_day; // 合同DB审批结束日 public String Contract_DB_request_reason; // 合同DB特价申请原因(SPO的合同特殊申请时的备注) public String ApprovedType; // User操作类型 3:撤回申请 public String ContractType; // 业务申请类型 1:新建合同 2.更改合同 3.撤销合同 public String Closing_Bid_Date; // 中标日期 public String SPOApprovedQuote; //合同审批完成的报价 //songxiaoqi ----------start public String IsTermination; //true代表合同终止 public String SealDate; // 电子签日期 //songxiaoqi-----------end // 2022-10-19 SWAG-CKB5S6 xxf start public String IsEsign; //是否电子签 1:电子签合同 0:非电子签合同 // 2022-10-19 SWAG-CKB5S6 xxf end } @HttpPost global static void execute() { // 取得接口传输内容 String strData = RestContext.request.requestBody.toString(); GeDatas ges = (GeDatas) JSON.deserializeStrict(strData, GeDatas.class); if (ges == null ) { return; } NFMUtil.Monitoring Monitoring = ges.Monitoring; if (Monitoring == null) { return; } BatchIF_Log__c rowData = NFMUtil.saveRowData(Monitoring, 'NFM206', ges.GeData); // 2022-10-15 SWAG-CG2A7S 同一合同多条询价自动win时的拆分处理 ssm start if (String.isBlank(rowData.Log__c) == false) { if (ges.GeData.size() > 1) { rowData.RowDataFlg__c = false; update rowData; Integer index = 1; String msg_num = Monitoring.MessageGroupNumber; for (NFM206Rest.GeData data : ges.GeData) { NFM206Rest.GeData[] spGeData = new NFM206Rest.GeData[1]; spGeData[0] = data; Monitoring.MessageGroupNumber = msg_num + '-' + index; index ++; BatchIF_Log__c spRowData = NFMUtil.saveRowData(Monitoring, 'NFM206', spGeData); Database.executeBatch(new LogAutoSendBatch(spRowData.Id), 1); } } else { executefuture(rowData.Id); } } // 2022-10-15 SWAG-CG2A7S 同一合同多条询价自动win时的拆分处理 ssm start // 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 = 'NFM206'; iflog.MessageGroupNumber__c = rowData.MessageGroupNumber__c; iflog.Log__c = logstr; iflog.ErrorLog__c = ''; insert iflog; // Integer index = rowData.Log__c.indexOf('SealDate'); // String SealDate = rowData.Log__c.subString(index+11,index+19); // system.debug('SealDate = '+ SealDate+'rowData.Log__c = ' +rowData.Log__c); String rowDataStr = NFMUtil.getRowDataStr(rowData); List geDataList = (List) JSON.deserialize(rowDataStr, List.class); if (geDataList == null || geDataList.size() == 0) { return; } Savepoint sp = Database.setSavepoint(); try { // 20220916 ljh SWAG-CG2A7S 注释 List accordList = new List(); List opportunity_NoList = new List(); //合同必填字段验证 for (GeData gda : geDataList) { if (String.isBlank(gda.Opportunity_No)) { iflog.ErrorLog__c += 'Error! 询价编码不能为空。\n'; continue; } if (String.isBlank(gda.ApprovedType)) { iflog.ErrorLog__c += 'Error! 合同申请类型不能为空 [ ' + gda.Opportunity_No + ' ]\n'; continue; } opportunity_NoList.add(gda.Opportunity_No); accordList.add(gda); } List opportunityUpsertList = new List(); List oppList = [Select Id , Opportunity_No__c, SPOApprovedQuote__c, Contract_DB_complite_day__c, SAP_Send_OK__c, Decided_Estimation__c, Estimation_Decision__c, Estimation_No__c, Competitor__c, Sign_Contract_Electronically__c, StageName, CloseDate from Opportunity where Opportunity_No__c in : opportunity_NoList]; Map oppMap = new Map(); for (Opportunity opp : oppList) { oppMap.put(opp.Opportunity_No__c, opp); } for (GeData gda : accordList) { Opportunity opportunityInfo = new Opportunity(); if (oppMap.containsKey(gda.Opportunity_No)) { opportunityInfo = oppMap.get(gda.Opportunity_No); } else { iflog.ErrorLog__c += '询价编码不存在[ ' + gda.Opportunity_No + ' ]\n'; continue; } logstr += '询价编码:' + gda.Opportunity_No + ' 用户操作类型:' + gda.ApprovedType + ' 合同申请类型:' + gda.ContractType ; if (gda.ApprovedType == '3' && (gda.ContractType == '3' || gda.ContractType == '2')) { continue; } opportunityInfo.IF_Submit__c = false; opportunityInfo.if_Interface_Lock__c = false; opportunityInfo.Contract_Authorize_Lock__c = false; // 2022-11-16 ssm 增加206接口判断,撤销合同时不设置电子签时间和自动win if (gda.ApprovedType != '3' && gda.ContractType != '3' && String.isNotBlank(gda.SealDate)) { opportunityInfo.Agency_Contract_Date1__c = NFMUtil.parseStr2Date(gda.SealDate); // 收到日期时自动win opportunityInfo.SAP_Send_OK__c = true; //20221208 you DB202212018969 给预测发货日赋值 Date SAP_Send_OKDay = Date.today(); if(SAP_Send_OKDay > opportunityInfo.CloseDate){ opportunityInfo.CloseDate = Date.today().addDays(1); } } if (((gda.ContractType == '3' && gda.ApprovedType != '3') || (gda.ApprovedType == '3' && gda.ContractType == '1')) && opportunityInfo.StageName == '引合') { //新申请合同的撤销 或者最终取消合同时,清空合同信息 opportunityInfo.NotesApprovedNo__c = null; opportunityInfo.Contract_DB_request_reason__c = null; opportunityInfo.Contract_DB_complite_day__c = null; opportunityInfo.Assistant_Applied_Date__c = null; opportunityInfo.Contract_DB_SalesDept_complite_day__c = null; opportunityInfo.Contract_DB_Finalcomplite_day__c = null; opportunityInfo.SPOApprovedQuote__c = null;//add opportunityInfo.Sign_Contract_Electronically__c = false; // 20211206 SWAG-C7P4XB 撤销合同时,如果当前询价等级为A1,退回到A start if ('A1'.equals(opportunityInfo.Competitor__c)) { opportunityInfo.Opportunity_stage__c = '确定了OLY参数'; opportunityInfo.Competitor__c = 'A'; } // 20211206 SWAG-C7P4XB 撤销合同时,如果当前询价等级为A1,退回到A end if (gda.ContractType == '3') { opportunityInfo.Contract_Invalid_Date__c = NFMUtil.parseStr2Date(gda.Contract_DB_complite_day); } } else if (gda.ContractType == '2' && gda.ApprovedType != '3') { // 变更合同(未撤销) opportunityInfo.Contract_DB_Finalcomplite_day__c = NFMUtil.parseStr2Date(gda.Contract_DB_complite_day); opportunityInfo.Contract_Authorize_Lock__c = true; } else if (gda.ContractType == '1' && gda.ApprovedType != '3') { // 新建合同(未撤销) opportunityInfo.NotesApprovedNo__c = gda.NotesApprovedNo; opportunityInfo.Contract_DB_request_reason__c = gda.Contract_DB_request_reason; opportunityInfo.Contract_DB_complite_day__c = NFMUtil.parseStr2Date(gda.Contract_DB_complite_day); opportunityInfo.Assistant_Applied_Date__c = NFMUtil.parseStr2Date(gda.Assistant_Applied_Date); //opportunityInfo.Closing_Bid_Date__c = NFMUtil.parseStr2Date(gda.Closing_Bid_Date); //SWAG-CCL6R7 2022-3-22 yjk 注释掉中标日逻辑 opportunityInfo.Contract_DB_SalesDept_complite_day__c = NFMUtil.parseStr2Date(gda.Contract_DB_SalesDept_complite_day); opportunityInfo.Contract_Invalid_Date__c = null; opportunityInfo.Contract_Authorize_Lock__c = true; if (gda.Contract_DB_complite_day == null) { opportunityInfo.if_Interface_Lock__c = true; } opportunityInfo.SPOApprovedQuote__c = gda.SPOApprovedQuote;//add // 2022-10-19 SWAG-CKB5S6 xxf start if(gda.IsEsign == '1'){//电子签合同:IsEsign='1' opportunityInfo.Sign_Contract_Electronically__c = true; }else if (gda.IsEsign == '0' || gda.IsEsign == null) {//非电子签合同:IsEsign='0' opportunityInfo.Sign_Contract_Electronically__c = false; } // 2022-10-19 SWAG-CKB5S6 xxf end } //songxiaoqi ------start 2020/11/4 update 状态1是询价 //传入true代表合同终止 StageName__c if (gda.IsTermination == 'true' && opportunityInfo.Estimation_Decision__c == true && gda.SPOApprovedQuote == opportunityInfo.Estimation_No__c && opportunityInfo.StageName == '引合') { //决定报价deide opportunityInfo.Estimation_Decision__c = false; //清空确定备货确认日 opportunityInfo.Stock_Confrim_Date__c = null; //取消win opportunityInfo.SAP_Send_OK__c = false; // 2022-05-30 取消win理由补充 ssm start opportunityInfo.Reason_Cancel_WIN__c = System.Label.Opportunity_Cancel_WIN_ByAPI; // 2022-05-30 取消win理由补充 ssm end //撤销操作清空相关内容 opportunityInfo.NotesApprovedNo__c = null; opportunityInfo.Contract_DB_request_reason__c = null; opportunityInfo.Contract_DB_complite_day__c = null; opportunityInfo.Assistant_Applied_Date__c = null; opportunityInfo.Contract_DB_SalesDept_complite_day__c = null; opportunityInfo.Contract_DB_Finalcomplite_day__c = null; opportunityInfo.SPOApprovedQuote__c = null; opportunityInfo.Sign_Contract_Electronically__c = false; } //songxiaoqi -------end opportunityUpsertList.add(opportunityInfo); } if (rowData.retry_cnt__c == null) rowData.retry_cnt__c = 0;// 20230419 ljh add if (opportunityUpsertList.size() > 0) { // 20220916 ljh SWAG-CG2A7S start // upsert opportunityUpsertList; // 20220916 ljh SWAG-CG2A7S start String logstrNew = ''; Integer failedCount = 0; Integer failedCountEmail = 0; Map errMap = new Map(); Map errMapAll = new Map(); Database.SaveResult[] updateRepairResult = Database.update(opportunityUpsertList, false); for (Integer tIdx = 0; tIdx < updateRepairResult.size(); tIdx++) { Database.SaveResult sr = updateRepairResult[tIdx]; System.debug('zheli:'+sr); if (!sr.isSuccess()) { failedCount += 1; String errStr = ''; Database.Error emsg = sr.getErrors()[0]; errStr += '\n' + emsg.getMessage(); String eId = (String) opportunityUpsertList[tIdx].get('Id'); String SealDateStr = String.valueOf(opportunityUpsertList[tIdx].get('Agency_Contract_Date1__c')); if ( String.isNotBlank(SealDateStr) && !String.valueOf(emsg.getMessage()).contains('Future method cannot be called from a future or batch method')) { failedCountEmail += 1; errMap.put(eId,errStr); } errMapAll.put(eId,errStr); logstr += '\n' + emsg.getMessage(); logstrNew = emsg.getMessage() + '\n' + emsg.getFields() + '\n' + logstrNew; } } if(failedCount > 0){ Database.rollback(sp); iflog.ErrorLog__c = logstrNew + '\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 = logstrNew + rowData.ErrorLog__c + '错误次数已经超过自动收信设定的最大次数,请手动收信'; } if(failedCountEmail > 0 && ((rowData.retry_cnt__c !=null && rowData.retry_cnt__c == batch_retry_max_cnt) || Test.isRunningTest())){ sendEmail(errMap,false); } if(failedCount > failedCountEmail && ((rowData.retry_cnt__c !=null && rowData.retry_cnt__c == batch_retry_max_cnt) || Test.isRunningTest())){ sendEmail(errMapAll,true); } }else{ rowData.retry_cnt__c = 0; } // 20220916 ljh SWAG-CG2A7S end } logstr += '\nend'; // 20220916 ljh SWAG-CG2A7S 注释 start } catch (Exception ex) { Database.rollback(sp); System.debug(Logginglevel.ERROR, 'NFM206_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage()); System.debug(Logginglevel.ERROR, 'NFM206_' + 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 + '错误次数已经超过自动收信设定的最大次数,请手动收信'; } } // 20220916 ljh SWAG-CG2A7S 注释 end 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; } public static void sendEmail(Map errMap,Boolean isAll){ // 发送邮件内容 List sendMails = new List(); Messaging.SingleEmailMessage message = new Messaging.SingleEmailMessage(); String OCSM_province = ''; String title; if(isAll){ title = '询价206更新报错 '; }else{ title = '询价自动WIN失败 '; } String subject = title + ' 时间:' + Datetime.now().format(); String htmlStr; if(isAll){ htmlStr = '更新报错原因及链接见表格:'; }else{ htmlStr = '您好!如下询价自动WIN失败,原因及链接见表格:'; } htmlStr += ''; htmlStr += ''; for(Opportunity opp:[select Id,Name,Opportunity_No__c,OCM_man_province_no_dealer__c from Opportunity where Id in:errMap.keySet()]){ if(String.isBlank(OCSM_province)){ OCSM_province = opp.OCM_man_province_no_dealer__c; } htmlStr += ''; } htmlStr += '
询价编码失败原因详细链接
'+opp.Opportunity_No__c+''+errMap.get(opp.Id)+'点击链接'+'
'; if(isAll){ htmlStr += '
请对应'; }else{ htmlStr += '
请对应好后通知IT'; } message.setSubject(subject); message.setHtmlBody(htmlStr); message.setCharset('UTF-8'); if(isAll){ String toEmail = System.Label.EmailAlert; if(toEmail.length() > 0){ List toMailsList = new List(); for(String email : toEmail.split(',')){ toMailsList.add(email); } if(toMailsList.size() > 0){ message.setToAddresses(toMailsList); } } }else{ // 收信人 String toEmail = System.Label.CN_MEBG_BusinessSupport; if(toEmail.length() > 0){ List toMailsList = new List(); for(String email : toEmail.split(',')){ toMailsList.add(email); } if(toMailsList.size() > 0){ message.setToAddresses(toMailsList); } } // CC Set ccEmailSet = new Set(); String ccEmail = System.Label.EmailAlert; if(ccEmail.length() > 0){ for(String email : ccEmail.split(',')){ ccEmailSet.add(email); } } if(!String.isBlank(OCSM_province)){ List ompList = [select Id,SalesManage__c,SalesManage__r.Email from OCM_Management_Province__c where name =:OCSM_province]; if(ompList.size() > 0){ if (!String.isBlank(ompList[0].SalesManage__r.Email)) { ccEmailSet.add(ompList[0].SalesManage__r.Email); } } } message.setCcAddresses(new List(ccEmailSet)); } sendMails.add(message); if (sendMails.size() > 0) { //Messaging.sendEmail(allMails); Messaging.SendEmailResult[] results = Messaging.sendEmail(sendMails); for (Integer i = 0; i < results.size(); i++) { if (results[i].success == false) { system.debug('=====send mail error:' + results[i].errors[0].message); } } } } }