李金换
2023-04-20 fd0bea6d4ad22f61b323ff5cf32e2b1104bb5492
force-app/main/default/classes/NFM206Rest.cls
@@ -1,6 +1,6 @@
@RestResource(urlMapping = '/NFM206/*')
global with sharing class NFM206Rest {
    global class GeDatas {
        public NFMUtil.Monitoring Monitoring;
        public NFM206Rest.GeData[] GeData;
@@ -20,8 +20,11 @@
        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
@@ -40,9 +43,26 @@
        }
        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;
@@ -69,6 +89,9 @@
        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) {
@@ -76,7 +99,7 @@
        }
        Savepoint sp = Database.setSavepoint();
        try {
        try { // 20220916 ljh SWAG-CG2A7S 注释
            List<GeData> accordList = new List<GeData>();
            List<String> opportunity_NoList = new List<String>();
            //合同必填字段验证
@@ -97,13 +120,16 @@
            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];
@@ -115,6 +141,7 @@
            for (GeData gda : accordList) {
                Opportunity opportunityInfo = new Opportunity();
                if (oppMap.containsKey(gda.Opportunity_No)) {
                    opportunityInfo = oppMap.get(gda.Opportunity_No);
                } else {
@@ -129,7 +156,19 @@
                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 == '引合') {
@@ -142,6 +181,7 @@
                    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)) {
@@ -173,6 +213,13 @@
                        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
@@ -185,6 +232,9 @@
                    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;
@@ -194,15 +244,67 @@
                    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());
@@ -219,6 +321,7 @@
                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) {
@@ -229,4 +332,96 @@
        }
        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);
                }
            }
        }
    }
}