| /** | 
|  * Opportunity作成後(コピー)、triggerにて集計項目をnullにする | 
|  * 商談の「外貿/内貿」と「通貨」の値が一致させるトリガーです。 | 
|  * 商談の所有者【システム】に所有者のIdを入れる | 
|  */ | 
| trigger OpportunityBefUpd on Opportunity (before insert, before update) { | 
|     List<String> idlist = new List<String>(); | 
|     if(Trigger.isInsert){ | 
|         //询价担当人和战略科室担当人不一致,在这里同步 20170512 XFUU-ALB9JK | 
|         if(Trigger.isBefore){ | 
|             for(Opportunity ops : Trigger.new){ | 
|                 if (ops.ownerid != ops.Custmor_pic_ID__c && | 
|                     ops.owner_not_automatically_update__c == false && | 
|                     ops.Custmor_pic_ID__c != null && | 
|                     ops.AccountType__c != system.label.Account_Type_Name_Agency && | 
|                     ops.Custmor_pic_IsActive__c == true){ | 
|                     System.debug('Anydatatype_msg' + ops.Custmor_pic_ID__c); | 
|                     ops.ownerid = ops.Custmor_pic_ID__c; | 
|                 } | 
|                 //if(ops.State_Owner__c == '能量') ops.STMS_Package_Sale__c = true; | 
|             } | 
|         } | 
|         if(Trigger.isAfter){ | 
|             /*List<Opportunity> opList = Trigger.new.clone(); | 
|             if(opList.size()==1){ | 
|                 for(Opportunity op : opList ){ | 
|                     if(op.Old_Opportunity_ID__c !=null){ | 
|                         String ResultStr = ControllerUtil.CopyQuoteFromOppor(op.Old_Opportunity_ID__c,op.Opportunity_No__c,op.Id,op); | 
|                         System.debug('2333333333'+ResultStr); | 
|                     } | 
|                 } | 
|             }*/ | 
|         } | 
|     }else if(Trigger.isUpdate){ | 
|     //询价担当人和战略科室担当人不一致,在这里同步 20170512 XFUU-ALB9JK | 
|     ////ops.AccountType__c != system.label.Account_Type_Name && | 
|     if(Trigger.isBefore){ | 
|         // List<String> opIds = new List<String>(); | 
|   | 
|         // List<String> acs = new List<String>(); | 
|         for(Opportunity ops : Trigger.new){ | 
|             if (ops.ownerid != ops.Custmor_pic_ID__c && | 
|                 ops.owner_not_automatically_update__c == false && | 
|                 ops.Custmor_pic_ID__c != null && | 
|                 ops.AccountType__c != system.label.Account_Type_Name_Agency && | 
|                 ops.Custmor_pic_IsActive__c == true){ | 
|                 System.debug('Anydatatype_msg' + ops.Custmor_pic_ID__c); | 
|                 ops.ownerid = ops.Custmor_pic_ID__c; | 
|             } | 
|             //if(ops.State_Owner__c == '能量') ops.STMS_Package_Sale__c = true; | 
|             // opIds.add(ops.Id); | 
|             // acs.add(ops.) | 
|         } | 
|         // System.debug('====================='+opIds); | 
|         // //在询价触发器里改这个验证,排除备品状态是取消的,只要是有备品,就不允许更改最终用户。 | 
|   | 
|         // //1.从询价中把Id拿出来 | 
|   | 
|         // //2.从询价Id中查询备品状态不为取消(状态不为取消且询价中有备品的话,就报错) | 
|         // List<Rental_Apply__c> raList = [Select Id,Follow_UP_Opp__c From Rental_Apply__c Where Status__c != '取消' and Follow_UP_Opp__c IN :opIds]; | 
|         // System.debug('--------------aaaaaaaaaaaaaaaaaaaaaa'+raList); | 
|         // //3.将其(每个询价对应的备品)放入map中 | 
|         // Map<String,List<Rental_Apply__c>> raMap = new Map<String,List<Rental_Apply__c>>(); | 
|         // for (Rental_Apply__c ra : raList) { | 
|         //     if(raMap.get(ra.Follow_UP_Opp__c) != null){ | 
|         //         raMap.get(ra.Follow_UP_Opp__c).add(ra); | 
|         //         System.debug('---------'+raMap.get(ra.Follow_UP_Opp__c)); | 
|         //     }else{ | 
|         //         List<Rental_Apply__c> raChildList = new  List<Rental_Apply__c>(); | 
|         //         raChildList.add(ra); | 
|         //         raMap.put(ra.Follow_UP_Opp__c,raChildList); | 
|         //         System.debug(raMap); | 
|         //     } | 
|         // } | 
|         // //4.通过for循环用Id进行对比,如果备品状态不为取消,则报错 | 
|         // for (String opId : opIds) { | 
|         //     if(raMap.get(opId).size()>0){ | 
|         //         // ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severity.ERROR,'Error: Invalid Input.'); | 
|         //         // ApexPages.addMessage(myMsg); | 
|         //         Account.addError('由于该询价关联有备品,更改客户名会产生影响'); | 
|         //     }    | 
|         // } | 
|     } | 
|     //如果询价编码变动,则报价编码一起变动 | 
|         if(Trigger.isAfter){ | 
|             /*List<id> updateQuoteOppoid = new List<id>(); | 
|             List<String> updateSodOppoid = new List<String>(); | 
|             for(Opportunity ops : Trigger.new){ | 
|                 Opportunity oldOne = Trigger.oldMap.get(ops.id); | 
|                 Opportunity newOne = Trigger.newMap.get(ops.id); | 
|                 if(oldOne.Opportunity_No__c != newOne.Opportunity_No__c){ | 
|                     updateQuoteOppoid.add(ops.id); | 
|                 } | 
|             } | 
|             if(updateQuoteOppoid.size()>0){ | 
|                 ControllerUtil.ResetQuoteNo(updateQuoteOppoid); | 
|             } | 
|             //如果特定字段发生变化,触发以下事件(仅限单一事件) | 
|             for(Opportunity ops : Trigger.new){ | 
|                 Opportunity oldOne = Trigger.oldMap.get(ops.id); | 
|                 Opportunity newOne = Trigger.newMap.get(ops.id); | 
|                 if( (oldOne.S_Install_Date__c != newOne.S_Install_Date__c && oldOne.S_Install_Date__c == null)|| | 
|                         (oldOne.SI_FinishedPorj_Date__c != newOne.SI_FinishedPorj_Date__c && oldOne.SI_FinishedPorj_Date__c == null | 
|                     )){ | 
|                     updateSodOppoid.add(ops.id); | 
|                 } | 
|             } | 
|             if(updateSodOppoid.size()>0){ | 
|                 ISO_DemandOperAndDemonsController.synchronousSodWithOppor(updateSodOppoid); | 
|             }*/ | 
|         } | 
|     } | 
|   | 
|     //付晓坤 2021-1-13 在询价触发器里改这个验证,排除备品状态是取消的,只要是有备品,就不允许更改最终用户  Start | 
|     if(Trigger.isBefore&&Trigger.isUpdate){ | 
|         //1.从询价中把Id拿出来 | 
|         List<String> opIds = new List<String>(); | 
|         List<Rental_Apply__c> raList = new List<Rental_Apply__c>(); | 
|         for(Opportunity ops : Trigger.new){ | 
|             //客户名改变以后才执行下面的操作 | 
|             if(Trigger.oldMap.get(ops.Id).AccountId != ops.AccountId && ops.RecordTypeId != '01210000000QekP' && ops.StageName!= '目標'){ | 
|                 opIds.add(ops.Id); | 
|             } | 
|         } | 
|         if(opIds.size()>0){ | 
|             //对于系统管理员,只存在取消和完了的备品,允许更改。 | 
|             if(UserInfo.getProfileId() != System.Label.ProfileId_SystemAdmin && UserInfo.getProfileId() != System.Label.ProfileId_SystemAdminGPI){ | 
|         //2.从询价Id中查询备品状态不为取消(状态不为取消且询价中有s备品的话,就报错)     | 
|                 raList = [Select Id,Follow_UP_Opp__c From Rental_Apply__c Where RA_Status_Text__c != '取消' and Follow_UP_Opp__c IN :opIds]; | 
|             }else{ | 
|         //2.从询价Id中查询备品状态不为取消(状态不为取消且询价中有s备品的话,就报错)     | 
|                 //20220307 lt update and RA_Status_Text__c != '草案中'  SWAG-CBXCYR 【委托】医院合并数据转移问题 | 
|                 raList = [Select Id,Follow_UP_Opp__c From Rental_Apply__c Where RA_Status_Text__c != '取消' and RA_Status_Text__c != '完了' and RA_Status_Text__c != '草案中' and Follow_UP_Opp__c IN :opIds];    | 
|             } | 
|             //3.将其(每个询价对应的备品)放入map中 | 
|             Map<String,Rental_Apply__c> raMap = new Map<String,Rental_Apply__c>(); | 
|             for (Rental_Apply__c ra : raList) { | 
|                 raMap.put(ra.Follow_UP_Opp__c,ra); | 
|             } | 
|         //判断询价中是否有备品,老的客户不等于新的客户    | 
|             for(Opportunity opps : Trigger.new){ | 
|             //4.通过for循环用Id进行对比,如果备品状态不为取消,则报错 | 
|                 if(raMap.containsKey(opps.Id)){ | 
|                     opps.AccountId.addError('询价:'+opps.Opportunity_No__c+'有关联备品申请,如果修改客户将影响备品回库'); | 
|                 } | 
|             } | 
|         }  | 
|     } | 
|     //付晓坤 2021-1-13 在询价触发器里改这个验证,排除备品状态是取消的,只要是有备品,就不允许更改最终用户  End | 
|      | 
|     //q.Quote_No__c = opp.Opportunity_No__c + '-' + oppNo; | 
|     system.debug('服务器侦错:other'); | 
|     if (StaticParameter.EscapeOpportunityBefUpdTrigger) { | 
| System.debug('Escape、EscapeOpportunityBefUpdTrigger:::::' + StaticParameter.EscapeOpportunityBefUpdTrigger); | 
|         return; | 
|     } | 
|      | 
|     Opportunity newTarget = null; | 
|     List<Id> quoteIds = new List<Id>(); | 
|      | 
|      //市(文本)値設定のため、データを検索 | 
|     List<String> oppIds = new List<String>(); | 
|      | 
|     List<String> hosIds = new List<String>(); | 
|     List<String> ownerIds = new List<String>(); | 
|     for(Opportunity opp : Trigger.new){ | 
|         hosIds.add(opp.Hospital__c); | 
|         ownerIds.add(opp.OwnerId); | 
|     } | 
|     //List<Account> hospitallist = [select id,Name,State_Master__r.Sales_assistant__r.Id,State_Master__r.Energy_Assistant__r.Id from Account where id in :hosIds]; | 
|     //List<Account> hospitallist = [select id, Name, OCM_Management_Province__r.GI_assistant__c, OCM_Management_Province__r.SP_assistant__c, OCM_Management_Province__r.Energy_assistant__c from Account where id in :hosIds]; | 
|     //Map<String,Account> hospitalMap = new Map<String,Account>(); | 
|      | 
|     //for(Account acc : hospitallist){ | 
|     //  hospitalMap.put(acc.id, acc); | 
|     //} | 
|      | 
|     // 20210623 SQL优化 Start | 
|     // List<OCM_Management_Province__c> mpList = [select id, Name, GI_assistant__c, SP_assistant__c, Energy_assistant__c from OCM_Management_Province__c]; | 
|     // Map<String, OCM_Management_Province__c> mpMap = new Map<String, OCM_Management_Province__c>(); | 
|     // for (OCM_Management_Province__c mp : mpList) { | 
|     //     mpMap.put(mp.Name, mp); | 
|     // } | 
|     Map<String, OCM_Management_Province__c> mpMap = new Map<String, OCM_Management_Province__c>(); | 
|     List<OCM_Management_Province__c> mpList = new List<OCM_Management_Province__c>(); | 
|     if (trigger.isBefore && (trigger.isInsert || trigger.isUpdate)) { | 
|         mpList = [select id, Name, GI_assistant__c, SP_assistant__c, Energy_assistant__c from OCM_Management_Province__c]; | 
|     } | 
|     for (OCM_Management_Province__c mp : mpList) { | 
|         mpMap.put(mp.Name, mp); | 
|     } | 
|     // 20210623 SQL优化 End | 
|      | 
|     // 20210623 SQL优化 Start | 
|     // Map<String, String> ownerUserMap = new Map<String, String>(); | 
|     // List<User> owerUser = [select id,Dept__c from User where id in :ownerIds]; | 
|     // for (User u : owerUser) { | 
|     //     ownerUserMap.put(u.id, u.Dept__c); | 
|     // } | 
|     // 20210623 SQL优化 End | 
|   | 
|     for (Opportunity opp : Trigger.new) { | 
|         if (Trigger.isInsert && Trigger.isBefore) { | 
|             // Opportunity作成後(コピー)、triggerにて集計項目をnullにする | 
|             opp.Num_Of_NTC__c = null; | 
|             opp.Num_Of_OPD__c = null; | 
|             opp.Visit_President_Count__c = null; | 
|             opp.Visit_Head_Doctor_Count__c = null; | 
|             opp.Xin_Gross_Follow_Num__c = null; | 
|         } | 
|         if (!String.isBlank(opp.Id)) { | 
|             oppIds.add(opp.Id); | 
|         } | 
|         // OLY_OCM-185_149P 询价管理改善方案 询价提醒人自动设置 | 
|         if (trigger.isBefore && (trigger.isInsert || trigger.isUpdate)) { | 
|             Opportunity old = trigger.oldMap == null ? null : trigger.oldMap.get(opp.Id); | 
|             //add by rentx 20210713 start 设置招投标阶段状态 | 
|             if (Trigger.isInsert || (old != null && old.Bidding_Project_Name_Bid__c == null && opp.Bidding_Project_Name_Bid__c != null)) { | 
|                 opp.InfoTypeBid_text__c = opp.InfoTypeBid__c; | 
|             } | 
|             //add by rentx 20210713 end 设置招投标阶段状态 | 
|             Opp.ShippingDate_For_Report__c = opp.Shipping_Date_For_Report__c; //日期(业绩统计用) | 
|             //Account hospital = HospitalMap.get(opp.Hospital__c); | 
|             OCM_Management_Province__c mp = mpMap.get(opp.OCM_man_province_no_eng__c); | 
|             opp.Manager_name_text__c = opp.Sales_manager_departmentID__c; // 询价所有人的经理(文本) | 
|             if (trigger.isInsert || opp.Last_alert_to_user_update__c != old.Last_alert_to_user_update__c | 
|                 || opp.OwnerId != old.OwnerId | 
|                 || String.isBlank(opp.Sales_assistant_name_text__c) | 
|                 ) { | 
| /*              if(hospital != null){ | 
|                     if(owerUser.size() > 0 && ownerUserMap.get(opp.OwnerId) == '能量事业本部') { | 
|                         //User u = owerUser.get(0); | 
|                         //if(u.Dept__c=='能量事业本部') { | 
|                             //opp.Sales_assistant_name_text__c = hospital.State_Master__r.Energy_Assistant__r.Id; // 询价助理(文本) | 
|                             opp.Sales_assistant_name_text__c = hospital.OCM_Management_Province__r.Energy_assistant__c; | 
|                         //} else { | 
|                         //    opp.Sales_assistant_name_text__c = hospital.State_Master__r.Sales_assistant__r.Id; // 询价助理(文本) | 
|                         //} | 
|                     } else { | 
|                         //opp.Sales_assistant_name_text__c = hospital.State_Master__r.Sales_assistant__r.Id; // 询价助理(文本) | 
|                         if (opp.Opportunity_Category__c == 'GI' || opp.Opportunity_Category__c == 'BF' || opp.Opportunity_Category__c == 'ET') { | 
|                             opp.Sales_assistant_name_text__c = hospital.OCM_Management_Province__r.GI_assistant__c; | 
|                         } else { | 
|                             opp.Sales_assistant_name_text__c = hospital.OCM_Management_Province__r.SP_assistant__c; | 
|                         } | 
|                     } | 
|                 }*/ | 
|                 if (mp != null) { | 
|                     if (opp.OCM_man_province__c == '能量') { | 
|                         opp.Sales_assistant_name_text__c = mp.Energy_assistant__c; | 
|                     } else { | 
|                         if (opp.Opportunity_Category__c == 'GI' || opp.Opportunity_Category__c == 'BF' || opp.Opportunity_Category__c == 'ET') { | 
|                             opp.Sales_assistant_name_text__c = mp.GI_assistant__c; | 
|                         } else { | 
|                             opp.Sales_assistant_name_text__c = mp.SP_assistant__c; | 
|                         } | 
|                     } | 
|                 } | 
|                 if (opp.Owner_Salesdepartment__c == '1.华北') { | 
|                     opp.Sales_window_text__c = System.label.Sales_Window_HB; // 销售部窗口(文本) | 
|                 } else if (opp.Owner_Salesdepartment__c == '2.东北') { | 
|                     opp.Sales_window_text__c = System.label.Sales_Window_DB; | 
|                 } else if (opp.Owner_Salesdepartment__c == '3.西北') { | 
|                     opp.Sales_window_text__c = System.label.Sales_Window_XB; | 
|                 } else if (opp.Owner_Salesdepartment__c == '5.华东') { | 
|                     opp.Sales_window_text__c = System.label.Sales_Window_HD; | 
|                 } else if (opp.Owner_Salesdepartment__c == '6.华南') { | 
|                     opp.Sales_window_text__c = System.label.Sales_Window_HN; | 
|                 } else if (opp.Owner_Salesdepartment__c == '4.西南') { | 
|                     opp.Sales_window_text__c = System.label.Sales_Window_XN; | 
|                 } else { | 
|                     opp.Sales_window_text__c = null; | 
|                 } | 
|             } | 
|   | 
|             if ((Trigger.isInsert || Trigger.oldMap.get(opp.Id).get('SAP_Send_OK__c') == false) && opp.SAP_Send_OK__c == true) { | 
|                 opp.Sales_assistantWIN_ID__c = UserInfo.getUserId(); | 
|                 opp.Sales_assistantWIN_Mail__c = UserInfo.getUserEmail(); | 
|             } | 
|         } | 
|     } | 
|     List<Opportunity> accOpps = ControllerUtil.oppSelectForCity(oppIds); | 
|     Map<String, String> oppRtMaps = new Map<String, String>(); | 
|     Map<String, String> oppCmMaps = new Map<String, String>(); | 
|     for (Opportunity opp : accOpps) { | 
|         // 病院 | 
|         if (opp.Account.Parent.Parent.RecordTypeId == '01210000000QemGAAS') { | 
|             oppRtMaps.put(opp.Id, opp.Account.Parent.Parent.RecordTypeId); | 
|             oppCmMaps.put(opp.Id, opp.Account.Parent.Parent.City_Master__r.Name); | 
|         } | 
|         // 販売店 | 
|         else if (opp.Account.Parent.RecordTypeId == '01210000000Qem1AAC') { | 
|             oppRtMaps.put(opp.Id, opp.Account.Parent.RecordTypeId); | 
|             oppCmMaps.put(opp.Id, opp.Account.City_Master__r.Name); | 
|         } | 
|     } | 
|      | 
|     for ( Integer i = 0; i < Trigger.New.size(); i++) { | 
|         newTarget = Trigger.New[i]; | 
|         // 古いデータの更新をスルー | 
|         if (Trigger.isUpdate) { | 
|             Boolean noChange = false; | 
|             for (String colApiName : ControllerUtil.oppColumnList) { | 
|                 colApiName = colApiName.trim(); | 
|                 if (newTarget.oldData_flg__c &&  | 
|                         Trigger.oldMap.get(newTarget.Id).get(colApiName) != Trigger.newMap.get(newTarget.Id).get(colApiName)) { | 
|                     noChange = true; | 
|                     break; | 
|                 } | 
|             } | 
|             if (noChange) { | 
|                 newTarget.addError('不能修改旧数据'); | 
|                 continue; | 
|             } | 
|         } | 
|          | 
|         if ( newTarget.DetailNum__c == 0) { | 
|             newTarget.CurrencyIsoCode = newTarget.Trade__c == '外貿' ? 'USD' : 'CNY'; | 
|         } | 
|         else { | 
|             newTarget.Trade__c = newTarget.CurrencyIsoCode == 'CNY' ? '内貿' : '外貿'; | 
|         } | 
|          | 
|         newTarget.Owner_System__c = newTarget.OwnerId; | 
|          | 
|         // 市(文本)の値を設定 | 
|         // WFにて二回実行、二回目はIDがある | 
|         if (!String.isBlank(newTarget.Id) && oppRtMaps.containsKey(newTarget.Id) | 
|                 && (oppRtMaps.get(newTarget.Id) == '01210000000QemGAAS' || oppRtMaps.get(newTarget.Id) == '01210000000Qem1AAC')) { | 
|             newTarget.City_Text__c = oppCmMaps.get(newTarget.Id); | 
|         } | 
|          | 
|         if (Trigger.isUpdate | 
|                 && Trigger.oldMap.get(newTarget.Id).get('Estimation_Decision__c') != newTarget.Estimation_Decision__c | 
|                 && newTarget.Estimation_Decision__c == false) { | 
|             // Estimation_Id__c より、 | 
|             if (newTarget.Estimation_Id__c != null && newTarget.Estimation_Id__c.length() > 0 && !newTarget.Estimation_Id__c.startsWith('a2K')) { | 
|                 quoteIds.add(newTarget.Estimation_Id__c); | 
|                 newTarget.Estimation_Id__c = ''; | 
|             } | 
|         } | 
|     } | 
|      | 
|     if (quoteIds.size() > 0) { | 
|         List<Quote> cancelQuoteList = [Select Id, Name, Cancel_Decide__c From Quote Where Id IN :quoteIds]; | 
|         for (Quote quo : cancelQuoteList) { | 
|             quo.Cancel_Decide__c = true; | 
|             quo.Name = '已取消:' + quo.Name; | 
|             // 【委托】SH-ET-SH0584979 无法打印报价 精琢技术 wql 2020/12/22 start | 
|             quo.Contract__c = false; | 
|             // 【委托】SH-ET-SH0584979 无法打印报价 精琢技术 wql 2020/12/22 end | 
|         } | 
|         update cancelQuoteList; | 
|     } | 
|      | 
| } |