public with sharing class LexOPDSupplementaryController {

    public LexOPDSupplementaryController(){
        integer i = 1;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
    }

    @AuraEnabled
    public static OPDPlan__c init(String recordId){
        try{
            OPDPlan__c res = [SELECT id,OPDPlan_ImplementDate__c,Status__c,
            OriginalOpdPlanRental__c,Rental_Apply2__c,Account_Laboratory__c,Related_Opportunity1_ID__c,
            PlanProdDetail__c,Cnt_OPD_LastYear__c,Cnt_OPD_ThisYear__c,Cnt_Rentals__c,
            lastMonth_Plan__c,SalesManager__c,OPDType__c,OriginalOpdPlanApplication__c,
            BuchangApprovalManagerSales__c,SalesManager_Txt__c,
            Name,supplementaryApplication__c ,OPD_DelayCancel_Last__c , EndDateTime__c ,StartDateTime__c
                FROM OPDPlan__c
                    Where Id = : recordId];
            return res;
        }
        catch(Exception e){
            System.debug(LoggingLevel.INFO, '*** e: ' + e);
        }
        return null;
    }

    //获取当前登录人的 id 备品智能化add sx start
    @AuraEnabled
    public static UserResult UserInfo_Owner() {
        UserResult result = new UserResult();
        ID myUserID = UserInfo.getUserId();
        try {
            User tempUser =
                [select Id,Job_Category__c,isFormal_Stuff__c,FirstName,LastName,Province__c from user where id = : myUserID ];
            result.id = tempUser.Id;
            result.isFormalStuff = tempUser.isFormal_Stuff__c;
            result.firstName = tempUser.FirstName == null ? '' : tempUser.FirstName;
            result.lastName = tempUser.LastName == null ? '' : tempUser.LastName;
            result.userProvince = tempUser.Province__c;
            result.userJobCategory = tempUser.Job_Category__c;
        } catch (exception e) {
            
            result.result = e.getMessage();
        }
        return result;
    }
    //获取当前登录人的 id 备品智能化add sx end

    @AuraEnabled
    public static List<OPDPlan__c> getTheOPDPlan(String Id){
        try{
            List<OPDPlan__c> res = [Select Id, Name,supplementaryApplication__c ,OriginalOpdPlanApplication__c
                FROM OPDPlan__c 
                    WHERE supplementaryApplication__c = true 
                    AND OriginalOpdPlanApplication__c = :Id];
            return res;
        }
        catch(Exception e){
            System.debug(LoggingLevel.INFO, '*** e: ' + e);
        }
        return null;
    }


    @AuraEnabled
    public static InitData init2(String recordId){
        InitData res = new initData();
        OPDPlan__c opdUpdate = new OPDPlan__c();
        Set<Id> quoteIdSet = new Set<Id>();
        Set<Id> opdIdSet = new Set<Id>();
        Set<String> renModelSet = new Set<String>();
        List<Product2> proModelList = new List<Product2>();
        Integer proSameNum = 0;
        Integer proAccSameNum = 0;
        Integer proModelNum = 0;
        Integer proStopNum = 0;
        String planNotFromDetai = '';
        String planFromDetai = '';
        try{
            //备品智能化 2023-10-19 update by dzk Start 验证OPD计划与询价报价行项目无一对应
            List<OPDPlan__c> repList = [SELECT Id,OPDPlan_ImplementDate__c,Status__c,OriginalOpdPlanApplication__r.RentalReson__c,Related_Opportunity1_ID__r.Estimation_Id__c,
                                        OriginalOpdPlanRental__c,Rental_Apply2__c,Account_Laboratory__c,Related_Opportunity1_ID__c,AttachmentCertificate__c,NeedReport__c,
                                        PlanProdDetail__c,Cnt_OPD_LastYear__c,Cnt_OPD_ThisYear__c,Cnt_Rentals__c,HospitalID__c,NoOpp_Reason__c,RentalApplyId__c,Related_Opportunity2_ID__c,
                                        lastMonth_Plan__c,SalesManager__c,OPDType__c,OriginalOpdPlanApplication__c,Campaign__c,IsJump__c,JumpCause__c,
                                        Rental_Apply_Flag__c,CampaignRecodeTypeId__c,Internal_in_charge_province__c,CampaignStatus__c,OCM_category_ID__c,
                                        BuchangApprovalManagerSales__c,SalesManager_Txt__c,IF_Approved__c,Approved_No__c,Approved_Status__c,OriginalOpdPlan__c,
                                        Name,supplementaryApplication__c ,OPD_DelayCancel_Last__c , EndDateTime__c ,StartDateTime__c,RentalReson__c,StayOrNot__c
                                            FROM OPDPlan__c
                                        Where Id = : recordId];
            List<Plan_Rental_Equipment__c>  planREList = [SELECT Id,Quote__c, Rental_Quantity__c,MDM_Model_No__c,ProductCode__c
                                                           FROM Plan_Rental_Equipment__c
                                                           WHERE OPD_Plan__c =: recordId];                           
            
            //备品智能化 2023-12-13 update by dzk Start 验证OPD计划与询价报价行项目无一对应
            // 取得符合备品借出条件的产品信息
            List<QuoteLineItem> quoteLineItemList = [SELECT Id,QuoteId, Product2.Name, Product2.Asset_Model_No__c
                                                      FROM QuoteLineItem 
                                                      WHERE QuoteId =: repList[0].Related_Opportunity1_ID__r.Estimation_Id__c];
            //备品智能化 2023-12-13 update by dzk End 验证OPD计划与询价报价行项目无一对应
            Map<Id,Plan_Rental_Equipment__c> planRenUpdateMap = new Map<Id,Plan_Rental_Equipment__c>();
            for(QuoteLineItem quoteItem : quoteLineItemList){
                for(Plan_Rental_Equipment__c planRE : planREList){
                    Plan_Rental_Equipment__c planRenUpdate = new Plan_Rental_Equipment__c();
                    if(quoteItem.Product2.Asset_Model_No__c == planRE.MDM_Model_No__c){
                        proSameNum = proSameNum + 1;
                        // 备品智能化 2023-12-20 add by dzk Start 
                        // 从科室创建的OPD计划,先选产品后填写询价,提交审批时
                        // 如果产品与询价最新报价的产品匹配,将报价编码重新赋值
                        planRenUpdate.Id = planRE.Id;
                        planRenUpdate.Quote__c = quoteItem.QuoteId;
                        planRenUpdateMap.put(planRenUpdate.Id,planRenUpdate);
                    }
                }
            } 
            List<Plan_Rental_Equipment__c> planRenUpdateList = new List<Plan_Rental_Equipment__c>(planRenUpdateMap.values());
            Update planRenUpdateList;

            List<Plan_Rental_Equipment__c> planRenNewList = [SELECT Id,Quote__c, Rental_Quantity__c,MDM_Model_No__c
                                                           FROM Plan_Rental_Equipment__c
                                                           WHERE OPD_Plan__c =: recordId];
          
            opdUpdate.Id = repList[0].Id;
            if(repList[0].Related_Opportunity1_ID__c != null){
                for(Plan_Rental_Equipment__c renNew : planRenNewList){
                    if(renNew.Quote__c == null){
                        planNotFromDetai += renNew.MDM_Model_No__c + '*' + renNew.Rental_Quantity__c + '; ';
                    }else{
                        planFromDetai += renNew.MDM_Model_No__c + '*' + renNew.Rental_Quantity__c + '; ';
                    }
                }
                opdUpdate.EquipmentNotFromOpp__c = planNotFromDetai;
                opdUpdate.EquipmentFromOpp__c = planFromDetai; 
            }
            // 备品智能化 2023-12-20 add by dzk End 
            // 从科室创建的OPD计划,先选产品后填写询价,提交审批时
            // 如果产品与询价最新报价的产品匹配,将报价编码重新赋值
            if(repList[0].Related_Opportunity1_ID__c == null || repList[0].OriginalOpdPlanApplication__c != null){
                proSameNum = 1;
            }
            // 备品智能化2023-10-19 Add by dzk End 验证OPD计划与询价报价行项目无一对应
            // v2023-10-20 ADD by dzk Start 同一科室下,计划中的OPD计划是否包含相同产品   
            if(proSameNum != 0){
                List<Rental_Apply__c> renList = [SELECT Id,Name
                                                          FROM Rental_Apply__c
                                                          WHERE Shippment_ng_num__c > 0
                                                          AND Account__c =: repList[0].Account_Laboratory__c];
                List<Rental_Apply_Equipment_Set__c> renAppSetList = [SELECT Id,Rental_Apply__r.Name,Loaner_code_F__c
                                                                        FROM Rental_Apply_Equipment_Set__c
                                                                        WHERE Rental_Apply__r.Shippment_ng_num__c > 0
                                                                        AND Rental_Apply__r.Account__c =: repList[0].Account_Laboratory__c];
                // 备品智能化 2023-12-14 ADD by dzk Start 增加备品上所需要的重复产品信息 
                // opdUpdate.Id = repList[0].Id;
                res.renAppName = '';
                res.proNewNum = 0;
                opdUpdate.RepeatRentalModel__c = '';
                Map<String,String> renAppNameMap = new Map<String,String>();
                Map<String,String> renAppModelMap = new Map<String,String>();
                for(Rental_Apply_Equipment_Set__c renAppSet : renAppSetList){
                    for(Plan_Rental_Equipment__c planRE : planREList){
                        if(planRE.MDM_Model_No__c == renAppSet.Loaner_code_F__c){
                            proAccSameNum = proAccSameNum += 1;
                            if(!renAppNameMap.containsKey(renAppSet.Rental_Apply__r.Name)){
                                if(proAccSameNum == renAppSetList.size()){
                                    res.renAppName += renAppSet.Rental_Apply__r.Name;
                                }else{
                                    res.renAppName += renAppSet.Rental_Apply__r.Name + ',';
                                }
                            }   
                            if(!renAppModelMap.containsKey(planRE.MDM_Model_No__c)){
                                opdUpdate.RepeatRentalModel__c += planRE.MDM_Model_No__c + ','; 
                            }
                            renAppModelMap.put(planRE.MDM_Model_No__c,planRE.MDM_Model_No__c);
                            renAppNameMap.put(renAppSet.Rental_Apply__r.Name,renAppSet.Rental_Apply__r.Name);
                           
                        }
                    }
                } 
                if(renAppNameMap.size() == 1){
                    List<String> valuesList = new List<String>(renAppNameMap.values());
                    res.renAppName = valuesList[0];
                }
                // 备品智能化 2023-12-14 ADD by dzk End 增加备品上所需要的重复产品信息     
            } 
            update opdUpdate;     
            // 备品智能化 2023-10-20 ADD by dzk End 同一科室下,计划中的OPD计划是否包含相同产品   
            // 备品智能化 2023-10-27 ADD by dzk Start 防止出借目的修改,提交时OPD计划下存在不符合条件的备品数据 
            String rentalReson = repList[0].RentalReson__c;  
            for(Plan_Rental_Equipment__c reList : planREList){
                renModelSet.add(reList.ProductCode__c);
            }
            String query = 'SELECT Id, Name, Loaner_categoryII__c FROM Product2 ';
            query += ' WHERE ProductCode =: renModelSet ';
            // 判断出借目的为追加配套
            if(repList[0].RentalReson__c == '追加配套'){
                rentalReson = repList[0].OriginalOpdPlanApplication__r.RentalReson__c;
            }
            if(rentalReson == 'OPD' || rentalReson == '对应修理' ){
                query += ' AND (Loaner_categoryII__c IN (\'模型\') ';
                query += ' OR (Loaner_categoryII__c NOT IN (\'台车\',\'监视器\',\'录像设备\') AND Manual_Entry__c = false  AND SFDA_Status__c IN (\'停止\'))) ';
            }else if(rentalReson == '新产品评价' ){
                List<Product2> newProList = [SELECT Id,Name,Product_Type__c
                                                    FROM Product2
                                                    WHERE ProductCode =: renModelSet
                                                    AND Product_Type__c = '新产品'];
                res.proNewNum = newProList.size();                                    
                query += ' AND Loaner_categoryII__c IN (\'模型\') ';
            }else if(rentalReson == '演示'){
                query += ' AND Loaner_categoryII__c IN (\'模型\') ';
            }else if(rentalReson == '模型出借'){
                query += ' AND (Loaner_categoryII__c NOT IN (\'模型\') ';
                query += ' OR (SFDA_Status__c IN (\'停止\') AND Manual_Entry__c = false)) ';
            }
            system.debug('query-------------' + query);

            if(String.isNotBlank(rentalReson)){
                proModelList = Database.query(query);
            }
            if(proModelList.size() != 0){
                proStopNum = 1;
            }
            res.proModelNum = proModelNum;
            res.proStopNum = proStopNum;
            res.rentalReson = rentalReson;
            // 备品智能化 2023-11-27 ADD by dzk End 防止出借目的修改,提交时OPD计划下存在不符合条件的备品数据   
            res.opdPlanRecord = repList[0];
            res.proAccSameNum = proAccSameNum; 
            res.proSameNum = proSameNum;
            res.opdStatusProcessState = System.Label.StatusProcessState;
            res.opdCampaignTypeId = Schema.SObjectType.Campaign.getRecordTypeInfosByDeveloperName().get('Service_trainig').getRecordTypeId();
            res.opdInternalinchargeprovince = repList[0].Internal_in_charge_province__c == null ? '' : repList[0].Internal_in_charge_province__c;
            return res;
        }
        catch(Exception e){
            System.debug(LoggingLevel.INFO, '*** e: ' + e);
            return null;    
        }
          
    }

    @AuraEnabled
    public static String NewAndUpdateOPDStatus(String Id, Boolean RepeatRentalSign){
    try{
        //sx  20231109  备品智能化add start
        Rental_Apply__c tempRa = new Rental_Apply__c();
        List<Rental_Apply__c> raList = [SELECT Id, Status__c FROM Rental_Apply__c WHERE OPDPlan__c = :Id order by CreatedDate DESC LIMIT 1 ];
        if(raList.size()>0){
            if(raList[0].Status__c == '申请中（OPD未通过）'){  
                tempRa.Id = raList[0].Id;
                tempRa.Status__c = '填写完毕';
                UPDATE tempRa;
            }
            // UPDATE tempRa;
        }
        //sx  20231109  备品智能化add end
        OPDPlan__c res =new OPDPlan__c();
        res.Id = Id;
        res.Status__c='提交';
        //杜 智能化重复审批标识 add start
        if(RepeatRentalSign == true){
            res.RepeatRentalSign__c=true;
        }
        //杜 智能化重复审批标识 add end
        update res;
        return 'success';
    }
    catch (Exception e) {
            String messageText='';
            if(e.getMessage().contains(':')){
                String eMessage =e.getMessage();
                Integer left = eMessage.indexOf(',')+1;
                Integer right= eMessage.lastIndexOf('：')+1;
                if(right>eMessage.length()||right<=left){
                    right=eMessage.length();
                }
                String mes=eMessage.substring(left,right);
                messageText = mes;
                return messageText + e.getLineNumber() + '行';
            }else{
                messageText=e.getMessage();
                return messageText + e.getLineNumber() + '行';
            }  
    }
    }

    //  @AuraEnabled
    // public static String UpdateSign(String recordId){
    //     try{
    //         OPDPlan__c res =new OPDPlan__c();
    //         res.Id = recordId;
    //         res.Status__c='提交';
    //         res.RepeatRentalSign__c=true;
    //         update res;
    //         return 'success';
    //     }
    //     catch (DMLException e) {
    //         return e.getDmlMessage(0);
    //     }
    // }
    
    @AuraEnabled
    public static OPDPlan__c init3(String recordId){
        OPDPlan__c res = new OPDPlan__c();
        try{ 
            res = [SELECT Id,Name,Status__c,DelayCancel_Reason__c
            ,Account_Laboratory__c,OPDType__c,RentalReson__c,
            Related_Opportunity1_ID__c,
            CorrespondingRepairNo__c,AdditionalSupport__c,Campaign__c,
            NoOpp_Reason__c,ModelLending__c,ModelLendingProduct__c,
            PlanProdDetail__c 
                FROM  OPDPlan__c  WHERE Id = :recordId];

        }
        catch(Exception e){
        System.debug(LoggingLevel.INFO, '*** e: ' + e);
        }
        return res;

    }

    @AuraEnabled
    public static List<OPDPlan__c> reapplyFindOPD(String Id){
        List<OPDPlan__c> res =new List<OPDPlan__c>();
        try{
            res =[SELECT Id, Name,Reapply__c 
                    FROM OPDPlan__c 
                        WHERE Reapply__c = true AND OriginalOpdPlan__c = :Id];
        }
        catch(Exception e){
            System.debug(LoggingLevel.INFO, '*** e: ' + e);
            return null;
        }
        return res;
    }
    //新建OPD计划（科室）  客户上的按钮
    @AuraEnabled
    public static Account  initNewOPDButton(String recordId){
        Account res = new Account();
        try{
            res = [SELECT Id,Is_Active__c 
                FROM Account 
                    WHERE Id=:recordId];
            return res;
        }
        catch(Exception e){
            System.debug(LoggingLevel.INFO, '*** e: ' + e);
            return null;
        }
    }
        //新建OPD计划（询价）  询价上的按钮
    @AuraEnabled
    public static Opportunity  initNewOPDButton2(String recordId){
        Opportunity res = new Opportunity();
        try{
            res = [SELECT Id,AccountId,Name ,StageName
                FROM Opportunity 
                    WHERE Id=:recordId];
            return res;
        }
        catch(Exception e){
            System.debug(LoggingLevel.INFO, '*** e: ' + e);
            return null;
        }
    }
    //取消按钮
    @AuraEnabled
    public static OPDPlan__c  initCancleSumbit(String recordId){
        OPDPlan__c res = new OPDPlan__c();
        try{
            res = [SELECT Id,Status__c,Name 
                FROM OPDPlan__c 
                    WHERE Id=:recordId];
            return res;
        }
        catch(Exception e){
            System.debug(LoggingLevel.INFO, '*** e: ' + e);
            return null;
        }        
    }
    //OPD报告
    @AuraEnabled
    public static OPDPlan__c  initReportSubmit(String recordId){
        OPDPlan__c res = new OPDPlan__c();
        try{
            res = [SELECT Id,Status__c,Name,Rental_Apply2_Status_New__c,Rental_Apply1_Status_New__c,
            Rental_Apply3_Status_New__c,Rental_Apply4_Status_New__c,Rental_Apply5_Status_New__c,
            Related_Opportunity1_ID__c,Related_Opportunity2_ID__c,Activity_Type2__c,
            Account_Laboratory__c,OCM_category_ID__c,OCM_category_Name__c,HospitalID__c,
            HospitalName__c,Rental_Apply2__c
                FROM OPDPlan__c 
                    WHERE Id=:recordId];
            return res;
        }
        catch(Exception e){
            System.debug(LoggingLevel.INFO, '*** e: ' + e);
            return null;
        }        
    }

    //提交审批失败发送邮件提醒
    // @AuraEnabled
    // public static void sendFailEmail(String recordId){
    //     try {
    //         EmailTemplate et=[Select id from EmailTemplate where name =:'OPD计划提交审批创建备品失败' limit 1];
    //         List<User> currUser = [
    //                 SELECT Id, Name, Email, Default_Referable_Apply_Equipment_Center__c
    //                 FROM User
    //                 WHERE Id = :UserInfo.getUserId()];
    //         List<Messaging.SingleEmailMessage> emails = new List<Messaging.SingleEmailMessage>();
    //         Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
    //         mail = Messaging.renderStoredEmailTemplate(et.Id, null , recordId);
    //         mail.setSaveAsActivity(false);
    //         List<String> toAddresses = new List<String>();
    //         //toAddresses.add(currUser[0].Email);
    //         toAddresses.add('@sunxia@prec-tech.com');
    //         List<String> ccAddresses = new List<String>();
    //         if (String.isNotBlank(System.Label.AuthRental_Apply_TEST)) {
    //             String[] toAddresses1 = System.Label.AuthRental_Apply_TEST.split(',');
    //             if(toAddresses1 != null) {
    //                 mail.setCcAddresses(toAddresses1);
    //             }
    //         }
    //         mail.setToAddresses(toAddresses);
    //         //mail.setCcAddresses(ccAddresses);
    //         emails.add(mail);
    //         Messaging.sendEmail(emails);
    //     }
    //     catch (Exception e) {
    //         System.debug(e.getMessage());
    //     }
    // }

    //自定义模板发送邮件
    @AuraEnabled
    public static void sendTemperatureEmail(String opdName, String ErrorMessage, String opdId){
        // 邮件List集合
        try {
        List<Messaging.SingleEmailMessage> emails = new List<Messaging.SingleEmailMessage>();
        List<User> currUser = [
                    SELECT Id, Name, Email, Default_Referable_Apply_Equipment_Center__c
                    FROM User
                    WHERE Id = :UserInfo.getUserId()];
        System.debug('currUser==='+currUser.get(0));
        System.debug('currUser==='+currUser[0]);
        // 发件人
        OrgWideEmailAddress[] owea = [select Id from OrgWideEmailAddress where Address = 'olympus@prec-tech.com'];
        //To Cc
        List<String> toAddresses = new List<String>();
        toAddresses.add(currUser.get(0).Email);
        String[] ccAddresses;
        if (String.isNotBlank(System.Label.AuthRental_Apply_TEST)) {
            ccAddresses = System.Label.AuthRental_Apply_TEST.split(',');
        }
        Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
        mail.setSaveAsActivity(false);
        mail.setToAddresses(toAddresses);
        mail.setCcAddresses(ccAddresses);
        mail.setSubject('OPD计划:' + opdName + '自动新建备品借出申请失败');
        mail.setOrgWideEmailAddressId(owea.get(0).Id);
        String emailBody = '';
        emailBody += '您好:<br/>';
        emailBody += 'OPD计划自动创建备品申请失败，还请参考如下信息调整相关内容，谢谢。<br/>';
        emailBody += ErrorMessage+'<br/>';
        emailBody += 'OPD计划链接如下:<br/>';
        emailBody += URL.getSalesforceBaseUrl().toExternalForm() + '/' + opdId;         //地址变成获取 20240106 sx 修改
        mail.setHtmlBody(emailBody);
        emails.add(mail);

        Messaging.sendEmail(emails);

        }
        catch (Exception e) {
            System.debug('sendTemperatureEmail====' + e.getMessage());
        }
    }

    @AuraEnabled
    public static  String  getRecordTypeByNameAndSobject(String Name ,String SobjectType){
        List<RecordType> res = new List<RecordType>();
        try{
            res = [SELECT Id  
                    FROM RecordType
                        WHERE Name=:Name AND SobjectType=: SobjectType];
            return res[0].Id;
        }
        catch(Exception e){
            System.debug(LoggingLevel.INFO, '*** e: ' + e);
            return e.getMessage();            
        }
    }
    @AuraEnabled
    public static String cloneOPD(String recordId){
        String s='';
        try {
            String objectName = 'OPDPlan__c'; // 要获取字段的对象名
            Map<String, Schema.SObjectType> globalDescribe = Schema.getGlobalDescribe();
            Schema.SObjectType objType = globalDescribe.get(objectName);
            if (objType != null) {
                Schema.DescribeSObjectResult objDescribe = objType.getDescribe();
                Map<String, Schema.SObjectField> fieldMap = objDescribe.fields.getMap();
                s+='SELECT ';
                // 现在，fieldMap中包含了对象的所有字段信息
                for (String fieldName : fieldMap.keySet()) {
                    if(!fieldName.equals('id'))
                        s+=fieldName+',';
                }

                s=s.removeEnd(',');
                s+=' FROM OPDPlan__c where id=\''+recordId+'\'';
                system.debug('SQL:'+s);
                List<OPDPlan__c> opportunitys = Database.query(s);
                s='';
                if(opportunitys.size()>0){
                    system.debug('in!');
                    for (String fieldName : fieldMap.keySet()) {
                        String formaF=fieldMap.get(fieldName).getDescribe().getName();
                        if(opportunitys.get(0).get(fieldName)!=null&&!opportunitys.get(0).get(fieldName).equals('null'))
                            s+=formaF+'='+opportunitys.get(0).get(fieldName)+',';
                    }
                    s=s.removeEnd(',');
                    return s;
                }
            }
            return s;
        } catch (Exception e) {
            System.debug('lexCopyToBaseController init error:'+e.getMessage());
        }
        return s;        
    }

    //新建申请单 sx 备品智能化 add 20231008 start
    @AuraEnabled
    public static String newRentalApply(String recordId){
        OPDPlan__c opd = [SELECT Id, Name, OriginalOpdPlan__c, OriginalOpdPlanApplication__c, OPDType__c, Campaign__c, Status__c, EquipmentFromOpp__c, EquipmentNotFromOpp__c,
            Account_Laboratory__c, OCM_category_ID__c, HospitalID__c, IsJump__c, Related_Opportunity1_ID__c, RentalApplyId__c, RentalReson__c, OPDPlan_ImplementDate__c,
            JumpCause__c, Approved_Status__c, Approved_No__c, Approved_No__r.Name, NoOpp_Reason__c, PlanProdDetail__c, PlanProdDetailSys__c, OwnerId, Owner.Name, OriginalOpdPlan__r.RentalApplyId__c from OPDPlan__c where Id = :recordId];

        System.debug('====newRentalApply===start===' + recordId );
        //新建备品 产品分类(GI/SP)
        String productCategory;
        //备品配套 
        Map<Id,Fixture_Set__c> fixMap = new Map<Id,Fixture_Set__c>();
        List<Fixture_Set__c> fixList = new List<Fixture_Set__c>();
        Map<String,Fixture_Set__c> fixDeduplicateMap = new Map<String,Fixture_Set__c>();        //配套去重
        List<Fixture_Set__c> fixSets = new List<Fixture_Set__c>();                               // 去重之后的配套List
        //备品配套明细
        List<Fixture_Set_Detail__c> fixSetDetails = new List<Fixture_Set_Detail__c>();
        //分配配套  从OPD计划的
        List<Rental_Apply_Equipment_Set__c> updateraesList = new List<Rental_Apply_Equipment_Set__c>();
        list<Rental_Apply_Equipment_Set_Detail__c> updateraedelList = new List<Rental_Apply_Equipment_Set_Detail__c>();
        //配套和配套明细的关系  <配套Id, List<明细>>
        Map<Id, List<Fixture_Set_Detail__c>> setDetalMap = new Map<Id,List<Fixture_Set_Detail__c>>();

        List<String> fixtureModels = new List<String>();
        if(opd.PlanProdDetail__c != null){
            List<String> fixSetStrings = opd.PlanProdDetail__c.split(';');
            if(fixSetStrings.size() > 0){
                for(String fixSet : fixSetStrings){
                    String tempString = fixSet.trim();
                    if(tempString.indexOf('*')!= -1){
                        fixtureModels.add(tempString.substring(0, tempString.indexOf('*')));
                    }
                }
            }
        }

        if(fixtureModels.size() > 0){
            //计划出借备品的第一个产品上去判断 如果产品第一分类
            List<Product2> firstProduct = [SELECT Id, Family FROM Product2 WHERE Fixture_Model_No_T__c = :fixtureModels];
            if(firstProduct.size()>0){
                if(firstProduct[0].Family == 'GI'){
                    productCategory = firstProduct[0].Family;
                }else{
                    productCategory = 'SP';
                }
            }
            
            fixList = [SELECT Id, Fixture_Set_Body_Model_No__c FROM Fixture_Set__c WHERE Fixture_Set_Body_Model_No__c IN :fixtureModels Order By Name];
            System.debug('fixList====='+fixList);
            for(Fixture_Set__c fix : fixList){
                if(!fixDeduplicateMap.containsKey(fix.Fixture_Set_Body_Model_No__c)){
                    fixDeduplicateMap.put(fix.Fixture_Set_Body_Model_No__c,fix);
                }
            }
            System.debug('fixDeduplicateMap====='+fixDeduplicateMap.values());
            fixSets = fixDeduplicateMap.values();

            System.debug('fixSets====='+fixSets);
            fixMap = new Map<Id,Fixture_Set__c>([SELECT Id FROM Fixture_Set__c WHERE Fixture_Set_Body_Model_No__c IN :fixtureModels]);
            fixSetDetails = [SELECT Id, SortInt__c, Fixture_Set__c FROM Fixture_Set_Detail__c WHERE Is_Body__c = true AND Fixture_Set__c IN :fixSets];
            System.debug('fixMap====='+ fixMap);
            System.debug('fixSetDetails====='+fixSetDetails);
            //一个备品配套 对应各自明细
            for(Fixture_Set_Detail__c fixDetail : fixSetDetails){
                if(setDetalMap.containsKey(fixDetail.Fixture_Set__c)){
                    setDetalMap.get(fixDetail.Fixture_Set__c).add(fixDetail);
                }else{
                    List<Fixture_Set_Detail__c> temp  = new List<Fixture_Set_Detail__c>();
                    temp.add(fixDetail);
                    setDetalMap.put(fixDetail.Fixture_Set__c,temp);
                }
            }
            System.debug('setDetalMap===='+setDetalMap);

        }else{
            return '该OPD计划的【计划出借备品信息】没有填写';
        }

        //新建备品借出申请
        Rental_Apply__c newRa = new Rental_Apply__c();

        try {
            //新产品评价
            if(opd.RentalReson__c == '新产品评价'){
                newRa.Demo_purpose1__c = '产品试用';
                newRa.demo_purpose2__c = '新产品评价';
                newRa.OPDPlan__c = opd.Id;
                newRa.Hospital__c = opd.HospitalID__c;  
                newRa.Name = '*';
                newRa.Strategic_dept__c = opd.OCM_category_ID__c;  //战略科室
                newRa.Person_In_Charge__c = opd.OwnerId;
                newRa.applyUser__c = opd.OwnerId;
                newRa.Account__c = opd.Account_Laboratory__c;
                newRa.Request_shipping_day__c = opd.OPDPlan_ImplementDate__c.addDays(-3);
                newRa.Product_category__c = productCategory;
                newRa.OPDProduct__c = opd.EquipmentNotFromOpp__c;
                newRa.OppProduct__c = opd.EquipmentFromOpp__c;
                newRa.Is_Auto__c = true;
                //newRa.Hope_Lonaer_date_Num__c = 1;
                INSERT newRa;
                //分配配套 分配配套明细
                for(Fixture_Set__c fix : fixSets){
                    Rental_Apply_Equipment_Set__c raes = new Rental_Apply_Equipment_Set__c();
                    raes.Name = '*';
                    raes.Rental_Apply__c = newRa.Id;
                    raes.Fixture_Set__c = fix.Id;
                    raes.IndexFromUniqueKey__c = 1;
                    raes.Rental_Num__c = 1;
                    updateraesList.add(raes);
                }
                INSERT updateraesList;


                for(Rental_Apply_Equipment_Set__c raes : updateraesList){
                    if(fixMap.containsKey(raes.Fixture_Set__c)){
                        Rental_Apply_Equipment_Set_Detail__c raesdel = new Rental_Apply_Equipment_Set_Detail__c();
                        raesdel.Name = '*';
                        raesdel.Rental_Apply__c = newRa.Id;
                        raesdel.Fixture_Set_Detail__c = setDetalMap.get(raes.Fixture_Set__c)[0].Id;
                        raesdel.Rental_Num__c = 1;
                        raesdel.Rental_Apply_Equipment_Set__c = raes.Id;
                        raesdel.Is_Body__c = true; 
                        raesdel.IndexFromUniqueKey__c = 1;
                        raesdel.IndexFromUniqueKey_Text__c = setDetalMap.get(raes.Fixture_Set__c)[0].SortInt__c + '';
                        updateraedelList.add(raesdel);
                    }
                }

                INSERT updateraedelList;

                if(updateraedelList.size()>0){
                    for(Rental_Apply_Equipment_Set__c raes : updateraesList){
                        for(Rental_Apply_Equipment_Set_Detail__c raesd : updateraedelList){
                            if(raes.Id == raesd.Rental_Apply_Equipment_Set__c){
                                System.debug('更新配套第一个明细');
                                raes.First_RAESD__c = raesd.Id;
                            }
                        }
                    }
                    UPDATE updateraesList;
                }
                
                return '备品新建成功';

            }


            //学会
            if(opd.OriginalOpdPlan__c == null && opd.OriginalOpdPlanApplication__c == null){
                if(opd.OPDType__c == '学会' && opd.Campaign__c != null){
                    System.debug('学会=======' + opd.Campaign__c);
                    //决裁状态 = 草稿 发送自动生成失败提醒
                    List<String> legalString = System.Label.StatusProcessState.split(',');
                    System.debug('legalString='+legalString);
                    if(legalString.contains(opd.Approved_Status__c) && opd.Approved_Status__c != '草稿'){
                        sendTemperatureEmail(opd.Name,'已申请决裁但决裁状态不符合条件', opd.Id);
                        return '已申请决裁但决裁状态不符合条件';
                    }

                    newRa.Demo_purpose1__c = '产品试用';
                    newRa.demo_purpose2__c = '学会展会';
                    newRa.Campaign__c = opd.Campaign__c;
                    newRa.Account__c = opd.Account_Laboratory__c;
                    newRa.Strategic_dept__c = opd.OCM_category_ID__c;
                    newRa.Hospital__c = opd.HospitalID__c;
                    newRa.OPDPlan__c = opd.Id;
                    newRa.Person_In_Charge__c = opd.OwnerId;      //备品出借担当
                    newRa.applyUser__c = opd.OwnerId;              //操作者
                    newRa.Loaner_received_staff__c = opd.Owner.Name;    //收件人姓名
                    newRa.IsJump__c = opd.IsJump__c;
                    newRa.JumpCause__c = opd.JumpCause__c;
                    newRa.Name = '*';
                    newRa.Approved_State_Create__c = opd.Approved_Status__c;
                    newRa.ApprovedNo_Create__c = opd.Approved_No__r.Name;
                    newRa.Product_category__c = productCategory;
                    newRa.OPDProduct__c = opd.EquipmentNotFromOpp__c;
                    newRa.OppProduct__c = opd.EquipmentFromOpp__c;
                    newRa.Is_Auto__c = true;
                    newRa.Request_shipping_day__c = opd.OPDPlan_ImplementDate__c.addDays(-3);
                }else if(String.isNotBlank(opd.Related_Opportunity1_ID__c)){
                    newRa.Demo_purpose1__c = '产品试用';
                    newRa.demo_purpose2__c = '试用（有询价）';
                    newRa.Follow_UP_Opp__c = opd.Related_Opportunity1_ID__c;
                    newRa.Account__c = opd.Account_Laboratory__c;
                    newRa.Strategic_dept__c = opd.OCM_category_ID__c;
                    newRa.Hospital__c = opd.HospitalID__c;
                    newRa.OPDPlan__c = opd.Id;
                    newRa.Person_In_Charge__c = opd.OwnerId;
                    newRa.applyUser__c = opd.OwnerId;
                    newRa.Loaner_received_staff__c = opd.Owner.Name;
                    newRa.IsJump__c = opd.IsJump__c;
                    newRa.JumpCause__c = opd.JumpCause__c;
                    newRa.Name = '*';
                    newRa.Approved_State_Create__c = opd.Approved_Status__c;
                    newRa.ApprovedNo_Create__c = opd.Approved_No__r.Name;
                    newRa.Product_category__c = productCategory;
                    newRa.OPDProduct__c = opd.EquipmentNotFromOpp__c;
                    newRa.OppProduct__c = opd.EquipmentFromOpp__c;
                    newRa.Is_Auto__c = true;
                    //newRa.Hope_Lonaer_date_Num__c = 1;
                    newRa.Request_shipping_day__c = opd.OPDPlan_ImplementDate__c.addDays(-3);
                }else{
                    newRa.Demo_purpose1__c = '产品试用';
                    newRa.demo_purpose2__c = '试用（无询价）';
                    newRa.NoOpp_Reason__c = opd.NoOpp_Reason__c;
                    newRa.Account__c = opd.Account_Laboratory__c;
                    newRa.Strategic_dept__c = opd.OCM_category_ID__c;
                    newRa.Hospital__c = opd.HospitalID__c;
                    newRa.OPDPlan__c = opd.Id;
                    newRa.Person_In_Charge__c = opd.OwnerId;
                    newRa.applyUser__c = opd.OwnerId;
                    newRa.Loaner_received_staff__c = opd.Owner.Name;
                    newRa.IsJump__c = opd.IsJump__c;
                    newRa.JumpCause__c = opd.JumpCause__c;
                    newRa.Name = '*';
                    newRa.Approved_State_Create__c = opd.Approved_Status__c;
                    newRa.ApprovedNo_Create__c = opd.Approved_No__r.Name;
                    newRa.Product_category__c = productCategory;
                    newRa.OPDProduct__c = opd.EquipmentNotFromOpp__c;
                    newRa.OppProduct__c = opd.EquipmentFromOpp__c;
                    newRa.Is_Auto__c = true;
                    //newRa.Hope_Lonaer_date_Num__c = 1;
                    newRa.Request_shipping_day__c = opd.OPDPlan_ImplementDate__c.addDays(-3);
                }

                //INSERT newRa;
                Database.SaveResult insertRaResult = Database.insert(newRa, false);
                if(!insertRaResult.isSuccess()){
                    Database.Error emsg = insertRaResult.getErrors()[0];
                    sendTemperatureEmail(opd.Name, emsg.getMessage(), opd.Id);
                    return '备品新建失败' + emsg.getMessage();
                }


                //分配配套 分配配套明细 如果是学会类型的 ，明细插队申请自动打开 Allow_Adjust_Queue_Flag__c
                for(Fixture_Set__c fix : fixSets){
                    Rental_Apply_Equipment_Set__c raes = new Rental_Apply_Equipment_Set__c();
                    raes.Name = '*';
                    raes.Rental_Apply__c = newRa.Id;
                    raes.Fixture_Set__c = fix.Id;
                    raes.IndexFromUniqueKey__c = 1;
                    raes.Rental_Num__c = 1;
                    updateraesList.add(raes);
                }
                INSERT updateraesList;


                for(Rental_Apply_Equipment_Set__c raes : updateraesList){
                    if(fixMap.containsKey(raes.Fixture_Set__c)){
                        Rental_Apply_Equipment_Set_Detail__c raesdel = new Rental_Apply_Equipment_Set_Detail__c();
                        raesdel.Name = '*';
                        raesdel.Rental_Apply__c = newRa.Id;
                        raesdel.Fixture_Set_Detail__c = setDetalMap.get(raes.Fixture_Set__c)[0].Id;
                        raesdel.Rental_Num__c = 1;
                        raesdel.Rental_Apply_Equipment_Set__c = raes.Id;
                        raesdel.Is_Body__c = true; 
                        raesdel.IndexFromUniqueKey__c = 1;
                        raesdel.IndexFromUniqueKey_Text__c = setDetalMap.get(raes.Fixture_Set__c)[0].SortInt__c + '';
                        if(newRa.demo_purpose2__c == '学会展会'){
                            raesdel.Allow_Adjust_Queue_Flag__c = true;
                            raesdel.jumpReason__c = '默认插队标记';
                        }
                        updateraedelList.add(raesdel);
                    }
                }
                INSERT updateraedelList;

                if(updateraedelList.size()>0){
                    for(Rental_Apply_Equipment_Set__c raes : updateraesList){
                        for(Rental_Apply_Equipment_Set_Detail__c raesd : updateraedelList){
                            if(raes.Id == raesd.Rental_Apply_Equipment_Set__c){
                                System.debug('更新配套第一个明细');
                                raes.First_RAESD__c = raesd.Id;
                            }
                        }
                    }
                    UPDATE updateraesList;
                }

                return newRa.Id+'';
            }
        }
        catch (Exception e) {
            //sendTemperatureEmail(opd.Name, e.getDmlMessage(0) , opd.Id);
            try {
                 Integer n = e.getNumDml();
                 //System.assert(false, 'Exception 2 expected');
                 sendTemperatureEmail(opd.Name, e.getDmlMessage(0) , opd.Id);
                 return '备品新建失败' + e.getDmlMessage(0);
             } catch (TypeException ee) {
                System.assertEquals('Procedure is only valid for System.DmlException and System.MailException', ee.getMessage());
                sendTemperatureEmail(opd.Name, ee.getMessage() , opd.Id);
                return '备品新建失败' + ee.getMessage();
             }

        }


        // 原OPD计划(再申请)   OriginalOpdPlan__c  原OPD计划(补充申请) OriginalOpdPlanApplication__c
        if(String.isNotBlank(opd.OriginalOpdPlan__c)){
            List<String> opdIdList = new List<String>();
            String s='';
            List<Rental_Apply__c> OPDPlans1 = new List<Rental_Apply__c>();
            try {
                //获取旧的OPD计划
                List<OPDPlan__c> opdList = [SELECT Id,Name,OriginalOpdPlan__c FROM OPDPlan__c WHERE Id = :recordId];
                if(opdList.size() > 0){
                    for (OPDPlan__c opdId : opdList) {
                        opdIdList.add(opdId.OriginalOpdPlan__c);
                    }

                    String objectName = 'Rental_Apply__c'; // 要获取字段的对象名
                    Map<String, Schema.SObjectType> globalDescribe = Schema.getGlobalDescribe();
                    Schema.SObjectType objType = globalDescribe.get(objectName);
                    if(objType != null){
                        Schema.DescribeSObjectResult objDescribe = objType.getDescribe();
                        Map<String, Schema.SObjectField> fieldMap = objDescribe.fields.getMap();
                        s+='SELECT '; //跟进询价1的Name deloitte-zhj 20230921
                        // 现在，fieldMap中包含了对象的所有字段信息
                        for (String fieldName : fieldMap.keySet()) {
                            if(!fieldName.equals('id') && !fieldName.equals('createddate') && !fieldName.equals('lastmodifieddate'))
                                s+=fieldName+',';

                        }
                        s=s.removeEnd(',');
                        s+=' FROM Rental_Apply__c where OPDPlan__c=\''+opdIdList[0]+'\'';
                        System.debug('===sql======='+s);
                        OPDPlans1 = Database.query(s);
                    }

                        //Rental_Apply__c nObj = nObjList[0];
                        Rental_Apply__c newApp = new Rental_Apply__c();
                        if(OPDPlans1.size()>0){
                            newApp = OPDPlans1[0];
                        }else{
                            sendTemperatureEmail(opd.Name, '原OPD计划没有关联备品借出申请单' , opd.Id);
                            return '备品新建失败' + '原OPD计划没有关联备品借出申请单';
                        }
                        newApp.Id = null;
                        newApp.Name = '*';
                        newApp.Status__c = '草案中';       //状态
                        newApp.OPDPlan__c = opd.Id;
                        if(OPDPlans1[0].AWS_Data_Id__c == null){
                            //正常情况应该没有不存在AWDId没值的情况，为了防止报错，所以这么赋值
                            newApp.AWS_Data_Id__c = OPDPlans1[0].Name + 'X'; 
                        }else{
                            newApp.AWS_Data_Id__c = OPDPlans1[0].AWS_Data_Id__c + 'X'; 
                        }
                        

                        //清空若干字段
                        newApp.Request_shipping_day__c = null;
                        newApp.Hope_Lonaer_date_Num__c = null;
                        newApp.Old_Rental_Apply__c = null;
                        newApp.Split_Apply_Reason__c = null;
                        newApp.Cancel_Reason__c = null;
                        newApp.Loaner_cancel_reason__c = null;
                        newApp.Loaner_cancel_request__c = null;
                        newApp.Zsq_Rental_Apply__c = opd.RentalApplyId__c;
                        
                        newApp.Request_shipping_day__c = opd.OPDPlan_ImplementDate__c.addDays(-3);
                        newApp.Product_category__c = productCategory;
                        newApp.OPDProduct__c = opd.EquipmentNotFromOpp__c;
                        newApp.OppProduct__c = opd.EquipmentFromOpp__c;
                        newApp.Is_Auto__c = true;
                        System.debug('newApp===='+newApp.Is_Auto__c );
                        INSERT newApp;

                        //Rental_Apply__c ra = [SELECT Id]
                        System.debug('再申请 备品配套====='+fixSets);
                        //分配配套 分配配套明细
                        // for(Fixture_Set__c fix : fixSets){
                        //     Rental_Apply_Equipment_Set__c raes = new Rental_Apply_Equipment_Set__c();
                        //     raes.Name = '*';
                        //     raes.Rental_Apply__c = newApp.Id;
                        //     raes.Fixture_Set__c = fix.Id;
                        //     raes.IndexFromUniqueKey__c = 1;
                        //     raes.Rental_Num__c = 1;
                        //     updateraesList.add(raes);
                        // }
                        // INSERT updateraesList;


                        // for(Rental_Apply_Equipment_Set__c raes : updateraesList){
                        //     if(fixMap.containsKey(raes.Fixture_Set__c)){
                        //         Rental_Apply_Equipment_Set_Detail__c raesdel = new Rental_Apply_Equipment_Set_Detail__c();
                        //         raesdel.Name = '*';
                        //         raesdel.Rental_Apply__c = newApp.Id;
                        //         raesdel.Fixture_Set_Detail__c = setDetalMap.get(raes.Fixture_Set__c)[0].Id;
                        //         raesdel.Rental_Num__c = 1;
                        //         raesdel.Rental_Apply_Equipment_Set__c = raes.Id;
                        //         raesdel.Is_Body__c = true; 
                        //         raesdel.IndexFromUniqueKey__c = 1;
                        //         raesdel.IndexFromUniqueKey_Text__c = setDetalMap.get(raes.Fixture_Set__c)[0].SortInt__c + '';
                        //         updateraedelList.add(raesdel);
                        //     }
                        // }
                        // INSERT updateraedelList;

                        return '备品创建成功';
                    }
            }catch (DmlException de) {
                String errormessage = '';
                errormessage = de.getDmlMessage(0);
                sendTemperatureEmail(opd.Name, errormessage , opd.Id);
                return '备品新建失败' + errormessage;
            }catch (Exception e){
                String errormessage = '';
                errormessage = e.getMessage();
                sendTemperatureEmail(opd.Name, errormessage , opd.Id);
                return '备品新建失败' + errormessage;
            }
            
        }


        if(opd.OriginalOpdPlan__c == null && opd.OriginalOpdPlanApplication__c != null){
            System.debug('======补充申请=====' + opd.OriginalOpdPlanApplication__c);
            List<String> opdIdList = new List<String>();
            String s='';
            List<Rental_Apply__c> OPDPlans = new List<Rental_Apply__c>();
            try {
                List<OPDPlan__c> opdList = [SELECT Id,Name,OriginalOpdPlanApplication__c FROM OPDPlan__c WHERE Id = :recordId];
                if (opdList.size() > 0) {
                    for (OPDPlan__c opdId : opdList) {
                        opdIdList.add(opdId.OriginalOpdPlanApplication__c);
                    }
                    String objectName = 'Rental_Apply__c'; // 要获取字段的对象名
                    Map<String, Schema.SObjectType> globalDescribe = Schema.getGlobalDescribe();
                    Schema.SObjectType objType = globalDescribe.get(objectName);
                    if (objType != null) {
                        Schema.DescribeSObjectResult objDescribe = objType.getDescribe();
                        Map<String, Schema.SObjectField> fieldMap = objDescribe.fields.getMap();
                        s+='SELECT '; //跟进询价1的Name deloitte-zhj 20230921
                        // 现在，fieldMap中包含了对象的所有字段信息
                        for (String fieldName : fieldMap.keySet()) {
                            if(!fieldName.equals('id') && !fieldName.equals('createddate') && !fieldName.equals('lastmodifieddate'))
                                s+=fieldName+',';
                        }

                        s=s.removeEnd(',');
                        s+=' FROM Rental_Apply__c where OPDPlan__c=\''+opdIdList[0]+'\'';
                        system.debug('SQL:'+s);
                        OPDPlans = Database.query(s);
                    }

                    List<Rental_Apply__c> nObjList = [SELECT Id,Name,
                                                        Request_return_day__c, // 预定归还日
                                                        Request_shipping_day__c, // 希望到货日
                                                        Hope_Lonaer_date_Num__c, // 希望借用天数
                                                        Cancel_Reason__c, // 取消理由
                                                        Loaner_cancel_reason__c, // 备品申请取消理由
                                                        Loaner_cancel_request__c, // 备品申请取消理由备注
                                                        Request_demo_time__c, // 申请时间
                                                        Request_approval_time__c, // 批准时间(申请提交时间)
                                                        Application_accept_time__c, // 申请受理时间(回答时间)
                                                        Request_answer_time__c, // 备品首次分配时间
                                                        Response__c, // 应答沟通
                                                        Assign_Person__c, // 分配人
                                                        Old_Rental_Apply__c, // 旧借出申请
                                                        Loaner_medical_Staff__r.Id,
                                                        // Loaner_medical_Staff__r.AWS_Data_Id__c, //deloitte-zhj 科室负责人的AWSID 20230916
                                                        // AWS_Data_Id__c, //deloitte-zhj 备品借出申请的AWSID 20230916
                                                        Follow_UP_Opp__r.Id,
                                                        Follow_UP_Opp__r.Name, //deloitte-zhj 跟进询价1 20230922
                                                        repair__r.Id,
                                                        repair__r.Name //deloitte-zhj 修理 20230922
                                                        FROM Rental_Apply__c WHERE OPDPlan__c = :opdIdList[0]];
                    if (nObjList.size() > 0) {
                        //需要从原申请单再特殊赋值
                        Rental_Apply__c nObj = nObjList[0];
                        Rental_Apply__c newApp = new Rental_Apply__c();
                        if(OPDPlans.size()>0){
                            //原单赋值
                           newApp = OPDPlans[0]; 
                        }
                        
                        newApp.Id = null;
                        newApp.Name = '*';
                        newApp.Status__c = '草案中';       //状态
                        newApp.OPDPlan__c = opd.Id;
                        // newApp.AWS_Data_Id__c = OPDPlans[0].AWS_Data_Id__c + 'X';
                        newApp.AWS_Data_Id__c ='';
                        newApp.OPDProduct__c = opd.EquipmentNotFromOpp__c;
                        newApp.OppProduct__c = opd.EquipmentFromOpp__c;
                        newApp.Is_Auto__c = true;
                        newApp.Request_shipping_day__c = opd.OPDPlan_ImplementDate__c.addDays(-3);
                        newApp.Hope_Lonaer_date_Num__c = nObjList[0].Hope_Lonaer_date_Num__c;
                        INSERT newApp;

                        //分配配套 分配配套明细
                        for(Fixture_Set__c fix : fixSets){
                            Rental_Apply_Equipment_Set__c raes = new Rental_Apply_Equipment_Set__c();
                            raes.Name = '*';
                            raes.Rental_Apply__c = newApp.Id;
                            raes.Fixture_Set__c = fix.Id;
                            raes.IndexFromUniqueKey__c = 1;
                            raes.Rental_Num__c = 1;
                            updateraesList.add(raes);
                        }
                        INSERT updateraesList;


                        for(Rental_Apply_Equipment_Set__c raes : updateraesList){
                            if(fixMap.containsKey(raes.Fixture_Set__c)){
                                Rental_Apply_Equipment_Set_Detail__c raesdel = new Rental_Apply_Equipment_Set_Detail__c();
                                raesdel.Name = '*';
                                raesdel.Rental_Apply__c = newApp.Id;
                                raesdel.Fixture_Set_Detail__c = setDetalMap.get(raes.Fixture_Set__c)[0].Id;
                                raesdel.Rental_Num__c = 1;
                                raesdel.Rental_Apply_Equipment_Set__c = raes.Id;
                                raesdel.Is_Body__c = true; 
                                raesdel.IndexFromUniqueKey__c = 1;
                                raesdel.IndexFromUniqueKey_Text__c = setDetalMap.get(raes.Fixture_Set__c)[0].SortInt__c + '';
                                updateraedelList.add(raesdel);
                            }
                        }
                        INSERT updateraedelList;

                        if(updateraedelList.size()>0){
                            for(Rental_Apply_Equipment_Set__c raes : updateraesList){
                                for(Rental_Apply_Equipment_Set_Detail__c raesd : updateraedelList){
                                    if(raes.Id == raesd.Rental_Apply_Equipment_Set__c){
                                        System.debug('更新配套第一个明细');
                                        raes.First_RAESD__c = raesd.Id;
                                    }
                                }
                            }
                            UPDATE updateraesList;
                        }

                        return '备品创建成功';
                    }
                }
            }
            catch (Exception e) {
                sendTemperatureEmail(opd.Name, e.getDmlMessage(0) , opd.Id);
                return '备品新建失败' + e.getMessage();
            }
        }

        return '新建备品成功';
    }
    //新建申请单 sx 备品智能化 add 20231008 end

    //反映维修合同    封装调用UpdateAssetToCurrentMCWebService
    @AuraEnabled
    public static void callUpdateAssetToCurrentMC(String targetAssetId){
        UpdateAssetToCurrentMCWebService.UpdateAssetToCurrentMC(targetAssetId);
    }

    //  public   static void UpdateAssetToCurrentMC(String targetAssetId ){
    //     UpdateAssetToCurrentMCBatch u = new UpdateAssetToCurrentMCBatch();
    //     u.targetAssetId = targetAssetId;
    //     Id execBTId = Database.executeBatch(u, 50);     
    // }
    
    public class UserResult {
        @AuraEnabled
        public string result;
        public UserResult( ) {
            result = 'Success';
        }
        @AuraEnabled
        public string id;
        @AuraEnabled
        public Boolean isFormalStuff;
        @AuraEnabled
        public string firstName;
        @AuraEnabled
        public string lastName;
        @AuraEnabled
        public string userProvince;
        @AuraEnabled
        public string userJobCategory;
    }


    public class InitData{
        @AuraEnabled
        public Integer proNewNum;
        @AuraEnabled
        public Integer proSameNum;
        @AuraEnabled
        public Integer proAccSameNum;
        @AuraEnabled
        public Integer proModelNum;
        @AuraEnabled
        public Integer proStopNum;
        @AuraEnabled
        public OPDPlan__c opdPlanRecord;
        @AuraEnabled
        public String renAppName;
        @AuraEnabled
        public String opdStatusProcessState;
        @AuraEnabled
        public String opdCampaignTypeId;
        @AuraEnabled
        public String opdInternalinchargeprovince;
        @AuraEnabled
        public String rentalReson;
        
    }
}