global class UpdateQuoteOtcodeBacth implements Database.Batchable<sObject> {
    //询价id
    String tempOppId ='';
    //参数 报价id
    String tempQuoId ='';
    //参数 otcode
    String otcode ='';
    //参数 产品id
    String proId ='';
    //价格手册id
    String tempPriceBookEntryId;
    public List<QELine> activities;
    public List<QELine> tmpactivities;
    public QELine active_activity;

    global UpdateQuoteOtcodeBacth() {

    }
    global UpdateQuoteOtcodeBacth(String tempQuoId,String otcode,String proId) {
        this.tempQuoId = tempQuoId;
        this.otcode = otcode;
        this.proId = proId;
    }

    global Database.QueryLocator start(Database.BatchableContext bc) {
        //查询  招投标标识 字段 为 true 的询价
        String query = 'SELECT Id,OpportunityId from quote ';

        if(String.isNotBlank(this.tempQuoId)){
            query += ' where Id = :tempQuoId';
        }
        query += ' limit 200 ';
        return Database.getQueryLocator(query);
    }
    global void execute(Database.BatchableContext BC, List<Quote> quoteList) {
        if(quoteList.size()>0){
            tempOppId = quoteList[0].OpportunityId;
        }
        List<PriceBookEntry> priceBookList = [SELECT Id, Product2Id, Product2.Id, Product2.Name FROM PriceBookEntry WHERE Product2Id=:proId and CurrencyIsoCode ='CNY'];
        if(priceBookList.size()>0){
            tempPriceBookEntryId = priceBookList[0].Id;
        }
        //clone报价行
        List<QuoteLineItem> QuoteLineItemCloneList = new List<QuoteLineItem>();
        //clone询价行
        List<OpportunityLineItem> OpportunityLineItemCloneList = new List<OpportunityLineItem>();

        if(otcode!=null &&proId!=null){
            //先检索报价行
            //develop console、batch不能执行
            //List<QuoteLineItem>  QuoteLineItemList= [select fields(all) from QuoteLineItem where Quoteid =:tempQuoId limit 200];
            List<QuoteLineItem> QuoteLineItemList =
            [Select id,Asset_Model_No__c,Product2Id, SFDA_Status__c, Name__c, BSS_Category__c,Qty_Unit__c, Cost__c, UnitPrice__c,UnitPrice, ListPrice__c, Quantity, PricebookEntryId, UnitPrice_Page__c,AgencyUnitPrice__c, AgencySubtotal__c, Present__c, multiYearWarranty__c , If_Cancel_Guarantee__c , GuaranteePeriod__c, ServicePrice__c , GuranteePrice__c, ProductEntend_gurantee_period_all__c,ProductGuranteePrice__c,  GuranteeType__c,warrantyType__c, productServicePrice__c, NoDiscountTotal__c, provistonPeriod__c, Maintenance_Price_Year__c,Quoteid  From QuoteLineItem where Quoteid =:tempQuoId Order by Item_Order__c, Id];
            // //由于ot code是公式文本，所以实际需要的是替换产品id
            // QuoteLineItemCloneList = QuoteLineItemList.clone();
            activities =new List<QELine>();
            if(QuoteLineItemList.size()>0){
                for(QuoteLineItem quote :QuoteLineItemList){
                    QELine c = new QELine(quote,otcode,proId,tempPriceBookEntryId);
                    System.debug('C::'+c);
                    activities.add(c);
                }
            }
            //报价行先删后增 start
            if(QuoteLineItemList.size()>0){
                delete QuoteLineItemList;
            }
            //报价行先删后增 end
            if(activities.size()>0){
                for(QELine  qe:activities){
                    //new 行项目
                    QuoteLineItem quo = new QuoteLineItem();
                    //复制报价行
                    quo = qe.pageObject;
                    //addlist
                    QuoteLineItemCloneList.add(quo);
                }
            }
            
            system.debug('QuoteLineItemCloneList:'+QuoteLineItemCloneList);
            //报价行先删后增 start
            if(QuoteLineItemCloneList.size()>0){
                insert QuoteLineItemCloneList;
            }
            //报价行先删后增 end

            //先检索报价行
            //develop console 、batch不能执行
            //List<OpportunityLineItem>  OpportunityLineItemList= [select fields(all) from OpportunityLineItem where Opportunityid =:tempOppId limit 200];
            List<OpportunityLineItem>  OpportunityLineItemList=[Select id,OpportunityId,Product2Id, Asset_Model_No__c, SFDA_Status__c, Name__c, ProductCode__c,Qty_Unit__c, Cost__c, ListPrice__c, Quantity, BSS_Category__c, TotalPrice,Product_Cost__c, Product_ListPrice__c,PricebookEntryId,UnitPrice__c, TotalPrice__c, AgencyUnitPrice__c, AgencySubtotal__c, Present__c, multiYearWarranty__c , If_Cancel_Guarantee__c , GuaranteePeriod__c,ServicePrice__c , GuranteePrice__c,ProductEntend_gurantee_period_all__c,ProductGuranteePrice__c, GuranteeType__c,warrantyType__c, productServicePrice__c,NoDiscountTotal__c, provistonPeriod__c, Maintenance_Price_Year__c From OpportunityLineItem Where OpportunityId =:tempOppId Order by Item_Order__c, Id];
            // //由于ot code是公式文本，所以实际需要的是替换产品id
            // OpportunityLineItemCloneList = OpportunityLineItemList.clone();
            //清空
            // activities.clear();
            activities =new List<QELine>();
            System.debug('最开始的：OpportunityLineItemList：'+OpportunityLineItemList);
            System.debug('最开始的数量：'+OpportunityLineItemList.size());
            if(OpportunityLineItemList.size()>0){
                for(OpportunityLineItem opp :OpportunityLineItemList){
                    QELine c = new QELine(opp,otcode,proId,tempPriceBookEntryId);
                    System.debug('C::'+c);
                    activities.add(c);
                }
            }
            //报价行先删后增 start
            if(OpportunityLineItemList.size()>0){
                delete OpportunityLineItemList;
            }
            system.debug('询价行的行数：'+activities.size());
            //报价行先删后增 end
            if(activities.size()>0){
                for(QELine  ql:activities){
                    //new 行项目
                    OpportunityLineItem oppli = new OpportunityLineItem();
                    //复制报价行
                    oppli = ql.pageOppObject;
                    //addlist
                    OpportunityLineItemCloneList.add(oppli);
                }
            }
            
            system.debug('OpportunityLineItemCloneList:'+OpportunityLineItemCloneList);
            //报价行先删后增 start
            if(OpportunityLineItemCloneList.size()>0){
                insert OpportunityLineItemCloneList;
            }
            
        }
        
    }
    global void finish(Database.BatchableContext BC) {

    }

    public class QELine {
        public String  Id;
        public String  Asset_Model_No;
        public String  Product2Id;
        public QuoteLineItem pageObject;
        public OpportunityLineItem pageOppObject;
        public String  SFDA_Status;
        public String  Name;
        public String  BSS_Category;
        public String  Qty_Unit;
        public Decimal  Cost;
        public Decimal  UnitPrice;
        public Decimal  ListPrice;
        public Decimal  Quantity;
        public String  PricebookEntryId;
        public Decimal  UnitPrice_Page;
        public Decimal  AgencyUnitPrice;
        public Decimal  AgencySubtotal;
        public Boolean  Present;
        public Boolean  multiYearWarranty;
        public Boolean  If_Cancel_Guarantee;
        public Decimal  GuaranteePeriod;
        public Decimal  ServicePrice;
        public Decimal  GuranteePrice;
        public Decimal  ProductEntend_gurantee_period_all;
        public Decimal  ProductGuranteePrice;
        public String  GuranteeType;
        public String  warrantyType;
        public Decimal  productServicePrice;
        public Decimal  NoDiscountTotal;
        public Decimal  provistonPeriod;
        public Decimal  Maintenance_Price_Year;
        public String  Quoteid;
        //报价行遍历
        public QELine(QuoteLineItem qli,String otcode,String proId,String tempPriceBookEntryId){
            this.pageObject = qli.clone();
            //insert 报价不需要id
            // this.Id  	=	qli.Id;
            this.Asset_Model_No    	=	qli.Asset_Model_No__c;
            //替换产品和价格手册
            if(qli.Asset_Model_No__c.equals(otcode)){
                this.pageObject.Product2Id=proId  ;
                this.pageObject.PricebookEntryId=tempPriceBookEntryId  ;
            }
            // else{
            //     this.Product2Id=qli.Product2Id  ;
            //     this.PricebookEntryId=qli.PricebookEntryId ;
            // }
            // this.Product2Id  	=	qli.Product2Id;
            // this.SFDA_Status    	=	qli.SFDA_Status__c;
            // this.Name    	=	qli.Name__c;
            // this.BSS_Category    	=	qli.BSS_Category__c;
            // this.Qty_Unit    	=	qli.Qty_Unit__c;
            // this.Cost    	=	qli.Cost__c;
            // this.UnitPrice    	=	qli.UnitPrice__c;
            // this.UnitPrice  	=	qli.UnitPrice;
            // this.ListPrice    	=	qli.ListPrice__c;
            // this.Quantity  	=	qli.Quantity;
            // this.PricebookEntryId  	=	qli.PricebookEntryId;
            // this.UnitPrice_Page    	=	qli.UnitPrice_Page__c;
            // this.AgencyUnitPrice    	=	qli.AgencyUnitPrice__c;
            // this.AgencySubtotal    	=	qli.AgencySubtotal__c;
            // this.Present    	=	qli.Present__c;
            // this.multiYearWarranty    	=	qli.multiYearWarranty__c;
            // this.If_Cancel_Guarantee    	=	qli.If_Cancel_Guarantee__c;
            // this.GuaranteePeriod    	=	qli.GuaranteePeriod__c;
            // this.ServicePrice    	=	qli.ServicePrice__c;
            // this.GuranteePrice    	=	qli.GuranteePrice__c;
            // this.ProductEntend_gurantee_period_all    	=	qli.ProductEntend_gurantee_period_all__c;
            // this.ProductGuranteePrice    	=	qli.ProductGuranteePrice__c;
            // this.GuranteeType    	=	qli.GuranteeType__c;
            // this.warrantyType    	=	qli.warrantyType__c;
            // this.productServicePrice    	=	qli.productServicePrice__c;
            // this.NoDiscountTotal    	=	qli.NoDiscountTotal__c;
            // this.provistonPeriod    	=	qli.provistonPeriod__c;
            // this.Maintenance_Price_Year    	=	qli.Maintenance_Price_Year__c;
            // this.Quoteid	=	qli.Quoteid;
        }
        //询价行遍历
        public QELine(OpportunityLineItem oli,String otcode,String proId,String tempPriceBookEntryId){
            this.pageOppObject = oli.clone();
            //insert 报价不需要id
            // this.Id  	=	qli.Id;
            this.Asset_Model_No    	=	oli.Asset_Model_No__c;
            //替换产品和价格手册
            if(oli.Asset_Model_No__c.equals(otcode)){
                this.pageOppObject.Product2Id=proId ;
                this.pageOppObject.PricebookEntryId=tempPriceBookEntryId  ;
            }
        }

    }

}