buli
2023-05-04 d4a4ce824f3b2f3a335a3ad8e8c9efb3b37d630f
force-app/main/default/classes/DNUpsertBatch.cls
@@ -14,23 +14,63 @@
    global Database.QueryLocator start(Database.BatchableContext bc) {
        if( string.isBlank( rowData_Id )){
            return Database.getQueryLocator(
                [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,DN_retry_cnt__c, CreatedDate
                 from BatchIF_Log__c
                 where RowDataFlg__c = true
                 and IsUpsertDN__c = true
                 and (DN_retry_cnt__c = null
                     or (DN_retry_cnt__c != 0 and DN_retry_cnt__c < 3))]);
                [
                    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,
                        DN_retry_cnt__c,
                        CreatedDate
                    FROM BatchIF_Log__c
                    WHERE
                        RowDataFlg__c = TRUE
                        AND IsUpsertDN__c = TRUE
                        AND (DN_retry_cnt__c = NULL
                        OR (DN_retry_cnt__c != 0
                        AND DN_retry_cnt__c < 3))
                ]
            );
        }else{
            return Database.getQueryLocator([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 ,DN_retry_cnt__c,CreatedDate
                                             from BatchIF_Log__c
                                             where RowDataFlg__c = true
                                             and Id = :rowData_Id ]);
            return Database.getQueryLocator(
                [
                    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,
                        DN_retry_cnt__c,
                        CreatedDate
                    FROM BatchIF_Log__c
                    WHERE RowDataFlg__c = TRUE AND Id = :rowData_Id
                ]
            );
        }
    }
    global void execute(Database.BatchableContext BC, List<BatchIF_Log__c> rowDataList) {
@@ -69,18 +109,18 @@
        iflog.ErrorLog__c = '';
        insert iflog;
        String rowDataStr = NFMUtil.getRowDataStr(rowData);
        List<NFM110Rest.GeneralData> generalDataList =
            (List<NFM110Rest.GeneralData>) JSON.deserialize(rowDataStr, List<NFM110Rest.GeneralData>.class);
        List<NFM110Rest.GeneralData> generalDataList = (List<NFM110Rest.GeneralData>) JSON.deserialize(
            rowDataStr,
            List<NFM110Rest.GeneralData>.class
        );
        if (generalDataList == null || generalDataList.size() == 0) {
            return;
        }
        // 电子签收单 start 优化原有select
        list<account> olympusAcclist =
            [select Id , ParentId ,AgentCode_Ext__c
             from Account
             where AgentCode_Ext__c = '9999900' or
             AgentCode_Ext__c = '9999999' or
             AgentCode_Ext__c = '9999901'
        list<account> olympusAcclist = [
            SELECT Id, ParentId, AgentCode_Ext__c
            FROM Account
            WHERE AgentCode_Ext__c = '9999900' OR AgentCode_Ext__c = '9999999' OR AgentCode_Ext__c = '9999901'
        ];
        Account ocm ,olympus,olympus_return;
        for(Account tempAcc : olympusAcclist){
@@ -145,9 +185,7 @@
                        //根据数据传的样式决定
                    }
                }
                if (!(infoH.ReturnMark == null || infoH.ReturnMark  == ''
                      || infoH.ReturnMark == '1' || infoH.ReturnMark == '3'
                     )) {
                if (!(infoH.ReturnMark == null || infoH.ReturnMark == '' || infoH.ReturnMark == '1' || infoH.ReturnMark == '3')) {
                         // ReturnMark = 上記以外の場合 Errorメッセージ出力
                         continue;
                     }
@@ -157,17 +195,12 @@
                    // CHAN-BBLAAP start
                    string Product_Serial_No = '';
                    if (dnInfo.SorLMark == 'S') {
                        Product_Serial_No =
                            dnInfo.OTCode + ':' + dnInfo.SerialNoorLotNo;
                        Product_Serial_No = dnInfo.OTCode + ':' + dnInfo.SerialNoorLotNo;
                    } else {
                        Product_Serial_No  =
                            dnInfo.OTCode + ':' + dnInfo.SerialNoorLotNo
                            + '(' + dnInfo.TracingCode + ')';
                        Product_Serial_No = dnInfo.OTCode + ':' + dnInfo.SerialNoorLotNo + '(' + dnInfo.TracingCode + ')';
                    }
                    // CHAN-BBLAAP end
                    if (dnInfo.OTCode == null || dnInfo.OTCode == ''
                        || dnInfo.SerialNoorLotNo == null || dnInfo.SerialNoorLotNo == ''
                       ) {
                    if (dnInfo.OTCode == null || dnInfo.OTCode == '' || dnInfo.SerialNoorLotNo == null || dnInfo.SerialNoorLotNo == '') {
                           // 商品コードがない場合、処理と飛ばす
                           continue;
                       }
@@ -178,33 +211,55 @@
                    productSerialNoList.add(dnInfo.SerialNoorLotNo);
                    productSerialNoList.add(dnInfo.SerialNoorLotNo + '(' + dnInfo.TracingCode + ')');
                }
            }
            // 电子签收单 start 额外检索end user
             List<Account> accList = [select Id, Name, Management_Code__c, Department_Class__c, Hospital__c, ParentId,
                                     RecordType.DeveloperName, Department_Name__c, OCM_man_province_txt__c
                                     from Account
                                     where Management_Code__c in :managementCodeList];
            List<Account> accList = [
                SELECT
                    Id,
                    Name,
                    Management_Code__c,
                    Department_Class__c,
                    Hospital__c,
                    ParentId,
                    RecordType.DeveloperName,
                    Department_Name__c,
                    OCM_man_province_txt__c
                FROM Account
                WHERE Management_Code__c IN :managementCodeList
            ];
            // HHOA-BLC8S6 update by vivek 2020-02-13 end
            Map<String, Account> accsMap = new Map<String, Account>();
            for (Account acc : accList) {
                accsMap.put(acc.Management_Code__c, acc);
            }
            Map<String, Opportunity> oppMap = new Map<String, Opportunity>();
            List<Opportunity> oppList = [Select Id, Purchase_Type__c, Opportunity_No__c,Strategic_department_Class_Name__c,
                                         Sales_Root__c, SAP_Province__c, Trade__c, Agency1__c,Agency1__r.Name,
                                         Agency1__r.OCM_man_province_txt__c, Opportunity_Category__c,
                                         OCM_man_province_cus__c, Sales_assistant_name_text__c
            List<Opportunity> oppList = [
                SELECT
                    Id,
                    Purchase_Type__c,
                    Opportunity_No__c,
                    Strategic_department_Class_Name__c,
                    Sales_Root__c,
                    SAP_Province__c,
                    Trade__c,
                    Agency1__c,
                    Agency1__r.Name,
                    Agency1__r.OCM_man_province_txt__c,
                    Opportunity_Category__c,
                    OCM_man_province_cus__c,
                    Sales_assistant_name_text__c,
                                        // 电子签收单 start
                                        // 临时使用 用作试点经销商
                                        ,Agency1__r.EsignTestAccount__c,Agency1__r.EsignTestAccountType__c
                    Agency1__r.EsignTestAccount__c,
                    Agency1__r.EsignTestAccountType__c,
                                        // 电子签收单 end
                                        //集中采购询价 精琢技术 wql  start
                                        ,Group_purchase_PCL__c
                    Group_purchase_PCL__c,
                                        //集中采购询价 精琢技术 wql  end
                                        ,Is_Corrosion__c
                                         From Opportunity Where Opportunity_No__c IN :inquiryNoList];
                    Is_Corrosion__c
                FROM Opportunity
                WHERE Opportunity_No__c IN :inquiryNoList
            ];
            for (Opportunity opp : oppList) {
                oppMap.put(opp.Opportunity_No__c, opp);
@@ -212,7 +267,7 @@
            // 检索出DN 并生成DN Map
            Boolean flg=true;
            map <string, Statu_Achievements_DN__c> DNMap = new  map <string, Statu_Achievements_DN__c>();
            map<string, Statu_Achievements_DN__c> DNMap = new Map<string, Statu_Achievements_DN__c>();
            List<Statu_Achievements_DN__c> DNList = GetDNList(DNNoSet);
                // [select id, Name,
                //  DeliveryDate_Raw__c,
@@ -254,31 +309,56 @@
            List<DNdetail> insertDNdetailList = new List<DNdetail>();
            // CHAN-BBLAAP  end
            List<Statu_Achievements__c> boList = [select Id, Name
                                                  from Statu_Achievements__c
                                                  where Name in :soNoList and OverviewStatus__c <> '无效合同'];
            List<Statu_Achievements__c> boList = [
                SELECT Id, Name
                FROM Statu_Achievements__c
                WHERE Name IN :soNoList AND OverviewStatus__c != '无效合同'
            ];
            Map<String, String> boMap = new Map<String, String>();
            for (Statu_Achievements__c bo : boList) {
                boMap.put(bo.Name, bo.Id);
            }
            
            List<Product2> prdList = [select Id, Name, ProductCode, ProductCode_Ext__c, MDM_Model_No__c
                                      from Product2
                                      where ProductCode_Ext__c in :productCodeList];
            List<Product2> prdList = [
                SELECT Id, Name, ProductCode, ProductCode_Ext__c, MDM_Model_No__c
                FROM Product2
                WHERE ProductCode_Ext__c IN :productCodeList
            ];
            Map<String, Product2> prdsMap = new Map<String, Product2>();
            for (Product2 prd : prdList) {
                prdsMap.put(prd.ProductCode_Ext__c, prd);
            }
            List<Asset> astList = [select Id, Name, Product2.ProductCode, Product2.Dealer_special_Object__c , Product2.Dealer_Object__c,
                                   SerialNumber, Product_Serial_No__c, Repair_Count__c, TracingCode__c,
                                   Product2Id, AccountId, Account.Management_Code__c, Department_Class__c, Hospital__c,
                                   Posting_Date__c, InstallDate, SLMark__c, MDM_Model_No__c, OT_CODE__c,
                                   Guarantee_period_for_products__c, Installation_Site__c, Delete_Flag__c, Return_Flag__c,
                                   Extend_Gurantee_DateTo__c, guarantee_period__c, Proviston_period__c
                                   from Asset
                                   where SerialNumber in :productSerialNoList
                                   and IsCompetitorProduct = false
                                   and Information_From__c <> '失单'];
            List<Asset> astList = [
                SELECT
                    Id,
                    Name,
                    Product2.ProductCode,
                    Product2.Dealer_special_Object__c,
                    Product2.Dealer_Object__c,
                    SerialNumber,
                    Product_Serial_No__c,
                    Repair_Count__c,
                    TracingCode__c,
                    Product2Id,
                    AccountId,
                    Account.Management_Code__c,
                    Department_Class__c,
                    Hospital__c,
                    Posting_Date__c,
                    InstallDate,
                    SLMark__c,
                    MDM_Model_No__c,
                    OT_CODE__c,
                    Guarantee_period_for_products__c,
                    Installation_Site__c,
                    Delete_Flag__c,
                    Return_Flag__c,
                    Extend_Gurantee_DateTo__c,
                    guarantee_period__c,
                    Proviston_period__c
                FROM Asset
                WHERE SerialNumber IN :productSerialNoList AND IsCompetitorProduct = FALSE AND Information_From__c != '失单'
            ];
            Map<String, Asset> astsMap = new Map<String, Asset>();
            for (Asset ast : astList) {
                astsMap.put(ast.MDM_Model_No__c + ast.SerialNumber, ast);
@@ -291,12 +371,11 @@
            Map < String, String > provinceGIMap = new Map< String, String > ();
            //检索OCSM管理省对象
            //集中采购询价 增加检索助理 
            List < OCM_Management_Province__c > ompList = [select id, Name, SalesManage__c,GI_assistant__c,Window1__c   from OCM_Management_Province__c ];
            List<OCM_Management_Province__c> ompList = [SELECT id, Name, SalesManage__c, GI_assistant__c FROM OCM_Management_Province__c];
            //存放map<省,担当>
            for (OCM_Management_Province__c omp: ompList) {
                provinceOwnerMap.put(omp.Name, omp.SalesManage__c);
                //provinceGIMap.put(omp.Name,omp.GI_assistant__c); //Commented by Li Jun 20230420
                provinceGIMap.put(omp.Name, omp.Window1__c);// Add By Li Jun 更新 签收单的【营业助理】值,从OCSM管理省对应的【营业窗口】字段获取
                provinceGIMap.put(omp.Name, omp.GI_assistant__c);
            }
            // 电子签收单 end
@@ -320,33 +399,58 @@
                    continue;
                }
                if (infoH.DnInformation == null || infoH.DnInformation.size() == 0) {
                    iflog.ErrorLog__c += 'Error! SoNo[' + infoH.SoNo + '] DeliveryNote[' + infoH.DeliveryNote + '] DnInformation is required. This DN is skipped.\n';
                    iflog.ErrorLog__c +=
                        'Error! SoNo[' +
                        infoH.SoNo +
                        '] DeliveryNote[' +
                        infoH.DeliveryNote +
                        '] DnInformation is required. This DN is skipped.\n';
                    continue;
                }
                if (infoH.EndUserNo == null || infoH.EndUserNo  == '') {
                    iflog.ErrorLog__c += 'Error! SoNo[' + infoH.SoNo + '] DeliveryNote[' + infoH.DeliveryNote + '] EndUserNo is required. This DN is skipped.\n';
                    iflog.ErrorLog__c +=
                        'Error! SoNo[' +
                        infoH.SoNo +
                        '] DeliveryNote[' +
                        infoH.DeliveryNote +
                        '] EndUserNo is required. This DN is skipped.\n';
                    continue;
                }
                if (accsMap.get(infoH.EndUserNo) == null) {
                    iflog.ErrorLog__c += 'Error! SoNo[' + infoH.SoNo + '] DeliveryNote[' + infoH.DeliveryNote + '] EndUserNo[' + infoH.EndUserNo + ']NotExist. This DN is skipped.\n';
                    iflog.ErrorLog__c +=
                        'Error! SoNo[' +
                        infoH.SoNo +
                        '] DeliveryNote[' +
                        infoH.DeliveryNote +
                        '] EndUserNo[' +
                        infoH.EndUserNo +
                        ']NotExist. This DN is skipped.\n';
                    continue;
                } else if (accsMap.get(infoH.EndUserNo).RecordType.DeveloperName != 'HP'
                           && accsMap.get(infoH.EndUserNo).RecordType.DeveloperName != 'Agency'
                           && accsMap.get(infoH.EndUserNo).RecordType.DeveloperName != 'AgencyContract') {
                    iflog.ErrorLog__c += 'Error! SoNo[' + infoH.SoNo + '] DeliveryNote[' + infoH.DeliveryNote + '] EndUserNo[' + infoH.EndUserNo + ']Is Not HP or Agency(Contract). This DN is skipped.\n';
                } else if (
                    accsMap.get(infoH.EndUserNo).RecordType.DeveloperName != 'HP' &&
                    accsMap.get(infoH.EndUserNo).RecordType.DeveloperName != 'Agency' &&
                    accsMap.get(infoH.EndUserNo).RecordType.DeveloperName != 'AgencyContract'
                ) {
                    iflog.ErrorLog__c +=
                        'Error! SoNo[' +
                        infoH.SoNo +
                        '] DeliveryNote[' +
                        infoH.DeliveryNote +
                        '] EndUserNo[' +
                        infoH.EndUserNo +
                        ']Is Not HP or Agency(Contract). This DN is skipped.\n';
                    continue;
                }
                Statu_Achievements_DN__c tempSADN =
                    DNMap.get(infoH.DeliveryNote);
                Statu_Achievements_DN__c tempSADN = DNMap.get(infoH.DeliveryNote);
                if (infoH.DeliveryNote != null) {
                    if (tempSADN == null) {
                        tempSADN = new Statu_Achievements_DN__c();
                        tempSADN.Statu_Achievements__c = null;
                        tempSADN = SetSADN(tempSADN, infoH, boMap, oppMap, accsMap , provinceOwnerMap,provinceGIMap);
                        checkSA( tempSADN, UpsertDNList, iflog, infoH );
                    } else {
                        if (infoH.SoNo != tempSADN.SoNo_Raw__c ||
                        if (
                            infoH.SoNo != tempSADN.SoNo_Raw__c ||
                            infoH.InquiryNo != tempSADN.InquiryNo_Raw__c ||
                            infoH.ReturnMark != tempSADN.ReturnMark_Raw__c ||
                            infoH.DeliveryDate != tempSADN.DeliveryDate_Raw__c ||
@@ -356,8 +460,7 @@
                           ) {
                               string SADNID = tempSADN.id;
                               // 电子签收单  额外增加营业管理部担当赋值 start
                               tempSADN = SetSADN(tempSADN, infoH, boMap,
                               oppMap,accsMap, provinceOwnerMap,provinceGIMap);
                            tempSADN = SetSADN(tempSADN, infoH, boMap, oppMap, accsMap, provinceOwnerMap, provinceGIMap);
                               // 电子签收单  额外增加营业管理部担当赋值 end
                               tempSADN.id = SADNID;
                               checkSA( tempSADN, UpsertDNList, iflog, infoH );
@@ -377,10 +480,13 @@
                    }
                    //  CHAN-BBLAAP 插入保有设备明细时插入对应DN start
                    boolean tempReturnFlg = infoH.ReturnMark == '1' ? true : false;
                    DNdetail tempDNdetail
                        = SetSADNDetails(infoH.DeliveryNote, tempReturnFlg, dnInfo, ast,
                                         dnInfo.SerialNoorLotNo != null && dnInfo.SerialNoorLotNo.equals('.') ?
                                         tempDNdetailNumber++ : tempDNdetailNumber);
                    DNdetail tempDNdetail = SetSADNDetails(
                        infoH.DeliveryNote,
                        tempReturnFlg,
                        dnInfo,
                        ast,
                        dnInfo.SerialNoorLotNo != null && dnInfo.SerialNoorLotNo.equals('.') ? tempDNdetailNumber++ : tempDNdetailNumber
                    );
                    insertDNdetailList.add(tempDNdetail);
                }
            }
@@ -424,10 +530,9 @@
                DNMap.put(dn.Name, dn);
            }
            list<Statu_Achievements_DN_details__c> insertSADNdetailList
                = new  list<Statu_Achievements_DN_details__c>();
            list<Statu_Achievements_DN_details__c> insertSADNdetailList = new List<Statu_Achievements_DN_details__c>();
            //电子签收单 虚进虚出 tracingcode为空不生成签收单 精琢技术 2020/12/08 start
             map <string, Statu_Achievements_DN__c> DNRestructureMap = new  map <string, Statu_Achievements_DN__c>();
            map<string, Statu_Achievements_DN__c> DNRestructureMap = new Map<string, Statu_Achievements_DN__c>();
            //电子签收单 虚进虚出 tracingcode为空不生成签收单 精琢技术 2020/12/08 end
            for (DNdetail tempDNd : insertDNdetailList) {
                if (DNMap.containskey(tempDNd.DeliveryNote)) {
@@ -442,21 +547,18 @@
                    if(tempSADN.ACC_Text__c != 'Y'){
                        if(String.isBlank(tempDNd.DNd.TracingCode_Raw__c)){
                            tempSADN.ACC_Text__c = 'Y';
                        }
                    }
                    DNRestructureMap.put(tempSADN.Name, tempSADN);
                    //电子签收单 虚进虚出 tracingcode为空不生成签收单 精琢技术 2020/12/08 end
                }
            }
            List<Statu_Achievements_DN_details__c> DNdetailList =
                [SELECT Id
            List<Statu_Achievements_DN_details__c> DNdetailList = [
                SELECT Id
                 FROM Statu_Achievements_DN_details__c
                 where Statu_Achievements_DN__r.Name in: DNMap.keySet()];
                WHERE Statu_Achievements_DN__r.Name IN :DNMap.keySet()
            ];
            if (DNdetailList.size() > 0 && !System.Test.isRunningTest()) {
                delete DNdetailList;
@@ -466,13 +568,12 @@
            }
            // 电子签收单  2020/07/17 start
            // 检索出签收单,并生成签收单map key 为DN号
            map <string, eSignForm__c> eSFMap = new  map <string, eSignForm__c>();
            List<eSignForm__c> eSFList =
                [select id, DNName__c,
                Hazardous_Chemicals__c,
                 Statu_Achievements__c,Statu_Achievements_DN__c
                 from eSignForm__c where
                 DNName__c in: DNNoSet];
            map<string, eSignForm__c> eSFMap = new Map<string, eSignForm__c>();
            List<eSignForm__c> eSFList = [
                SELECT id, DNName__c, Hazardous_Chemicals__c, Statu_Achievements__c, Statu_Achievements_DN__c
                FROM eSignForm__c
                WHERE DNName__c IN :DNNoSet
            ];
            for (eSignForm__c eSF : eSFList) {
                eSFMap.put(eSF.DNName__c, eSF);
            }
@@ -484,28 +585,24 @@
                upsert UpsertESFList;
            }
            // key 为 对应DN的ID
            map <string, eSignForm__c> eSFAllMap = new map <string, eSignForm__c> ();
            map<string, eSignForm__c> eSFAllMap = new Map<string, eSignForm__c>();
            for( eSignForm__c tempeSignForm : UpsertESFList){
                eSFAllMap.put(tempeSignForm.DNName__c,tempeSignForm);
            }
            // 检索现有签收单明细,并生成签收单明细map key 为DN号 + 产品OTCode
            map <string, eSignFormLineItem__c> eSFLMap = new  map <string, eSignFormLineItem__c>();
            List<eSignFormLineItem__c> eSFLList =
                [select id,DNProductNo__c,
                 Count__c,Product2__c,eSignForm__c
                 , CaseNumber__c
                 from eSignFormLineItem__c
                 where eSignForm__r.DNName__c in: DNNoSet
            map<string, eSignFormLineItem__c> eSFLMap = new Map<string, eSignFormLineItem__c>();
            List<eSignFormLineItem__c> eSFLList = [
                SELECT id, DNProductNo__c, Count__c, Product2__c, eSignForm__c, CaseNumber__c
                FROM eSignFormLineItem__c
                WHERE eSignForm__r.DNName__c IN :DNNoSet
                ];
            for (eSignFormLineItem__c eSFL : eSFLList) {
                eSFL.Count__c = 0;
                eSFLMap.put(eSFL.DNProductNo__c, eSFL);
            }
            // 构造签收单明细
            list<eSignFormLineItem__c> UpsertESFLList =
                SetupeSignFormLineItems( insertSADNdetailList, eSFLMap , eSFAllMap, prdsMap);
            list<eSignFormLineItem__c> UpsertESFLList = SetupeSignFormLineItems(insertSADNdetailList, eSFLMap, eSFAllMap, prdsMap);
            if(UpsertESFLList.size() > 0){
                upsert UpsertESFLList;
            }
@@ -515,19 +612,25 @@
                throw new ControllerUtil.myException('测试错误!');
            }
            // 电子签收单  2020/07/17 end
        } catch (Exception ex) {
            Database.rollback(sp);
            logstr += '\n' + ex.getMessage();
             rowData.IsUpsertDN__c = true;
            iflog.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + iflog.ErrorLog__c;
            if (rowData.DN_retry_cnt__c == null) rowData.DN_retry_cnt__c = 0;
            if (rowData.DN_retry_cnt__c == null)
                rowData.DN_retry_cnt__c = 0;
            if (rowData.DN_retry_cnt__c < batch_retry_max_cnt) {
                rowData.DN_retry_cnt__c++;
                DNUpsertSchedule.assignOneMinute();
            }
            if (rowData.DN_retry_cnt__c >= batch_retry_max_cnt) {
                rowData.ErrorLog__c = ex.getMessage() + '\n' + ex.getStackTraceString() + '\n' + rowData.ErrorLog__c + '错误次数已经超过自动收信设定的最大次数,请手动收信';
                rowData.ErrorLog__c =
                    ex.getMessage() +
                    '\n' +
                    ex.getStackTraceString() +
                    '\n' +
                    rowData.ErrorLog__c +
                    '错误次数已经超过自动收信设定的最大次数,请手动收信';
            }
        }
