| | |
| | | @RestResource(urlMapping = '/NFM206/*') |
| | | global with sharing class NFM206Rest { |
| | | |
| | | |
| | | global class GeDatas { |
| | | public NFMUtil.Monitoring Monitoring; |
| | | public NFM206Rest.GeData[] GeData; |
| | |
| | | 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 |
| | |
| | | } |
| | | |
| | | 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) { |
| | | executefuture(rowData.Id); |
| | | 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; |
| | |
| | | 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<GeData> geDataList = (List<GeData>) JSON.deserialize(rowDataStr, List<GeData>.class); |
| | | if (geDataList == null || geDataList.size() == 0) { |
| | |
| | | } |
| | | |
| | | Savepoint sp = Database.setSavepoint(); |
| | | try { |
| | | try { // 20220916 ljh SWAG-CG2A7S 注释 |
| | | List<GeData> accordList = new List<GeData>(); |
| | | List<String> opportunity_NoList = new List<String>(); |
| | | //合同必填字段验证 |
| | |
| | | List<Opportunity> opportunityUpsertList = new List<Opportunity>(); |
| | | List<Opportunity> oppList = [Select Id , |
| | | Opportunity_No__c, |
| | | SPOApprovedQuote__c, |
| | | Contract_DB_complite_day__c, |
| | | SAP_Send_OK__c, |
| | | //Decided_Estimation__c |
| | | Decided_Estimation__c, |
| | | Estimation_Decision__c, |
| | | Estimation_No__c, |
| | | Competitor__c, |
| | | StageName |
| | | Sign_Contract_Electronically__c, |
| | | StageName, |
| | | CloseDate |
| | | from Opportunity |
| | | where Opportunity_No__c in : opportunity_NoList]; |
| | | |
| | |
| | | |
| | | for (GeData gda : accordList) { |
| | | Opportunity opportunityInfo = new Opportunity(); |
| | | |
| | | if (oppMap.containsKey(gda.Opportunity_No)) { |
| | | opportunityInfo = oppMap.get(gda.Opportunity_No); |
| | | } else { |
| | |
| | | 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.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.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); |
| | | //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; |
| | |
| | | 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 |
| | |
| | | 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_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) { |
| | | upsert opportunityUpsertList; |
| | | // 20220916 ljh SWAG-CG2A7S start |
| | | // upsert opportunityUpsertList; |
| | | // 20220916 ljh SWAG-CG2A7S start |
| | | String logstrNew = ''; |
| | | Integer failedCount = 0; |
| | | Integer failedCountEmail = 0; |
| | | Map<String,String> errMap = new Map<String,String>(); |
| | | Map<String,String> errMapAll = new Map<String,String>(); |
| | | 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'; |
| | | rowData.retry_cnt__c = 0; |
| | | |
| | | // 20220916 ljh SWAG-CG2A7S 注释 start |
| | | } catch (Exception ex) { |
| | | Database.rollback(sp); |
| | | System.debug(Logginglevel.ERROR, 'NFM206_' + rowData.MessageGroupNumber__c + ':' + ex.getMessage()); |
| | |
| | | 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) { |
| | |
| | | } |
| | | update iflog; |
| | | } |
| | | |
| | | public static void sendEmail(Map<String,String> errMap,Boolean isAll){ |
| | | // 发送邮件内容 |
| | | List<Messaging.SingleEmailMessage> sendMails = new List<Messaging.SingleEmailMessage>(); |
| | | 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 += '<table border="1">'; |
| | | htmlStr += '<tr> <th>询价编码</th><th>失败原因</th><th>详细链接</th></tr>'; |
| | | |
| | | 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 += '<tr><td>'+opp.Opportunity_No__c+'</td><td>'+errMap.get(opp.Id)+'</td><td><a href="' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + opp.Id + '">点击链接</a>'+'</td></tr>'; |
| | | } |
| | | htmlStr += '</table>'; |
| | | if(isAll){ |
| | | htmlStr += '<br/>请对应'; |
| | | }else{ |
| | | htmlStr += '<br/>请对应好后通知IT'; |
| | | } |
| | | message.setSubject(subject); |
| | | message.setHtmlBody(htmlStr); |
| | | message.setCharset('UTF-8'); |
| | | |
| | | if(isAll){ |
| | | String toEmail = System.Label.EmailAlert; |
| | | if(toEmail.length() > 0){ |
| | | List<String> toMailsList = new List<String>(); |
| | | 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<String> toMailsList = new List<String>(); |
| | | for(String email : toEmail.split(',')){ |
| | | toMailsList.add(email); |
| | | } |
| | | if(toMailsList.size() > 0){ |
| | | message.setToAddresses(toMailsList); |
| | | } |
| | | } |
| | | // CC |
| | | Set<String> ccEmailSet = new Set<String>(); |
| | | String ccEmail = System.Label.EmailAlert; |
| | | if(ccEmail.length() > 0){ |
| | | for(String email : ccEmail.split(',')){ |
| | | ccEmailSet.add(email); |
| | | } |
| | | } |
| | | |
| | | if(!String.isBlank(OCSM_province)){ |
| | | List<OCM_Management_Province__c> 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<String>(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); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |