//1.a 此单记录类型是备品中心且分单到备品中心 整单报错  不会进入此代码
//1.b 此单记录类型是备品中心且分单到备品中心 部分分单 之前逻辑
//1.c 此单记录类型是备品中心且分单到办事处 整单 之前手工修改的改逻辑
//1.d 此单记录类型是备品中心且分单到办事处 部分分单 之前逻辑
//2.a 此单记录类型是办事处且分单到备品中心 整单 提醒是否整单 新逻辑
//2.b 此单记录类型是办事处且分单到备品中心 部分分单 新逻辑
//2.c 此单记录类型是办事处且分单到办事处 整单 提醒是否整单 新逻辑
//2.d 此单记录类型是办事处且分单到办事处 部分分单 新逻辑
public without sharing class RentalApplySplitController {

    /*--------- private ---------*/
    private Id objId {get; set;}            // 申请单ID
    private String raesIds {get; set;}      // 被选中的一览记录Id

    /*--------- public(画面表示用) ---------*/
    public Rental_Apply__c ra {get; private set;}   // objId的源申请单
    public List<Rental_Apply_Equipment_Set__c> raesList {get; set;}   // 符合分单条件的被选中的一览记录
    public String saveStatus {get; set;}                              // 分单结果： 'ok'--成功
    public String errorMessage;
    public Rental_Apply__c cloneRas {get; set;}                       // 分单后新建的申请单
    public Boolean allSplitFlag {get; set;}                           // 整单分单 20210528 ljh add 1732
    public Boolean NGFlag {get; set;}                                 // 到货NG分单 20210528 ljh add 1732
    public Boolean rootStatusFlag {get; set;}                         // 源申请root是否发货/取消(true 发货/取消)  20210528 ljh add 1732
    public Boolean CrossRegionAssignFlag {get; set;}                  // 源申请root是否跨区域分配  20210618 ljh add 1732
    public Boolean allSplitShow {get; set;}                           // 全选一览是显示弹框 20210527 ljh add 1732
    public Integer SplitNum {get; set;}                               // 分单数字化 20210609 ljh add 1732
    public Boolean RecordTypeIsAgency {get; set;}                     // 当前单是否是记录类型 20210527 ljh add 1732
    public String rootRaId;                                           // 全局化 20210609 ljh add 1732
    private static final Map<String,Schema.RecordTypeInfo>  DEVELOPERNAMEMAP  = Schema.SObjectType.Rental_Apply__c.getRecordTypeInfosByDeveloperName();//记录类型
    /**
    * @description RentalApplySplitController Class的构造函数
    * @param objId   申请单ID
    * @param raesIds 被选中的一览记录Id
    **/
    public RentalApplySplitController() {
        this.objId = ApexPages.currentPage().getParameters().get('objId');
        this.raesIds = ApexPages.currentPage().getParameters().get('raesIds');
        //20210527 ljh add 1732 start
        allSplitFlag = false;
        NGFlag = false;
        rootStatusFlag = false;
        allSplitShow = false;
        RecordTypeIsAgency = false;
        CrossRegionAssignFlag = false;
        //20210527 ljh add 1732 end
    }

    /**
    * @description RentalApplySplitController 初始化方法
    **/
    public void init() {

        try{
            if (String.isBlank(this.objId)) {
                throw new ControllerUtil.myException('请设置备品借出申请的Id');
            }
            if (String.isBlank(this.raesIds)) {
                throw new ControllerUtil.myException('请设置备品借出申请一览的Id');
            }
            // 1.判断是否存在页面传过来Id对应的申请单记录 & 状态和Id都符合的选中一览记录
            List<Rental_Apply__c> raList = getRa();
            if (raList.size() == 0) {
                throw new ControllerUtil.myException('没有检索出备品借出申请');
            }
            this.ra = raList[0];
            //20210607 ljh add start
            if(this.ra.RecordTypeId == DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId()){
                RecordTypeIsAgency = true;
            }
            //20210607 ljh add end
            // 2.新建申请单，选中的一览记录转移到新的申请单
            this.cloneRas = ra.clone();
            this.cloneRas.ToAgency__c = null;
            this.cloneRas.Split_Apply_Reason__c = null;
            // 3.判断当前申请单&选中一览是否符合分单条件
            checkRAES(true);
            //20210608 ljh update 1732 start
            //20201119 ljh OCSM_BP5-60 update  start
            // 分单页面分单理由初始为空
            //this.cloneRas.Split_Apply_Reason__c = null;
            // 5.当前记录类型是【备品申请（办事处）】一览选择的都是收货NG，分单理由只能是【到货NG分单】
            // if(cloneRas.RecordTypeId == DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId()){
            //     this.cloneRas.Split_Apply_Reason__c = '到货NG分单';
            //     this.SplitApplyReasonFlag = true;
            // }else{
            //     // 分单页面分单理由初始为空
            //     this.cloneRas.Split_Apply_Reason__c = null;
            // }
            //20201119 ljh OCSM_BP5-60 update  end
            //20210608 ljh update 1732 start
            this.cloneRas.SalesdeptSelect__c = this.cloneRas.Salesdept__c;//20201117 ljh add 不同本部分配不同办事处
        } catch (ControllerUtil.myException me) {
            System.debug('myException caught when init: ' + me.getMessage());
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, me.getMessage()));
            errorMessage = me.getStackTraceString();
            return;
        } catch (Exception e) {
            System.debug('Exception caught when init: ' + e.getStackTraceString());
            ApexPages.addMessages(e);
            errorMessage = e.getStackTraceString();
            return;
        }
    }

    /**
    * @description 保存分单理由
    **/
    public PageReference saveSplit() {
        Savepoint sp = Database.setSavepoint();
        try {
            allSplitShow = false;
            List<Rental_Apply__c> lockRaList = [
                    select Id, Name
                    from Rental_Apply__c
                    where Id  = :ra.Id
                    for update];

            if (lockRaList.size() <> 1) {
                throw new ControllerUtil.myException('源数据('+ ra.Name +') 已经被其他用户操作，请重试');
            }
            //20210610 ljh 1732 add start
            if(this.ra.RecordTypeId == DEVELOPERNAMEMAP.get('StandardRequest').getRecordTypeId()
                && !String.isBlank(cloneRas.Split_Apply_Reason__c)  && !cloneRas.Split_Apply_Reason__c.equals('现地管理分单')
                ){
                //备品中心->备品中心
                List<Rental_Apply_Equipment_Set__c> tempList = [select RAES_Status__c from Rental_Apply_Equipment_Set__c where Rental_Apply__c =:this.objId];
                if(tempList.size() == 1){
                    throw new ControllerUtil.myException('这个申请单只有一条借出备品一览，不能分单');   
                }else if(tempList.size() == this.raesIds.split(',').size()){
                    throw new ControllerUtil.myException('不能全选借出备品一览分单');   
                }
            }
            //20210610 ljh 1732 add end
            
            // 20210609 ljh update 1732 start
            // 保存前再次判断当前申请单&选中一览是否符合分单条件 
            // String rootRaId = checkRAES(true);
            rootRaId = checkRAES(true); 
            // 20210609 ljh update 1732 end 
            //20201207 ljh add start
            if(cloneRas.Split_Apply_Reason__c != null && cloneRas.Split_Apply_Reason__c.equals('现地管理分单')){
                if(cloneRas.ToAgency__c == null){
                    throw new ControllerUtil.myException('分单理由选择【现地管理分单】时，分配办事处选项必须选择！');
                }
            }else if(cloneRas.RecordTypeId != DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId() && cloneRas.Split_Apply_Reason__c !=null && !cloneRas.Split_Apply_Reason__c.equals('现地管理分单')){
                if(cloneRas.ToAgency__c != null){
                    throw new ControllerUtil.myException('分单理由 非【现地管理分单】且记录类型非【备品申请（办事处）】时，分配办事处不应有值！');
                }
            }      
            //20201207 ljh add end
            //20210528 ljh 1732 add start
            if(this.ra.RecordTypeId == DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId()
                && !String.isBlank(cloneRas.Split_Apply_Reason__c)){
                // 办事处->XXX
                if(cloneRas.Split_Apply_Reason__c.equals('分批发货分单') || cloneRas.ToAgency__c == null){
                    //办事处->备品中心
                    SplitNum = 1;
                }else if(cloneRas.ToAgency__c != null){
                    //办事处->办事处
                    //是否是同一办事处
                    if(cloneRas.Split_Apply_Reason__c.equals('现地管理分单') && cloneRas.ToAgency__c == this.ra.ToAgency__c){
                        throw new ControllerUtil.myException('不能选择同一办事处');
                    }
                    SplitNum = 2;
                }
                if(NGFlag){
                    //1.满足 到货NG重新发货
                    if(!cloneRas.Split_Apply_Reason__c.equals('到货NG分单')){
                        throw new ControllerUtil.myException('此单有到货NG一览，分单理由只能是【到货NG分单】');
                    }
                }            
            }else {
                // if(NGFlag){
                //     //1.满足 到货NG重新发货
                //     if(!cloneRas.Split_Apply_Reason__c.equals('到货NG分单')){
                //         throw new ControllerUtil.myException('此单有到货NG一览，分单理由只能是【到货NG分单】');
                //     }
                // }
                SplitNum = 3;
            }
            if(allSplitFlag && !(cloneRas.Split_Apply_Reason__c.equals('到货NG分单') && cloneRas.ToAgency__c == this.ra.ToAgency__c)){
                allSplitShow = true;
            }else{
                String statusMessage = addAndUpdate(rootRaId);
                if (statusMessage != '1') {
                    throw new ControllerUtil.myException(statusMessage);
                }
                saveStatus = 'ok'; 
            }
            //20210528 ljh 1732 add end
            // String statusMessage = addAndUpdate(rootRaId);
            // if (statusMessage != '1') {
            //     throw new ControllerUtil.myException(statusMessage);
            // }
            // saveStatus = 'ok';

        } catch (ControllerUtil.myException me) {
            Database.rollback(sp);
            System.debug('myException caught when save: ' + me.getMessage());
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, me.getMessage()));
            saveStatus = 'ng';
            errorMessage = me.getStackTraceString();
        } catch (DmlException de) {
            Database.rollback(sp);
            System.debug('DmlException caught when save: ' + de.getMessage());
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, de.getMessage()));
            saveStatus = 'ng';
            errorMessage = de.getStackTraceString();
        } catch (Exception e) {
            Database.rollback(sp);
            System.debug('Exception caught when save: ' + e.getStackTraceString());
            ApexPages.addMessages(e);
            saveStatus = 'ng';
            errorMessage = e.getStackTraceString();
        }
        return null;
    }
    //20210609 ljh add 1732 start
    /**
    * 选择全部一览的时候保存分单理由等
    **/
    public void saveSplitAll() {
        Savepoint sp = Database.setSavepoint();
        try {
            String statusMessage = addAndUpdate(rootRaId);
            if (statusMessage != '1') {
                throw new ControllerUtil.myException(statusMessage);
            }
            saveStatus = 'ok';
        } catch (ControllerUtil.myException me) {
            Database.rollback(sp);
            System.debug('myException caught when save: ' + me.getMessage());
            ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, me.getMessage()));
            saveStatus = 'ng';
            errorMessage = me.getStackTraceString();
        }
    }
    //20210609 ljh add 1732 end
    /**
    * 选中一览记录是否符合分单条件判断
    * @param throwErrorFlg
    * @return 最原始申请单Id
    **/
    private String checkRAES(Boolean throwErrorFlg) {

        // 判断是否存在状态和Id和父申请单都符合的选中一览记录
        String[] ids = raesIds.split(',');

        // 分单条件之一览状态--'待分配', '排队中', '暂定分配', '已分配', '已出库指示', '已下架', '出库前已检测'
        Set<String> statusRaesSet = new Set<String>{FixtureUtil.raesStatusMap.get(FixtureUtil.RaesStatus.Dai_Fen_Pei.ordinal()),
                FixtureUtil.raesStatusMap.get(FixtureUtil.RaesStatus.Pai_Dui_Zhong.ordinal()),
                FixtureUtil.raesStatusMap.get(FixtureUtil.RaesStatus.Zan_Ding_Fen_Pei.ordinal()),
                FixtureUtil.raesStatusMap.get(FixtureUtil.RaesStatus.Yi_Fen_Pei.ordinal()),
                FixtureUtil.raesStatusMap.get(FixtureUtil.RaesStatus.Yi_Chu_Ku_Zhi_Shi.ordinal()),
                FixtureUtil.raesStatusMap.get(FixtureUtil.RaesStatus.Yi_Xia_Jia.ordinal()),
                FixtureUtil.raesStatusMap.get(FixtureUtil.RaesStatus.Chu_Ku_Qian_Yi_Jian_Ce.ordinal())};

        this.raesList = [
                SELECT Id, Name,RAES_Status__c, Loaner_code_F__c, Rental_Apply__c, Old_Rental_Apply__c ,
                Rental_Apply__r.DeliverySlip__c,Rental_Apply__r.RA_Status__c, //20210528 ljh add 1732
                Old_Rental_Apply__r.DeliverySlip__c,Old_Rental_Apply__r.RA_Status__c, //20210528 ljh add 1732
                Rental_Apply__r.Cross_Region_Assign__c ,Old_Rental_Apply__r.Cross_Region_Assign__c ,//20210528 ljh add 1732
                Received_NG_ReAssign__c, Rental_Apply__r.RecordTypeId  //20201119 ljh OCSM_BP5-60 add
                FROM Rental_Apply_Equipment_Set__c
                WHERE Id in :ids
                AND Rental_Apply__c = :this.objId
                AND RAES_Status__c in :statusRaesSet];
        // 防止对一条一览进行多次分单，有可能分单后源申请单页面未刷新
        for (Rental_Apply_Equipment_Set__c raes : this.raesList) {
            if (throwErrorFlg && raes.Rental_Apply__c != this.objId) {
                throw new ControllerUtil.myException('已选一览已被分到其他申请单');
            }
            //20201119 ljh OCSM_BP5-60 add start
            // else{
            //     // 5.当前记录类型是【备品申请（办事处）】一览选择的都是收货NG，分单理由只能是【到货NG分单】
            //     if(raes.Rental_Apply__r.RecordTypeId == DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId() && !raes.Received_NG_ReAssign__c){
            //         throw new ControllerUtil.myException('请选择符合条件的一览！');
            //     }
            // }
            //20201119 ljh OCSM_BP5-60  add end
            //20210528 ljh add  1732 start 
            else{
                // 5.当前记录类型是【备品申请（办事处）】一览选择的都是收货NG，分单理由只能是【到货NG分单】
                // if(raes.Rental_Apply__r.RecordTypeId == DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId() && raes.Received_NG_ReAssign__c){
                if(raes.Received_NG_ReAssign__c){
                    NGFlag = true;
                }
            }
            //20210528 ljh add  1732 end 
        }
        
        //20201119 ljh OCSM_BP5-60 add  start
        // 5.当前记录类型是【备品申请（办事处）】一览选择的都是收货NG，分单理由只能是【到货NG分单】
        // if(cloneRas.RecordTypeId == DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId()){        
        //     this.cloneRas.Split_Apply_Reason__c = '到货NG分单'; 
        // }
        //20201119 ljh OCSM_BP5-60 add  end

        if (throwErrorFlg && raesList.size() != ids.size()) {
            throw new ControllerUtil.myException('已选一览状态不符合分单条件');
        }
        //20210528 ljh update 1732 start
        // rootRaId: 最原始申请单Id
        String rootRaId = raesList[0].Old_Rental_Apply__c;
        // if (String.isBlank(raesList[0].Old_Rental_Apply__c)) {
        //     rootRaId = raesList[0].Rental_Apply__c;
        // }
        String rootStatus ;
        String rootDeliverySlip ;
        String CrossRegionAssign;
        if (String.isBlank(raesList[0].Old_Rental_Apply__c)) {
            rootRaId = raesList[0].Rental_Apply__c;
            rootStatus = raesList[0].Rental_Apply__r.RA_Status__c;
            rootDeliverySlip  = raesList[0].Rental_Apply__r.DeliverySlip__c;
            CrossRegionAssign = raesList[0].Rental_Apply__r.Cross_Region_Assign__c;
        } else{
            //源单状态
            rootStatus = raesList[0].Old_Rental_Apply__r.RA_Status__c;
            rootDeliverySlip = raesList[0].Old_Rental_Apply__r.DeliverySlip__c;
            CrossRegionAssign = raesList[0].Old_Rental_Apply__r.Cross_Region_Assign__c;
        }
        if(String.isNotBlank(rootDeliverySlip) || rootStatus == '取消'){
            rootStatusFlag = true;
        }
        if(String.isNotBlank(CrossRegionAssign)){
            CrossRegionAssignFlag = true; //跨区域分配
        } 
        //20210528 ljh update 1732 end
        //1.a 此单记录类型是备品中心且分单到备品中心 有此提醒
        // RentalApplyEquipmentSetHandler handler = new RentalApplyEquipmentSetHandler();
        Set<String> raIds = new Set<String>{this.objId};
        Set<String> emptyRaObjs = RentalApplyEquipmentSetHandler.checkRentalApplyNotExistRAES(raesList, raIds); // raesList为页面选中一览
        if (emptyRaObjs.size() != 0) {
            //202100608 ljh update 1732 start
            // throw new ControllerUtil.myException('这个申请单下必须要有一条借出备品一览,不能分单了');
            if(this.ra.RecordTypeId == DEVELOPERNAMEMAP.get('StandardRequest').getRecordTypeId() 
            && !String.isBlank(cloneRas.Split_Apply_Reason__c)  && !cloneRas.Split_Apply_Reason__c.equals('现地管理分单')){
                throw new ControllerUtil.myException('这个申请单下必须要有一条借出备品一览,不能分单了');
            }
            allSplitFlag = true;
            //20210608 ljh update 1732 end  
        }
        //20201207 ljh add start
        List<Rental_Apply_Equipment_Set_Detail__c> raesdList = [
                SELECT Id, Name,FSD_Is_OneToOne_F__c,Is_Body__c,Asset__c 
                FROM Rental_Apply_Equipment_Set_Detail__c 
                WHERE Rental_Apply_Equipment_Set__c in :ids
                AND Rental_Apply__c = :this.objId];
        for(Rental_Apply_Equipment_Set_Detail__c raesd:raesdList){
            //2.如果分单的一览有已经分配或者暂定分配的话（Asset__c有值不能分配）
            if(
                (
                    (cloneRas.Split_Apply_Reason__c != null && cloneRas.Split_Apply_Reason__c.equals('现地管理分单'))
                || this.ra.RecordTypeId == DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId()
                )
                && String.isNotBlank(raesd.Asset__c)
            ){
                throw new ControllerUtil.myException('一览有已经分配或者暂定分配的话,不能分单了');
            }
        }         
        //20201207 ljh add end

        return rootRaId;
    }
    /**
    * @description 新建申请单，更改选中一览与申请单的联系 20210408 ljh update 如果有先新建opd计划在新建申请单
    * @param rootRaId 最原始申请单Id
    * @return String 操作成功返回‘1’，失败返回message
    */
    private String addAndUpdate(String rootRaId) {
        // 1.获取rootRaList[0] -- 当前申请单对应的最原始的申请单
        List<Rental_Apply__c> rootRaList = [
                select Id, Name
                from Rental_Apply__c
                where Id = :rootRaId];

        if (rootRaList.size() == 0) {
            throw new ControllerUtil.myException('最原始申请单('+ ra.Name +') 已经不存在，请确认数据。');
        }
        String[] ids = raesIds.split(',');   // 选中一览id
        List<Rental_Apply_Equipment_Set_Detail__c> raesdList = [select Id, Rental_Apply_Equipment_Set__c
                    from Rental_Apply_Equipment_Set_Detail__c 
                    where Rental_Apply_Equipment_Set__c in :ids];
        if(this.ra.RecordTypeId == DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId()
            && !String.isBlank(cloneRas.Split_Apply_Reason__c)  && !cloneRas.Split_Apply_Reason__c.equals('现地管理分单')){
            // 1.分批发货分单 2.到货NG分单
            //办事处->备品中心 分批发货分单 OR 到货NG时 办事处->办事处/备品中心
            if(cloneRas.Split_Apply_Reason__c.equals('分批发货分单')) {
                if(
                    ((ra.Old_Rental_Apply__c == null || rootStatusFlag) 
                    ||(CrossRegionAssignFlag && !rootStatusFlag))
                    && allSplitFlag){
                    // 整单 (发货或者取消)或者本身就是整单到办事处的  更改 修改记录类型为 备品申请
                    // 整单 1.并且 root单 没有(发货或者取消) && 跨区域 并会源申请单 2.当前单取消
                    this.ra.SplitUser__c = null;
                    this.ra.RecordTypeId = DEVELOPERNAMEMAP.get('StandardRequest').getRecordTypeId();
                    this.ra.ToAgency__c = null;
                    this.ra.Split_Apply_Reason__c = ra.Old_Rental_Apply__c == null?null:cloneRas.Split_Apply_Reason__c;
                    this.ra.Office_Assistant1__c = null;
                    this.ra.Office_Assistant2__c = null;
                    this.ra.SalesdeptSelect__c = null;
                    this.ra.Cross_Region_Assign__c  = null;
                    FixtureUtil.withoutUpdate(new Rental_Apply__c[]{this.ra});
                    return '1';
                }else if(!rootStatusFlag && !CrossRegionAssignFlag){
                    // 整单 1.并且 root单 没有(发货或者取消) && 未跨区域 并会源申请单 2.当前单取消
                    // 部分 1.并且 root单 没有(发货或者取消) && 未跨区域 并会源申请单
                    // 1. 选中分单的一览与root申请单关联
                    for (Rental_Apply_Equipment_Set__c updRaesObj : this.raesList) {
                        updRaesObj.Old_Rental_Apply__c = null;      // 最源申请单Link
                        updRaesObj.Rental_Apply__c = rootRaList[0].Id;
                    }
                    // 2. 配套明细分割到新申请单，明细的Name在RentalApplyEquipmentSetDetailHandler中更新
                    FixtureUtil.withoutUpdate(this.raesList);
                    if (raesdList.size() > 0) {
                        for (Rental_Apply_Equipment_Set_Detail__c raesdObj : raesdList) {
                            raesdObj.Rental_Apply__c = rootRaList[0].Id;
                        }
                        FixtureUtil.withoutUpdate(raesdList);
                    }
                    if(allSplitFlag){
                        //3.当前单取消
                        // 20210823 ljh SFDC-C448KZ start
                        // RentalApplyCancelController rac = new RentalApplyCancelController();
                        // rac.objId = objId;
                        // rac.ra = ra;
                        // rac.ra.Cancel_Reason__c = '主动取消';
                        // rac.ra.Loaner_cancel_reason__c = '申请单合并';
                        // rac.ra.Loaner_cancel_request__c = '申请单合并';
                        // rac.saveCancel();  
                        this.ra.Cancel_Reason__c = '主动取消';
                        this.ra.Loaner_cancel_reason__c = '申请单合并';
                        this.ra.Loaner_cancel_request__c = '申请单合并';
                        FixtureUtil.withoutUpdate(new Rental_Apply__c[]{this.ra});
                        // 20210823 ljh SFDC-C448KZ start

                    }
                    return '1';
                }else if((rootStatusFlag ||(!rootStatusFlag && CrossRegionAssignFlag)) && !allSplitFlag){
                    // 部分 1.并且 root单 (发货或者取消) 新建申请书 办事处无值 修改记录类型为 备品申请 清空相关信息
                    // 部分 1.并且 root单 没有(发货或者取消) && 跨区域 新建申请 清空跨区域字段
                    cloneRas.RecordTypeId = DEVELOPERNAMEMAP.get('StandardRequest').getRecordTypeId();
                    cloneRas.ToAgency__c = null;
                    cloneRas.SplitUser__c = null;
                    cloneRas.Office_Assistant1__c = null;
                    cloneRas.Office_Assistant2__c = null;
                    cloneRas.SalesdeptSelect__c = null;
                    cloneRas.Cross_Region_Assign__c = null;
                }
            } else if(cloneRas.Split_Apply_Reason__c.equals('到货NG分单')){
                //到货NG分单 新建申请书 办事处有值 记录类型等不修改 分单原因及办事处按照页面上写的
                //到货NG分单 新建申请书 办事处无值 修改记录类型为 备品申请 清空相关信息
                if(allSplitFlag){
                    if(String.isBlank(cloneRas.ToAgency__c)){
                        this.ra.RecordTypeId = DEVELOPERNAMEMAP.get('StandardRequest').getRecordTypeId();
                        this.ra.ToAgency__c = null;
                        this.ra.Office_Assistant1__c = null;
                        this.ra.Office_Assistant2__c = null;
                        this.ra.SplitUser__c = null;
                        this.ra.SalesdeptSelect__c = null;
                        this.ra.Cross_Region_Assign__c = null;
                    }else{
                        this.ra.ToAgency__c = cloneRas.ToAgency__c;
                        this.ra.SplitUser__c = UserInfo.getUserId();
                    }
                    FixtureUtil.withoutUpdate(new Rental_Apply__c[]{this.ra});
                    return '1';
                }else{
                    if(String.isBlank(cloneRas.ToAgency__c)){
                        cloneRas.RecordTypeId = DEVELOPERNAMEMAP.get('StandardRequest').getRecordTypeId();
                        cloneRas.ToAgency__c = null;
                        cloneRas.SplitUser__c = null;
                        cloneRas.Office_Assistant1__c = null;
                        cloneRas.Office_Assistant2__c = null;
                        cloneRas.SalesdeptSelect__c = null;
                        cloneRas.Cross_Region_Assign__c = null;
                    }
                }
            }
        }else if(this.ra.RecordTypeId == DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId()
            && !String.isBlank(cloneRas.Split_Apply_Reason__c)  && cloneRas.Split_Apply_Reason__c.equals('现地管理分单')){
            //办事处->办事处 现地管理分单
            //记录类型不变 
            if(allSplitFlag){
                //不新建申请书 修改 分配办事处
                this.ra.ToAgency__c = cloneRas.ToAgency__c;
                this.ra.SplitUser__c = UserInfo.getUserId();
                FixtureUtil.withoutUpdate(new Rental_Apply__c[]{this.ra});
                return '1';
            }
            //else 新建申请书    
        }else if(this.ra.RecordTypeId == DEVELOPERNAMEMAP.get('StandardRequest').getRecordTypeId() 
                && !String.isBlank(cloneRas.Split_Apply_Reason__c)  && cloneRas.Split_Apply_Reason__c.equals('现地管理分单')){
            //备品中心->办事处 现地管理分单
            if(allSplitFlag){
                //整单 不新建申请书 修改记录类型为 备品申请（办事处） 、分配办事处等
                if (raesdList.size() > 0) {
                    for (Rental_Apply_Equipment_Set_Detail__c raesdObj : raesdList) {
                        //3.如果有排队中的清除排队信息
                        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; //20210913 you SFDC-C6E3WQ 
                        raesdObj.Queue_Number__c = null;
                    }
                    FixtureUtil.withoutUpdate(raesdList);
                }
                this.ra.SplitUser__c = UserInfo.getUserId();
                this.ra.SalesdeptSelect__c = this.ra.Salesdept__c;
                this.ra.ToAgency__c = cloneRas.ToAgency__c;
                this.ra.Split_Apply_Reason__c = cloneRas.Split_Apply_Reason__c;
                this.ra.RecordTypeId = DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId();
                FixtureUtil.withoutUpdate(new Rental_Apply__c[]{this.ra});
                return '1';
            }
            // 代码547行左右【4.办事处分配分单出来的备品借出申请，数据类型需要修改】有写~
            // else{
            //     //部分分单  新建申请书 修改记录类型为 备品申请（办事处） 、分配办事处等
            //     cloneRas.RecordTypeId = DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId();
            //     cloneRas.SplitUser__c = UserInfo.getUserId();
            // }
        }
        //20210531 ljh add 1732 end
        //20210408 ljh add start
        OPDPlan__c cloneOPD =  new OPDPlan__c();
        if(cloneRas.OPDPlan__c != null){
            List<OPDPlan__c> opdList = [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
                    AdditionalSupport__c //原OPD计划（追加配套用）
                      FROM OPDPlan__c WHERE Id = :cloneRas.OPDPlan__c];
            if(opdList.size()>0){
                cloneOPD = opdList[0].clone();
                //cloneOPD.OriginalOpdPlanApplication__c = cloneRas.OPDPlan__c;
                cloneOPD.OriginalOpdPlanRental__c = cloneRas.OPDPlan__c;
                //cloneOPD.RentalSplit__c = true;
                cloneOPD.Status__c = '计划中';
                FixtureUtil.withoutInsert(new OPDPlan__c[]{cloneOPD});
                cloneRas.OPDPlan__c = cloneOPD.Id;
                cloneRas.ApprovedNo_Create__c = cloneOPD.Approved_No__c; // 20220218 ljh add 决裁
                cloneRas.Approved_State_Create__c = cloneOPD.Approved_Status__c; // 20220218 ljh add 决裁
                // List<Plan_Rental_Equipment__c> inPreList = new List<Plan_Rental_Equipment__c>();
                // for(Plan_Rental_Equipment__c pre0 : [SELECT Id, Campaign__c,Event_ID__c,RecordTypeId,Name,Rental_Equipment__c,Rental_Quantity__c FROM Plan_Rental_Equipment__c WHERE OPD_Plan__c = :opdList[0].Id]){
                //     Plan_Rental_Equipment__c pre = new Plan_Rental_Equipment__c();
                //     pre = pre0.clone();
                //     pre.Id = null;
                //     pre.Event_ID__c = null;
                //     pre.Campaign__c = null;
                //     pre.OPD_Plan__c = cloneOPD.Id;
                //     inPreList.add(pre);
                // }
                // if (inPreList.size()>0) {
                //     insert inPreList;
                // }
                //附件拷贝
                /*List<Attachment> newFiles = new List<Attachment>();
                for(Attachment att : [SELECT Id, Body, Name, ParentId
                                        FROM Attachment
                                        WHERE ParentId = :opdList[0].Id]){
                    newFiles.add(new Attachment(Body = att.Body,Name = att.Name, ParentId = cloneOPD.Id));
                }
                if (newFiles.size()>0) {
                    insert newFiles;
                }*/
            }
        }
        //20210408 ljh add end
        // 分单出来的个数
        //20210609 ljh update 1732 start
        // List<AggregateResult> oldRaList = [
        //         select Rental_Apply__c
        //         from Rental_Apply_Equipment_Set__c where Old_Rental_Apply__c = :rootRaList[0].Id
        //         group by Rental_Apply__c];
        List<Rental_Apply__c> oldRaList = [select Id,Name from Rental_Apply__c where Root_Rental_Apply__c = :rootRaList[0].Id];
        //20210609 ljh update 1732 start
        Integer num = oldRaList.size() + 1;
        // 新申请单命名方式：最原始申请单_1、_2、_3…
        cloneRas.Name = rootRaList[0].Name + '_' + num;
        cloneRas.Old_Rental_Apply__c = ra.Id;                       // 源申请单Link
        cloneRas.Root_Rental_Apply__c = rootRaList[0].Id;           // 最源申请单Id 20210609 ljh add 1732
        cloneRas.OPDManagerText__c = ra.OPDManager__c;   // 20210926 ljh add SFDC-C6A97F add 
        //20201117 ljh  OCSM_BP5-60 add start
        //4.办事处分配分单出来的备品借出申请，数据类型需要修改
        if(cloneRas.Split_Apply_Reason__c != null && cloneRas.Split_Apply_Reason__c.equals('现地管理分单')){
            cloneRas.RecordTypeId = DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId();
            cloneRas.SplitUser__c = UserInfo.getUserId();
        }
        if(String.isNotBlank(cloneRas.RecordTypeId) && cloneRas.RecordTypeId == DEVELOPERNAMEMAP.get('AgencyRequest').getRecordTypeId()){
            cloneRas.SplitUser__c = UserInfo.getUserId();
        }
        //20201117 ljh  OCSM_BP5-60 add end
        FixtureUtil.withoutInsert(new Rental_Apply__c[]{cloneRas});
        // cloneRas.Response__c = '\n\n备品借出申请链接： ' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + cloneRas.Id +' \n\n' + cloneRas.Response__c;
        cloneRas.Response__c = '<br/>备品借出申请链接： ' + URL.getSalesforceBaseUrl().toExternalForm() + '/' + cloneRas.Id +' <br/><br/>' + cloneRas.Response__c;
        FixtureUtil.withoutUpdate(new Rental_Apply__c[]{cloneRas});

        // 2. 选中分单的一览与新旧申请单关联
        for (Rental_Apply_Equipment_Set__c updRaesObj : this.raesList) {
            updRaesObj.Old_Rental_Apply__c = rootRaList[0].Id;      // 最源申请单Link
            updRaesObj.Rental_Apply__c = cloneRas.Id;
        }

        // 3. 配套明细分割到新申请单，明细的Name在RentalApplyEquipmentSetDetailHandler中更新
        // 20210611 ljh update 1732 start
        //String[] ids = raesIds.split(',');   // 选中一览id
        // List<Rental_Apply_Equipment_Set_Detail__c> raesdList = [select Id, Rental_Apply_Equipment_Set__c
                    // from Rental_Apply_Equipment_Set_Detail__c 
                    // where Rental_Apply_Equipment_Set__c in :ids];
        // 20210611 ljh update 1732 end
        FixtureUtil.withoutUpdate(this.raesList);
        if (raesdList.size() != 0) {
            for (Rental_Apply_Equipment_Set_Detail__c raesdObj : raesdList) {
                raesdObj.Rental_Apply__c = cloneRas.Id;
                //20201117 ljh  OCSM_BP5-60 add start
                //3.如果有排队中的清除排队信息
                if(cloneRas.Split_Apply_Reason__c != null && cloneRas.Split_Apply_Reason__c.equals('现地管理分单')){
                     // 清空排队信息
                    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;
                }
                //20201117 ljh  OCSM_BP5-60 add end
            }
            FixtureUtil.withoutUpdate(raesdList);
        }
        return '1';
    }
    /**
    * @description 获取新建申请单时需要复制的字段
    **/
    private List<Rental_Apply__c> getRa() {
       return [SELECT Id,
                    OwnerId,
                    Status__c,
                    Cancel_Reason__c,
                    Old_Rental_Apply__c,
                    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,                 // 联系电话
                    // ------ 借用备品的目的 ------
                    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计划状态改善
                    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_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 
                    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
                    // OLY_OCM-583 Start 分单时增加拷贝字段GI本部区分 
                    GI_Diff__c                       // GI本部区分
                    // OLY_OCM-583 End
                 FROM Rental_Apply__c
                WHERE Id = :this.objId];
    }
    @TestVisible private void test() {
        Integer i = 0;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
    }
}