@@ -540,12 +643,13 @@
            iflog.ErrorLog__c = iflog.ErrorLog__c.subString(0, 32760) + ' ...';
        }
        update iflog;
    }
    //优化两次sql查询 thh 2021-11-02 start
    private static list<Statu_Achievements_DN__c> GetDNList(Set<String> DNNoSet){
        List<Statu_Achievements_DN__c> DNList =
                [select id, Name,
        List<Statu_Achievements_DN__c> DNList = [
            SELECT
                id,
                Name,
                 DeliveryDate_Raw__c,
                 DeliveryNote_Raw__c,
                 DepartmentNo_Raw__c,
@@ -555,49 +659,33 @@
                 SoNo_Raw__c,
                 Opportunity__c,
                 Statu_Achievements__c,
                 endUser__c
                endUser__c,
                 //电子签收单试点用户赋值
                 ,endUser__r.RecordType.Name
                endUser__r.RecordType.Name,
                 // 电子签收单 start 
                 , Sales_assistant_name_text__c,
                 RC_Manager__c,ReturnMark__c
                Sales_assistant_name_text__c,
                RC_Manager__c,
                ReturnMark__c,
                 // 试点用户,届时需要删掉
                 , EsignTestAccount__c
                EsignTestAccount__c,
                 // 电子签收单  end
                 //ET召回品不生成签收单 start
                , ETRecalledProducts__c
                ETRecalledProducts__c,
                 //ET召回品不生成签收单 end
                 //acc标识 start
                 ,ACC_Text__c,
                ACC_Text__c,
                 Is_Corrosion__c,
                 //无偿出库标识 thh 2021-11-01 start
                 Statu_Achievements__r.orderType__c 
                 //无偿出库标识 thh 2021-11-01 end
                 //acc标识 end
                 //Add by Li Jun 20230420 start
                 ,Opportunity__r.OCM_man_province_cus__c
                 //Add By Li Jun 20230420 end
                 from Statu_Achievements_DN__c where
                 Name in: DNNoSet];
            FROM Statu_Achievements_DN__c
            WHERE Name IN :DNNoSet
        ];
        return DNList;
    }
    global void finish(Database.BatchableContext BC) {
    }
    //Add By Li Jun 0420 Start query management province
    private static Map<String,OCM_Management_Province__c> provinceManagementMap{set;get;}
    public static Map<String,OCM_Management_Province__c> getManagementProvince(){
        if(provinceManagementMap !=null && provinceManagementMap.keySet().size()>0 ){
            return provinceManagementMap;
        }
        provinceManagementMap = new Map<String,OCM_Management_Province__c>();
        List <OCM_Management_Province__c > ompList = [select id, Name, SalesManage__c,GI_assistant__c,Window1__c   from OCM_Management_Province__c];
        for (OCM_Management_Province__c omp: ompList) {
            provinceManagementMap.put(omp.Name,omp);
        }
        return provinceManagementMap;
    }
      //Add By Li Jun 0420 End
    /* 构建签收单:
     * eSFMap 是系统里面现有的签收单
     * key 为 DN号;
@@ -605,7 +693,7 @@
     */
    @TestVisible
    private static list<eSignForm__c> SetupeSignForm(map <string, eSignForm__c> eSFMap , list<Statu_Achievements_DN__c> DNList){
        list<eSignForm__c> UpsertESFList = new list<eSignForm__c> ();
        list<eSignForm__c> UpsertESFList = new List<eSignForm__c>();
        for(Statu_Achievements_DN__c tempDN:DNList ){
            // 获取现有签收单
            eSignForm__c tempeSF = eSFMap.get(tempDN.Name);
@@ -614,21 +702,14 @@
            }
            // 签收单名字 为: DN号-发货日年月日
            string datestr = tempDN.DeliveryDate_Raw__c == null?
            Date.today().format().ReplaceAll('/', ''):
            tempDN.DeliveryDate_Raw__c ;
            string datestr = tempDN.DeliveryDate_Raw__c == null ? Date.today().format().ReplaceAll('/', '') : tempDN.DeliveryDate_Raw__c;
            tempeSF.Name = string.valueof(integer.valueOf(tempDN.Name)) + '-' +datestr;
            
            tempeSF.DNName__c = tempDN.Name;
            tempeSF.Statu_Achievements__c = tempDN.Statu_Achievements__c;
            tempeSF.Statu_Achievements_DN__c = tempDN.ID;
            //Updated By Li Jun 20230420 start
            //tempeSF.Sales_assistant_name_text__c = tempDN.Sales_assistant_name_text__c;
            tempeSF.Sales_assistant_name_text__c = tempDN.Opportunity__c != null && tempDN.Opportunity__r.OCM_man_province_cus__c != '' && getManagementProvince().containsKey(tempDN.Opportunity__r.OCM_man_province_cus__c)?
                                                    getManagementProvince().get(tempDN.Opportunity__r.OCM_man_province_cus__c).Window1__c: null;
            tempeSF.Sales_assistant_name_text__c = tempDN.Sales_assistant_name_text__c;
            tempeSF.RC_Manager__c = tempDN.RC_Manager__c;
            //Updated By Li Jun 20230420 end
            //生成签收单时,给是否无偿出库赋值  精琢技术 thh 2021-10-15 start
            if(tempDN.Statu_Achievements__r.orderType__c == 'ZM16'){
                tempeSF.isFreeDelivery__c = true;
@@ -637,9 +718,16 @@
            // 经销商试点用户
            //电子签收单 虚进虚出 明细为racing code 为空的 不生成签收单 20201207 精琢技术 start
            if(tempDN.EsignTestAccount__c && !tempDN.ETRecalledProducts__c&&!tempDN.ReturnMark__c&&(tempDN.ACC_Text__c!='Y'||(tempDN.ACC_Text__c=='Y'&&tempDN.Is_Corrosion__c))){//&&tempDN.Is_Corrosion__c
            if (
                tempDN.EsignTestAccount__c &&
                !tempDN.ETRecalledProducts__c &&
                !tempDN.ReturnMark__c &&
                (tempDN.ACC_Text__c != 'Y' || (tempDN.ACC_Text__c == 'Y' && tempDN.Is_Corrosion__c))
            ) {
                //&&tempDN.Is_Corrosion__c
                //添加危化品标识
                if(tempDN.ACC_Text__c=='Y'&&tempDN.Is_Corrosion__c){//&&tempDN.Is_Corrosion__c
                if (tempDN.ACC_Text__c == 'Y' && tempDN.Is_Corrosion__c) {
                    //&&tempDN.Is_Corrosion__c
                    tempeSF.Hazardous_Chemicals__c=true;
                }
                UpsertESFList.add(tempeSF);
@@ -663,12 +751,13 @@
    @TestVisible
    private static list<eSignFormLineItem__c> SetupeSignFormLineItems(
        list<Statu_Achievements_DN_details__c> insertSADNdetailList,
        map <string, eSignFormLineItem__c> eSFLMap ,map <string, eSignForm__c> eSFAllMap,
        Map<String, Product2> prdsMap){
        map<string, eSignFormLineItem__c> eSFLMap,
        map<string, eSignForm__c> eSFAllMap,
        Map<String, Product2> prdsMap
    ) {
            // key 是 DN号 + 箱号 + 产品OTCode
            for(Statu_Achievements_DN_details__c tempDNDetail : insertSADNdetailList){
                string key = tempDNDetail.DNName__c + '-' +
                tempDNDetail.CaseNumber__c + '-' + tempDNDetail.OTCode_Raw__c;
            string key = tempDNDetail.DNName__c + '-' + tempDNDetail.CaseNumber__c + '-' + tempDNDetail.OTCode_Raw__c;
                //获取现有签收单明细
                eSignFormLineItem__c tempeSignFormLineItem = eSFLMap.get(key);
                if( tempeSignFormLineItem == null){
@@ -684,8 +773,13 @@
                }
                // Double CaseNumber = tempDNDetail.CaseNumber__c == null ? tempDNDetail.CaseNumber__c : Double.valueOf(tempDNDetail.CaseNumber__c);
                tempeSignFormLineItem.DNProductNo__c = key ;
                tempeSignFormLineItem.Name  = tempDNDetail.CaseNumber__c == null ? String.valueOf(integer.valueOf(tempDNDetail.DNName__c)) + '-' +  tempDNDetail.OTCode_Raw__c:String.valueOf(integer.valueOf(tempDNDetail.DNName__c)) + '-' +
                tempDNDetail.CaseNumber__c + '-' + tempDNDetail.OTCode_Raw__c;
            tempeSignFormLineItem.Name = tempDNDetail.CaseNumber__c == null
                ? String.valueOf(integer.valueOf(tempDNDetail.DNName__c)) + '-' + tempDNDetail.OTCode_Raw__c
                : String.valueOf(integer.valueOf(tempDNDetail.DNName__c)) +
                  '-' +
                  tempDNDetail.CaseNumber__c +
                  '-' +
                  tempDNDetail.OTCode_Raw__c;
                tempeSignFormLineItem.Product2__c = prdsMap.get(tempDNDetail.OTCode_Raw__c).ID;
                if(eSFAllMap.containskey(tempDNDetail.DNName__c)){
                    tempeSignFormLineItem.eSignForm__c = eSFAllMap.get(tempDNDetail.DNName__c).ID;
@@ -702,7 +796,8 @@
        Map<String, Opportunity> oppMap,
      Map<String, Account> accsMap, 
        Map < String, String > provinceOwnerMap,
        Map < String, String > provinceGIMap) {
        Map<String, String> provinceGIMap
    ) {
            tempSADN.SoNo_Raw__c = infoH.SoNo;
            tempSADN.InquiryNo_Raw__c = infoH.InquiryNo ;
            tempSADN.ReturnMark_Raw__c = infoH.ReturnMark ;
@@ -754,22 +849,17 @@
                    tempSADN.Is_Corrosion__c=opp.Is_Corrosion__c;
                    // 电子签收单  赋值营业助理和营业管理部担当 start
                    //集中采购的询价 精琢技术 wql 2020/01/11 start 
                    //Add By Li Jun 20230420 Start
                    tempSADN.Sales_assistant_name_text__c =opp.OCM_man_province_cus__c!='' && provinceGIMap.containskey(opp.OCM_man_province_cus__c)?provinceGIMap.get(opp.OCM_man_province_cus__c):null;
                    //Add By Li Jun 20230420 End
                    if(opp.Group_purchase_PCL__c){
                        //tempSADN.Sales_assistant_name_text__c = provinceGIMap.get('集采课'); //Commented By Li Jun 20230420
                    tempSADN.Sales_assistant_name_text__c = provinceGIMap.get('集采课');
                        tempSADN.RC_Manager__c =  provinceOwnerMap.get('集采课');
                    }else{
                        //tempSADN.Sales_assistant_name_text__c = opp.Sales_assistant_name_text__c; //Commented By Li Jun 20230420
                    tempSADN.Sales_assistant_name_text__c = opp.Sales_assistant_name_text__c;
                        tempSADN.RC_Manager__c =  provinceOwnerMap.get(opp.OCM_man_province_cus__c);
                    }
                    //集中采购的询价 精琢技术 wql 2020/01/11 end
                    
                    //如果 发货日期 大于 2020/12/01 才生成签收单
                    if(DeliveryDate >= todate){
                        tempSADN.EsignTestAccount__c =true;
                    }else{
                        tempSADN.EsignTestAccount__c =false;
@@ -782,7 +872,6 @@
                    }else{
                        tempSADN.ETRecalledProducts__c =false;
                    }
                }
                if (Inquiry.size() > 1) {
                    tempSADN.Order_No__c = Inquiry[1];
@@ -790,35 +879,40 @@
            }
            return tempSADN;
        }
    private static void checkSA(Statu_Achievements_DN__c tempSADN,
    private static void checkSA(
        Statu_Achievements_DN__c tempSADN,
                                List<Statu_Achievements_DN__c> UpsertDNList,
                                BatchIF_Log__c iflog,
                                NFM110rest.GeneralData infoH ) {
        NFM110rest.GeneralData infoH
    ) {
                                    if (tempSADN.Statu_Achievements__c != null)
                                        UpsertDNList.add(tempSADN);
                                    else {
                                        iflog.ErrorLog__c += 'warning! SoNo[' + infoH.SoNo +
                                            '] Statu_Achievements__c  NotExist. The insert of this DN is skipped.\n';
            iflog.ErrorLog__c += 'warning! SoNo[' + infoH.SoNo + '] Statu_Achievements__c  NotExist. The insert of this DN is skipped.\n';
                                    }                                    
                                }
    private static DNdetail SetSADNDetails(string DNnumber, boolean returnFlg,
                                           NFM110Rest.DnInformation dnInfo, asset ast, integer tempDNdetailNumber) {
    private static DNdetail SetSADNDetails(
        string DNnumber,
        boolean returnFlg,
        NFM110Rest.DnInformation dnInfo,
        asset ast,
        integer tempDNdetailNumber
    ) {
                                               DNdetail tempDNdetail = new DNdetail();
                                               Statu_Achievements_DN_details__c DNd = new Statu_Achievements_DN_details__c();
                                               DNd.Qty_Raw__c = dnInfo.QTY;
                                               DNd.QTY__c = String.isBlank(dnInfo.QTY) || Decimal.valueOf(dnInfo.QTY.trim()) == 0 ?
                                                   1 : Decimal.valueOf(dnInfo.QTY.trim());
                                               DNd.ShippedAmount_without_tax__c = String.isBlank(dnInfo.NetWorth) ?
                                                   0 : returnFlg == false ?
                                                       Decimal.valueOf(dnInfo.NetWorth.trim()) : - Decimal.valueOf(dnInfo.NetWorth.trim());
        DNd.QTY__c = String.isBlank(dnInfo.QTY) || Decimal.valueOf(dnInfo.QTY.trim()) == 0 ? 1 : Decimal.valueOf(dnInfo.QTY.trim());
        DNd.ShippedAmount_without_tax__c = String.isBlank(dnInfo.NetWorth)
            ? 0
            : returnFlg == false ? Decimal.valueOf(dnInfo.NetWorth.trim()) : -Decimal.valueOf(dnInfo.NetWorth.trim());
                                               DNd.ShippedAmount__c = String.isBlank(dnInfo.VALUE) ?
                                                   0 : returnFlg == false ?
                                                       Decimal.valueOf(dnInfo.VALUE.trim()) : - Decimal.valueOf(dnInfo.VALUE.trim());
        DNd.ShippedAmount__c = String.isBlank(dnInfo.VALUE)
            ? 0
            : returnFlg == false ? Decimal.valueOf(dnInfo.VALUE.trim()) : -Decimal.valueOf(dnInfo.VALUE.trim());
                                               DNd.NetWorthNoProviston__c = String.isBlank(dnInfo.NetWorthNoProviston) ?
                                                   0 : returnFlg == false ?
                                                       Decimal.valueOf(dnInfo.NetWorthNoProviston.trim()) : - Decimal.valueOf(dnInfo.NetWorthNoProviston.trim());
        DNd.NetWorthNoProviston__c = String.isBlank(dnInfo.NetWorthNoProviston)
            ? 0
            : returnFlg == false ? Decimal.valueOf(dnInfo.NetWorthNoProviston.trim()) : -Decimal.valueOf(dnInfo.NetWorthNoProviston.trim());
                                               if (dnInfo.SorLMark == 'S') {
                                                   DNd.SerialNumber__c = dnInfo.SerialNoorLotNo;
                                               } else {