Li Jun
2022-04-06 fb04e7c01d119c60632b4298d18fd93f3ccb3d79
force-app/main/default/triggers/Repair.trigger
@@ -1,353 +1,1009 @@
trigger Repair on Repair__c (before insert, after insert, before update, after update, after delete, before delete) {
    RepairHandler handler = new RepairHandler();
    handler.run();
    System.debug( '-----: trigger start');
    if ( Trigger.isBefore && Trigger.isUpdate) {
        RepairTrigger.CheckUpdate(Trigger.old, Trigger.newMap);
    }
    // ----------------------------------------------------------------------
    // wangweipeng  20210727   start
    // 新增修理时,如果直返收货地址的信息都为空,那么就根据医院的 OCSM管理省(文本) 字段来匹配地址表里 省和市字段
    // 如果能匹配到那么默认是这条新增的修理收货地址
    // ----------------------------------------------------------------------
    if ( Trigger.isBefore && Trigger.isInsert) {
        RepairBeforeInsertHandler ribt = new RepairBeforeInsertHandler();
        ribt.beforeInsertValue(Trigger.new,Trigger.old);
    }
    //wangweipeng  20210727   end
    if ((Trigger.isAfter && Trigger.isInsert) || (Trigger.isAfter && Trigger.isUpdate) || (Trigger.isAfter && Trigger.isDelete)) {
        NFM103Controller.NFM103Trigger(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
        NFM603Controller.NFM603Trigger(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
        RepairTrigger.UpdateAssert(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
    }
    // ----------------------------------------------------------------------
    // ここより、修理のサービスコントラクト項目を自動的に更新するロジック
    // ----------------------------------------------------------------------
    if ( Trigger.isBefore && (Trigger.isInsert || Trigger.isUpdate)) {
        // 納入機器IDを一意に格納する Setです。
        Set<ID> assetIds = new Set<Id>();
        // 納入機器の一意のIDを得る
        for ( Repair__c repair : Trigger.New) {
            if (String.isBlank(repair.Delivered_Product__c) == false) assetIds.add( repair.Delivered_Product__c);
    if(Test.isRunningTest()||UserInfo.getUserId()!=System.Label.ByPassTrigger){
        RepairHandler handler = new RepairHandler();
        handler.run();
        System.debug( '-----: trigger start');
        test();
        if ( Trigger.isBefore && Trigger.isUpdate) {
            RepairTrigger.CheckUpdate(Trigger.old, Trigger.newMap);
        }
        // 有効なサービス契約の Mapを得る
        // arg1は納入機器のID, arg2は納入機器のIDのサービス契約一覧
        // 区分虚拟维修合同和正常维修合同
        // 正常维修合同保有设备集合
        Map<Id, List<Maintenance_Contract_Asset__c>> effectiveContracts = new Map<Id, List<Maintenance_Contract_Asset__c>>();
        // 虚拟维修合同保有设备集合
        Map<Id, List<Maintenance_Contract_Asset__c>> effectiveContractsVM = new Map<Id, List<Maintenance_Contract_Asset__c>>();
        List<Maintenance_Contract_Asset__c> contracts = OncallFinalStatusManager.selectMaintenance_Contract_Asset_List(assetIds);
        for (Maintenance_Contract_Asset__c local : contracts) {
            if (local.Maintenance_Contract__r.RecordType.DeveloperName == 'VM_Contract') {
                List<Maintenance_Contract_Asset__c> middleTableVMList = effectiveContractsVM.get(local.Asset__c);
                if (middleTableVMList == null) {
                    middleTableVMList = new List<Maintenance_Contract_Asset__c>();
                    effectiveContractsVM.put(local.Asset__c, middleTableVMList);
                }
                middleTableVMList.add(local);
            } else {
                List<Maintenance_Contract_Asset__c> middleTableList = effectiveContracts.get(local.Asset__c);
                if (middleTableList == null) {
                    middleTableList = new List<Maintenance_Contract_Asset__c>();
                    effectiveContracts.put(local.Asset__c, middleTableList);
                }
                middleTableList.add(local);
            }
        // ----------------------------------------------------------------------
        // wangweipeng  20210727   start
        // 新增修理时,如果直返收货地址的信息都为空,那么就根据医院的 OCSM管理省(文本) 字段来匹配地址表里 省和市字段
        // 如果能匹配到那么默认是这条新增的修理收货地址
        // ----------------------------------------------------------------------
        if ( Trigger.isBefore && Trigger.isInsert) {
            RepairBeforeInsertHandler ribt = new RepairBeforeInsertHandler();
            ribt.beforeInsertValue(Trigger.new,Trigger.old);
        }
        System.debug( '-----: 维修合同开始');
        // 本題のロジック
        for ( Repair__c repair : Trigger.New) {
            //add     wangweipeng               2021/12/09          start
            boolean defaultFlag = true;
            //add     wangweipeng               2021/12/09          end
            // 草案中修理だけ更新
            // GZW 特殊处理 跳过维修中心自动赋值,以手选为准 start
            // 判断条件追加   && repair.Exc_work_location__c == false
            if(repair.Exc_work_location__c){
                defaultFlag = false;
            }
            // GZW 特殊处理 跳过维修中心自动赋值,以手选为准 start
        //wangweipeng  20210727   end
            if ((repair.Status__c == '草案中' || String.isBlank(repair.Status__c)) == false) {
                // if (Trigger.isUpdate && repair.SAP_Transfer_time__c == null) {
                if (Trigger.isUpdate && repair.SAP_Transfer_time__c == null && repair.Exc_work_location__c == false) {
                    repair = RepairTrigger.updateWorkLocationSelect(repair, null);
                    defaultFlag = false;
                }
                continue;
            }
            System.debug( '-----:自动带出维修合同');
            // 修理の「故障発生日」が、サービス契約の「契約開始日」〜「契約終了日」に含まれるか?
            List<Maintenance_Contract_Asset__c> middleTableList = effectiveContracts.get(repair.Delivered_Product__c);
        if ((Trigger.isAfter && Trigger.isInsert) || (Trigger.isAfter && Trigger.isUpdate) || (Trigger.isAfter && Trigger.isDelete)) {
            // if(!(System.isFuture()||System.isBatch())){// Add By Lijun 20220303 to avoid mutiple execute
                NFM103Controller.NFM103Trigger(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
                NFM603Controller.NFM603Trigger(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
                RepairTrigger.UpdateAssert(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
            // }
        }
        // ----------------------------------------------------------------------
        // ここより、修理のサービスコントラクト項目を自動的に更新するロジック
        // ----------------------------------------------------------------------
        if ( Trigger.isBefore && (Trigger.isInsert || Trigger.isUpdate)) {
            //先款后修-修理增加先款标识 thh 20220322 start
            RepairTrigger.AdvancePaymentFlagUpsert(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
            //先款后修-修理增加先款标识 thh 20220322 end
            Boolean needsetnull = true;
            System.debug( '-----:自动带出维修合同11111' + middleTableList);
            // if (middleTableList == null) {
            if (middleTableList == null  && repair.Exc_work_location__c == false) {
                if ((repair.NewProductGuarante_Txt__c == '2: 多年保修'
                        || repair.NewProductGuarante_Txt__c == '2: 服务多年保修'
                        || repair.NewProductGuarante_Txt__c == '8: 市场多年保修')
                        && (repair.Sales_Branch__c != repair.Finance_of_Branch__c) && repair.SAP_Transfer_time__c == null) {
                    repair = RepairTrigger.updateWorkLocationSelect(repair, null);
                    defaultFlag = false;
            // 納入機器IDを一意に格納する Setです。
            Set<ID> assetIds = new Set<Id>();
            // 納入機器の一意のIDを得る
            for ( Repair__c repair : Trigger.New) {
                if (String.isBlank(repair.Delivered_Product__c) == false) assetIds.add( repair.Delivered_Product__c);
            }
            // 有効なサービス契約の Mapを得る
            // arg1は納入機器のID, arg2は納入機器のIDのサービス契約一覧
            // 区分虚拟维修合同和正常维修合同
            // 正常维修合同保有设备集合
            Map<Id, List<Maintenance_Contract_Asset__c>> effectiveContracts = new Map<Id, List<Maintenance_Contract_Asset__c>>();
            // 虚拟维修合同保有设备集合
            Map<Id, List<Maintenance_Contract_Asset__c>> effectiveContractsVM = new Map<Id, List<Maintenance_Contract_Asset__c>>();
            List<Maintenance_Contract_Asset__c> contracts = OncallFinalStatusManager.selectMaintenance_Contract_Asset_List(assetIds);
            for (Maintenance_Contract_Asset__c local : contracts) {
                if (local.Maintenance_Contract__r.RecordType.DeveloperName == 'VM_Contract') {
                    List<Maintenance_Contract_Asset__c> middleTableVMList = effectiveContractsVM.get(local.Asset__c);
                    if (middleTableVMList == null) {
                        middleTableVMList = new List<Maintenance_Contract_Asset__c>();
                        effectiveContractsVM.put(local.Asset__c, middleTableVMList);
                    }
                    middleTableVMList.add(local);
                } else {
                    List<Maintenance_Contract_Asset__c> middleTableList = effectiveContracts.get(local.Asset__c);
                    if (middleTableList == null) {
                        middleTableList = new List<Maintenance_Contract_Asset__c>();
                        effectiveContracts.put(local.Asset__c, middleTableList);
                    }
                    middleTableList.add(local);
                }
            }
            if (middleTableList != null) for (Maintenance_Contract_Asset__c middleTable : middleTableList) {
                    if (repair.SERVICE_CONTRACT_JUDEGE_DAY__C != null
                            && repair.SERVICE_CONTRACT_JUDEGE_DAY__C >= middleTable.Maintenance_Contract__r.Contract_Start_Date__c
                            && repair.SERVICE_CONTRACT_JUDEGE_DAY__C <= middleTable.Maintenance_Contract__r.Contract_End_Date__c
                            && middleTable != null
                            && middleTable.Maintenance_Contract__r.Status__c == '契約'
                            && middleTable.Maintenance_Contract__r.Contract_Start_Date__c != null
                            && middleTable.Maintenance_Contract__r.Contract_End_Date__c != null
                       ) {
                        //限次合同产品信息维护相关 FXK 2021/03/05 Start
                        //1.如果记录类型是维修合同 或者 记录类型是服务任务但不是URF限次合同,保持现状
                        //如果最大大修次数大于0,并且已经大修次数 小于 最大大修次数,那么保持现状
                        if (middleTable.Maintenance_Contract__r.RecordType.DeveloperName == 'Maintenance_Contract'
                                || (middleTable.Maintenance_Contract__r.RecordType.DeveloperName == 'NewMaintenance_Contract'
                                    && (middleTable.Maintenance_Contract__r.URF_Contract__c != true
                                        || (middleTable.Maintenance_Contract__r.URF_Contract__c == true
                                            && (middleTable.Series_MaxRepairCount_F__c > 0
                                                && middleTable.Series_RepairCount_F__c < middleTable.Series_MaxRepairCount_F__c))))) {
                            repair.Maintenance_Contract__c = middleTable.Maintenance_Contract__c;
                            // repair.Contract_Principal_Office__c = middleTable.Maintenance_Contract__r.SalesOfficeCode_selection__c;
                            // system.debug('555555:' + middleTable.Maintenance_Contract__r.SalesOfficeCode_selection__c);
                            // system.debug('mmmmmmmm:' + Trigger.isInsert);
                            // system.debug('nnnnnnn:' + Trigger.isUpdate);
                            repair.repairPlace__c = middleTable.Maintenance_Contract__r.SalesOfficeCode_selection__c;
                            //新增逻辑 HWAG-BKP5FB 精琢科技 2020/03/19 Start
                            //wangweipeng   发生数据到SAP以后,修理的维修中心不能做修改
                            // if(repair.SAP_Transfer_time__c == null){
                            if(repair.SAP_Transfer_time__c == null  && repair.Exc_work_location__c == false){
                                repair = RepairTrigger.updateWorkLocationSelect(repair, middleTable);
            System.debug( '-----: 维修合同开始');
            // 本題のロジック
            for ( Repair__c repair : Trigger.New) {
                //add     wangweipeng               2021/12/09          start
                boolean defaultFlag = true;
                //add     wangweipeng               2021/12/09          end
                // 草案中修理だけ更新
                // GZW 特殊处理 跳过维修中心自动赋值,以手选为准 start
                // 判断条件追加   && repair.Exc_work_location__c == false
                if(repair.Exc_work_location__c){
                    defaultFlag = false;
                }
                // GZW 特殊处理 跳过维修中心自动赋值,以手选为准 start
                if ((repair.Status__c == '草案中' || String.isBlank(repair.Status__c)) == false) {
                    // if (Trigger.isUpdate && repair.SAP_Transfer_time__c == null) {
                    if (Trigger.isUpdate && repair.SAP_Transfer_time__c == null && repair.Exc_work_location__c == false) {
                        repair = RepairTrigger.updateWorkLocationSelect(repair, null);
                        defaultFlag = false;
                    }
                    continue;
                }
                System.debug( '-----:自动带出维修合同');
                // 修理の「故障発生日」が、サービス契約の「契約開始日」〜「契約終了日」に含まれるか?
                List<Maintenance_Contract_Asset__c> middleTableList = effectiveContracts.get(repair.Delivered_Product__c);
                Boolean needsetnull = true;
                System.debug( '-----:自动带出维修合同11111' + middleTableList);
                // if (middleTableList == null) {
                if (middleTableList == null  && repair.Exc_work_location__c == false) {
                    if ((repair.NewProductGuarante_Txt__c == '2: 多年保修'
                            || repair.NewProductGuarante_Txt__c == '2: 服务多年保修'
                            || repair.NewProductGuarante_Txt__c == '8: 市场多年保修')
                            && (repair.Sales_Branch__c != repair.Finance_of_Branch__c) && repair.SAP_Transfer_time__c == null) {
                        repair = RepairTrigger.updateWorkLocationSelect(repair, null);
                        defaultFlag = false;
                    }
                }
                if (middleTableList != null) for (Maintenance_Contract_Asset__c middleTable : middleTableList) {
                        if (repair.SERVICE_CONTRACT_JUDEGE_DAY__C != null
                                && repair.SERVICE_CONTRACT_JUDEGE_DAY__C >= middleTable.Maintenance_Contract__r.Contract_Start_Date__c
                                && repair.SERVICE_CONTRACT_JUDEGE_DAY__C <= middleTable.Maintenance_Contract__r.Contract_End_Date__c
                                && middleTable != null
                                && middleTable.Maintenance_Contract__r.Status__c == '契約'
                                && middleTable.Maintenance_Contract__r.Contract_Start_Date__c != null
                                && middleTable.Maintenance_Contract__r.Contract_End_Date__c != null
                        ) {
                            //限次合同产品信息维护相关 FXK 2021/03/05 Start
                            //1.如果记录类型是维修合同 或者 记录类型是服务任务但不是URF限次合同,保持现状
                            //如果最大大修次数大于0,并且已经大修次数 小于 最大大修次数,那么保持现状
                            if (middleTable.Maintenance_Contract__r.RecordType.DeveloperName == 'Maintenance_Contract'
                                    || (middleTable.Maintenance_Contract__r.RecordType.DeveloperName == 'NewMaintenance_Contract'
                                        && (middleTable.Maintenance_Contract__r.URF_Contract__c != true
                                            || (middleTable.Maintenance_Contract__r.URF_Contract__c == true
                                                && (middleTable.Series_MaxRepairCount_F__c > 0
                                                    && middleTable.Series_RepairCount_F__c < middleTable.Series_MaxRepairCount_F__c))))) {
                                repair.Maintenance_Contract__c = middleTable.Maintenance_Contract__c;
                                // repair.Contract_Principal_Office__c = middleTable.Maintenance_Contract__r.SalesOfficeCode_selection__c;
                                // system.debug('555555:' + middleTable.Maintenance_Contract__r.SalesOfficeCode_selection__c);
                                // system.debug('mmmmmmmm:' + Trigger.isInsert);
                                // system.debug('nnnnnnn:' + Trigger.isUpdate);
                                repair.repairPlace__c = middleTable.Maintenance_Contract__r.SalesOfficeCode_selection__c;
                                //新增逻辑 HWAG-BKP5FB 精琢科技 2020/03/19 Start
                                //wangweipeng   发生数据到SAP以后,修理的维修中心不能做修改
                                // if(repair.SAP_Transfer_time__c == null){
                                if(repair.SAP_Transfer_time__c == null  && repair.Exc_work_location__c == false){
                                    repair = RepairTrigger.updateWorkLocationSelect(repair, middleTable);
                                    defaultFlag = false;
                                }
                                // 新增逻辑 HWAG-BKP5FB 精琢科技 2020/03/19 End
                                // HWAG-BJABEY LHJ 2019/12/04 Start
                                repair.MaintenanceContractType__c = middleTable.Maintenance_Contract__r.RecordType.Name;
                                // HWAG-BJABEY LHJ 2019/12/04 End
                            }
                            //2.如果记录类型是服务任务并且是URF限次合同,如果最大大修次数为0或者空,那么直接add Error报错 让联系服务管理部;
                            if (middleTable.Maintenance_Contract__r.RecordType.DeveloperName == 'NewMaintenance_Contract'
                                    && middleTable.Maintenance_Contract__r.URF_Contract__c == true) {
                                if (middleTable.Series_MaxRepairCount_F__c == 0 || middleTable.Series_MaxRepairCount_F__c == null) {
                                    //直接add Error报错 让联系服务管理部
                                    repair.addError('修理设备不是限次设备,请联系服务管理部');
                                }
                                //如果最大大修次数大于0,并且已经大修次数 大于或等于 最大大修次数,那么不仅不赋值维修合同信息,而且清空当前信息
                                if (middleTable.Series_MaxRepairCount_F__c > 0 && middleTable.Series_RepairCount_F__c >= middleTable.Series_MaxRepairCount_F__c) {
                                    //不赋值维修合同信息,而且清空当前信息
                                    repair.Maintenance_Contract__c = null;
                                    repair.MaintenanceContractType__c = null;
                                }
                            }
                            //限次合同产品信息维护相关 FXK 2021/03/05 END
                            needsetnull = false;
                            System.debug( '-----:自动带出维修合同22222');//把保有设备上的维修合同存到修理上
                            break;
                        }
                    }
                //MaintenanceContractType__c:维修合同记录类型
                /*如果不在合同中,则将1.‘修理’中的‘维修合同’和‘修理’中的‘维修合同记录类型’清空*/
                if (needsetnull) {
                    System.debug( '-----:nullにせよ');
                    repair.Maintenance_Contract__c = null;
                    repair.MaintenanceContractType__c = null;
                }
                System.debug( '-----: repair=' + repair);
                System.debug( '-----: repair.Maintenance_Contract__c=' + repair.Maintenance_Contract__c);
                System.debug( '-----: repair.SERVICE_CONTRACT_JUDEGE_DAY__C=' + repair.SERVICE_CONTRACT_JUDEGE_DAY__C);
                // 设备修理时,自动带出虚拟维修合同
                List<Maintenance_Contract_Asset__c> middleTableVMList = effectiveContractsVM.get(repair.Delivered_Product__c);
                // Boolean needsetnull = true;
                System.debug( '-----:自动带出虚拟维修合同');
                System.debug( '-----:自动带出虚拟维修合同' + middleTableVMList);
                // if (middleTableVMList == null) {
                if (middleTableVMList == null  && repair.Exc_work_location__c == false) {
                    if ((repair.NewProductGuarante_Txt__c == '2: 多年保修'
                            || repair.NewProductGuarante_Txt__c == '2: 服务多年保修'
                            || repair.NewProductGuarante_Txt__c == '8: 市场多年保修')
                            && (repair.Sales_Branch__c != repair.Finance_of_Branch__c)) {
                        repair = RepairTrigger.updateWorkLocationSelect(repair, null);
                        defaultFlag = false;
                    }
                }
                if (middleTableVMList != null) for (Maintenance_Contract_Asset__c middleTable : middleTableVMList) {
                        if (repair.SERVICE_CONTRACT_JUDEGE_DAY__C != null
                                && repair.SERVICE_CONTRACT_JUDEGE_DAY__C >= middleTable.startDateGurantee_Text__c
                                && repair.SERVICE_CONTRACT_JUDEGE_DAY__C <= middleTable.endDateGurantee_Text__c
                                && middleTable != null
                                && middleTable.Maintenance_Contract__r.Status__c == '契約'
                                && middleTable.startDateGurantee_Text__c != null
                                && middleTable.endDateGurantee_Text__c != null
                        ) {
                            repair.VM_Maintenance_Contract__c = middleTable.Maintenance_Contract__c;
                            needsetnull = false;
                            //新增逻辑 SLIU-BMMDWK 精琢科技 2020/03/17 Start
                            // if (repair.VM_Maintenance_Contract__c != null) {
                            if (repair.VM_Maintenance_Contract__c != null  && repair.Exc_work_location__c == false) {
                                repair = RepairTrigger.updateWorkLocationSelect(repair, middleTable);
                                defaultFlag = false;
                            }
                            // 新增逻辑 HWAG-BKP5FB 精琢科技 2020/03/19 End
                            // HWAG-BJABEY LHJ 2019/12/04 Start
                            repair.MaintenanceContractType__c = middleTable.Maintenance_Contract__r.RecordType.Name;
                            // HWAG-BJABEY LHJ 2019/12/04 End
                            // 新增逻辑 SLIU-BMMDWK 精琢科技 2020/03/17 End
                            break;
                        }
                        //2.如果记录类型是服务任务并且是URF限次合同,如果最大大修次数为0或者空,那么直接add Error报错 让联系服务管理部;
                        if (middleTable.Maintenance_Contract__r.RecordType.DeveloperName == 'NewMaintenance_Contract'
                                && middleTable.Maintenance_Contract__r.URF_Contract__c == true) {
                            if (middleTable.Series_MaxRepairCount_F__c == 0 || middleTable.Series_MaxRepairCount_F__c == null) {
                                //直接add Error报错 让联系服务管理部
                                repair.addError('修理设备不是限次设备,请联系服务管理部');
                            }
                            //如果最大大修次数大于0,并且已经大修次数 大于或等于 最大大修次数,那么不仅不赋值维修合同信息,而且清空当前信息
                            if (middleTable.Series_MaxRepairCount_F__c > 0 && middleTable.Series_RepairCount_F__c >= middleTable.Series_MaxRepairCount_F__c) {
                                //不赋值维修合同信息,而且清空当前信息
                                repair.Maintenance_Contract__c = null;
                                repair.MaintenanceContractType__c = null;
                            }
                    }
                if (needsetnull) {
                    System.debug( '-----:nullにせよ');
                    repair.VM_Maintenance_Contract__c = null;
                }
                //add     wangweipeng             2021/12/10                start
                if(defaultFlag){
                    //一般修理品的维修中心赋值逻辑
                    //SAP上传修理时间
                    if(repair.SAP_Transfer_time__c == null){
                        if(repair.On_site_repair__c == 'RC修理'||repair.On_site_repair__c== '直送SORC修理'||repair.On_site_repair__c== '直送OGZ修理' ){
                            System.debug('-----------------11------');
                            repair = RepairTrigger.generalUpdateWorkLocationSelect(repair);
                        }
                        //限次合同产品信息维护相关 FXK 2021/03/05 END
                        needsetnull = false;
                        System.debug( '-----:自动带出维修合同22222');//把保有设备上的维修合同存到修理上
                        break;
                    }
                }
            //MaintenanceContractType__c:维修合同记录类型
            /*如果不在合同中,则将1.‘修理’中的‘维修合同’和‘修理’中的‘维修合同记录类型’清空*/
            if (needsetnull) {
                System.debug( '-----:nullにせよ');
                repair.Maintenance_Contract__c = null;
                repair.MaintenanceContractType__c = null;
                //add     wangweipeng             2021/12/10                end
            }
            System.debug( '-----: repair=' + repair);
            System.debug( '-----: repair.Maintenance_Contract__c=' + repair.Maintenance_Contract__c);
            System.debug( '-----: repair.SERVICE_CONTRACT_JUDEGE_DAY__C=' + repair.SERVICE_CONTRACT_JUDEGE_DAY__C);
            // 设备修理时,自动带出虚拟维修合同
            List<Maintenance_Contract_Asset__c> middleTableVMList = effectiveContractsVM.get(repair.Delivered_Product__c);
            // Boolean needsetnull = true;
            System.debug( '-----:自动带出虚拟维修合同');
            System.debug( '-----:自动带出虚拟维修合同' + middleTableVMList);
            // if (middleTableVMList == null) {
            if (middleTableVMList == null  && repair.Exc_work_location__c == false) {
                if ((repair.NewProductGuarante_Txt__c == '2: 多年保修'
                        || repair.NewProductGuarante_Txt__c == '2: 服务多年保修'
                        || repair.NewProductGuarante_Txt__c == '8: 市场多年保修')
                        && (repair.Sales_Branch__c != repair.Finance_of_Branch__c)) {
                    repair = RepairTrigger.updateWorkLocationSelect(repair, null);
                    defaultFlag = false;
                }
            }
            if (middleTableVMList != null) for (Maintenance_Contract_Asset__c middleTable : middleTableVMList) {
                    if (repair.SERVICE_CONTRACT_JUDEGE_DAY__C != null
                            && repair.SERVICE_CONTRACT_JUDEGE_DAY__C >= middleTable.startDateGurantee_Text__c
                            && repair.SERVICE_CONTRACT_JUDEGE_DAY__C <= middleTable.endDateGurantee_Text__c
                            && middleTable != null
                            && middleTable.Maintenance_Contract__r.Status__c == '契約'
                            && middleTable.startDateGurantee_Text__c != null
                            && middleTable.endDateGurantee_Text__c != null
                       ) {
                        repair.VM_Maintenance_Contract__c = middleTable.Maintenance_Contract__c;
                        needsetnull = false;
                        //新增逻辑 SLIU-BMMDWK 精琢科技 2020/03/17 Start
                        // if (repair.VM_Maintenance_Contract__c != null) {
                        if (repair.VM_Maintenance_Contract__c != null  && repair.Exc_work_location__c == false) {
                            repair = RepairTrigger.updateWorkLocationSelect(repair, middleTable);
                            defaultFlag = false;
                        }
                        // 新增逻辑 SLIU-BMMDWK 精琢科技 2020/03/17 End
                        break;
                    }
                }
            if (needsetnull) {
                System.debug( '-----:nullにせよ');
                repair.VM_Maintenance_Contract__c = null;
            }
            System.debug( '-----: 维修合同结束');
            //add     wangweipeng             2021/12/10                start
            if(defaultFlag){
                //一般修理品的维修中心赋值逻辑
                //SAP上传修理时间
                if(repair.SAP_Transfer_time__c == null){
                    if(repair.On_site_repair__c == 'RC修理'||repair.On_site_repair__c== '直送SORC修理'||repair.On_site_repair__c== '直送OGZ修理' ){
                        System.debug('-----------------11------');
                        repair = RepairTrigger.generalUpdateWorkLocationSelect(repair);
                    }
                }
            }
            //add     wangweipeng             2021/12/10                end
        }
        System.debug( '-----: 维修合同结束');
        // 20160727 add 计算修理工作日
        RepairTrigger.setRepairWorkday(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
        //
        if (Trigger.isUpdate) {
            /****************************************************************************************************/
            //迁移进程生成器中repair Alltime功能       Start
            /****************************************************************************************************/
            for (Repair__c a : Trigger.new) {
                String StatusStr = '';
                if (a.Delete_Flag__c == true) {
                    StatusStr = '0.删除';
                } else if (a.RepairOrderStatusCode__c == 'A99' && a.IncorrectDataComment__c != null) {
                    StatusStr = '0.删除';
                } else if ((a.RepairOrderStatusCode__c == 'A95' || a.RepairOrderStatusCode__c == 'A96')
                           && a.Return_Without_Repair_IF__c == true) {
                    StatusStr = '0.取消';
                } else if (a.Finish_Check__c == 1) {
                    StatusStr = '5.完毕';
                } else if (a.Facility_Return_Receipt_Collection_Date__c != null
                           || a.Repair_Returned_To_HP_Date__c != null
                           || a.Repair_Shipped_Date__c  != null) {
                    StatusStr = '4.修理品返送阶段';
                } else if (a.Repair_Final_Inspection_Date__c != null
                           || a.Repair_Completed_Date__c != null
                           || a.Repair_Start_Date__c != null) {
                    StatusStr = '3.维修阶段';
                } else if (a.Agreed_Date__c != null
                           || a.Repair_Discount_Date__c  != null
                           || a.Repair_Estimated_Date__c  != null
                           || a.Repair_Inspection_Date__c  != null) {
                    StatusStr = '2.维修报价阶段';
                } else {
                    StatusStr = a.Status__c;
                }
                a.Status__c = a.Status1__c;
                // DOJ2.1 gzw AwareDate公式考文本 start
                if (a.AwareDate__c != a.Aware_date__c &&
                    (a.Aware_date__c >= Date.newInstance(2021, 9, 1) ||
                    a.AwareDate__c >= Date.newInstance(2021, 9, 1) )) {
                    a.Aware_date__c = a.AwareDate__c;
                }
                // DOJ2.1 gzw AwareDate公式考文本 end
            // 20160727 add 计算修理工作日
            RepairTrigger.setRepairWorkday(Trigger.new, Trigger.newMap, Trigger.old, Trigger.oldMap);
            //
            if (Trigger.isUpdate) {
                /****************************************************************************************************/
                //迁移进程生成器中repair Alltime功能       End
                //迁移进程生成器中repair Alltime功能       Start
                /****************************************************************************************************/
                for (Repair__c a : Trigger.new) {
                    String StatusStr = '';
                    if (a.Delete_Flag__c == true) {
                        StatusStr = '0.删除';
                    } else if (a.RepairOrderStatusCode__c == 'A99' && a.IncorrectDataComment__c != null) {
                        StatusStr = '0.删除';
                    } else if ((a.RepairOrderStatusCode__c == 'A95' || a.RepairOrderStatusCode__c == 'A96')
                            && a.Return_Without_Repair_IF__c == true) {
                        StatusStr = '0.取消';
                    } else if (a.Finish_Check__c == 1) {
                        StatusStr = '5.完毕';
                    } else if (a.Facility_Return_Receipt_Collection_Date__c != null
                            || a.Repair_Returned_To_HP_Date__c != null
                            || a.Repair_Shipped_Date__c  != null) {
                        StatusStr = '4.修理品返送阶段';
                    } else if (a.Repair_Final_Inspection_Date__c != null
                            || a.Repair_Completed_Date__c != null
                            || a.Repair_Start_Date__c != null) {
                        StatusStr = '3.维修阶段';
                    } else if (a.Agreed_Date__c != null
                            || a.Repair_Discount_Date__c  != null
                            || a.Repair_Estimated_Date__c  != null
                            || a.Repair_Inspection_Date__c  != null) {
                        StatusStr = '2.维修报价阶段';
                    } else {
                        StatusStr = a.Status__c;
                    }
                    a.Status__c = a.Status1__c;
                    // DOJ2.1 gzw AwareDate公式考文本 start
                    if (a.AwareDate__c != a.Aware_date__c &&
                        (a.Aware_date__c >= Date.newInstance(2021, 9, 1) ||
                        a.AwareDate__c >= Date.newInstance(2021, 9, 1) )) {
                        a.Aware_date__c = a.AwareDate__c;
                    }
                    // DOJ2.1 gzw AwareDate公式考文本 end
                    /****************************************************************************************************/
                    //迁移进程生成器中repair Alltime功能       End
                    /****************************************************************************************************/
                }
            }
        }
    }
    // ----------------------------------------------------------------------
    // ここまで、サービスコントラクト項目を自動的に更新するロジック
    // ----------------------------------------------------------------------
        // ----------------------------------------------------------------------
        // ここまで、サービスコントラクト項目を自動的に更新するロジック
        // ----------------------------------------------------------------------
        // ----------------------------------------------------------------------
        // これより、On-Callの「On-Call跟进结果」を更新するロジック
        // ----------------------------------------------------------------------
    // ----------------------------------------------------------------------
    // これより、On-Callの「On-Call跟进结果」を更新するロジック
    // ----------------------------------------------------------------------
        if ( ( Trigger.isBefore && ( Trigger.isInsert || Trigger.isUpdate)) || ( Trigger.isAfter && Trigger.isDelete)) {
    if ( ( Trigger.isBefore && ( Trigger.isInsert || Trigger.isUpdate)) || ( Trigger.isAfter && Trigger.isDelete)) {
            // 処理対象となる修理を全部確保
            List<Repair__c> repairs = ( Trigger.isBefore ? Trigger.New : new List<Repair__c>());
            Set<Id> cncallIds = new Set<Id>();
            for ( Repair__c repair : ( Trigger.isBefore ? Trigger.New : Trigger.Old)) {
                if (String.isBlank(repair.On_Call_ID__c) == false) {
                    cncallIds.add( repair.On_Call_ID__c);
                }
            }
        // 処理対象となる修理を全部確保
        List<Repair__c> repairs = ( Trigger.isBefore ? Trigger.New : new List<Repair__c>());
        Set<Id> cncallIds = new Set<Id>();
        for ( Repair__c repair : ( Trigger.isBefore ? Trigger.New : Trigger.Old)) {
            if (String.isBlank(repair.On_Call_ID__c) == false) {
                cncallIds.add( repair.On_Call_ID__c);
            // 処理対象となるオンコールを全部確保
            // 20210622 SQL优化 Start
            // List<On_Call__c> oncalls = OncallFinalStatusManager.getOncallList(cncallIds);
            List<On_Call__c> oncalls = new List<On_Call__c>();
            if (cncallIds.size() > 0 ) {
                oncalls = OncallFinalStatusManager.getOncallList(cncallIds);
            }
            // 20210622 SQL优化 End
            if (oncalls.size() > 0) {
                // 処理対象となるQISを全部確保
                List<QIS_Report__c> qiss = OncallFinalStatusManager.getQisListFronOncalls(oncalls);
                // FinalStatus更新処理
                OncallFinalStatusManager.setFinalStatus( oncalls, repairs, qiss);
                OncallFinalStatusManager.updOncalls(oncalls);
            }
        }
        // 処理対象となるオンコールを全部確保
        // ----------------------------------------------------------------------
        // ここまで、On-Callの「On-Call跟进结果」を更新するロジック
        // ----------------------------------------------------------------------
        // 20210622 SQL优化 Start
        // List<On_Call__c> oncalls = OncallFinalStatusManager.getOncallList(cncallIds);
        List<On_Call__c> oncalls = new List<On_Call__c>();
        if (cncallIds.size() > 0 ) {
            oncalls = OncallFinalStatusManager.getOncallList(cncallIds);
        }
        // 20210622 SQL优化 End
        if (oncalls.size() > 0) {
            // 処理対象となるQISを全部確保
            List<QIS_Report__c> qiss = OncallFinalStatusManager.getQisListFronOncalls(oncalls);
            // FinalStatus更新処理
            OncallFinalStatusManager.setFinalStatus( oncalls, repairs, qiss);
            OncallFinalStatusManager.updOncalls(oncalls);
        }
    }
    // ----------------------------------------------------------------------
    // ここまで、On-Callの「On-Call跟进结果」を更新するロジック
    // ----------------------------------------------------------------------
    // ----------------------------------------------------------------------
    // これより、备品借出申请の「修理最终检测日」を更新するロジック(更新后触发WorkFlow)
    // ----------------------------------------------------------------------
    if (Trigger.isAfter && Trigger.isUpdate) {
        Map<String, Date> repairDateMap = new Map<String, Date>();
        List<String> targetRepairList = new List<String>();
        for (Repair__c repair : Trigger.New) {
            Repair__c oldRepair = Trigger.OldMap.get(repair.Id);
            if (oldRepair.Repair_Final_Inspection_Date__c != repair.Repair_Final_Inspection_Date__c) {
                repairDateMap.put(repair.Id, repair.Repair_Final_Inspection_Date__c);
                targetRepairList.add(repair.Id);
        // ----------------------------------------------------------------------
        // これより、备品借出申请の「修理最终检测日」を更新するロジック(更新后触发WorkFlow)
        // ----------------------------------------------------------------------
        if (Trigger.isAfter && Trigger.isUpdate) {
            Map<String, Date> repairDateMap = new Map<String, Date>();
            List<String> targetRepairList = new List<String>();
            for (Repair__c repair : Trigger.New) {
                Repair__c oldRepair = Trigger.OldMap.get(repair.Id);
                if (oldRepair.Repair_Final_Inspection_Date__c != repair.Repair_Final_Inspection_Date__c) {
                    repairDateMap.put(repair.Id, repair.Repair_Final_Inspection_Date__c);
                    targetRepairList.add(repair.Id);
                }
            }
            // 20210622 SQL优化 Start
            //List<Rental_Apply__c> raList = [select Id, Repair__c from Rental_Apply__c where Repair__c = :targetRepairList];
            List<Rental_Apply__c> raList = new List<Rental_Apply__c>();
            if (targetRepairList.size() > 0) {
                raList = [select Id, Repair__c from Rental_Apply__c where Repair__c = :targetRepairList];
            }
            // 20210622 SQL优化 End
            for (Rental_Apply__c ra : raList) {
                ra.Repair_Final_Inspection_Date__c = repairDateMap.get(ra.Repair__c);
            }
            if (raList.size() > 0) {
                update raList;
            }
        }
        // 20210622 SQL优化 Start
        //List<Rental_Apply__c> raList = [select Id, Repair__c from Rental_Apply__c where Repair__c = :targetRepairList];
        List<Rental_Apply__c> raList = new List<Rental_Apply__c>();
        if (targetRepairList.size() > 0) {
            raList = [select Id, Repair__c from Rental_Apply__c where Repair__c = :targetRepairList];
        }
        // 20210622 SQL优化 End
        for (Rental_Apply__c ra : raList) {
            ra.Repair_Final_Inspection_Date__c = repairDateMap.get(ra.Repair__c);
        }
        if (raList.size() > 0) {
            update raList;
        }
    }
    // ----------------------------------------------------------------------
    // ここまで、备品借出申请の「修理最终检测日」を更新するロジック
    // ----------------------------------------------------------------------
        // ----------------------------------------------------------------------
        // ここまで、备品借出申请の「修理最终检测日」を更新するロジック
        // ----------------------------------------------------------------------
    System.debug( '-----: trigger end');
        System.debug( '-----: trigger end');
    }
    public 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++;
        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++;
        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++;
        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++;
        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++;
        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++;
    }
}