| 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); | 
|         } | 
|   | 
|         // 有効なサービス契約の 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); | 
|             } | 
|         } | 
|         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; | 
|                         } | 
|                         // 新增逻辑 SLIU-BMMDWK 精琢科技 2020/03/17 End | 
|                         break; | 
|                     } | 
|                 } | 
|             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); | 
|                     } | 
|                 } | 
|             } | 
|             //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 | 
|   | 
|                 /****************************************************************************************************/ | 
|                 //迁移进程生成器中repair Alltime功能       End | 
|                 /****************************************************************************************************/ | 
|             } | 
|         } | 
|     } | 
|     // ---------------------------------------------------------------------- | 
|     // ここまで、サービスコントラクト項目を自動的に更新するロジック | 
|     // ---------------------------------------------------------------------- | 
|   | 
|   | 
|   | 
|     // ---------------------------------------------------------------------- | 
|     // これより、On-Callの「On-Call跟进结果」を更新するロジック | 
|     // ---------------------------------------------------------------------- | 
|   | 
|     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); | 
|             } | 
|         } | 
|   | 
|         // 処理対象となるオンコールを全部確保 | 
|   | 
|         // 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); | 
|             } | 
|         } | 
|         // 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'); | 
| } |