buli
2023-05-04 d4a4ce824f3b2f3a335a3ad8e8c9efb3b37d630f
force-app/main/default/classes/DNUpsertBatch.cls
@@ -1,5 +1,5 @@
global class DNUpsertBatch implements Database.Batchable<sObject>, Database.Stateful {
    public string  rowData_Id;
    public string rowData_Id;
    public transient static List<Id> orderReturnIdList;
    private class DNdetail {
        private string DeliveryNote;
@@ -8,29 +8,69 @@
    global DNUpsertBatch() {
    }
    global DNUpsertBatch( string rowData_Id ) {
    global DNUpsertBatch(string rowData_Id) {
        this.rowData_Id = rowData_Id;
    }
    global Database.QueryLocator start(Database.BatchableContext bc) {
        if( string.isBlank( rowData_Id )){
        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))]);
        }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 ]);
                [
                    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
                ]
            );
        }
    }
    global void execute(Database.BatchableContext BC, List<BatchIF_Log__c> rowDataList) {
@@ -41,19 +81,19 @@
        // String day = String.valueOf(strdate.day()) ;
        // String datestr = String.valueOf(year+month+day);
        //add by rentx 20210727 end
        BatchIF_Log__c rowData = rowDataList[0];
        rowData.IsUpsertDN__c = false;
        update rowData;
        //update by rentx  20210823
        //update by rentx  20210823
        //本次修改只针对于保有设备 之前使用年月日去插入时 会出现 同一天多批日志里有同一个设备 导致更新失败  现解决方案为精确到分
        Datetime nowTime = rowData.CreatedDate;
        String oyear = String.valueOf(nowTime.year()) ;
        String omonth = String.valueOf(nowTime.month()) ;
        String oday = String.valueOf(nowTime.day()) ;
        String ohour = String.valueOf(nowTime.hour()) ;
        String ominute = String.valueOf(nowTime.minute()) ;
        String datestr = String.valueOf(oyear+omonth+oday+ohour+ominute);
        String oyear = String.valueOf(nowTime.year());
        String omonth = String.valueOf(nowTime.month());
        String oday = String.valueOf(nowTime.day());
        String ohour = String.valueOf(nowTime.hour());
        String ominute = String.valueOf(nowTime.minute());
        String datestr = String.valueOf(oyear + omonth + oday + ohour + ominute);
        //update by rentx  20210823
        //之前使用年月日去插入时 会出现 同一天多批日志里有同一个设备 导致更新失败  现解决方案为精确到分
@@ -69,30 +109,30 @@
        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){
            if(tempAcc.AgentCode_Ext__c.equals('9999900')){
        Account ocm, olympus, olympus_return;
        for (Account tempAcc : olympusAcclist) {
            if (tempAcc.AgentCode_Ext__c.equals('9999900')) {
                ocm = tempAcc;
            }else if(tempAcc.AgentCode_Ext__c.equals('9999999')){
            } else if (tempAcc.AgentCode_Ext__c.equals('9999999')) {
                olympus = tempAcc;
            }else if(tempAcc.AgentCode_Ext__c.equals('9999901')){
            } else if (tempAcc.AgentCode_Ext__c.equals('9999901')) {
                olympus_return = tempAcc;
            }
        }
    // 电子签收单 end
        // 电子签收单 end
        NFM110Rest.isRunning = true;
        //orderoutIdList = new List<Id>();
        orderReturnIdList = new List<Id>();
@@ -121,7 +161,7 @@
                // 病院と診療科の管理コード、TODO 販売店
                infoH.EndUserNo = NFMUtil.trimLeft(infoH.EndUserNo, '0');
                infoH.DepartmentNo = NFMUtil.trimLeft(infoH.DepartmentNo, '0');
                if (infoH.EndUserNo == null || infoH.EndUserNo  == '') {
                if (infoH.EndUserNo == null || infoH.EndUserNo == '') {
                    // 病院と診療科の管理コードがない場合、処理と飛ばす
                    continue;
                }
@@ -145,106 +185,121 @@
                        //根据数据传的样式决定
                    }
                }
                if (!(infoH.ReturnMark == null || infoH.ReturnMark  == ''
                      || infoH.ReturnMark == '1' || infoH.ReturnMark == '3'
                     )) {
                         // ReturnMark = 上記以外の場合 Errorメッセージ出力
                         continue;
                     }
                if (!(infoH.ReturnMark == null || infoH.ReturnMark == '' || infoH.ReturnMark == '1' || infoH.ReturnMark == '3')) {
                    // ReturnMark = 上記以外の場合 Errorメッセージ出力
                    continue;
                }
                for (nfm110rest.DnInformation dnInfo : infoH.DnInformation) {
                    dnInfo.SerialNoorLotNo = checkSerialNoorLotNo(dnInfo.SerialNoorLotNo);
                    productCodeList.add(dnInfo.OTCode);
                    // 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 == ''
                       ) {
                           // 商品コードがない場合、処理と飛ばす
                           continue;
                       }
                    if (dnInfo.OTCode == null || dnInfo.OTCode == '' || dnInfo.SerialNoorLotNo == null || dnInfo.SerialNoorLotNo == '') {
                        // 商品コードがない場合、処理と飛ばす
                        continue;
                    }
                    // HHOA-AGN2EH start
                    //add by rentx 20210726 start
                    dnInfo.SerialNoorLotNo = dnInfo.SerialNoorLotNo == '.'? datestr +dnInfo.OTCode : dnInfo.SerialNoorLotNo;
                    //add by rentx 20210726 start
                    dnInfo.SerialNoorLotNo = dnInfo.SerialNoorLotNo == '.' ? datestr + dnInfo.OTCode : dnInfo.SerialNoorLotNo;
                    //update by rentx 20210726 end
                    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
                                        // 电子签收单 start
                                        // 临时使用 用作试点经销商
                                        ,Agency1__r.EsignTestAccount__c,Agency1__r.EsignTestAccountType__c
                                        // 电子签收单 end
                                        //集中采购询价 精琢技术 wql  start
                                        ,Group_purchase_PCL__c
                                        //集中采购询价 精琢技术 wql  end
                                        ,Is_Corrosion__c
                                         From Opportunity Where Opportunity_No__c IN :inquiryNoList];
            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,
                    // 电子签收单 end
                    //集中采购询价 精琢技术 wql  start
                    Group_purchase_PCL__c,
                    //集中采购询价 精琢技术 wql  end
                    Is_Corrosion__c
                FROM Opportunity
                WHERE Opportunity_No__c IN :inquiryNoList
            ];
            for (Opportunity opp : oppList) {
                oppMap.put(opp.Opportunity_No__c, opp);
            }
            // 检索出DN 并生成DN Map
            Boolean flg=true;
            map <string, Statu_Achievements_DN__c> DNMap = new  map <string, Statu_Achievements_DN__c>();
            Boolean flg = true;
            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,
                //  DeliveryNote_Raw__c,
                //  DepartmentNo_Raw__c,
                //  EndUserNo_Raw__c,
                //  InquiryNo_Raw__c,
                //  ReturnMark_Raw__c,
                //  SoNo_Raw__c,
                //  Opportunity__c,
                //  Statu_Achievements__c,
                //  endUser__c
                //  //电子签收单试点用户赋值
                //  ,endUser__r.RecordType.Name
                //  // 电子签收单 start
                //  , Sales_assistant_name_text__c,
                //  RC_Manager__c,ReturnMark__c
                //  // 试点用户,届时需要删掉
                //  , EsignTestAccount__c
                //  // 电子签收单  end
                //  //ET召回品不生成签收单 start
                // , ETRecalledProducts__c
                //  //ET召回品不生成签收单 end
                //  //acc标识 start
                //  ,ACC_Text__c,
                //  Is_Corrosion__c,
                //  //无偿出库标识 thh 2021-11-01 start
                //  Statu_Achievements__r.orderType__c
                //  //无偿出库标识 thh 2021-11-01 end
                //  //acc标识 end
                //  from Statu_Achievements_DN__c where
                //  Name in: DNNoSet];
            // [select id, Name,
            //  DeliveryDate_Raw__c,
            //  DeliveryNote_Raw__c,
            //  DepartmentNo_Raw__c,
            //  EndUserNo_Raw__c,
            //  InquiryNo_Raw__c,
            //  ReturnMark_Raw__c,
            //  SoNo_Raw__c,
            //  Opportunity__c,
            //  Statu_Achievements__c,
            //  endUser__c
            //  //电子签收单试点用户赋值
            //  ,endUser__r.RecordType.Name
            //  // 电子签收单 start
            //  , Sales_assistant_name_text__c,
            //  RC_Manager__c,ReturnMark__c
            //  // 试点用户,届时需要删掉
            //  , EsignTestAccount__c
            //  // 电子签收单  end
            //  //ET召回品不生成签收单 start
            // , ETRecalledProducts__c
            //  //ET召回品不生成签收单 end
            //  //acc标识 start
            //  ,ACC_Text__c,
            //  Is_Corrosion__c,
            //  //无偿出库标识 thh 2021-11-01 start
            //  Statu_Achievements__r.orderType__c
            //  //无偿出库标识 thh 2021-11-01 end
            //  //acc标识 end
            //  from Statu_Achievements_DN__c where
            //  Name in: DNNoSet];
            for (Statu_Achievements_DN__c dn : DNList) {
                DNMap.put(dn.Name, dn);
            }
