global class AuthRentalApplySplitBatch implements Database.Batchable<sObject>,Database.Stateful {
    private static final Map<String,Schema.RecordTypeInfo>  DEVELOPERNAMEMAP  = Schema.SObjectType.Rental_Apply__c.getRecordTypeInfosByDeveloperName();//记录类型
    private Boolean isFirst = true;
    public List<String> raIdList;
    private BatchIF_Log__c iflog;
    private static String iflogLog3 = ''; // 借用机会可视化-根据邮箱地址去执行分单分配 2024-1-9 zyh add
    private String raMail; // 借用机会可视化-根据邮箱地址去执行分单分配 2024-1-9 zyh add
    global AuthRentalApplySplitBatch() {
        
    }

    // 借用机会可视化-根据邮箱地址去执行分单分配 2024-1-9 zyh start
    global AuthRentalApplySplitBatch(String mailAddress) {
        if (mailAddress == 'BJ') {
            mailAddress = System.Label.BeijingEmail;
        }
        if (mailAddress == 'SH') {
            mailAddress = System.Label.ShanghaiEmai;
        }
        if (mailAddress == 'GZ') {
            mailAddress = System.Label.GuangzhouEmail;
        }
        this.raMail = mailAddress;
    }
    // 借用机会可视化-根据邮箱地址去执行分单分配 2024-1-9 zyh end
    
    global AuthRentalApplySplitBatch(List<String> raIdList) {
        System.debug('zyhtest====Batch');
        this.raIdList = raIdList;
    }
    global Database.QueryLocator start(Database.BatchableContext bc) {
        iflog = new BatchIF_Log__c();
        iflog.Type__c = 'AuthRentalApplySplitBatch';
        iflog.Log__c  = 'AuthRentalApplySplitBatch start\n';
        iflog.Log2__c  = '申请单Id start：\n';
        iflog.Log3__c  = '申请单分配Id start：\n';
        iflog.ErrorLog__c = '';
        insert iflog;
        String query = 'SELECT Id, Status__c, Request_shipping_day__c, Person_In_Charge__r.Email, Rental_Assistant__r.Email, Demo_purpose1__c,RecordType.DeveloperName,Loaner_centre_mail_address__c from Rental_Apply__c';
        query += ' WHERE Status__c != \'完了\' AND Status__c != \'取消\' AND Status__c != \'删除\' AND Rental_Status__c = \'已批准\' AND RecordType.DeveloperName = \'StandardRequest\' AND Request_shipping_day__c <= NEXT_N_DAYS:7 AND Demo_purpose1__c != \'其他\' AND Request_approval_time__c != NULL AND Cross_Region_Assign__c = null';
        
        // 借用机会可视化-根据邮箱地址去执行分单分配 2024-1-9 zyh start
        if (String.isNotBlank(this.raMail)) {
            query += ' AND Loaner_centre_mail_address__c =: raMail';
        }
        // 借用机会可视化-根据邮箱地址去执行分单分配 2024-1-9 zyh end

        if (this.raIdList != null && this.raIdList.size() > 0) {
            query += ' AND Id IN :raIdList ORDER BY OPD_OrderNum__c NULLS LAST,OPD_OrderNum__c,Request_approval_time__c'; // 20231213-zyh-借用机会可视化==按照OPD排序推送
            System.debug('testzyh===='+query);
        } else{
            query += ' ORDER BY OPD_OrderNum__c NULLS LAST,OPD_OrderNum__c,Request_approval_time__c'; // 添加OPD排队Num&维修代用等
        }
        System.debug('zyhsql===='+query);
        return Database.getQueryLocator(query);
    }
    global void execute(Database.BatchableContext BC, list<Rental_Apply__c> scope) {
        List<String> raIdList = new List<String>();
        for (Rental_Apply__c ra : scope) {
            raIdList.add(ra.Id);
            iflog.Log2__c += raIdList + ',\n';
            System.debug('1213===raIdList'+ra.Id);
        }
        System.debug('zyhtest=====fendan:'+raIdList);
        if (raIdList.size() > 0) {
            if (String.isNotBlank(scope[0].Loaner_centre_mail_address__c) && scope[0].Loaner_centre_mail_address__c == System.Label.ShanghaiEmai) {
                iflog.Log3__c += raIdList + ',\n';
                if (isFirst) {
                    toFp(raIdList,isFirst);
                    // System.enqueueJob(new RentalFixtureSetAssignAndQueueWebService(raIdList));
                    isFirst = false;
                } else {
                    toFp(raIdList,isFirst);
                }
            } else {
                if (isFirst) {
                    toSplitRentalApply(raIdList,isFirst);
                    isFirst = false;
                } else {
                    toSplitRentalApply(raIdList,isFirst);
                }
            }
            // toSplitRentalApply(raIdList);
        }
        iflog.Log3__c += AuthRentalApplySplitBatch.iflogLog3;
        System.debug('AuthRentalApplySplitBatch.iflogLog3=====3' + AuthRentalApplySplitBatch.iflogLog3);
    }
    global void finish(Database.BatchableContext BC) {
        iflog.Log__c += '\nAuthRentalApplySplitBatch end';
        String tmp = iflog.ErrorLog__c;
        if (tmp.length() > 65000) {
            tmp = tmp.substring(0, 65000);
            tmp += ' ...have more lines...';
            iflog.ErrorLog__c = tmp;
        }
        update iflog;
        
    }
    public static void toSplitRentalApply(List<String> raIdList,Boolean isFirst) {
        System.debug('AuthRentalApplySplitBatch.iflogLog3=====1' + AuthRentalApplySplitBatch.iflogLog3);
        Map<String,List<Rental_Apply_Equipment_Set__c>> raIdMap = new Map<String,List<Rental_Apply_Equipment_Set__c>>(); // 用于存放需要分单的一览
        Map<String,Rental_Apply__c> raIdMap1 = new Map<String,Rental_Apply__c>(); // 用于存放需要分单的申请单=>用于判断是否是整单
        Map<String,String> raSpIdMap = new Map<String,String>();
        List<Rental_Apply_Equipment_Set__c> raesFdObjList = new List<Rental_Apply_Equipment_Set__c>(); // 存放分单之后再分配的一览
        List<Rental_Apply_Equipment_Set__c> raesFdToFpObjList = new List<Rental_Apply_Equipment_Set__c>(); // 存放分单之后再分配的一览
        List<String> raesFdToFpList = new List<String>(); // 存放分单之后再分配的一览Id
        List<String> raesNoFdToFpList = new List<String>(); // 存放可以直接分配的一览Id
        List<String> raNoFdToFpList = new List<String>(); // 存放可以直接分配的申请单(未去重)
        List<String> raToFpList = new List<String>(); // 存放可以直接分配的申请单(去重)
        List<String> opdSpIdList = new List<String>(); // 用于存放需要分单的OPD的Id
        List<String> raesIdList = new List<String>(); //用于存放需要部分分单的一览Id
        List<String> raSpIdList = new List<String>(); //用于存放需要克隆的申请单Id
        List<Rental_Apply__c> raUpList = new List<Rental_Apply__c>(); //用于全部分单更新记录类型等
        List<String> raZdIdList = new List<String>(); // 存放整单分单的申请单ID
        List<Asset> assetList = new List<Asset>(); // 用于存放查询出来的保有设备
        Map<String,Double> assetKeyMap = new Map<String,Double>(); // 用于存放保有设备的一对多数量
        List<String> assetModList = new List<String>(); // 用于存放设备型号
        List<String> assetAddList = new List<String>(); // 用于存放备品存放地
        List<String> raes_dIdList = new List<String>(); // 用于存放没有分配的申请单Id
        Map<String,String> raFpMap = new Map<String,String>(); // 用于存放To自动分配的
        Map<String,String> assetModelMap = new Map<String,String>();
        Map<String,String> assetAddMap = new Map<String,String>();
        List<Rental_Apply_Equipment_Set_Detail__c> allFpList = new List<Rental_Apply_Equipment_Set_Detail__c>();
        Map<String,Rental_Apply_Equipment_Set_Detail__c> noFpMap = new Map<String,Rental_Apply_Equipment_Set_Detail__c>();
        Map<String,Rental_Apply_Equipment_Set_Detail__c> okFpMap = new Map<String,Rental_Apply_Equipment_Set_Detail__c>();
        // List<Rental_Apply__c> raSpList = 
        // 查找需要推送的一览  Rental_Apply_Equipment_Set_Cnt__c  => 申请单的一览数
        List<Rental_Apply_Equipment_Set__c> raesSpList = new List<Rental_Apply_Equipment_Set__c>();
        List<String> raesOkList = new List<String>(); // Id
        List<Rental_Apply_Equipment_Set__c> raesList = [SELECT Id,Name,Rental_Apply__c,Fixture_Set__c,Fixture_Set__r.Loaner_categoryII__c,Rental_Apply__r.WorkPlace__c,Rental_Apply__r.OPD_OrderNum__c FROM Rental_Apply_Equipment_Set__c WHERE (RAES_Status__c = '待分配' OR RAES_Status__c = '排队中' OR RAES_Status__c = '暂定分配' OR RAES_Status__c = '已分配' OR RAES_Status__c = '已出库指示' OR RAES_Status__c = '已下架' OR RAES_Status__c = '出库前已检测') AND Rental_Apply__c IN :raIdList ORDER BY Rental_Apply__r.OPD_OrderNum__c];
        System.debug('zyhtest=====raesList.size()' + raesList.size());
        if(raesList.size() > 0){
            for (Rental_Apply_Equipment_Set__c tempObj : raesList) {
                raes_dIdList.add(tempObj.Id);
            }
            // 判断有没有分配
            if (raes_dIdList.size() > 0) {
                allFpList = [SELECT Id,Asset__c,Rental_Apply_Equipment_Set__c,EquipmentSet_Detail_Status_Status__c FROM Rental_Apply_Equipment_Set_Detail__c WHERE Rental_Apply_Equipment_Set__c IN :raes_dIdList];
                if (allFpList.size() > 0) {
                    for (Rental_Apply_Equipment_Set_Detail__c mx : allFpList) {
                        // 如果明细分配了，就跳过，没分配的再去分单
                        if (String.isNotBlank(mx.Asset__c) && mx.EquipmentSet_Detail_Status_Status__c != '待废弃') {
                            // 如果已分配的map里包含了，那么就跳过
                            if (okFpMap.containsKey(mx.Rental_Apply_Equipment_Set__c)) {
                                continue;
                            } else {
                                // 如果一览里，既有没分配的，也有分配了的，那么把没分配的map里的数据删了，加到已分配的map里
                                if (noFpMap.containsKey(mx.Rental_Apply_Equipment_Set__c)){
                                    noFpMap.remove(mx.Rental_Apply_Equipment_Set__c); // 删除没分配map里的数据
                                    okFpMap.put(mx.Rental_Apply_Equipment_Set__c,mx);  // 新增已分配map里的数据
                                } else {
                                    okFpMap.put(mx.Rental_Apply_Equipment_Set__c,mx);
                                }
                            }
                        } else {
                            // 如果未分配的map里包含了，那么就跳过
                            if (noFpMap.containsKey(mx.Rental_Apply_Equipment_Set__c)) {
                                continue;
                            }
                            // 如果已分配的map里没包含，就加到未分配的map里
                            if (!okFpMap.containsKey(mx.Rental_Apply_Equipment_Set__c)) {
                                noFpMap.put(mx.Rental_Apply_Equipment_Set__c,mx);
                            }
                        }
                    }
                    // 未分配的往下走自动分单/分配，已分配的不管
                    for (String raesId : noFpMap.keySet()) {
                        raesOkList.add(raesId); // 存放未分配的（可不可以分单的都有）
                    }
                }
            }
            if(raesOkList.size() > 0){
                raesFdObjList = [SELECT Id,Name,Rental_Apply__c,Fixture_Set__c,Fixture_Set__r.Loaner_categoryII__c,Loaner_code_F__c,Rental_Apply__r.WorkPlace__c,Rental_Apply__r.Salesdept__c,Rental_Apply__r.OPD_OrderNum__c,Rental_Num__c,First_RAESD_Is_Main__c FROM Rental_Apply_Equipment_Set__c WHERE (RAES_Status__c = '待分配' OR RAES_Status__c = '排队中' OR RAES_Status__c = '暂定分配' OR RAES_Status__c = '已分配' OR RAES_Status__c = '已出库指示' OR RAES_Status__c = '已下架' OR RAES_Status__c = '出库前已检测') AND Id IN :raesOkList ORDER BY Rental_Apply__r.OPD_OrderNum__c];
            }
            // for (Rental_Apply_Equipment_Set__c raesNum : raesList) { // 2023-10-28 zyh 更换遍历的list（优化）
            for (Rental_Apply_Equipment_Set__c raesNum : raesFdObjList) {
                // 将不是北上广深的台车、监视器并且有主体的一览组成List进行自动分单
                if (raesNum.First_RAESD_Is_Main__c && !raesNum.Rental_Apply__r.WorkPlace__c.contains('北京') && !raesNum.Rental_Apply__r.WorkPlace__c.contains('上海') && !raesNum.Rental_Apply__r.WorkPlace__c.contains('广州') && !raesNum.Rental_Apply__r.WorkPlace__c.contains('深圳') && !raesNum.Rental_Apply__r.WorkPlace__c.contains('安徽') && !raesNum.Rental_Apply__r.WorkPlace__c.contains('福建') && !raesNum.Rental_Apply__r.WorkPlace__c.contains('江苏') && !raesNum.Rental_Apply__r.WorkPlace__c.contains('江西') && !raesNum.Rental_Apply__r.WorkPlace__c.contains('浙江') && !raesNum.Rental_Apply__r.Salesdept__c.contains('华东') && (raesNum.Fixture_Set__r.Loaner_categoryII__c == '台车' || raesNum.Fixture_Set__r.Loaner_categoryII__c == '监视器')){
                    assetModList.add(raesNum.Loaner_code_F__c);
                    assetAddList.add(raesNum.Rental_Apply__r.WorkPlace__c);
                    assetAddMap.put(raesNum.Id,raesNum.Rental_Apply__r.WorkPlace__c);
                    assetModelMap.put(raesNum.Id,raesNum.Loaner_code_F__c);
                    raesFdToFpObjList.add(raesNum);
                    System.debug('zyhtest===raesNoFdToFpList:jinlaifendan');
                    System.debug('zyhtest===assetModList:jinlaifendan'+assetModList);
                    System.debug('zyhtest===assetModList:jinlaifendan'+assetAddList);
                } else {
                    raesNoFdToFpList.add(raesNum.Id); // 不符合分单条件的未分配的直接走自动分配
                }
                System.debug('zyhtest===raesNoFdToFpList:'+raesNoFdToFpList);
            }
            if (assetModList.size() > 0) {
                // 查询对应的保有设备
                assetList = [SELECT Id,Name,Internal_asset_location__c,Fixture_Model_No_F__c,You_Xiao_Ku_Cun__c FROM Asset WHERE AssetManageConfirm__c = true AND Internal_asset_location__c IN :assetAddList AND Fixture_Model_No_F__c IN :assetModList];
                System.debug('zyhtest===assetList'+assetList);
                System.debug('zyhtest===assetList'+assetList.size());
                if (assetList.size() > 0) {
                    for (Asset asset : assetList) {
                        // 查询保有设备的总有效库存
                        if (assetKeyMap.containsKey(asset.Internal_asset_location__c + asset.Fixture_Model_No_F__c)){
                            Decimal num = assetKeyMap.get(asset.Internal_asset_location__c + asset.Fixture_Model_No_F__c) + asset.You_Xiao_Ku_Cun__c;
                            assetKeyMap.put(asset.Internal_asset_location__c + asset.Fixture_Model_No_F__c , num);
                        } else {
                            assetKeyMap.put(asset.Internal_asset_location__c + asset.Fixture_Model_No_F__c , asset.You_Xiao_Ku_Cun__c);
                        }
                    }
                    System.debug('zyhtest===assetKeyMap'+assetKeyMap);
                }
            }
            // for(Rental_Apply_Equipment_Set__c raes : raesList){ // 2023-10-28 zyh 更换遍历的list（优化）
            for(Rental_Apply_Equipment_Set__c raes : raesFdToFpObjList){ // 遍历走自动分单的List
                // 判断是否是北、上、广、深的单子，不是的话自动分单，是的话自动分配
                if (!raes.Rental_Apply__r.WorkPlace__c.contains('北京') && !raes.Rental_Apply__r.WorkPlace__c.contains('上海') && !raes.Rental_Apply__r.WorkPlace__c.contains('广州') && !raes.Rental_Apply__r.WorkPlace__c.contains('深圳') && !raes.Rental_Apply__r.WorkPlace__c.contains('安徽') && !raes.Rental_Apply__r.WorkPlace__c.contains('福建') && !raes.Rental_Apply__r.WorkPlace__c.contains('江苏') && !raes.Rental_Apply__r.WorkPlace__c.contains('江西') && !raes.Rental_Apply__r.WorkPlace__c.contains('浙江') && !raes.Rental_Apply__r.Salesdept__c.contains('华东')){
                    System.debug('zyhtest===raes.Rental_Num__c'+raes.Rental_Num__c);
                    System.debug('zyhtest===assetKeyMap.get(raes.Rental_Apply__r.WorkPlace__c + raes.Loaner_code_F__c)'+assetKeyMap.get(raes.Rental_Apply__r.WorkPlace__c + raes.Loaner_code_F__c));
                    // 判断是否有库存，有的话自动分单，没有的话自动分配
                    // 把需要的数量换成1，每个一览只有一个配套 20231210 zyh start
                    // if (raes.Rental_Num__c <= assetKeyMap.get(raes.Rental_Apply__r.WorkPlace__c + raes.Loaner_code_F__c)) {
                    if (1 <= assetKeyMap.get(raes.Rental_Apply__r.WorkPlace__c + raes.Loaner_code_F__c)) {
                        // 确认分单后减去一分单的数量
                        // assetKeyMap.put(raes.Rental_Apply__r.WorkPlace__c + raes.Loaner_code_F__c , assetKeyMap.get(raes.Rental_Apply__r.WorkPlace__c + raes.Loaner_code_F__c) - raes.Rental_Num__c);
                        assetKeyMap.put(raes.Rental_Apply__r.WorkPlace__c + raes.Loaner_code_F__c , assetKeyMap.get(raes.Rental_Apply__r.WorkPlace__c + raes.Loaner_code_F__c) - 1);
                        // 把需要的数量换成1，每个一览只有一个配套 20231210 zyh end
                        // clone申请单
                        // 判定需要分单的配套，台车/监视器才可以分单
                        System.debug('zyhtest=====raes.Fixture_Set__r.Loaner_categoryII__c' + raes.Fixture_Set__r.Loaner_categoryII__c + raes.Id);
                        if (raes.Fixture_Set__r.Loaner_categoryII__c == '台车' || raes.Fixture_Set__r.Loaner_categoryII__c == '监视器') {
                            if(raIdMap.containsKey(raes.Rental_Apply__c)) {
                                raIdMap.get(raes.Rental_Apply__c).add(raes);
                                System.debug('zyhtest====raIdMap1'+raIdMap);
                            } else{
                                List<Rental_Apply_Equipment_Set__c> raesUpList = new List<Rental_Apply_Equipment_Set__c>();
                                raesUpList.add(raes);
                                raIdMap.put(raes.Rental_Apply__c,raesUpList);
                                System.debug('zyhtest====raIdMap2'+raIdMap);
                                System.debug('zyhtest====raIdMap2size'+raIdMap.size());
                            }
                            raSpIdList.add(raes.Rental_Apply__c);
                            raesSpList.add(raes);
                            System.debug('zyhtest====raSpIdList'+raSpIdList.size());
                            System.debug('zyhtest====raSpIdList'+raSpIdList);
                            System.debug('zyhtest====raIdMap.values()'+raIdMap.values());
                            System.debug('zyhtest====raIdMap.values()'+raIdMap);
                            raes_dIdList.add(raes.Id);
                        }
                    } else {
                        raesNoFdToFpList.add(raes.Id); // 存放有效库存不足而不能分单的一览
                    }
                }
                // raesIdList.add(ra.Id);

            }
            if(raSpIdList.size() > 0){
                List<Rental_Apply__c> raSpList = getRa(raSpIdList).clone(); // 用于存放需要克隆的申请单
                List<Rental_Apply__c> raSpZcList  = new List<Rental_Apply__c>(); // 用于存放要新建的申请单
                List<Rental_Apply__c> raSpOpdList  = new List<Rental_Apply__c>(); // 存放OPD来源的申请单
                List<String> raRootIdList  = new List<String>(); // 用于存放源申请单ID
                Map<String,List<String>> raRootMap = new Map<String,List<String>>(); // 用于一对多存放要分单的申请单/数量
                Map<String,String> raOPDMap = new Map<String,String>(); // 存放一对一的OPDID和申请单ID
                Integer num = 0; // 用于命名_num
                // 需要分单的申请单创建
                if (raSpList.size() > 0) {
                    // 遍历要克隆的申请单
                    for (Rental_Apply__c spRa : raSpList) {
                        // 判断是否有源申请单，没有的话赋Id
                        if (String.isNotBlank(spRa.Root_Rental_Apply__c)) {
                            raRootIdList.add(spRa.Root_Rental_Apply__c);
                        } else {
                            raRootIdList.add(spRa.Id);
                        }
                        raIdMap1.put(spRa.Id,spRa);
                        System.debug('zyhtest====raIdMap1====' + raIdMap1);
                        System.debug('zyhtest====raIdMap1.size()====' + raIdMap1.size());
                    }
                    if(raRootIdList.size() > 0){
                        System.debug('zyhtest====raRootIdList：' + raRootIdList.size());
                        System.debug('zyhtest====raRootIdList：' + raRootIdList);
                        List<Rental_Apply__c> raRootList = [SELECT Id,Name,Root_Rental_Apply__c FROM Rental_Apply__c WHERE Root_Rental_Apply__c IN :raRootIdList];
                        System.debug('zyhtest====raRootList：' + raRootList);
                        System.debug('zyhtest====raRootList：' + raRootList.size());
                        // 有源申请单的批量做成一对多的Map
                        if(raRootList.size() > 0){
                            for (Rental_Apply__c rootRa : raRootList) {
                                System.debug('zyhtest====rootRa.Root_Rental_Apply__c'+rootRa.Root_Rental_Apply__c);
                                // 源申请单有值的话判断Map里是否含有，没有的话value定义一个List
                                if(String.isNotBlank(rootRa.Root_Rental_Apply__c)){
                                    if(raRootMap.containsKey(rootRa.Root_Rental_Apply__c)){
                                        raRootMap.get(rootRa.Root_Rental_Apply__c).add(rootRa.Id);
                                    }else{
                                        List<String> rootList = new List<String>();
                                        rootList.add(rootRa.Id);
                                        raRootMap.put(rootRa.Root_Rental_Apply__c,rootList);
                                    }
                                }else{
                                    raRootMap.put(rootRa.Id,null);
                                }
                            }
                        }
                    }
                    System.debug('zyhtest=====raRootMap：'+raRootMap);
                    for (Rental_Apply__c raObj : raSpList) {
                        raObj.Split_Apply_Reason__c = '现地管理分单';
                        raObj.RecordTypeId = DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId(); // 记录类型
                        raObj.SalesdeptSelect__c = raObj.Salesdept__c; // 申请者销售本部
                        raObj.ToAgency__c = getOcmMgtProvMap().get(raObj.WorkPlace__c); // 分配办事处
                        // 判断有没有源申请单
                        if(String.isNotBlank(raObj.Root_Rental_Apply__c)){
                            raObj.Root_Rental_Apply__c = raObj.Root_Rental_Apply__c; // 源申请单
                            System.debug('zyhtest=====Root_Rental_Apply__c：'+raObj.Root_Rental_Apply__c);
                        }else {
                            raObj.Root_Rental_Apply__c = raObj.Id; // 源申请单
                            System.debug('zyhtest=====Root_Rental_Apply__c1：'+raObj.Root_Rental_Apply__c);
                        }
                        // 判断是整单分单还是部分分单
                        System.debug('zyhtest=====raIdMap.get(raObj.Id).size()='+raIdMap.get(raObj.Id).size());
                        System.debug('zyhtest=====raIdMap1.get(raObj.Id).Rental_Apply_Equipment_Set_Cnt__c='+raIdMap1.get(raObj.Id).Rental_Apply_Equipment_Set_Cnt__c);
                        if(raIdMap.get(raObj.Id).size() == raIdMap1.get(raObj.Id).Rental_Apply_Equipment_Set_Cnt__c){
                            // 如果是整单，就更新记录类型等
                            System.debug('zyhtest=====Update');
                            raObj.Id = raObj.Id;
                            raObj.Root_Rental_Apply__c = ''; // 整单不需要有源申请单
                            raZdIdList.add(raObj.Id); // 整单分单的申请单的ID
                            raUpList.add(raObj);
                        }else{
                            // 如果是部分分单，就新建申请单
                            System.debug('zyhtest=====Insert');
                            // 借用机会可视化-判断是不是分单后的数据 20240113 zyh start
                            // if(raRootMap.get(raObj.Id) == null){
                            if(raRootMap.get(raObj.Old_Rental_Apply__c) == null){ // 不是分单的没有旧申请单
                                // 可以根据当前申请单Id去做分单No后缀判断
                                if(raRootMap.get(raObj.Id) == null){
                                    num = 1;
                                } else {
                                    num = raRootMap.get(raObj.Id).size() + 1;
                                }
                                raObj.Name = raObj.Name + '_' + num;
                            }else{
                                // num = raRootMap.get(raObj.Id).size() + 1;
                                // 是分单数据的话根据原申请单去判断分单No后缀
                                num = raRootMap.get(raObj.Root_Rental_Apply__c).size() + 1;
                                raObj.Name = raObj.Old_Rental_Apply__r.Name + '_' + num;
                            }
                            // raObj.Name = raObj.Name + '_' + num;
                            // raObj.Name = raObj.Old_Rental_Apply__r.Name + '_' + num;
                            // 借用机会可视化-判断是不是分单后的数据 20240113 zyh end
                            raObj.Old_Rental_Apply__c = raObj.Id;
                            raObj.autoSplitContinue__c = true;
                            // if (String.isNotBlank(raObj.AWS_Data_Id__c)) {
                            //     raObj.AWS_Data_Id__c = raObj.AWS_Data_Id__c + 'X' + num;
                            // } else {
                            //     raObj.AWS_Data_Id__c = raObj.Name.subString(17,22) + 'X' + num;
                            // }
                            // raObj.AWS_Data_Id__c = raObj.AWS_Data_Id__c + 'X' + num;
                            raObj.Id = null;
                            if (raObj.OPDPlan__c != null) {
                                // 存放OPD来源的OPDId
                                opdSpIdList.add(raObj.OPDPlan__c);
                                // 存放OPD来源的申请单
                                raSpOpdList.add(raObj);
                            }else {
                                // 存放其他来源的申请单
                                raSpZcList.add(raObj);
                            }
                        }
                    }
                    System.debug('zyhtest=====Insert_opdSpIdList' + opdSpIdList);
                    System.debug('zyhtest=====Insert_raSpOpdList' + raSpOpdList.size());
                    if (opdSpIdList.size() > 0) {
                        List<OPDPlan__c> opdCloneList = getOpd(opdSpIdList).clone();
                        List<OPDPlan__c> opdCloneList1 = new List<OPDPlan__c>();
                        Map<String,String> opdSpMap = new Map<String,String>();
                        for (OPDPlan__c opdObj : opdCloneList) {
                            opdObj.OriginalOpdPlanRental__c = opdObj.Id;
                            opdObj.Status__c = '计划中';
                            opdObj.Id = null;
                            opdCloneList1.add(opdObj);
                        }
                        if (opdCloneList1.size() > 0){
                            System.debug('zyhtest=====opdCloneList1'+opdCloneList1);
                            FixtureUtil.withoutInsert(opdCloneList1);
                            for (OPDPlan__c opdObj : opdCloneList1) {
                                raOPDMap.put(opdObj.OriginalOpdPlanRental__c, opdObj.Id);
                            }
                            if (raOPDMap.size() > 0) {
                                for (Rental_Apply__c raopd : raSpOpdList) {
                                    raopd.OPDPlan__c = raOPDMap.get(raopd.OPDPlan__c);
                                }
                            }
                            System.debug('zyhtest=====opdCloneList1==1'+opdCloneList1);
                        }
                    }
                    // 整单分单更新
                    if (raUpList.size() > 0) {
                        FixtureUtil.withoutUpdate(raUpList);
                        List<Rental_Apply_Equipment_Set_Detail__c> raesdZdList = [SELECT Id, Rental_Apply_Equipment_Set__c,Asset__c,Rental_Apply__c
                                                                                        FROM Rental_Apply_Equipment_Set_Detail__c 
                                                                                        WHERE Rental_Apply__c in :raZdIdList];
                        if (raesdZdList.size() > 0) {
                            for (Rental_Apply_Equipment_Set_Detail__c raesdObj : raesdZdList) {
                                    // 清空排队信息 zyh start
                                    raesdObj.Queue_Conment__c = null;
                                    raesdObj.Queue_Day__c = null;
                                    raesdObj.Queue_Time__c = null;
                                    raesdObj.Queue_User__c = null;
                                // raesdObj.Queue_Day_Text__c = null;// 20210903 you SFDC-C6E3WQ 
                                    raesdObj.Queue_Number__c = null;
                                    // 清空排队信息 zyh end
                            }
                            FixtureUtil.withoutUpdate(raesdZdList);
                        }
                    }
                    // 部分分单新建
                    if (raSpZcList.size() > 0 || raSpOpdList.size() > 0) {
                        System.debug('zyhtest=====fendan2-1:'+raSpZcList);
                        raSpZcList.addAll(raSpOpdList);
                        System.debug('zyhtest=====fendan2-2:'+raSpZcList);
                        FixtureUtil.withoutInsert(raSpZcList); // 创建分单后的单子
                        System.debug('zyhtest=====fendan3:'+raSpZcList);
                        // Map<String,List<String>> raseSpUpMap = new Map<String,List<String>>(); // 多单情况
                        Map<String,String> raseSpUpMap = new Map<String,String>(); // 一对一
                        for (Rental_Apply__c spRa : raSpZcList) {
                            // 多单情况start
                            // if (raseSpUpMap.containsKey(spRa.Old_Rental_Apply__c)){
                            //     raseSpUpMap.get(spRa.Old_Rental_Apply__c).add(spRa.Id);
                            // } else {
                            //     List<String> tempList = new List<String>();
                            //     tempList.add(spRa.Id);
                            //     raseSpUpMap.put(spRa.Old_Rental_Apply__c,tempList);
                            // }
                            // 多单情况end
                            raseSpUpMap.put(spRa.Old_Rental_Apply__c,spRa.Id); // 一对一
                            raNoFdToFpList.add(spRa.Old_Rental_Apply__c);
                            System.debug('zyhtest=====raseSpUpMap'+raseSpUpMap);
                        }

                        if (raseSpUpMap.size() > 0){
                            List<Rental_Apply_Equipment_Set__c> tempUpRaesList = new List<Rental_Apply_Equipment_Set__c>();
                            // List<String> raesIdList = new List<String>();
                            for (Rental_Apply_Equipment_Set__c tempUpRaes : raesSpList){
                                System.debug('zyhtest=====raesSpList'+raesSpList.size());
                                if (raseSpUpMap.containsKey(tempUpRaes.Rental_Apply__c)){
                                    tempUpRaes.Old_Rental_Apply__c = tempUpRaes.Rental_Apply__c;
                                    tempUpRaes.Rental_Apply__c = raseSpUpMap.get(tempUpRaes.Rental_Apply__c);
                                    tempUpRaesList.add(tempUpRaes);
                                    raesIdList.add(tempUpRaes.Id);
                                    System.debug('zyhtest=====tempUpRaesList'+tempUpRaesList);
                                    System.debug('zyhtest=====tempUpRaesList'+tempUpRaesList.size());
                                }
                            }
                            if(raesIdList.size() > 0){
                                List<Rental_Apply_Equipment_Set_Detail__c> raesdList = [SELECT Id, Rental_Apply_Equipment_Set__c,Asset__c,Rental_Apply__c
                                                                                        FROM Rental_Apply_Equipment_Set_Detail__c 
                                                                                        WHERE Rental_Apply_Equipment_Set__c in :raesIdList];
                                if(raesdList.size() > 0){
                                    for(Rental_Apply_Equipment_Set_Detail__c raesdObj : raesdList){
                                        if (String.isNotBlank(raesdObj.Rental_Apply__c)) {
                                            raesdObj.Rental_Apply__c = raseSpUpMap.get(raesdObj.Rental_Apply__c);
                                            // 清空排队信息 zyh start
                                            raesdObj.Queue_Conment__c = null;
                                            raesdObj.Queue_Day__c = null;
                                            raesdObj.Queue_Time__c = null;
                                            raesdObj.Queue_User__c = null;
                                            // raesdObj.Queue_Day_Text__c = null;// 20210903 you SFDC-C6E3WQ 
                                            raesdObj.Queue_Number__c = null;
                                            // 清空排队信息 zyh end
                                        }
                                    }
                                }
                                FixtureUtil.withoutUpdate(raesdList); // 更新明细
                            }
                            if(tempUpRaesList.size() > 0){
                                FixtureUtil.withoutUpdate(tempUpRaesList); // 更新一览
                            }
                        }
                    }
                    
                }
            }
            
            if (raesNoFdToFpList.size() > 0) {
                List<Rental_Apply_Equipment_Set__c> raFpList = [SELECT Id,Name,Rental_Apply__c FROM Rental_Apply_Equipment_Set__c WHERE Id IN :raesNoFdToFpList];
                for (Rental_Apply_Equipment_Set__c fpRa : raFpList) {
                    raNoFdToFpList.add(fpRa.Rental_Apply__c); // 最终自动分配的申请单的Id（未去重）
                    AuthRentalApplySplitBatch.iflogLog3 += fpRa.Rental_Apply__c + ',\n';
                }
                // 借用机会可视化优化-2024-1-12 zyh start
                // for (String str : raNoFdToFpList) {
                //     if (raFpMap.containsKey(str)) {
                //         continue;
                //     } else {
                //         raFpMap.put(str , str);
                //     }
                // }
                // 借用机会可视化优化-2024-1-12 zyh end
            }
            // for (String str : raFpMap.keySet()) {
            //     raToFpList.add(str);
            // }
            // System.debug('zyhtest=====fendan2:'+raIdMap);
            
        }
        system.debug('zyhtest=====fenpeiold:' + raNoFdToFpList);
        // if (raToFpList.size() > 0) {
        if (raNoFdToFpList.size() > 0) {
            system.debug('zyhtest=====fenpei:' + raNoFdToFpList);
            // 借用机会可视化 - 单独分出调用分配的方法 2024-01-10 zyh start
            toFp(raNoFdToFpList,isFirst);
            // 借用机会可视化 - 单独分出调用分配的方法 2024-01-10 zyh end
            //自动分配raToFpList
            // 借用机会可视化 触发器走异步 zyh 20231225 start
            // if (!System.isBatch()) {
            //     // 不是Batch调用，同步进行分配 20231209 zyh add
            //     RentalFixtureSetAssignAndQueueWebService.setAssignAndQueue(raToFpList);
            // } else {
            // 借用机会可视化 触发器走异步 zyh 20231225 end
            // 借用机会可视化 - 单独分出调用分配的方法 2024-01-10 zyh start
                // 借用机会可视化--延迟推送分配/排队--zyh--start
                // DateTime startHold = Datetime.now();
                // DateTime endHold = startHold.addSeconds(60);
                // System.debug('20231212-isFirst-end'+isFirst);
                // // System.debug('20231212-whileOut-start'+startHold);
                // // System.debug('20231214-isFirst-start'+Datetime.now()+AuthRentalApplySplitBatch.isFirst);
                // if (isFirst) {
                //     System.debug('** isFirst');
                //     if (!Test.isRunningTest()) {
                //         System.enqueueJob(new RentalFixtureSetAssignAndQueueWebService(raToFpList));
                //     }
                // //     System.enqueueJob(new RentalFixtureSetAssignAndQueueWebService(raToFpList));
                // } else {
                //     System.debug('**Not isFirst');
                //     while (Datetime.now() < endHold) {
                //         // System.debug('20231212-while'+Datetime.now());
                //     }
                //     if (!Test.isRunningTest()) {
                //         System.enqueueJob(new RentalFixtureSetAssignAndQueueWebService(raToFpList));
                //     }
                // }
                // System.debug('20231212-whileOut-nowD'+Datetime.now());
                // Batch调用，异步进行分配 20231209 zyh add
            // 借用机会可视化 - 单独分出调用分配的方法 2024-01-10 zyh end
                // 借用机会可视化--延迟推送分配/排队--zyh--start
                // AuthRentalApplySplitBatch.isFirst = false;
                // System.debug('20231214-isFirst-end'+Datetime.now()+AuthRentalApplySplitBatch.isFirst);
            // 借用机会可视化 触发器走异步 zyh 20231225 start
            // }
            // 借用机会可视化 触发器走异步 zyh 20231225 end
            system.debug('zyhtest=====raToFpList:' + raNoFdToFpList.size());
            // RentalFixtureSetAssignAndQueueWebService rfsAndQ = new RentalFixtureSetAssignAndQueueWebService();
            // rfsAndQ.setAssignAndQueue(raToFpList);
        }
    }
    /**
    * @description 获取新建申请单时需要复制的字段
    **/
    private static List<Rental_Apply__c> getRa(List<String> idList) {
        return [SELECT Id,
                     OwnerId,
                     Status__c,
                     Cancel_Reason__c,
                     Old_Rental_Apply__c,
                     Old_Rental_Apply__r.Name,
                     Split_Apply_Reason__c,
                     // ------ 备品借出申请の詳細 ------
                     Name,                            // 申请No.
                     ToAgency__c,                     // 分配办事处 20201117 ljh add
                     SalesdeptSelect__c,              // 申请者销售本部 20201117 ljh add
                     Salesdept__c,                    // 申请者销售本部
                     WorkPlace__c,                    // 申请者办事处
                     ApplyPerson_Phone__c,            // 申请人电话
                     Loaner_centre_mail_address__c,   // 备品中心的邮箱地址
                     Select_Status__c,                // 分配状态
                     Queue_Status__c,                 // 排队状态
                     Rental_Assistant__c,             // 备品助理
                     RA_Status__c,                    // 备品借出状态
                     // OLY_OCM-504 不拷贝追加备品审批状态
                     //Add_Approval_Status__c,          // 追加备品审批状态
                     Person_In_Charge__c,             // 备品出借担当
                     applyUser__c,                    // 操作者
                     Foul_Points__c,                  // 备品出借担当累计犯规点数
                    //  First_Satisfied__c,              // 首满
                     loaner_Status__c,                // 出库状态
                     Cross_Region_Assign__c,          // 跨区域分配
                     // ------ 备品借用方 ------
                     Hospital__c,                     // 医院
                     Strategic_dept__c,               // 战略科室
                     OCM_dept_category__c,            // 战略科室分类
                     Account__c,                      // 科室
                     OCM_segmentation__c,             // OCM分类
                     Loaner_medical_Staff__c,         // 科室负责人
                     Phone_number__c,                 // 联系电话
                        Phone_Number_Encrypt__c,                   // 20220401 PI COPY by Bright
                     // ------ 借用备品的目的 ------
                     Demo_purpose1__c,                // 使用目的1
                     demo_purpose2__c,                // 使用目的2
                     // OLY_OCM-669 Start
                     Hope_Lonaer_date_Num__c,         // 希望借用天数
                     // OLY_OCM-669 End
                     Product_category__c,             // 产品分类(GI/SP)
                     Campaign__c,                     // 学会
                     //OPD__c,                          // OPD报告书   2021-12-28  mzy  OPD计划状态改善
                     OPD__c,                          // 20231030 备品智能化 zyh
                     QIS_number__c,                   // QIS
                     QIS_ID_Line__c,                  // QIS的ID值
                     QISRepair__c,                    // QIS修理
                     Demo_purpose_text__c,            // 申请理由
                     Repair__c,                       // 修理
                     Follow_UP_Opp__c,                // 跟进询价1
                     Follow_pcl_status2__c,           // 跟进询价状态
                     Follow_pcl_status2_Text__c,      // 跟进询价状态（申请时）
                     Follow_Inquiry_Level_Text__c,    // 询价等级（申请时） // 20211008 ljh SWAG-C7LCH2
                     Follow_Inquiry_Stage_Text__c,    // 询价阶段（申请时） // 20211008 ljh SWAG-C7LCH2
                     Statu_Achievements__c,           // 注残
                     Shipping_Finished_Day_Func__c,   // 最终发货日(已购待货)
                     CrinicalTrialName__c,            // 临床研究项目名称
                     DB_loaner_request__c,            // MA本部审核合同编号
                     // ------ 备品希望借出期限 ------
                     Request_shipping_day__c,         // 希望到货日
                     Return_dadeline_final__c,        // 最新预定归还日
                     Request_return_day__c,           // 预定归还日
                     Lonaer_date_not_working_date__c, // 希望借用天数
                     // ------ 发送信息 ------
                     Shipment_address__c,             // 办事处地址
                     Dealer__c,                       // 经销商
                     Loaner_received_staff__c,        // 收件者姓名 (销售或FSE)
                     Shippment_adress_detail__c,      // 发送办事处地址详细
                     direct_shippment_address__c,     // 直送发送地址
                        Direct_Shippment_Address_Encrypt__c,                   // 20220401 PI COPY by Bright
                     direct_send__c,                  // 发送方
                     pickup_time__c,                  // 自提时间
                     Loaner_received_staff_phone__c,  // 收件者电话(销售或FSE)
                     Post_Code__c,                    // 邮编
                     // ApprovedNo_Delivery__c,          // 决裁编号（发货时） 20220224 ljh add
                     // Approved_State_Delivery__c,      // 决裁状态（发货时）20220224 ljh add 
                     ApprovedNo_Create__c,            // 决裁编号（创建时） 20220301 ljh add
                     Approved_State_Create__c,        // 决裁状态（创建时） 20220301 ljh add
                     Response__c,                     // 应答沟通
                     Request_demo_time__c,            // 申请时间
                     Request_approval_time__c,        // 批准时间（申请提交时间）
                     Request_answer_time__c,          // 备品首次分配时间
                     Application_accept_time__c,      // 应答沟通申请受理时间（回答时间）
                     OPDPlan__c,                      // OPD计划
                     RecordTypeId,                    // 记录类型 1732 ljh add 20210528
                     Root_Rental_Apply__c,            // 源申请单(root) 1732 ljh add 20210609
                     First_level_actual_approver__c,  //一级实际审批人 20210908 ljh SFDC-C6A97F add
                     Second_level_actual_approver__c, //二级实际审批人 20210908 ljh SFDC-C6A97F add
                     OPDManager__c,                   // 20210926 ljh add SFDC-C6A97F add
                     OPDBuchang__c,                   // 20220722 zyh add SWAG-CGG7X9 add
                     Rental_Apply_Equipment_Set_Cnt__c, // 20231025 zyh add
                     NoDirectReason__c,               // 20231110 ljh DB202310484652 add
                     NoDirectNoteReason__c,           // 20231110 ljh DB202310484652 add
                     Medical_Institution_Address__c,  // 20231227 ljh DB202312530994 add
                     Medical_Institution_Address_sup__c,// 20231227 ljh DB202312530994 add
                    //  AWS_Data_Id__c,
                     // OLY_OCM-583 Start 分单时增加拷贝字段GI本部区分 
                     GI_Diff__c                       // GI本部区分
                     // OLY_OCM-583 End
                  FROM Rental_Apply__c
                 WHERE Id IN :idList];
     }
     
    private static List<OPDPlan__c> getOpd(List<String> idList) {
        return [SELECT Id,
                    OwnerId, //所有人
                    //Status__c, //状态
                    OPDPlan_ImplementDate__c, //OPD计划实施日期
                    OPDPlan_ImplementDate_temp__c, // OPD计划实施日期(Temp)
                    Activity_Type2__c, //拜访区分
                    Account_Laboratory__c, //科室
                    //OPDPlan_Report__c, //报告书  //2021-12-28  mzy OPD计划改善 
                    Campaign__c, //学会
                    Related_Opportunity1_ID__c, //跟进询价ID1
                    Related_Opportunity2_ID__c, //跟进询价ID2
                    NoOpp_Reason__c,//无询价申请理由
                    OPDType__c, //OPD计划来源
                    SalesManager__c, //推广经理
                    SalesManager_Txt__c, //推广经理（文本）
                    PlanProdDetail__c, //计划出借备品信息
                    DelayCancel_Reason__c, //延期取消理由
                    RentalReson__c, //出借目的     
                    noReportStatus__c, //无报告状态  
                    ModelLendingProduct__c, //模型出借产品  
                    ModelLending__c, //模型出借产品型号  
                    CorrespondingRepairNo__c, //对应修理维修NO
                    AttachmentCertificate__c, //附件证明
                    Meeting_Cooperate__c,  //会议合作本部1
                    Meeting_Cooperate2__c, //会议合作本部2
                    Meeting_Cooperate3__c, //会议合作本部3
                    Meeting_Cooperate4__c, //会议合作本部4
                    IF_Approved__c, // 是否申请决裁 20220218 ljh add
                    Approved_No__c, // 决裁编码 20220218 ljh add
                    Approved_Status__c,// 决裁状态 20220218 ljh add
                    EquipmentFromOpp__c, // 报价外产品 20240110 zyh add
                    EquipmentNotFromOpp__c, // 报价内产品  20240110 zyh add
                    PlanProdDetailSys__c, // 计划出借战略产品  20240110 zyh add
                    PlanProdDetailSysT__c, // 计划出借战略产品  20240110 zyh add
                    AdditionalSupport__c, //原OPD计划（追加配套用）
                    EquipmentFromOppNum__c,         //报价内产品数量 20240204 sx 报价外产品数量/报价内产品数量 赋值 
                    EquipmentNotFromOppNum__c       //报价外产品数量 20240204 sx 报价外产品数量/报价内产品数量 赋值 
                      FROM OPDPlan__c WHERE Id IN :idList];
    }
    /**
     * 从 Label.OCM_Management_Province_Mapping
     * 取出 存放地 → 省 的 Map
     */
    private static Map<String, String> getOcmMgtProvMap() {
        Map<String, String> ocm_Map = new Map<String, String>();
        String OCM_Management_Province_Mapping = System.Label.OCM_Management_Province_Mapping;
        for (String str : OCM_Management_Province_Mapping.split(',')) {
            List<String> strList = str.split(':');
            ocm_Map.put(strList[1].trim(), strList[0].trim());
        }
        return ocm_Map;
    }

    /**
     * 单独拎出分配方法
     * 2024-01-10 zyh
     */
    private static void toFp(List<String> raIdFpList,Boolean isFirst) {
        // 借用机会可视化--延迟推送分配/排队--zyh--start
        DateTime startHold = Datetime.now();
        // 借用机会可视化_延迟推送改为自定义标签 20240113 zyh start
        // DateTime endHold = startHold.addSeconds(60);
        Integer num = 60;
        if (String.isNotBlank(System.Label.SplitToFp)) {
            System.debug('System.Label.SplitToFp===' + System.Label.SplitToFp);
            num = Integer.valueOf(System.Label.SplitToFp);
        }
        DateTime endHold = startHold.addSeconds(num);
        // 借用机会可视化_延迟推送改为自定义标签 20240113 zyh end
        if (isFirst) {
            System.debug('** isFirst');
            if (!Test.isRunningTest()) {
                System.enqueueJob(new RentalFixtureSetAssignAndQueueWebService(raIdFpList));
            }
        } else {
            System.debug('**Not isFirst');
            while (Datetime.now() < endHold) {

            }
            if (!Test.isRunningTest()) {
                System.enqueueJob(new RentalFixtureSetAssignAndQueueWebService(raIdFpList));
            }
        }
    }
}