public without sharing class Product2TriggerHandler {

    public static void upsertProductSearch(List<Product2> newList, Map<Id, Product2> newMap, List<Product2> oldList, Map<Id, Product2> oldMap) 
    {
        if(Trigger.isAfter && (Trigger.isInsert || Trigger.isUpdate))
        {
            List<String> p2ids = new List<String>();
            for(Product2 p2 : newList)
            {
                p2ids.add(p2.id);
            }
            
            List<Product_Search__c> ps = [select Id,Name,CurrencyIsoCode,Product__c From Product_Search__c Where Product__c in: p2ids];
            Map <String,Product_Search__c> psmap = new Map<String,Product_Search__c>();
            List<Product_Search__c> pss = new List<Product_Search__c>();
            for(Product_Search__c p : ps)
            {
                psmap.put(p.Product__c,p);
            }
            
            for(Product2 p2 : newList)
            {
                Product_Search__c p2s;
                if(psmap.containsKey(p2.id))
                {
                    p2s = psmap.get(p2.id);
                }
                else
                {
                    p2s = new Product_Search__c();
                }
                
                p2s.Name =  p2.Name;
                p2s.Product__c = p2.id;
                p2s.CurrencyIsoCode = p2.CurrencyIsoCode;
                pss.add(p2s);
            }
            System.debug('psssize' + pss.size());
            upsert(pss);  
        }else if(Trigger.isDelete)
       {
           for(Product2 en : newList)
           {
                 en.addError('此数据不能删除');
           }
       }
    }

    //PJ1新显微镜降类
    public static void checkProduct2Level(List<Product2> newList, Map<Id, Product2> newMap, List<Product2> oldList, Map<Id, Product2> oldMap) {
        //获取产品
        List<String> p2ids = new List<String>();
        for(Product2 p2 : newList){
            p2ids.add(p2.Id);
        }

        //查注册证的医疗器械分类,产品入库日期,生产日期,系统维护日。
        List<Product_Register_Link__c> pro2List = new List<Product_Register_Link__c>();
        if(p2ids.size()>0){
            pro2List = [select Id,Product2__r.demoteer_Sap__c,Product2__r.Diedatvanink__c,Product_Register__r.Stelsedag__c,Product_Register__r.MedPrdClass__c 
            from Product_Register_Link__c 
            where Product2__r.Id in : p2ids];
        }
        

        //根据Id存放产品所属的所有注册证下的器械分类。
        Map<Id,List<String>> pro2Map = new Map<Id,List<String>>();
        //存放注册证上最前的维护日
        Map<Id,Date> prSteMap = new Map<Id,Date>();
        if (pro2List.size()>0) {
            for (Product_Register_Link__c prl: pro2List) {
                if (pro2Map.containsKey(prl.Product2__r.Id)) {
                    pro2Map.get(prl.Product2__r.Id).add(prl.Product_Register__r.MedPrdClass__c);
                }else {
                    pro2Map.put(prl.Product2__r.Id, new List<String>());
                    pro2Map.get(prl.Product2__r.Id).add(prl.Product_Register__r.MedPrdClass__c);
                }
                if (prSteMap.containsKey(prl.Product2__r.Id)) {
                    if (prSteMap.get(prl.Product2__r.Id) > prl.Product_Register__r.Stelsedag__c) {
                        prSteMap.remove(prl.Product2__r.Id);
                        prSteMap.put(prl.Product2__r.Id,prl.Product_Register__r.Stelsedag__c);
                    }
                }else {
                    prSteMap.put(prl.Product2__r.Id,prl.Product_Register__r.Stelsedag__c);
                }
            }
        }
        System.debug('pro2Map='+pro2Map);
        System.debug('prSteMap='+prSteMap);

        //产品Id与等级类别
        Map<Id,String> prlMap = new Map<Id,String>();

        if (pro2Map.size()>0 && prSteMap.size()>0) {
            for (Product_Register_Link__c pr: pro2List) {
                //大在后小在前
                if (pro2Map.containsKey(pr.Product2__r.Id) && prSteMap.containsKey(pr.Product2__r.Id)) {
                    //生产日小于维护日,入库日小于维护日
                    if (pr.Product2__r.demoteer_Sap__c <= prSteMap.get(pr.Product2__r.Id) && 
                        pr.Product2__r.Diedatvanink__c <= prSteMap.get(pr.Product2__r.Id)) {
                        if (pro2Map.get(pr.Product2__r.Id).contains('1') || 
                            pro2Map.get(pr.Product2__r.Id).contains('2') || 
                            pro2Map.get(pr.Product2__r.Id).contains('3')) {
                            prlMap.put(pr.Product2__r.Id, '二类');
                        }else {
                            prlMap.put(pr.Product2__r.Id, '非监管');
                        }
                    }else {
                        //入库日大于维护日
                        if (pr.Product2__r.Diedatvanink__c > prSteMap.get(pr.Product2__r.Id)) {
                            //生产日大于维护日
                            if (pr.Product2__r.demoteer_Sap__c > prSteMap.get(pr.Product2__r.Id)) {
                                prlMap.put(pr.Product2__r.Id, '一类');
                            }else if (pr.Product2__r.demoteer_Sap__c < prSteMap.get(pr.Product2__r.Id)) {
                                //生产日小于维护日
                                if (pro2Map.get(pr.Product2__r.Id).contains('1')) {
                                    prlMap.put(pr.Product2__r.Id, '一类');
                                }else if (!pro2Map.get(pr.Product2__r.Id).contains('1') && 
                                          (pro2Map.get(pr.Product2__r.Id).contains('2') || 
                                           pro2Map.get(pr.Product2__r.Id).contains('3'))) {
                                    prlMap.put(pr.Product2__r.Id, '二类');
                                }else {
                                    prlMap.put(pr.Product2__r.Id, '非监管');
                                }
                            }
                        }
                    }
                }
            }
        }
        System.debug('prlMap='+prlMap);

        for (Product2 pr2: newList) {
            if (prlMap.containsKey(pr2.Id)) {
                pr2.Level_Category__c = prlMap.get(pr2.Id);
            }else {
                pr2.Level_Category__c = null;
            }
        }
    }
}