@@ -254,49 +309,73 @@
            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);
            }
            // 电子签收单 start
            // key 是省份名字, value 是对应的营业管理部担当 1 ,2 ,3
            Map < String, String > provinceOwnerMap = new Map< String, String > ();
            Map<String, String> provinceOwnerMap = new Map<String, String>();
            //集中采购询价 构建助理map key是省份名称 value是助理
            Map < String, String > provinceGIMap = new Map< String, String > ();
            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) {
            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,48 +399,72 @@
                    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';
                if (infoH.EndUserNo == null || infoH.EndUserNo == '') {
                    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 );
                        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 ||
                            infoH.EndUserNo != tempSADN.EndUserNo_Raw__c ||
                            infoH.DepartmentNo != tempSADN.DepartmentNo_Raw__c ||
                            infoH.DeliveryNote != tempSADN.DeliveryNote_Raw__c
                           ) {
                               string SADNID = tempSADN.id;
                               // 电子签收单  额外增加营业管理部担当赋值 start
                               tempSADN = SetSADN(tempSADN, infoH, boMap,
                               oppMap,accsMap, provinceOwnerMap,provinceGIMap);
                               // 电子签收单  额外增加营业管理部担当赋值 end
                               tempSADN.id = SADNID;
                               checkSA( tempSADN, UpsertDNList, iflog, infoH );
                           }
                        ) {
                            string SADNID = tempSADN.id;
                            // 电子签收单  额外增加营业管理部担当赋值 start
                            tempSADN = SetSADN(tempSADN, infoH, boMap, oppMap, accsMap, provinceOwnerMap, provinceGIMap);
                            // 电子签收单  额外增加营业管理部担当赋值 end
                            tempSADN.id = SADNID;
                            checkSA(tempSADN, UpsertDNList, iflog, infoH);
                        }
                    }
                }
                integer tempDNdetailNumber = 0;
@@ -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);
                }
            }
@@ -391,43 +497,42 @@
                DNMap.put(tempSADN.Name, tempSADN);
            }
            DNList = GetDNList(DNMap.keySet());
                // [select id, Name,
                //  DeliveryDate_Raw__c,
                //  DeliveryNote_Raw__c,
                //  DepartmentNo_Raw__c,
                //  EndUserNo_Raw__c,
                //  InquiryNo_Raw__c,
                //  ReturnMark_Raw__c,
                //  SoNo_Raw__c,
                //  Opportunity__c,
                //  Statu_Achievements__c,
                //  endUser__c
                //  //电子签收单试点用户赋值
                //  ,endUser__r.RecordType.Name
                //  // 电子签收单 start
                //  , Sales_assistant_name_text__c,
                //  RC_Manager__c,ReturnMark__c
                //  // 试点用户,届时需要删掉
                //  , EsignTestAccount__c
                //  // 电子签收单  end
                //  //ET召回品不生成签收单 start
                // , ETRecalledProducts__c
                //  //ET召回品不生成签收单 end
                //  //acc标识 start
                //  ,ACC_Text__c,
                //  Is_Corrosion__c,
                //  Statu_Achievements__r.orderType__c
                //  //acc标识 end
                //  from Statu_Achievements_DN__c where
                //  Name in: DNMap.keySet()];
            // [select id, Name,
            //  DeliveryDate_Raw__c,
            //  DeliveryNote_Raw__c,
            //  DepartmentNo_Raw__c,
            //  EndUserNo_Raw__c,
            //  InquiryNo_Raw__c,
            //  ReturnMark_Raw__c,
            //  SoNo_Raw__c,
            //  Opportunity__c,
            //  Statu_Achievements__c,
            //  endUser__c
            //  //电子签收单试点用户赋值
            //  ,endUser__r.RecordType.Name
            //  // 电子签收单 start
            //  , Sales_assistant_name_text__c,
            //  RC_Manager__c,ReturnMark__c
            //  // 试点用户,届时需要删掉
            //  , EsignTestAccount__c
            //  // 电子签收单  end
            //  //ET召回品不生成签收单 start
            // , ETRecalledProducts__c
            //  //ET召回品不生成签收单 end
            //  //acc标识 start
            //  ,ACC_Text__c,
            //  Is_Corrosion__c,
            //  Statu_Achievements__r.orderType__c
            //  //acc标识 end
            //  from Statu_Achievements_DN__c where
            //  Name in: DNMap.keySet()];
            for (Statu_Achievements_DN__c dn : DNList) {
                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)) {
@@ -438,25 +543,22 @@
                    insertSADNdetailList.add(tempDNd.DNd);
                    //电子签收单 虚进虚出 tracingcode为空不生成签收单 精琢技术 2020/12/08 start
                    if(tempSADN.ACC_Text__c != 'Y'){
                        if(String.isBlank(tempDNd.DNd.TracingCode_Raw__c)){
                            tempSADN.ACC_Text__c = 'Y';
                    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
                 FROM Statu_Achievements_DN_details__c
                 where Statu_Achievements_DN__r.Name in: DNMap.keySet()];
            List<Statu_Achievements_DN_details__c> DNdetailList = [
                SELECT Id
                FROM Statu_Achievements_DN_details__c
                WHERE Statu_Achievements_DN__r.Name IN :DNMap.keySet()
            ];
            if (DNdetailList.size() > 0 && !System.Test.isRunningTest()) {
                delete DNdetailList;
@@ -466,68 +568,69 @@
            }
            // 电子签收单  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);
            }
            //电子签收单 虚进虚出 明细为racing code 为空的 不生成签收单 20201207 精琢技术 start
            list<eSignForm__c> UpsertESFList = SetupeSignForm( eSFMap , DNRestructureMap.values() );
            list<eSignForm__c> UpsertESFList = SetupeSignForm(eSFMap, DNRestructureMap.values());
            //电子签收单 虚进虚出 明细为racing code 为空的 不生成签收单 20201207 精琢技术 end
            if(UpsertESFList.size()> 0) {
            if (UpsertESFList.size() > 0) {
                upsert UpsertESFList;
            }
            // key 为 对应DN的ID
            map <string, eSignForm__c> eSFAllMap = new map <string, eSignForm__c> ();
            for( eSignForm__c tempeSignForm : UpsertESFList){
                eSFAllMap.put(tempeSignForm.DNName__c,tempeSignForm);
            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);
            if(UpsertESFLList.size() > 0){
            list<eSignFormLineItem__c> UpsertESFLList = SetupeSignFormLineItems(insertSADNdetailList, eSFLMap, eSFAllMap, prdsMap);
            if (UpsertESFLList.size() > 0) {
                upsert UpsertESFLList;
            }
            rowData.IsUpsertDN__c = false;
            rowData.DN_retry_cnt__c = 0;
            if(System.Test.isRunningTest()){
            if (System.Test.isRunningTest()) {
                throw new ControllerUtil.myException('测试错误!');
            }
            // 电子签收单  2020/07/17 end
        } catch (Exception ex) {
            Database.rollback(sp);
            logstr += '\n' + ex.getMessage();
             rowData.IsUpsertDN__c = true;
            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,107 +643,92 @@
            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,
                 DeliveryDate_Raw__c,
                 DeliveryNote_Raw__c,
                 DepartmentNo_Raw__c,
                 EndUserNo_Raw__c,
                 InquiryNo_Raw__c,
                 ReturnMark_Raw__c,
                 SoNo_Raw__c,
                 Opportunity__c,
                 Statu_Achievements__c,
                 endUser__c
                 //电子签收单试点用户赋值
                 ,endUser__r.RecordType.Name
                 // 电子签收单 start
                 , Sales_assistant_name_text__c,
                 RC_Manager__c,ReturnMark__c
                 // 试点用户,届时需要删掉
                 , EsignTestAccount__c
                 // 电子签收单  end
                 //ET召回品不生成签收单 start
                , ETRecalledProducts__c
                 //ET召回品不生成签收单 end
                 //acc标识 start
                 ,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];
    private static list<Statu_Achievements_DN__c> GetDNList(Set<String> DNNoSet) {
        List<Statu_Achievements_DN__c> DNList = [
            SELECT
                id,
                Name,
                DeliveryDate_Raw__c,
                DeliveryNote_Raw__c,
                DepartmentNo_Raw__c,
                EndUserNo_Raw__c,
                InquiryNo_Raw__c,
                ReturnMark_Raw__c,
                SoNo_Raw__c,
                Opportunity__c,
                Statu_Achievements__c,
                endUser__c,
                //电子签收单试点用户赋值
                endUser__r.RecordType.Name,
                // 电子签收单 start
                Sales_assistant_name_text__c,
                RC_Manager__c,
                ReturnMark__c,
                // 试点用户,届时需要删掉
                EsignTestAccount__c,
                // 电子签收单  end
                //ET召回品不生成签收单 start
                ETRecalledProducts__c,
                //ET召回品不生成签收单 end
                //acc标识 start
                ACC_Text__c,
                Is_Corrosion__c,
                //无偿出库标识 thh 2021-11-01 start
                Statu_Achievements__r.orderType__c
            //无偿出库标识 thh 2021-11-01 end
            //acc标识 end
            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号;
     * 退货DN不生成签收单
     */
    @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> ();
        for(Statu_Achievements_DN__c tempDN:DNList ){
    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>();
        for (Statu_Achievements_DN__c tempDN : DNList) {
            // 获取现有签收单
            eSignForm__c tempeSF = eSFMap.get(tempDN.Name);
            if( tempeSF == null ){
            if (tempeSF == null) {
                tempeSF = new eSignForm__c();
            }
            // 签收单名字 为: DN号-发货日年月日
            string datestr = tempDN.DeliveryDate_Raw__c == null?
            Date.today().format().ReplaceAll('/', ''):
            tempDN.DeliveryDate_Raw__c ;
            tempeSF.Name = string.valueof(integer.valueOf(tempDN.Name)) + '-' +datestr;
            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'){
            if (tempDN.Statu_Achievements__r.orderType__c == 'ZM16') {
                tempeSF.isFreeDelivery__c = true;
            }
            //生成签收单时,给是否无偿出库赋值  精琢技术 thh 2021-10-15 end
            // 经销商试点用户
            //电子签收单 虚进虚出 明细为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
                    tempeSF.Hazardous_Chemicals__c=true;
                if (tempDN.ACC_Text__c == 'Y' && tempDN.Is_Corrosion__c) {
                    //&&tempDN.Is_Corrosion__c
                    tempeSF.Hazardous_Chemicals__c = true;
                }
                UpsertESFList.add(tempeSF);
            }
@@ -663,202 +751,208 @@
    @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){
            // key 是 DN号 + 箱号 + 产品OTCode
            for(Statu_Achievements_DN_details__c tempDNDetail : insertSADNdetailList){
                string key = tempDNDetail.DNName__c + '-' +
                tempDNDetail.CaseNumber__c + '-' + tempDNDetail.OTCode_Raw__c;
                //获取现有签收单明细
                eSignFormLineItem__c tempeSignFormLineItem = eSFLMap.get(key);
                if( tempeSignFormLineItem == null){
                    tempeSignFormLineItem = new eSignFormLineItem__c();
                    tempeSignFormLineItem.Count__c = 0;
                }
                tempeSignFormLineItem.Count__c++;
                // Double CaseNumber;
                if(string.isBlank(tempDNDetail.CaseNumber__c)){
                    tempeSignFormLineItem.CaseNumber__c = null;
                }else{
                    tempeSignFormLineItem.CaseNumber__c = Double.valueOf(tempDNDetail.CaseNumber__c);
                }
                // 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.Product2__c = prdsMap.get(tempDNDetail.OTCode_Raw__c).ID;
                if(eSFAllMap.containskey(tempDNDetail.DNName__c)){
                    tempeSignFormLineItem.eSignForm__c = eSFAllMap.get(tempDNDetail.DNName__c).ID;
                    eSFLMap.put(key,tempeSignFormLineItem);
                }
        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;
            //获取现有签收单明细
            eSignFormLineItem__c tempeSignFormLineItem = eSFLMap.get(key);
            if (tempeSignFormLineItem == null) {
                tempeSignFormLineItem = new eSignFormLineItem__c();
                tempeSignFormLineItem.Count__c = 0;
            }
            return eSFLMap.values();
            tempeSignFormLineItem.Count__c++;
            // Double CaseNumber;
            if (string.isBlank(tempDNDetail.CaseNumber__c)) {
                tempeSignFormLineItem.CaseNumber__c = null;
            } else {
                tempeSignFormLineItem.CaseNumber__c = Double.valueOf(tempDNDetail.CaseNumber__c);
            }
            // 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.Product2__c = prdsMap.get(tempDNDetail.OTCode_Raw__c).ID;
            if (eSFAllMap.containskey(tempDNDetail.DNName__c)) {
                tempeSignFormLineItem.eSignForm__c = eSFAllMap.get(tempDNDetail.DNName__c).ID;
                eSFLMap.put(key, tempeSignFormLineItem);
            }
        }
        return eSFLMap.values();
    }
    // 设置发货DN
    private static Statu_Achievements_DN__c SetSADN(
        Statu_Achievements_DN__c tempSADN,
        NFM110Rest.GeneralData infoH,
        Map<String, String> boMap,
        Map<String, Opportunity> oppMap,
      Map<String, Account> accsMap,
        Map < String, String > provinceOwnerMap,
        Map < String, String > provinceGIMap) {
            tempSADN.SoNo_Raw__c = infoH.SoNo;
            tempSADN.InquiryNo_Raw__c = infoH.InquiryNo ;
            tempSADN.ReturnMark_Raw__c = infoH.ReturnMark ;
            tempSADN.DeliveryDate_Raw__c = infoH.DeliveryDate ;
            tempSADN.EndUserNo_Raw__c = infoH.EndUserNo ;
            tempSADN.DepartmentNo_Raw__c = infoH.DepartmentNo ;
            tempSADN.DeliveryNote_Raw__c = infoH.DeliveryNote ;
            // 电子签收单 2020/07/17 start
            tempSADN.supplier__c = infoH.supplier ;
            tempSADN.supplierNo__c = infoH.supplierNo ;
            tempSADN.shippingUnit__c = infoH.shippingUnit ;
            tempSADN.shippingAddress__c = infoH.shippingAddress ;
            tempSADN.contactName__c = infoH.contactName ;
            tempSADN.contactNumber__c = infoH.contactNumber ;
            tempSADN.totalNumber__c = infoH.totalNumber ;
            tempSADN.transportMode__c = infoH.transportMode ;
            tempSADN.totalWeight__c = infoH.totalWeight ;
            //tempSADN.GoodDetails__c = infoH.GoodDetails ;
            //tempSADN.weight__c = infoH.weight ;
            tempSADN.endUser__c = accsMap.get(infoH.EndUserNo) == null ?null : accsMap.get(infoH.EndUserNo).id  ;
        Map<String, Account> accsMap,
        Map<String, String> provinceOwnerMap,
        Map<String, String> provinceGIMap
    ) {
        tempSADN.SoNo_Raw__c = infoH.SoNo;
        tempSADN.InquiryNo_Raw__c = infoH.InquiryNo;
        tempSADN.ReturnMark_Raw__c = infoH.ReturnMark;
        tempSADN.DeliveryDate_Raw__c = infoH.DeliveryDate;
        tempSADN.EndUserNo_Raw__c = infoH.EndUserNo;
        tempSADN.DepartmentNo_Raw__c = infoH.DepartmentNo;
        tempSADN.DeliveryNote_Raw__c = infoH.DeliveryNote;
        // 电子签收单 2020/07/17 start
        tempSADN.supplier__c = infoH.supplier;
        tempSADN.supplierNo__c = infoH.supplierNo;
        tempSADN.shippingUnit__c = infoH.shippingUnit;
        tempSADN.shippingAddress__c = infoH.shippingAddress;
        tempSADN.contactName__c = infoH.contactName;
        tempSADN.contactNumber__c = infoH.contactNumber;
        tempSADN.totalNumber__c = infoH.totalNumber;
        tempSADN.transportMode__c = infoH.transportMode;
        tempSADN.totalWeight__c = infoH.totalWeight;
        //tempSADN.GoodDetails__c = infoH.GoodDetails ;
        //tempSADN.weight__c = infoH.weight ;
        tempSADN.endUser__c = accsMap.get(infoH.EndUserNo) == null ? null : accsMap.get(infoH.EndUserNo).id;
            // 电子签收单 2020/07/17 end
            //增加发货DNacc标识 2020/11/23 start
            if(infoH.ACCMark !=null){
                if(infoH.ACCMark.trim() == 'Y'){
                    tempSADN.ACC_Mark__c = 'Y';
                }else{
                    tempSADN.ACC_Mark__c = 'N';
                }
        // 电子签收单 2020/07/17 end
        //增加发货DNacc标识 2020/11/23 start
        if (infoH.ACCMark != null) {
            if (infoH.ACCMark.trim() == 'Y') {
                tempSADN.ACC_Mark__c = 'Y';
            } else {
                tempSADN.ACC_Mark__c = 'N';
            }
            tempSADN.name = infoH.DeliveryNote;
            tempSADN.ReturnMark__c = infoH.ReturnMark == '1' ? true : false;
            if (tempSADN.Statu_Achievements__c == null) {
                tempSADN.Statu_Achievements__c = boMap.get(infoH.SoNo);
            }
            tempSADN.DeliveryDate__c = NFMUtil.parseStr2Date(infoH.DeliveryDate);
            //发货日在2020/12/01以后的,才生成签收单 start
            Date afterDate = NFMUtil.parseStr2Date('20201201');
            String todate = NFMUtil.formatDate2Str(afterDate);
            String DeliveryDate = NFMUtil.formatDate2Str(tempSADN.DeliveryDate__c);
            //发货日在2020/12/01以后的,才生成签收单 end
            String[] Inquiry;
            if (infoH.InquiryNo != null && infoH.InquiryNo.contains(',')) {
                Inquiry = infoH.InquiryNo.split(',');
                if (oppMap.get(Inquiry[0]) != null) {
                    opportunity opp =  oppMap.get(Inquiry[0]);
                    tempSADN.Opportunity__c = opp.id;
                    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.RC_Manager__c =  provinceOwnerMap.get('集采课');
                    }else{
                        //tempSADN.Sales_assistant_name_text__c = opp.Sales_assistant_name_text__c; //Commented By Li Jun 20230420
                        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;
                    }
                    //SAP里召回品换出订单的送达方地址如果为奥林巴斯办事处的地址,DN不生成待签收信息。
                    String ContactName = tempSADN.ContactName__c.toUpperCase();
                    if(ContactName.indexOf('OCSM')>=0){
                        tempSADN.ETRecalledProducts__c =true;
                    }else{
                        tempSADN.ETRecalledProducts__c =false;
                    }
                }
                if (Inquiry.size() > 1) {
                    tempSADN.Order_No__c = Inquiry[1];
                }
            }
            return tempSADN;
        }
    private static void checkSA(Statu_Achievements_DN__c tempSADN,
                                List<Statu_Achievements_DN__c> UpsertDNList,
                                BatchIF_Log__c iflog,
                                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';
                                    }
                                }
    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());
        tempSADN.name = infoH.DeliveryNote;
        tempSADN.ReturnMark__c = infoH.ReturnMark == '1' ? true : false;
        if (tempSADN.Statu_Achievements__c == null) {
            tempSADN.Statu_Achievements__c = boMap.get(infoH.SoNo);
        }
        tempSADN.DeliveryDate__c = NFMUtil.parseStr2Date(infoH.DeliveryDate);
        //发货日在2020/12/01以后的,才生成签收单 start
        Date afterDate = NFMUtil.parseStr2Date('20201201');
        String todate = NFMUtil.formatDate2Str(afterDate);
        String DeliveryDate = NFMUtil.formatDate2Str(tempSADN.DeliveryDate__c);
        //发货日在2020/12/01以后的,才生成签收单 end
                                               DNd.ShippedAmount__c = String.isBlank(dnInfo.VALUE) ?
                                                   0 : returnFlg == false ?
                                                       Decimal.valueOf(dnInfo.VALUE.trim()) : - Decimal.valueOf(dnInfo.VALUE.trim());
        String[] Inquiry;
        if (infoH.InquiryNo != null && infoH.InquiryNo.contains(',')) {
            Inquiry = infoH.InquiryNo.split(',');
            if (oppMap.get(Inquiry[0]) != null) {
                opportunity opp = oppMap.get(Inquiry[0]);
                tempSADN.Opportunity__c = opp.id;
                tempSADN.Is_Corrosion__c = opp.Is_Corrosion__c;
                // 电子签收单  赋值营业助理和营业管理部担当 start
                //集中采购的询价 精琢技术 wql 2020/01/11 start
                if (opp.Group_purchase_PCL__c) {
                    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;
                    tempSADN.RC_Manager__c = provinceOwnerMap.get(opp.OCM_man_province_cus__c);
                }
                //集中采购的询价 精琢技术 wql 2020/01/11 end
                                               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 {
                                                   DNd.SerialNumber__c  = dnInfo.SerialNoorLotNo + '(' + dnInfo.TracingCode + ')';
                                               }
                                               DNd.Product_Serial_No__c = dnInfo.OTCode + ':' + DNd.SerialNumber__c;
                                               DNd.DNProduct_Serial_No__c = DNnumber + ':' + DNd.Product_Serial_No__c;
                                               if (dnInfo.SerialNoorLotNo != null && dnInfo.SerialNoorLotNo.equals('.')) {
                                                   DNd.DNProduct_Serial_No__c += tempDNdetailNumber;
                                               }
                                               // 电子签收单 start
                                               DNd.CaseNumber__c = NFMUtil.trimLeft(dnInfo.CaseNumber, '0');
                                               // 电子签收单 end
                //如果 发货日期 大于 2020/12/01 才生成签收单
                if (DeliveryDate >= todate) {
                    tempSADN.EsignTestAccount__c = true;
                } else {
                    tempSADN.EsignTestAccount__c = false;
                }
                                               DNd.Barcode_Raw__c = dnInfo.Barcode;
                                               DNd.OTCode_Raw__c = dnInfo.OTCode;
                                               DNd.SerialNoorLotNo_Raw__c = dnInfo.SerialNoorLotNo;
                                               DNd.SorLMark_Raw__c = dnInfo.SorLMark;
                                               DNd.GuaranteePeriod_Raw__c = dnInfo.GuaranteePeriod;
                                               DNd.TracingCode_Raw__c = dnInfo.TracingCode;
                                               DNd.ValidTo_Raw__c = dnInfo.ValidTo;
                                               DNd.NetWorth_Raw__c = dnInfo.NetWorth;
                                               DNd.GuaranteePrice_Raw__c    = dnInfo.GuaranteePrice;
                                               DNd.GuaranteeType_Raw__c     = dnInfo.GuaranteeType;
                                               DNd.MaintenancePrice_Raw__c = dnInfo.MaintenancePrice;
                                               DNd.NetWorthNoProviston_Raw__c = dnInfo.NetWorthNoProviston;
                                               DNd.ProduceDate_Raw__c = dnInfo.ProduceDate;
                                               DNd.ProvistonPeriod_Raw__c = dnInfo.ProvistonPeriod;
                                               DNd.ServicePrice_Raw__c = dnInfo.ServicePrice;
                                               DNd.VALUE_Raw__c = dnInfo.VALUE;
                                               DNd.NetWorth_Raw__c = dnInfo.NetWorth;
                                               DNd.NMPA_Approbation_No__c = dnInfo.NMPA_NO;
                                               DNd.ProduceCompany__c = dninfo.Provider;
                                               tempDNdetail.DeliveryNote = DNnumber;
                                               tempDNdetail.DNd = DNd;
                                               if (ast != null && ast.id != null) {
                                                   tempDNdetail.DNd.asset__c = ast.id;
                                               }
                                               return tempDNdetail;
                                           }
                //SAP里召回品换出订单的送达方地址如果为奥林巴斯办事处的地址,DN不生成待签收信息。
                String ContactName = tempSADN.ContactName__c.toUpperCase();
                if (ContactName.indexOf('OCSM') >= 0) {
                    tempSADN.ETRecalledProducts__c = true;
                } else {
                    tempSADN.ETRecalledProducts__c = false;
                }
            }
            if (Inquiry.size() > 1) {
                tempSADN.Order_No__c = Inquiry[1];
            }
        }
        return tempSADN;
    }
    private static void checkSA(
        Statu_Achievements_DN__c tempSADN,
        List<Statu_Achievements_DN__c> UpsertDNList,
        BatchIF_Log__c iflog,
        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';
        }
    }
    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.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());
        if (dnInfo.SorLMark == 'S') {
            DNd.SerialNumber__c = dnInfo.SerialNoorLotNo;
        } else {
            DNd.SerialNumber__c = dnInfo.SerialNoorLotNo + '(' + dnInfo.TracingCode + ')';
        }
        DNd.Product_Serial_No__c = dnInfo.OTCode + ':' + DNd.SerialNumber__c;
        DNd.DNProduct_Serial_No__c = DNnumber + ':' + DNd.Product_Serial_No__c;
        if (dnInfo.SerialNoorLotNo != null && dnInfo.SerialNoorLotNo.equals('.')) {
            DNd.DNProduct_Serial_No__c += tempDNdetailNumber;
        }
        // 电子签收单 start
        DNd.CaseNumber__c = NFMUtil.trimLeft(dnInfo.CaseNumber, '0');
        // 电子签收单 end
        DNd.Barcode_Raw__c = dnInfo.Barcode;
        DNd.OTCode_Raw__c = dnInfo.OTCode;
        DNd.SerialNoorLotNo_Raw__c = dnInfo.SerialNoorLotNo;
        DNd.SorLMark_Raw__c = dnInfo.SorLMark;
        DNd.GuaranteePeriod_Raw__c = dnInfo.GuaranteePeriod;
        DNd.TracingCode_Raw__c = dnInfo.TracingCode;
        DNd.ValidTo_Raw__c = dnInfo.ValidTo;
        DNd.NetWorth_Raw__c = dnInfo.NetWorth;
        DNd.GuaranteePrice_Raw__c = dnInfo.GuaranteePrice;
        DNd.GuaranteeType_Raw__c = dnInfo.GuaranteeType;
        DNd.MaintenancePrice_Raw__c = dnInfo.MaintenancePrice;
        DNd.NetWorthNoProviston_Raw__c = dnInfo.NetWorthNoProviston;
        DNd.ProduceDate_Raw__c = dnInfo.ProduceDate;
        DNd.ProvistonPeriod_Raw__c = dnInfo.ProvistonPeriod;
        DNd.ServicePrice_Raw__c = dnInfo.ServicePrice;
        DNd.VALUE_Raw__c = dnInfo.VALUE;
        DNd.NetWorth_Raw__c = dnInfo.NetWorth;
        DNd.NMPA_Approbation_No__c = dnInfo.NMPA_NO;
        DNd.ProduceCompany__c = dninfo.Provider;
        tempDNdetail.DeliveryNote = DNnumber;
        tempDNdetail.DNd = DNd;
        if (ast != null && ast.id != null) {
            tempDNdetail.DNd.asset__c = ast.id;
        }
        return tempDNdetail;
    }
    @TestVisible
    private static String checkSerialNoorLotNo(String sn) {
        if (sn == null || sn == '' || sn.length() < 8) {
@@ -900,4 +994,4 @@
        }
        return sn;
    }
}
}