// FIXME 見積もり商品の Asset_Model_No__c ですが、数式になっています。トランザクションデータとして、項目を持つべきかと思います。by katsu 20130216
// 商談商品のId__c を PricebookEntry.Product2Idに変更すべき
// 見積もり可否 ですが、保存時みていますが、Sales_Possibilityを見ないですか？いいえ、js側で見ています
public  with sharing class SI_NewQuoteEntryController {
    public Integer quoteEntryMaxLine { get; private set; }
    public Id oppId { get; set; }
    public Id quoId { get; set; }
    public Boolean productStatusUpdated { get; set; }               // 状態更新、{!$Label.Status_Update} を押下したかどうか
    public Boolean changedAfterPrint { get; set; }                  // true の場合、画面に confirm メッセージが表示します。quoIdを新しいinsert。判定はjsにて実施
    public Boolean changedAfterBid { get; set; }                    // true の場合、画面に confirm メッセージが表示します。quoIdを新しいinsert。判定はjsにで実施
    //public Id qlistId { get; set; }

    //lastbuy  2022/2/9 fy start
    public Boolean filg { get; set; }
    public Integer flglastbuy { get; set; }
    public String errorProductmodel { get; set; }
    //lastbuy  2022/2/9 fy end

    public String excel_text { get; set; }
    public Integer select_index { get; set; }                       // excelImport専用ですが、jsにて制御することになるので、TODO katsu 削除予定
    public String Product_text { get; set; }
    public String setProduct_text { get; set; }

    public List<QELine> activities { get; set; }
    public List<QELine> tmpactivities { get; set; }
    public QELine active_activity { get; set; }
    public OppInfo oppInfo { get; set; }
    //用于检查询价报价具体产品状态是否变更
    public List<QuoteLineItem> CheckItem {get;set;}
    //値引き
    public Decimal DisCalculation { get; set; }
    public Decimal DisAmount { get; set; }

    //第一販売店
    //public String SalesName1 { get; set; }
    public String SalesShopClass1 { get; set; }
    //public Decimal SalesAmount1 { get; set; }
    public Decimal Salesprofit1 { get; set; }
    public Decimal SalesCalculation1 { get; set; }
    public String SalesId1 { get; set; }
     // 2018/09/29 CHAN-B4YAB8 经销商折扣 start
    public Decimal AgencyDiscount { get; set; }
    //第二販売店
    //public String SalesName2 { get; set; }
    public String SalesShopClass2 { get; set; }
    //public Decimal SalesAmount2 { get; set; }
    public Decimal Salesprofit2 { get; set; }
    public Decimal SalesCalculation2 { get; set; }
    public String SalesId2 { get; set; }
    //病院マスタ選択リスト
    public String selection_hp { get; set; }
    public List<SelectOption> options_hp { get; set; }
    //画面制御判定用
    public Boolean displayCost { get; set; }
    //public Boolean enableEntry { get; set; }
    public Boolean enableSales { get; set; }
    public Boolean specialAuthority { get; set; }
    public Boolean verified { get; set; }
    public Boolean QuoteDecision { get; set; }
    // SI业务系统流程改善和提升项目2019-10-28 by vivek start
    public Boolean QuoteBusiness { get; set; }
    public String Configuration_Suggestion { get; set; }
    public String Configuration_Suggestion_Feedback { get; set; }
    public Integer Save_button1 { get; set; }
    // public boolean ConfigurationSuggestionIsNull { get; set; }
    // public Boolean ConfigurationSuggestions { get; set; }
    // SI业务系统流程改善和提升项目2019-10-28 by vivek end
    public Boolean QuoteSapSented { get; set; }
    public Boolean QuoteCorrect { get; set; }
    //public Boolean salesEntry { get; set; }
    public Boolean enableContract { get; set; }
    //ボタン制御用
    public Boolean print_button { get; set; }
    public Boolean sap_button { get; set; }
    public Boolean Decision_button { get; set; }
    public Boolean Save_button { get; set; }
    public Boolean WinOrDecideAlert{get;set;}

    //********************Insert [SI询价-产品配套] [20160315] [赵德芳] Start********************//
    public String oppoidforCSV{Set;get;}
    public boolean DecideFunc   { get; set; }
    public boolean UnConfirmQuote{Set;get;}
    public String ProfileIDStr {set;get;}
    public id quoteOwner {Set;get;}
    //********************Insert [SI询价-产品配套] [20160315] [赵德芳] End**********************//

    // 多年保修 start
    public string trade {get; private set;}
    public string quoteGurantee_Period;
    public string quotemultiYearWarranty;
    // 多年保修 end
  //报价试算 判断经销商是否变化 start
  public string agency1Name;
  public string agency2Name;
  //报价试算 判断经销商是否变化 end
    public Boolean getHiddenSaveBtn() {
        Boolean rtn = quo.Cancel_Decide__c;
        Schema.DescribeSObjectResult quoteDesc = Quote.SObjectType.getDescribe();
        rtn = (rtn == false) ? !quoteDesc.isUpdateable() : rtn;
        return rtn;
    }
    //見積調整金額
    //public Decimal QuoAmount { get; set; }
    //public Decimal QuoCalculation { get; set; }
    //見積
    public Pricebook2 standardPricebook;                // 画面上使わないため、get setなし
    public Quote quo { get; set; }
    public Decimal quoStocking_Price_c { get; set; }

    //Get Opportunity Object
    public Opportunity opp;

    private Map<Id, Product2> prd2LatestValMap;

    public boolean errorflg { get; set; }
    public String errorMessage { get; set; }
    public String errorMessagechack { get; set; }
    public String baseUrl { get; set; }
    public boolean Messageflg { get; set; }
    public String Message { get; set; }
    public Boolean viewSpecialAgencyAmout { get; set; }
    public Boolean displayFlg { get; set; }
    public QuoteBean qb { get; set; }
    public Integer rowIdx { get; set; }

    public SI_NewQuoteEntryController() {
        quoteEntryMaxLine = Integer.valueOf(System.Label.QuoteEntryMaxLine2);
        //Apexpages.currentPage().getHeaders().put('X-UA-Compatible', 'IE=8');
        baseUrl = URL.getSalesforceBaseUrl().toExternalForm();
        changedAfterPrint = false;
        changedAfterBid = false;
        productStatusUpdated = false;
    }

    public SI_NewQuoteEntryController(ApexPages.StandardController controller) {
        this();
    }

    public PageReference init() {

        system.debug('============start init==============');
    //********************Insert [SI询价-产品配套] [20160315] [赵德芳] Start********************//
        UnConfirmQuote = false;
    //********************Insert [SI询价-产品配套] [20160315] [赵德芳] END**********************//
        boolean quoteflg = true;
        WinOrDecideAlert = false;
        errorflg = false;
        displayFlg = true;

        //Quote
        standardPricebook = ControllerUtil.getStandardPricebook();
        quo = new Quote();
        qb = new QuoteBean();
        //Opportunityid
        if (oppId==null) {
            oppId = System.currentPageReference().getParameters().get('oppid');
            if (oppId==Null) {
                quoId = System.currentPageReference().getParameters().get('id');

                List<Quote> ql = New List<Quote>();
                //添加行
                ql = [select Id,OpportunityId,LineItemCount From Quote Where Id =:quoId];
                if (ql.size()>0) {
                    oppId = ql[0].OpportunityId;
                    //添加行
                    if(ql[0].LineItemCount >quoteEntryMaxLine){
                        quoteEntryMaxLine = ql[0].LineItemCount;
                    }
                 }
            } else {
                quoId = System.currentPageReference().getParameters().get('copyid');
                if (quoId != null) {
                    // コピーのデータが後で作成する
                } else {
                    List<Quote> ql = New List<Quote>();
                    //添加行
                    ql = [select Id,OpportunityId,LineItemCount From Quote Where OpportunityId =:oppId];
                    if (ql.size()>0) {
                    //添加行
                    if(ql[0].LineItemCount >quoteEntryMaxLine){
                        quoteEntryMaxLine = ql[0].LineItemCount;
                    }
                        quoteflg = true;
                    } else {
                        quoteflg = false;
                    }
                }
            }
        }
        //--User
        List<User> us = New List<User>();
        String userid = UserInfo.getUserId();
        if (userid!=null) {
            us=[Select Quote_Correct__c,Quote_Special_Operation__c,Cost_Referable__c,
                        ViewSpecialAgencyAmout__c,Profileid From User Where Id =:userid];
            if (us.size()>0) {
    //********************Insert [SI询价-产品配套] [20160315] [赵德芳] Start********************//
                ProfileIDStr = us[0].Profileid;
    //********************Insert [SI询价-产品配套] [20160315] [赵德芳] END**********************//
                verified = us[0].Quote_Correct__c;
                specialAuthority = us[0].Quote_Special_Operation__c;
                displayCost = us[0].Cost_Referable__c;
                viewSpecialAgencyAmout = us[0].ViewSpecialAgencyAmout__c;
            }
        }
        //--Opportunity
        List<Opportunity> oppList = New List<Opportunity>();
        String accountid;

        oppList = [SELECT Account.Name,BusinessFileArchived__c,Account.RecordType.DeveloperName,Opportunity_sub_owner__c,
                    CLBIC_Category__c,HP_Name__c,Name,CurrencyIsoCode,Wholesale_Price__c,Department_Name__c,
                    Direct_Separate__c,Trade__c,AccountId,New_Opportunity__c,Estimation_Decision__c,SAP_Send_OK__c,Sales_Root__c,
                    Agency1__c,Agency2__c,Stocking_Price__c,Purchasing_Cost__c,Opportunity_No__c,StageName,
                    Agency1__r.Special__c,Agency2__r.Special__c,Account.Parent.Special__c
                    // LHJ Start
                    , Authorized_DB_No__c, Authorized_Finish_Sales__c, If_Need_Authorize__c
                    // LHJ End
                    // 多年保修 start
                    , Gurantee_Period__c , multiYearWarranty__c, MultiYearWarrantyTotalPrice__c
                    // 多年保修 end
                    // SI业务系统流程改善和提升项目2019-10-28 by vivek start
                    ,Configuration_Suggestion__c , Configuration_Suggestion_Feedback__c
                    // SI业务系统流程改善和提升项目2019-10-28 by vivek end
                    FROM Opportunity Where Id = :oppId];
        // 多年保修 start
        trade = '外貿';
        // 多年保修 end
        if (oppList.size() > 0) {

            opp = oppList[0];
            // 多年保修 start
            trade = opp.Trade__c;
            // 多年保修 end
            // SI业务系统流程改善和提升项目2019-10-28 by vivek start
            QuoteBusiness = opp.BusinessFileArchived__c;
            Configuration_Suggestion = opp.Configuration_Suggestion__c;
            Configuration_Suggestion_Feedback = opp.Configuration_Suggestion_Feedback__c;
            // SI业务系统流程改善和提升项目2019-10-28 by vivek end
            QuoteDecision = opp.Estimation_Decision__c;
            QuoteSapSented = opp.SAP_Send_OK__c;
            QuoteCorrect = opp.New_Opportunity__c;

            enableSales = false;
            if (opp.Sales_Root__c!=null) {
                if (opp.Sales_Root__c=='販売店') {
                    enableSales = true;
                    opp.Sales_Root__c = System.Label.Sales_Outlet;
                } else {
                    enableSales = false;
                    opp.Sales_Root__c = System.Label.OCM_Direct;
                }
            }

            accountid = opp.AccountId;

            if (QuoteDecision==true) {
                enableContract = true;
            } else {
                enableContract = false;
            }

            oppInfo = new OppInfo(opp);

            if (opp.SAP_Send_OK__c == false) {
                displayFlg = true;
            } else {
                if (opp.Agency1__r.Special__c || opp.Agency1__r.Special__c || opp.Account.Parent.Special__c) {
                    // 特別販売店の引合い
                    if (viewSpecialAgencyAmout) {
                        displayFlg = true;
                    } else {
                        displayFlg = false;
                    }
                } else {
                    displayFlg = true;
                }
            }
        }

        //Quote
        Integer i;
        if (quoId==null) {
            quoId = System.currentPageReference().getParameters().get('id');
        }
        if (quoId==null) {
            if (quoteflg == false) {

                //商談商品が存在、見積が存在しないデータの対応
                List<OpportunityLineItem> items = New List<OpportunityLineItem>();
                if (oppId==null) {
                    oppId = System.currentPageReference().getParameters().get('oppid');
                }

                items = [Select Id,Asset_Model_No__c,SFDA_Status__c,Name__c,ProductCode__c,PricebookEntry.Product2.StorageStatus__c,
                        //增加字段,不可取消多年保 精琢技术 wql 2020/09/10 start
                        Qty_Unit__c,Cost__c,UnitPrice,ListPrice__c,Quantity,BSS_Category__c,TotalPrice,PricebookEntry.Product2.VenderName__c,PricebookEntry.Product2.CanNotCancelledGurantee__c,
                        //增加字段,不可取消多年保 精琢技术 wql 2020/09/10 end
                        PricebookEntry.Product2.SFDA_Status__c, Product_Cost__c, Product_ListPrice__c, PricebookEntry.Product2.Sales_Possibility__c, PricebookEntry.Product2.Name,
                        PricebookEntryId, PricebookEntry.Product2Id, Opportunity.Trade__c, PricebookEntry.Product2.Intra_Trade_List_RMB__c, PricebookEntry.Product2.Intra_Trade_Cost_RMB__c,
                        PricebookEntry.Product2.Foreign_Trade_List_US__c,PricebookEntry.Product2.Packing_list_manual__c,PricebookEntry.Product2.Foreign_Trade_Cost_US__c,UnitPrice__c,TotalPrice__c
                        ,AgencyUnitPrice__c,AgencySubtotal__c,Present__c // CHAN-B4YAB8 2018/09/29 业务机会产品的赠送、经销商小计、单价
                        //多年保修 start
                        , 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
                        , PricebookEntry.Product2.Entend_gurantee_period_all__c
                        //, PricebookEntry.Product2.Foreign_Trade_Gurantee_US__c
                        , PricebookEntry.Product2.Intra_Trade_Gurantee_RMB__c
                        , PricebookEntry.Product2.Intra_Trade_Service_RMB__c
                        , PricebookEntry.Product2.GuranteeType__c
                         // 维修合同报价
                         ,PricebookEntry.Product2.Maintenance_Price_Year__c
                         ,Maintenance_Price_Year__c
                        //多年保修 end
                         //外贸多年保 2021/01/27 精琢技术 wql start
                         //维修合同报价（USD）
                         ,PricebookEntry.Product2.Repair_Contract_USD__c
                         //计提金额（不含税，USD）
                         ,PricebookEntry.Product2.Intra_Trade_Foreign_RMB__c
                         //NoDiscount 金额（USD）
                         ,PricebookEntry.Product2.NoDiscount_Foreign__c
                         //外贸多年保 2021/01/27 精琢技术 wql end

                         //SFDC停止预警 lt 20211009 start
                         ,PricebookEntry.Product2.Estimated_ConsumptionDueDate__c
                         //SFDC停止预警 lt 20211009 end

                        From OpportunityLineItem Where OpportunityId =:oppId Order by Item_Order__c, Id];

                if (items.size()>0) {
                    activities = new List<QELine>();
                    i=0;

                    for (OpportunityLineItem o:items) {
                        QELine c = new QELine(o,i);
                        activities.add(c);
                        i++;
                    }
                    for (integer j=i;j<quoteEntryMaxLine;j++) {
                        QELine c = new QELine(j);
                        activities.add(c);
                    }

                } else {
                    //新規リストコントローラの取得
                    if (activities==null) {
                        activities = new List<QELine>();
                        for (i=0;i<quoteEntryMaxLine;i++) {
                            QELine active_activity = new QELine(i);
                            activities.add(active_activity);
                        }
                    }
                }
            } else {
                //新規リストコントローラの取得
                if (activities==null) {
                    activities = new List<QELine>();
                    for (i=0;i<quoteEntryMaxLine;i++) {
                        QELine active_activity = new QELine(i);
                        activities.add(active_activity);
                    }
                }
            }
        } else {
            //添加行
            List<Quote> quoList =
                [ SELECT Id,Name,Cancel_Decide__c,CreatedDate, PriceRefreshDate__c,Quote_Print_Date__c,
                        Dealer_Final_Price__c,TotalPrice__c,Estimation_List_Price__c,QuoteNumber,
                        CreatedByid,Queto_Confirm_Date__c,
                        QuoteToName,Quote_Expiration_Date__c,Quote_Comment__c,Stocking_Price__c,Unit_Price__c,
                        Offer_Amount__c,TOTAL__c,Discount__c,Pricing__c,Preferential_Trading_Price__c,Contract__c,
                        Agency1__c,OCM_Agent1_Price__c,Agency1_Profit__c,Agency1_Profit_Rate__c,Print_HP_Name__c,
                        Agency2__c,Agent1_Agent2_Price__c,Agency2_Profit__c,Agency2_Profit_Rate__c,Quote_No__c,
                        Quote_Adjust_Amount__c,Quote_Adjust_Calculate__c,Discount_Amount__c,Discount_Amount_Calculate__c,Installation_location__c,
                        QuoteTotal_Page__c,Dealer_Final_Price_Page__c,Quote_Adjust_Amount_Page__c,OCM_Agent1_Price_Page__c,Agent1_Agent2_Price_Page__c
                        ,AgencyDiscount__c //  2018/09/28 CHAN-B4YAB8 经销商折扣
                        //  多年保修 start
                        , Gurantee_Period__c , multiYearWarranty__c, MultiYearWarrantyTotalPrice__c
                        ,Preferential_Gurantee_Period__c
                        // 多年保修 end
                        ,LineItemCount 
			            //报价试算 start
                        ,IsQuoteTrial__c  
                        //报价试算 end

                        FROM Quote Where Id =:quoId];
            List<QuoteLineItem> items =
                [Select Id,Asset_Model_No__c,SFDA_Status__c,Product_Sales_Possibility__c,
                    Name__c,BSS_Category__c,Quote.Quote_Print_Date__c,
                    //不可取消多年保
                    PricebookEntry.Product2.VenderName__c,PricebookEntry.Product2.CanNotCancelledGurantee__c,ProductSetName__c,
                    Qty_Unit__c,Cost__c,UnitPrice__c,ListPrice__c,Quantity,TotalPrice__c,
                    PricebookEntry.Product2.SFDA_Status__c, ProductCode__c, Product_Cost__c, Product_ListPrice__c, PricebookEntry.Product2.Sales_Possibility__c, PricebookEntry.Product2.Name,
                    PricebookEntryId, PricebookEntry.Product2Id,UnitPrice_Page__c,PricebookEntry.Product2.Packing_list_manual__c,PricebookEntry.Product2.StorageStatus__c
                     ,AgencyUnitPrice__c, AgencySubtotal__c, Present__c // CHAN-B4YAB8 2018/9/29 赠送、经销商单价和小计
                    //  多年保修 start
                     , 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
                     , PricebookEntry.Product2.Entend_gurantee_period_all__c
                     , PricebookEntry.Product2.Intra_Trade_Gurantee_RMB__c
                     , PricebookEntry.Product2.Intra_Trade_Service_RMB__c
                     , PricebookEntry.Product2.GuranteeType__c
                     // 维修合同报价
                    , PricebookEntry.Product2.Maintenance_Price_Year__c
                    ,Maintenance_Price_Year__c
                     // 多年保修 end
                    //外贸多年保 2021/01/27 精琢技术 wql start
                    //维修合同报价（USD）
                    ,PricebookEntry.Product2.Repair_Contract_USD__c
                    //计提金额（不含税，USD）
                    ,PricebookEntry.Product2.Intra_Trade_Foreign_RMB__c
                    //NoDiscount 金额（USD）
                    ,PricebookEntry.Product2.NoDiscount_Foreign__c 
                    ,Quote.Opportunity.Trade__c 
                    //外贸多年保 2021/01/27 精琢技术 wql end
                    //fy 预留产品标识
                    ,PricebookEntry.Product2.LastbuyProductFLG__c
                    //SFDC停止预警 lt 20211009 start
                    ,PricebookEntry.Product2.Estimated_ConsumptionDueDate__c
                    //SFDC停止预警 lt 20211009 end

                    From QuoteLineItem where Quoteid = :quoId Order by Item_Order__c, Id];
            String copyQuoId = System.currentPageReference().getParameters().get('copyid');
            CheckItem = items;

            if (copyQuoId == null) {
                    quo = quoList[0];
                    quoteOwner = quo.CreatedByid;
                    //SWAG-C5DBAL  【委托】 [紧急]SI询价肖寒无法修改报价单  精琢技术  2021/07/30 start
                    //注释原逻辑
                    if(quo.Queto_Confirm_Date__c != null ||
                    (quo.Queto_Confirm_Date__c == null && (ProfileIDStr == System.Label.SI_2M3_ID||ProfileIDStr == System.Label.ProfileId_SystemAdmin||quo.CreatedByid == UserInfo.getUserId()))){//2M3_SI部门担当,标签设置
                    //SWAG-C5DBAL  【委托】 [紧急]SI询价肖寒无法修改报价单  精琢技术  2021/07/30 end
                    // if(quo.Queto_Confirm_Date__c != null ||
                    //         (quo.Queto_Confirm_Date__c == null && (ProfileIDStr == System.Label.ProfileId_SystemAdmin||quo.CreatedByid == UserInfo.getUserId()))){//2M3_SI部门担当,标签设置
                        quo.QuoteName__c = quo.Name;
                        if(quo.Queto_Confirm_Date__c == null){
                            UnConfirmQuote = true;
                        }else if(quo.Queto_Confirm_Date__c != null){
                        }else{
                            Messageflg = true;
                            Message = '请及时确认报价';
                        }

                    }else{
                        quo = new Quote();
                        //增加对是否确认报价的验证
                        errorflg =true;
                        UnConfirmQuote = false;
                        errorMessage = '该报价尚未确认，不能查看';
                        return null;
                        //增加对是否确认报价的验证
                    }
            } else {
                // copyの場合、quoIdをnullに戻す
                quoId = null;
            }
            if (quoList.size() > 0) {
                //添加行
                if(quoList[0].LineItemCount >quoteEntryMaxLine){
                    quoteEntryMaxLine = quoList[0].LineItemCount;
                }
                if (copyQuoId == null) {
                    quo = quoList[0];
                    quo.QuoteName__c = quo.Name;
                    // 多年保修 start
                    quoteGurantee_Period = quo.Gurantee_Period__c;
                    quotemultiYearWarranty = '' + quo.multiYearWarranty__c;
                    // 多年保修 end
          	    //报价试算 增加经销商前后对比 wql 20210508 start
          	    agency1Name = quo.Agency1__c;
          	    agency2Name = quo.Agency2__c;
          	    //报价试算 增加经销商前后对比 wql 20210508 end
                    // 多年保修 start
                    quo.Gurantee_Period__c              = quoList[0].Gurantee_Period__c;
                    quo.multiYearWarranty__c            = quoList[0].multiYearWarranty__c;
                    quo.MultiYearWarrantyTotalPrice__c  = quoList[0].MultiYearWarrantyTotalPrice__c;
                    // 多年保修 end
                    qb.setPriceRefreshPeriodByDate(quo.PriceRefreshDate__c == null ? quo.CreatedDate.Date() : quo.PriceRefreshDate__c);
                    qb.Estimation_List_Price = quo.Estimation_List_Price__c;
                    quo.QuoteTotal_Page__c = quo.TotalPrice__c;
                    quo.Dealer_Final_Price_Page__c = quo.Dealer_Final_Price__c;
                    qb.Quote_Adjust_Calculate = quo.Quote_Adjust_Calculate__c;
                    quo.Quote_Adjust_Amount_Page__c = quo.Quote_Adjust_Amount__c;
                    DisCalculation = quo.Discount_Amount_Calculate__c;
                    DisAmount = quo.Discount_Amount__c;
                    quo.Agency1__c = quo.Agency1__c;
                    AgencyDiscount = quo.AgencyDiscount__c; //2018/09/28 CHAN-B4YAB8 经销商折扣
                    quo.OCM_Agent1_Price_Page__c = quo.OCM_Agent1_Price__c;
                    Salesprofit1 = quo.Agency1_Profit__c;
                    qb.SalesCalculation1 = quo.Agency1_Profit_Rate__c;
    //                quo.Agency1_Profit_Rate__c = quo.Agency1_Profit_Rate__c;
                    quo.Agency2__c = quo.Agency2__c;
                    quo.Agent1_Agent2_Price_Page__c = quo.Agent1_Agent2_Price__c;
                    Salesprofit2 = quo.Agency2_Profit__c;
                    qb.SalesCalculation2 = quo.Agency2_Profit_Rate__c;
                    //HWAG-BLDE6J   带出字段 2020/02/10 end
                } else {
                    //HWAG-BLDE6J   带出字段 2020/02/11 start
                    quo = quoList[0];
                    //报价名称
                    quo.QuoteName__c = quo.Name;
                    quo.Cancel_Decide__c =quo.Cancel_Decide__c ;
                    quo.Cancel_Decide__c = false;
                    // quo.QuoteName__c = '';
                    quo.PriceRefreshDate__c = Date.today();
                    quo.Quote_Date__c = null;
                    quo.Quote_Print_Date__c = null;

                     //报价总额
                    quo.QuoteTotal_Page__c = quo.TotalPrice__c;
                    //第一经销商
                    quo.OCM_Agent1_Price_Page__c = quo.OCM_Agent1_Price__c;
                    //第二经销商
                    quo.Agent1_Agent2_Price_Page__c = quo.Agent1_Agent2_Price__c;
                    //医院的合同金额
                    quo.Dealer_Final_Price_Page__c = quo.Dealer_Final_Price__c;
                    //HWAG-BLDE6J   带出字段 2020/02/11 end
                }
                // 多年保修 start
//                 quo.Gurantee_Period__c              = quoList[0].Gurantee_Period__c;
//                 quo.multiYearWarranty__c            = quoList[0].multiYearWarranty__c;
//                 quo.MultiYearWarrantyTotalPrice__c  = quoList[0].MultiYearWarrantyTotalPrice__c;
//                 // 多年保修 end
//                 qb.setPriceRefreshPeriodByDate(quo.PriceRefreshDate__c == null ? quo.CreatedDate.Date() : quo.PriceRefreshDate__c);
//                 qb.Estimation_List_Price = quo.Estimation_List_Price__c;
//                 quo.QuoteTotal_Page__c = quo.TotalPrice__c;
//                 quo.Dealer_Final_Price_Page__c = quo.Dealer_Final_Price__c;
//                 qb.Quote_Adjust_Calculate = quo.Quote_Adjust_Calculate__c;
//                 quo.Quote_Adjust_Amount_Page__c = quo.Quote_Adjust_Amount__c;
//                 DisCalculation = quo.Discount_Amount_Calculate__c;
//                 DisAmount = quo.Discount_Amount__c;
//                 quo.Agency1__c = quo.Agency1__c;
//                 AgencyDiscount = quo.AgencyDiscount__c; //2018/09/28 CHAN-B4YAB8 经销商折扣
//                 quo.OCM_Agent1_Price_Page__c = quo.OCM_Agent1_Price__c;
//                 Salesprofit1 = quo.Agency1_Profit__c;
//                 qb.SalesCalculation1 = quo.Agency1_Profit_Rate__c;
// //                quo.Agency1_Profit_Rate__c = quo.Agency1_Profit_Rate__c;
//                 quo.Agency2__c = quo.Agency2__c;
//                 quo.Agent1_Agent2_Price_Page__c = quo.Agent1_Agent2_Price__c;
//                 Salesprofit2 = quo.Agency2_Profit__c;
//                 qb.SalesCalculation2 = quo.Agency2_Profit_Rate__c;
//                quo.Agency2_Profit_Rate__c = quo.Agency2_Profit_Rate__c;
            }

            activities = new List<QELine>();
            i=0;
            QELine c = new QELine(i);
            if (items.size()>0) {
                for (QuoteLineItem o:items) {
                    c = new QELine(o,i,copyQuoId);
                    activities.add(c);
                    i++;
                }

                for (integer j=i;j<quoteEntryMaxLine;j++) {
                    c = new QELine(j);
                    activities.add(c);
                }

            } else {
                activities = new List<QELine>();
                for (i=0;i<quoteEntryMaxLine;i++) {
                    QELine active_activity = new QELine(i);
                    activities.add(active_activity);
                }
            }
            //******************************************************************************************
            //            增加检测产品状态是否发生变化
            //******************************************************************************************
            List<String> product2Ids = New List<String>();
            if (activities.size()>0) {
                for (QELine a:activities){
                    if (String.isBlank(a.PageObject.Id__c) == false) {
                        product2Ids.add(a.PageObject.Id__c);
                    }
                }
            }
            Map<String,String> loopMap = new Map<String,String>();
            if(CheckItem.size()>0){
                for(QuoteLineItem qli : CheckItem){
                    loopMap.put(qli.PricebookEntry.Product2Id,qli.SFDA_Status__c);
                }
            }
            // ここを修正したら、NFM007.triggerも要確認
            prd2LatestValMap = new Map<Id, Product2>();
            if(CheckItem.size()>0){
                List<Product2> plo  =
                [Select Id, Estimation_Entry_Possibility__c, SFDA_Status__c,Packing_list_manual__c
                    // 多年保修 start
                    , Intra_Trade_Gurantee_RMB__c,
                    Intra_Trade_Service_RMB__c
                    // 多年保修 end
                From Product2 Where Id IN :product2Ids];
                if(plo.size()>0){
                    for (Product2 prd2: plo ) {
                        if(prd2.SFDA_Status__c != loopMap.get(prd2.Id)){
                            WinOrDecideAlert = true;
                            system.debug('WinOrDecideAlert:::::::1'+WinOrDecideAlert );
                        }

                    }
                }

            }
            system.debug('WinOrDecideAlert:::::::2'+WinOrDecideAlert );
            //******************************************************************************************
            //            增加检测产品状态是否发生变化==================End 20161115 by ZDF
            //******************************************************************************************
        }
        // 多年保修 start
        if (quo.Gurantee_Period__c == null) {
            quo.Gurantee_Period__c = '1';
        }

        // 多年保修 end
        //初期値設定
        if (accountid!=null) {
            List<Account> accs2=[Select Id, RecordType.DeveloperName, Hospital__c, Agent_Ref__c From Account Where Id =:accountid];
            if (accs2.size()>0) {
                List<Account> accs = new List<Account>();
                if (accs2[0].RecordType.DeveloperName != 'AgencyContract') {
                    accs=[Select Id,Name,Site,Alias_Name2__c From Account Where Id =:accs2[0].Hospital__c];
                } else {
                    accs=[Select Id,Name,Site,Alias_Name2__c From Account Where Id =:accs2[0].Agent_Ref__c];
                }
                if (accs.size() > 0) {
                    options_hp = new List<SelectOption>();
                    if (accs[0].Name!=null) {
                        options_hp.add(new SelectOption(accs[0].Name,accs[0].Name));
                    }
                    if (accs[0].Site!=null) {
                        options_hp.add(new SelectOption(accs[0].Site,accs[0].Site));
                    }
                    if (accs[0].Alias_Name2__c!=null) {
                        options_hp.add(new SelectOption(accs[0].Alias_Name2__c,accs[0].Alias_Name2__c));
                    }
                    //初期値設定
                    if (quo.Print_HP_Name__c==null) {
                        selection_hp = accs[0].Name;
                    } else {
                        selection_hp = quo.Print_HP_Name__c;
                    }
                }
            }
        }

        if (quo.Quote_Expiration_Date__c==null) {
            quo.Quote_Expiration_Date__c = Date.today() + 30;
        }

        //--Printbutton
        if (QuoteCorrect==false) {
            print_button = true;
        } else if (verified==false) {
            print_button = true;
        } else {
            print_button = false;
        }
        //--SAPButton
        if (QuoteDecision==false) {
            sap_button = true;
        } else if (specialAuthority==false) {
            sap_button = true;
        } else {
            sap_button = false;
        }
        //--Decisionbutton
        if (verified==true) {
            Decision_button =false;
        } else if (QuoteCorrect==false) {
            Decision_button = true;
        } else if (QuoteDecision==true) {
            Decision_button = true;
        } else {
            Decision_button = false;
        }
        // もし、すでに決定ずみの場合、決定ボタンをつかえないようにする
        if (QuoteSapSented == true || QuoteDecision == true) {
            Decision_button = true;
        }
        //--Savebutton
        if (QuoteDecision==true) {
            Save_button=true;
        } else {
            Save_button=false;
        }
        //vivek --save button1
        Save_button1 = 0;
        if(Configuration_Suggestion == null && Configuration_Suggestion_Feedback == null && QuoteBusiness == false){
            Save_button1 = 111;
        }
        if(Configuration_Suggestion == '有建议' && Configuration_Suggestion_Feedback == null && QuoteBusiness == false){
            Save_button1 = 211;
        }
        if(Configuration_Suggestion == '有建议' && Configuration_Suggestion_Feedback != null && QuoteBusiness == false){
            Save_button1 = 221;
        }
        if(Configuration_Suggestion == null && Configuration_Suggestion_Feedback == null && QuoteBusiness == true){
            Save_button1 = 112;
        }
        if(Configuration_Suggestion == '有建议' && Configuration_Suggestion_Feedback == null && QuoteBusiness == true){
            Save_button1 = 212;
        }
        // if(Configuration_Suggestion == null){
        //     Save_button1 = 2;
        // }
        if(Configuration_Suggestion == '无建议' && QuoteBusiness == false){
            Save_button1 = 1;
        }
        // vivek end
        system.debug('初始化时的集合：'+activities);
        return null;
     }


    //Search Events============================================================
    // TODO ManualEntryと同様、jsにて解決できる、ここでwebserviceだけを実装、今後 by katsu
    public PageReference setProductEntry() {
        system.debug('-----:start');
        system.debug('○○○○○○○○○○○○○○○Welcome to setProductEntry!!');
        system.debug('▼▼▼▼▼setProduct_text:' + setProduct_text);
        setOppFromOppInfo();
        //********************Insert [SI询价-产品配套] [20160315] [赵德芳] Start********************//
        List<String> productIDLIST = new List<String>();
        //********************Insert [SI询价-产品配套] [20160315] [赵德芳] END********************//
        //既存データ数の確認
        Integer currentDetailNumber = 0;
        for (QELine s:activities) {
            //データ判定にAsset_Model_Noを使用
            if ((s.Asset_Model==null) || (s.Asset_Model=='')) {
                break;
            }
            currentDetailNumber++;
        }

        //既存データ数が150以上？
        if (currentDetailNumber >= quoteEntryMaxLine) {
            //添加行
            errorflg = true;
            errormessage = System.Label.Error_Message32;
            PageArrange();
        system.debug('-----:強制終了:00');
            return null;
        }

        // SearchSetProductから、セット品コードは渡ってきたか？
        if (setProduct_text == null) {
            // セット品コードが渡ってこなかった場合
            // 終了
            PageArrange();
        system.debug('-----:強制終了:01');
            return null;
        }else{
            productIDLIST = setProduct_text.split(',');
        }

        // セット品明細の ProductId一覧を格納する
        // pricebookEntry + product2へのクエリのWhere句で使用する
        List<Id> productIds = null;

        // ----------------------------------------------------------------------------------------
        // 該当するセット品明細のレコードを取得
        // ----------------------------------------------------------------------------------------
        system.debug('-----:Product_Set_Detail__c select start');
        List<Product_Set_Detail__c> productSetDetails = [SELECT Id, Product__c, Quantity__c, Product_Set__r.Name,Product__r.VenderName__c,Product__r.Estimated_ConsumptionDueDate__c FROM Product_Set_Detail__c Where Product_Set__c in :productIDLIST];
        system.debug('-----:Product_Set_Detail__c select end');
        if (productSetDetails.size() == 0) {
            PageArrange();
            return null;
        }
        else {
            productIds = new List<Id>();
            for (Product_Set_Detail__c local : productSetDetails) {
                productIds.add(local.Product__c);
            }
        }

        //=======Temporary=====
        tmpactivities = activities;

        //=======Initialize=========
        activities = new List<QELine>();

        boolean lineflg = false;

        // ----------------------------------------------------------------------------------------
        // Product2へのクエリを実行
        // 一度Listで結果を受けた後に、Product2Idの Mapにする
        // ----------------------------------------------------------------------------------------
        system.debug('-----:Product2 select start');
        Map<Id, Product2> items = new Map<Id, Product2>();
        List<Product2> products = [select Id,Name,ProductCode,
                Foreign_Trade_Cost_US__c,Foreign_Trade_List_US__c,Intra_Trade_Cost_RMB__c,Intra_Trade_List_RMB__c,
                Asset_Model_No__c,Sales_Possibility__c,Estimation_Entry_Possibility__c,VenderName__c,
                SFDA_Status__c,Qty_Unit__c,BSSCategory__c,Packing_list_manual__c,StorageStatus__c
                // 多年保修 start
               , Entend_gurantee_period_all__c
               , Intra_Trade_Gurantee_RMB__c
               ,Intra_Trade_Service_RMB__c
               , GuranteeType__c
               // 维修合同价格
               , Maintenance_Price_Year__c
               // 多年保修 end
               //增加检索 不可取消多年保 2020/08/27
               ,CanNotCancelledGurantee__c
               //增加检索 阿西赛多 2020/09/10 start
               //外贸多年保 2021/01/27 精琢技术 wql start
               //维修合同报价（USD）
               ,Repair_Contract_USD__c
               //计提金额（不含税，USD）
               ,Intra_Trade_Foreign_RMB__c
               //NoDiscount 金额（USD）
               ,NoDiscount_Foreign__c
               //外贸多年保 2021/01/27 精琢技术 wql end
                //fy 预留产品标识
                ,LastbuyProductFLG__c
               //SFDC停止预警 lt 20211009 start
               ,Estimated_ConsumptionDueDate__c
               //SFDC停止预警 lt 20211009 end

                FROM Product2 Where Id IN :productIds
                And Manual_Entry__c = false];
        for (Product2 product : products) {
            items.put(product.Id, product);
        }
        system.debug('-----:Product2 select end');
        system.debug('-----:PricebookEntry select start');
        Map<Id, PricebookEntry> entries = new Map<Id, PricebookEntry>();
        List<PricebookEntry> workEntries = [
                SELECT Id,Product2Id
                FROM PricebookEntry Where Product2Id IN :productIds
                AND CurrencyIsoCode = :(opp.Trade__c == '外貿' ? 'USD' : 'CNY')
                AND IsActive = true
        ];
        for (PricebookEntry workEntry : workEntries) {
            entries.put(workEntry.Product2Id, workEntry);
        }
        system.debug('-----:PricebookEntry select end');

        // ----------------------------------------------------------------------------------------
        // 画面の明細行のループ
        // ----------------------------------------------------------------------------------------
        Integer i = 0;
        Integer rightcnt = 0; // 成功した数をカウント
        for (QELine t:tmpactivities) {

            QELine a = New QELine(i);

        system.debug('-----:i=' + i + ', currentDetailNumber=' + currentDetailNumber);

            if (i == currentDetailNumber) {
                // ----------------------------------------------------------------------------------------
                // 一回だけ実行されるコード
                // ----------------------------------------------------------------------------------------
        system.debug('-----:items.size()=' + items.size());
                if (items.size() > 0) {
                    // ----------------------------------------------------------------------------------------
                    // セット品明細のループ
                    // ----------------------------------------------------------------------------------------
        system.debug('-----:セット品明細のループスタート');
                    for (Integer l = 0; l < productSetDetails.size(); l++) {
                        Product_Set_Detail__c nowDetail = productSetDetails[l];
                        Product2 prd = items.get(nowDetail.product__c);
                        PricebookEntry pbe = entries.get(nowDetail.product__c);

                        if (pbe == null) {
        system.debug('This Productid(' + nowDetail.product__c +  ') is not exist PricebookEntry');
                            // ----------------------------------------------------------------------------------------
                            // 取得済みの Product2のリストの中に、セット品明細の情報がみつからない場合
                            // なにもしないでスルーする
                            // ----------------------------------------------------------------------------------------
                        }
                        else {
                            // ----------------------------------------------------------------------------------------
                            // 取得済みの Product2のリストの中に、セット品明細の情報がみつかった
                            // 明細のその Product2の情報をセットする？
                            // ----------------------------------------------------------------------------------------
                            QELine c = null;
                            Integer Quantity_c = nowDetail.Quantity__c > 0 ? Integer.valueOf(nowDetail.Quantity__c) : 1;
                            if (opp.Trade__c == '外貿') {
                                if (prd.Foreign_Trade_List_US__c > 0 && prd.Foreign_Trade_Cost_US__c > 0) {
                                    c =
                                    new QELine(i,prd.CanNotCancelledGurantee__c,prd.VenderName__c,
                                                prd.Estimated_ConsumptionDueDate__c, //20211009 lt add
                                                nowDetail.Product_Set__r.Name,
                                        pbe.Id, prd.Asset_Model_No__c, prd.StorageStatus__c,
                                        prd.ProductCode, nowDetail.product__c, prd.SFDA_Status__c,
                                        prd.Sales_Possibility__c, prd.Name, prd.BSSCategory__c,
                                            Quantity_c, prd.Foreign_Trade_List_US__c,
                                            prd.Foreign_Trade_List_US__c, prd.Foreign_Trade_Cost_US__c,
                                            prd.Packing_list_manual__c
                                            // 多年保修 start
                                           , prd.Entend_gurantee_period_all__c
                                           //外贸多年保 取产品主数据上的金额及维修合同报价 精琢技术 wql 2021/01/27 start
                                            , prd.Intra_Trade_Foreign_RMB__c
                                            , prd.GuranteeType__c
                                            , prd.NoDiscount_Foreign__c, prd.Repair_Contract_USD__c
                                             //外贸多年保 取产品主数据上的金额及维修合同报价 精琢技术 wql 2021/01/27 end
                                             // 多年保修 end
                                           // 多年保修 end

                                        );
                                } else {
                                    continue;
                                }
                            } else if (opp.Trade__c == '内貿') {
                                if (prd.Intra_Trade_List_RMB__c > 0 && prd.Intra_Trade_Cost_RMB__c > 0) {
                                    c =
                                    new QELine(i,prd.CanNotCancelledGurantee__c,prd.VenderName__c,
                                            prd.Estimated_ConsumptionDueDate__c,   //20211009 lt add
                                            nowDetail.Product_Set__r.Name,pbe.Id,
                                            prd.Asset_Model_No__c, prd.StorageStatus__c,
                                            prd.ProductCode, nowDetail.product__c,
                                            prd.SFDA_Status__c, prd.Sales_Possibility__c,
                                            prd.Name, prd.BSSCategory__c,
                                            Quantity_c, prd.Intra_Trade_List_RMB__c,
                                            prd.Intra_Trade_List_RMB__c, prd.Intra_Trade_Cost_RMB__c,
                                            prd.Packing_list_manual__c
                                            // 多年保修 start
                                           , prd.Entend_gurantee_period_all__c
                                           , prd.Intra_Trade_Gurantee_RMB__c
                                           ,prd.GuranteeType__c
                                           ,prd.Intra_Trade_Service_RMB__c
                                           //维修合同报价
                                           , prd.Maintenance_Price_Year__c
                                           // 多年保修 end
                                        );
                                } else {
                                    continue;
                                }
                            } else {
                                continue;
                                // c = new QELine(i, pbe.Id, prd.Asset_Model_No__c, prd.ProductCode, nowDetail.product__c, prd.SFDA_Status__c, prd.Sales_Possibility__c, prd.Name, prd.BSSCategory__c,
                                //        Quantity_c, 0, 0, 0);
                            }
                            activities.add(c);

                            if (i == 149) {
                                // 明細行の最大値に達したら、処理を終了する
                                PageArrange();
        system.debug('-----:強制終了:98');
                                return null;
                            }

                            i++;
                            rightcnt++;
                            lineflg = true;
                        }
                    }
        system.debug('-----:セット品明細のループ終了');
                    if (lineflg==true) {
                        i--;
                    }
                }
                else {
                    // ----------------------------------------------------------------------------------------
                    // Product2へのクエリが結果を返さなかった時に実行されるコード
                    // ----------------------------------------------------------------------------------------
                    a = t;
                    a.lineNo = i;
                    activities.add(a);
                }
            }
            else {
                // ----------------------------------------------------------------------------------------
                // Product2へクエリを投げない時に実行されるコード
                // ----------------------------------------------------------------------------------------
                a = t;
                a.lineNo = i;
                activities.add(a);
            }

            i++;
            if (i > 149) {
                break;
            }
        }

        PageArrange();
        if (productSetDetails.size() > 0) {
            errorflg = true;
            String Message = '';
            List<String> Nl = new  List<String>();
            Map<String,String> nameMap = new Map<String,String>();
            for(Product_Set_Detail__c Psd : productSetDetails){
                nameMap.put(Psd.Product_Set__r.Name, Psd.Product_Set__r.Name);

            }
            for(String name : nameMap.keySet()){
                Message += name+' ';
            }
            errormessage = Message + ' 导入结束，导入 ' + productSetDetails.size() + ' 件，成功' + rightcnt + ' 件';
        }
        system.debug('-----:終了:' + errormessage);
        return null;
    }

    // xudan 20140626 行追加ロジック実装
    public void addRow() {
        List<QELine> tmpQELine = new List<QELine>();
        for (Integer i = 0; i < activities.size(); i++) {
            if (i < rowIdx) {
                tmpQELine.add(activities[i]);
            } else if ( i == rowIdx) {
                tmpQELine.add(new QELine(i));
            } else {
                tmpQELine.add(activities[i - 1]);
                tmpQELine[tmpQELine.size() - 1].lineNo = i;
            }
        }
        activities = new List<QELine>();
        activities.addAll(tmpQELine);
        PageArrange();
    }
    //添加行
  public void addMultipleRow() {
      system.debug('11111111111111111===11111111111111');
    List<QELine> tmpQELine = new List<QELine>();
    //页面上的输入框追加 (只能在末尾追加)
    
    Integer lineRows  = activities.size() + rowIdx;
    if(lineRows>0 && lineRows>activities.size()&&activities.size()>0){
        //页面输入0或负数都不应该继续执行
        for (Integer i = 0; i < lineRows; i++) {
            if (i < activities.size()) {
                tmpQELine.add(activities[i]);
            } else{
                system.debug('走到这里了~');
                tmpQELine.add(new QELine(i));
            } 
        }
        system.debug('tmpQELine:'+tmpQELine);
        //如果发生行数变化 则后台最大报价行也更新
        if(quoteEntryMaxLine < lineRows){
            quoteEntryMaxLine = lineRows;
        }

        
        //重画页面 重画新增行
        activities = new List<QELine>();
        activities.addAll(tmpQELine);
        PageArrange();
    }
    
  }
    public void DownloadCsv(){
        //操作属性上的公式表达式必填。 ===>>>取消return
        List<Quote> QuoteList = [SELECT id from Quote WHERE Opportunityid = :oppId AND id=:quoid];
         SYSTEM.DEBUG(QuoteList.size()+'wwwwwww'+oppoidforCSV);
        if(QuoteList.size()>0){
            oppoidforCSV = QuoteList[0].id;
             SYSTEM.DEBUG(QuoteList.size()+'XXXXXXXX'+oppoidforCSV);
        }else{
        }
    }
    //报价确认
    public PageReference QuoteConfirm(){
        System.debug('报价确认进入======');
        List<Quote> QuoteList = [SELECT id,Queto_Confirm_Date__c,Opportunity.Sales_assistant_ID__c,
                                    CreatedBy.SalesManager__c,CreatedBy.ZongjianApprovalManager__c,
                                    CreatedBy.BuchangApprovalManagerSales__c,OpportunityId,Opportunity.Quote_Update_Sum__c
                                from Quote WHERE id=:quoid];
        Map<Id,Opportunity> oppMap = new Map<Id,Opportunity>();
        for(Quote Qu : QuoteList){
            Qu.Queto_Confirm_Date__c = Date.today();
            Qu.OpporsAssistance__c = Qu.Opportunity.Sales_assistant_ID__c;
            Qu.Manager_Sell__c = Qu.CreatedBy.SalesManager__c;
            Qu.Minister_Sell__c = Qu.CreatedBy.BuchangApprovalManagerSales__c;
            Qu.Majordomo_Sell__c =Qu.CreatedBy.ZongjianApprovalManager__c;
            if (String.isBlank(Qu.OpportunityId) == false) {
                Opportunity opp = new Opportunity();
                opp.Id = Qu.OpportunityId;
                if (Qu.Opportunity.Quote_Update_Sum__c == null) {
                    opp.Quote_Update_Sum__c = 1;
                } else {
                    opp.Quote_Update_Sum__c = Qu.Opportunity.Quote_Update_Sum__c + 1;
                }
                oppMap.put(Qu.id, opp);
            }
        }
        Savepoint Sp = Database.setSavepoint();
        try{
            Update QuoteList;
            Update oppMap.values();
        }catch (Exception o){
            Database.rollback(Sp);
            ApexPages.addmessages(o);
            return null;
        }
        return null;
    }
    //excelImport
    public PageReference excelImport() {
        system.debug('○○○○○○○○○○○○○○○Welcome to excelImport!!');
        system.debug('▼▼▼▼▼excel_text:' + excel_text);
        //oppに画面の値を設定
        setOppFromOppInfo();

        errorflg = false;
        errormessage = null;

        //既存データ数の確認
        Integer j = 0;
        for (QELine s:activities) {
            //データ判定にAsset_Model_Noを使用
            if ((s.Asset_Model==null) || (s.Asset_Model=='')) {
                break;
            }
            j++;
        }

        //=======Temporary=====
        tmpactivities = activities;

        //=======Initialize=========
        activities = new List<QELine>();
        //List<OpportunityLineItem> items = New List<OpportunityLineItem>();
        Integer i = 0;
        Integer xlscnt = 0;
        Integer rightcnt = 0; // 成功した数をカウント

        string[] xlslists = excel_text.split('\n',-1);
        List<string> xlslist = New list<string>();
        List<string> codelist = New List<string>();
        List<Integer> Quantitylist = New List<Integer>();
        //String str ;

        Map<String, Integer> mp = new Map<String, Integer>();
        string xlscode;
        Integer xlsQuantity;

        try {
            for (string xls:xlslists) {
                if (xls==null || xls=='') {
                    //null
                } else {
                    xlscode = null;
                    xlsQuantity = null;
                    xlslist = xls.split('\t',-1);
                    for (String s:xlslist) {
                        //odd number or even number
                        if (math.mod(i, 2) != 0) {
                            //odd number
                            if (s=='' || s==null) {
                                errorflg = true;
                                errormessage = System.Label.Error_Message31;
                                activities = tmpactivities;
                                pageArrange();
                                return null;
                            } else {
                                s = s.trim();
                                xlsQuantity = Integer.valueOf(s);
                                Quantitylist.add(xlsQuantity);
                            }
                        } else {
                            //even number
                            if (s=='' || s==null) {
                                errorflg = true;
                                errormessage = System.Label.Error_Message31;
                                activities = tmpactivities;
                                pageArrange();
                                return null;
                            } else {
                                s = s.trim();
                                codelist.add(s);
                                xlscode = s;
                            }
                        }
                        i++;
                    }
                    //mp.put(xlscode, xlsQuantity);
                    xlscnt++;
                }
            }
        } catch(Exception ex) {
            activities = tmpactivities;
            errorflg = true;
            errormessage = System.Label.Error_Message31;
            pageArrange();
            return null;
        }

system.debug(j);
system.debug('xlscnt:::::' + xlscnt);

        if (codelist.size()==0 || Quantitylist.size()==0) {
            activities = tmpactivities;
            errorflg = true;
            errormessage = System.Label.Error_Message31;
            pageArrange();
            return null;
        }

        xlscnt = j + xlscnt;
        if (xlscnt>quoteEntryMaxLine) {
            activities = tmpactivities;
            errorflg = true;
            errormessage = System.Label.Error_Message32;
            pageArrange();
            return null;
        }

        i = 0;
        boolean lineflg = false;
        for (QELine t:tmpactivities) {
            if (i==j) {
                Map<String, Product2> mpProduct2 = new Map<String, Product2>();                     // keyがProductCodeです。
                List<Product2> items = [select Id,Name,ProductCode,
                        Foreign_Trade_Cost_US__c,Foreign_Trade_List_US__c,Intra_Trade_Cost_RMB__c,Intra_Trade_List_RMB__c,
                        Asset_Model_No__c,Sales_Possibility__c,Estimation_Entry_Possibility__c,VenderName__c,
                        SFDA_Status__c,Qty_Unit__c,BSSCategory__c,Packing_list_manual__c,StorageStatus__c
                        // 多年保修 start
                        , Entend_gurantee_period_all__c
                        , Intra_Trade_Gurantee_RMB__c
                        , Intra_Trade_Service_RMB__c
                        , GuranteeType__c
                        ,Maintenance_Price_Year__c
                        // 多年保修 end
                        //增加检索 不可取消多年保 2020/08/27
                        ,CanNotCancelledGurantee__c
                        //外贸多年保 2021/01/27 精琢技术 wql start
                        //维修合同报价（USD）
                        ,Repair_Contract_USD__c
                        //计提金额（不含税，USD）
                        ,Intra_Trade_Foreign_RMB__c
                        //NoDiscount 金额（USD）
                        ,NoDiscount_Foreign__c
                        //外贸多年保 2021/01/27 精琢技术 wql end
                        //fy 预留产品标识
                        ,LastbuyProductFLG__c
                        //SFDC停止预警 lt 20211009 start
                        ,Estimated_ConsumptionDueDate__c
                        //SFDC停止预警 lt 20211009 end

                        FROM Product2 Where ProductCode In :codelist
                        And Manual_Entry__c = false];
                for (Product2 prd:items) {
system.debug('prd.ProductCode:::::' + prd.ProductCode);
                    mpProduct2.put(prd.ProductCode, prd);
                }
                Map<String, PricebookEntry> entries = new Map<String, PricebookEntry>();            // keyがProductCodeです。
                List<PricebookEntry> pbes = [
                    select Id, PricebookEntry.Product2.ProductCode
                    FROM PricebookEntry Where PricebookEntry.Product2.ProductCode IN :codelist
                    AND CurrencyIsoCode = :(opp.Trade__c == '外貿' ? 'USD' : 'CNY')
                    AND IsActive = true];
                for (PricebookEntry pbe:pbes) {
system.debug('pbe.Product2.ProductCode:::::' + pbe.Product2.ProductCode);
                    entries.put(pbe.Product2.ProductCode, pbe);
                }

                for (Integer l=0;l<codelist.size();l++) {
system.debug('codelist[l]:::::' + codelist[l]);
                    Product2 prd = mpProduct2.get(codelist[l]);
                    if (prd != null) {
                        PricebookEntry pbe = entries.get(codelist[l]);
                        QELine c = null;
                        if (pbe != null && (opp.Trade__c=='外貿' || opp.Trade__c=='内貿')) {
                            if (opp.Trade__c=='外貿') {
                                if (prd.Foreign_Trade_List_US__c > 0 && prd.Foreign_Trade_Cost_US__c > 0) {
                                    c =
                                    new QELine(i,prd.CanNotCancelledGurantee__c,prd.VenderName__c,
                                        prd.Estimated_ConsumptionDueDate__c,'',//20211009 lt add
                                        pbe.Id, prd.Asset_Model_No__c,
                                        prd.StorageStatus__c, prd.ProductCode,
                                        prd.Id, prd.SFDA_Status__c, prd.Sales_Possibility__c,
                                        prd.Name, prd.BSSCategory__c,
                                        Quantitylist[l], prd.Foreign_Trade_List_US__c,
                                        prd.Foreign_Trade_List_US__c, prd.Foreign_Trade_Cost_US__c,
                                        prd.Packing_list_manual__c
                                        // 多年保修 start
                                         //外贸多年保 取产品主数据上的金额及维修合同报价 精琢技术 wql 2021/01/04 start
                                         , prd.Entend_gurantee_period_all__c
                                         , prd.Intra_Trade_Foreign_RMB__c
                                         , prd.GuranteeType__c
                                         , prd.NoDiscount_Foreign__c,
                                         prd.Repair_Contract_USD__c
                                         //外贸多年保 取产品主数据上的金额及维修合同报价 精琢技术 wql 2021/01/04 end
                                        // 多年保修 end
                                        );
                                } else {
                                    continue;
                                }
                            } else {
                                if (prd.Intra_Trade_List_RMB__c > 0 && prd.Intra_Trade_Cost_RMB__c > 0) {
                                    c = 
                                    new QELine(i,prd.CanNotCancelledGurantee__c, prd.VenderName__c,
                                        prd.Estimated_ConsumptionDueDate__c,'',  //20211009 lt add
                                        pbe.Id, prd.Asset_Model_No__c,
                                        prd.StorageStatus__c, prd.ProductCode,
                                        prd.Id, prd.SFDA_Status__c, 
                                        prd.Sales_Possibility__c, prd.Name,
                                        prd.BSSCategory__c, Quantitylist[l], 
                                        prd.Intra_Trade_List_RMB__c, prd.Intra_Trade_List_RMB__c, 
                                        prd.Intra_Trade_Cost_RMB__c,prd.Packing_list_manual__c
                                        // 多年保修 start
                                       , prd.Entend_gurantee_period_all__c
                                       , prd.Intra_Trade_Gurantee_RMB__c
                                       , prd.GuranteeType__c
                                       ,prd.Intra_Trade_Service_RMB__c
                                       //维修合同报价
                                       , prd.Maintenance_Price_Year__c
                                       // 多年保修 end
                                        );
                                } else {
                                    continue;
                                }
                            }
                        } else {
                            continue;
                            // c = new QELine(i, pbe.Id, prd.Asset_Model_No__c, prd.ProductCode, prd.Id, prd.SFDA_Status__c, prd.Sales_Possibility__c, prd.Name, prd.BSSCategory__c,
                            //        Quantitylist[l], 0, 0, 0);              // pbe ない時も追加する、setProductEntry() のロジックと違います。
                        }
                        activities.add(c);
                        i++;
                        rightcnt++;
                        lineflg = true;
                    }
                }
                if (lineflg==true) {
                    i--;
                } else {
                    // 20140507,LW修改。
                    // 当导入的所有商品都不成功时，当前明细行什么都没有做，并且i加一。导致下面循环New QELine(t, i)中i错误。
                    // 修改为：当导入的所有商品都不成功时，当前明细行插入一个空行，之后i加一。
                    QELine a = New QELine(t, i);
                    activities.add(a);
                }
            } else {
                QELine a = New QELine(t, i);
                activities.add(a);
            }
            i++;
            if (i>149) {
                break;
            }
        }
        // messageを出す
        errorflg = true;
        errormessage = '数据导入结束，导入 ' + codelist.size() + ' 件，成功' + rightcnt + ' 件';
        pageArrange();

        return null;

    }

    //販売店1
    public void getSalesId1() {
        system.debug('○○○○○○○○○○○○○○○Welcome to getSalesId1!!');
        system.debug('▼▼▼▼▼SalesId1：' + SalesId1);
        //oppに画面の値を設定
        setOppFromOppInfo();

        errorflg = false;
        errormessage = null;

        List<Account> accs = New List<Account>();
        accs = [select Id,Name,Sales_Shop_Class__c From Account Where Id =:SalesId1];
        If (accs.size()>0) {
            SalesShopClass1 = accs[0].Sales_Shop_Class__c;
            opp.Agency1__c = accs[0].Id;
        }
        pageArrange();
    }

    //販売店2
    public void getSalesId2() {
        system.debug('○○○○○○○○○○○○○○○Welcome to getSalesId2!!');
        system.debug('▼▼▼▼▼SalesId2：' + SalesId2);
        //oppに画面の値を設定
        setOppFromOppInfo();

        errorflg = false;
        errormessage = null;

        List<Account> accs = New List<Account>();
        accs = [select Id,Name,Sales_Shop_Class__c From Account Where Id =:SalesId2];
        If (accs.size()>0) {
            SalesShopClass2 = accs[0].Sales_Shop_Class__c;
            opp.Agency2__c = accs[0].Id;
        }
        pageArrange();
    }


    //Button Ivents============================================================

    //cancel button
    public void cancel() {
        system.debug('○○○○○○○○○○○○○○○Welcome to CancelButton!!');
                system.debug('selection_hp' + selection_hp);
    }

    //PriceStatusUpdate button、TODO productCompare(jsのところ)１件ずつ検索していますが、今後、webserviceを使って一括か高速かできます。
    public void PriceStatusUpdate() {
        system.debug('○○○○○○○○○○○○○○○Welcome to PriceStatusUpdate!!');
        //oppに画面の値を設定
        setOppFromOppInfo();

        errorflg = false;
        errormessage = null;

        //全件洗い替えします。
        if (activities.size()>0) {
            for (QELine a:activities) {
                if ((a.Asset_Model!=null) && (a.Asset_Model!='')) {
                    // TODO katsu SFDAステータスの確認などいらないですか（最新商品XXXの項目も）
                    a.PageObject.SFDA_Status__c = a.latestInfo.SFDA_Status;
                    a.PageObject.Name__c = a.latestInfo.ProductName;
                    a.ListPrice_Page = a.latestInfo.ListPrice;
                    a.PageObject.Cost__c = a.latestInfo.Cost;
                    a.Cost_c = a.latestInfo.Cost;
                    //多年保修 start
                    a.PageObject.ProductGuranteePrice__c =  a.latestInfo.Intra_Trade_Gurantee;
                    a.PageObject.productServicePrice__c = a.latestInfo.Intra_Trade_Service;
                    a.PageObject.GuranteeType__c = a.latestInfo.GuranteeType;
                    // 计提金额
                    a.PageObject.productServicePrice__c = a.latestInfo.Intra_Trade_Service;
                    // 多年保修年限
                    a.PageObject.ProductEntend_gurantee_period_all__c
                        = a.latestInfo.ProductEntend_gurantee_period_all;
                    // 维修合同报价
                    a.Maintenance_Price_Year = a.latestInfo.Maintenance_Price_Year;
                    //多年保修 end
                }
            }
        }
        pageArrange();
    }
/**
    新增提交待审批   激活询价审批：备货确认申请
*/
    public void submitOppoApplyStock(){
        id oppIDs = null;
        if(oppid == null){
            Quote qupSet = [SELECT Opportunityid from Quote WHERE id =:quoId];
            oppIDs = qupSet.Opportunityid;
        }else{
            oppIDs = oppid;
        }
        Opportunity ops = [SELECT   id,Stock_Submit_Date__c,Stock_Confrim_Date__c,Sales_assistant_ID__c,
                                    Stock_Check_Leader__c,Quote_Update_Sum__c,
                                    is_CheckTarget_TF__c  from Opportunity WHERE id =:oppIDs];
        User ThisAssisUser = [select id,SI_Stock_Checker__c,Salesdepartment__c,Profileid from user where id = :UserInfo.getUserId()];
        if(ops.Sales_assistant_ID__c!=UserInfo.getUserId().substring(0,15)  && ThisAssisUser.Profileid!=System.Label.ProfileId_SystemAdmin && ThisAssisUser.Profileid!='00e10000000xo1DAAQ'){
            errorflg = true;//005p0000000nNrHAAU
                            //00510000001O6Hx
            errormessage = '申请备货确认，须由询价助理提出申请 (From Apex 1043)';
        }else{

            if(ThisAssisUser.SI_Stock_Checker__c == null){
                // SI询价调整 修改备货审批人逻辑，update by vivek 20200102 srart
                 // if(ThisAssisUser.Salesdepartment__c == '2.东北' || ThisAssisUser.Salesdepartment__c == '1.华北'){
                 //    ThisAssisUser.SI_Stock_Checker__c = System.label.SI_Stock_DBHB;
                 //    }else if(ThisAssisUser.Salesdepartment__c == '3.西北' || ThisAssisUser.Salesdepartment__c == '4.西南'){
                 //        ThisAssisUser.SI_Stock_Checker__c = System.label.SI_Stock_XBXN;
                 //        }else if(ThisAssisUser.Salesdepartment__c == '5.华东' || ThisAssisUser.Salesdepartment__c == '6.华南'){
                 //            ThisAssisUser.SI_Stock_Checker__c = System.label.SI_Stock_HDHN;
                 //        }1.华北2.东北3.西北4.西南5.华东6.华南
                if(ThisAssisUser.Salesdepartment__c == '5.华东'){
                    ThisAssisUser.SI_Stock_Checker__c = System.label.SI_Stock_HD;
                    }else if(ThisAssisUser.Salesdepartment__c == '2.东北' || ThisAssisUser.Salesdepartment__c == '4.西南'){
                        ThisAssisUser.SI_Stock_Checker__c = System.label.SI_Stock_HDHN;
                        }else if(ThisAssisUser.Salesdepartment__c == '1.华北' || ThisAssisUser.Salesdepartment__c == '6.华南'){
                            ThisAssisUser.SI_Stock_Checker__c = System.label.si_stock_dbhb;
                        }else if(ThisAssisUser.Salesdepartment__c == '3.西北'){
                            ThisAssisUser.SI_Stock_Checker__c = System.label.SI_Stock_XBXN;
                        }
                // SI询价调整 修改备货审批人逻辑，update by vivek 20200102 end
                update ThisAssisUser;
            }

            ops.Stock_Submit_Date__c = Date.today();
            if (ops.Quote_Update_Sum__c == null) {
                ops.Quote_Update_Sum__c = 1;
            } else {
                ops.Quote_Update_Sum__c = ops.Quote_Update_Sum__c + 1;
            }
            Savepoint sp = Database.setSavepoint();
            // SI询价调整 修改备货审批人逻辑，update by vivek 20200102 srart
            // if(ops.is_CheckTarget_TF__c     ){
            // SI询价调整 修改备货审批人逻辑，update by vivek 20200102 end
                try{
                    update ops;
                    Approval.ProcessSubmitRequest psr = new Approval.ProcessSubmitRequest();
                    psr.setObjectId(oppIDs);
                    Approval.ProcessResult submitResult = Approval.process(psr);
                    errorflg = true;
                    errormessage = '备货确认申请已提交 (From Apex 1000)';
                }catch (Exception o){
                    Database.rollback(sp);
                    ApexPages.addmessages(o);
                }
                // SI询价调整 修改备货审批人逻辑，update by vivek 20200102 srart
                // }else{
                //     errorflg = true;
                //     errormessage = '标书未审批通过，不可以申请备货确认 (From Apex 1007)';
                // }
                // SI询价调整 修改备货审批人逻辑，update by vivek 20200102 end
        }
    }
    //Save button
    public PageReference Save() {
        setOppFromOppInfo();
        system.debug('WinOrDecideAlert:::::::3'+WinOrDecideAlert );
        errorflg = false;
        errormessage = null;
        errorMessagechack = null;
        Savepoint sp = Database.setSavepoint();
        try {
            String lines = '';
            system.debug(oppId+'^^^^^^^'+lines);
            if(oppId != null){
                lines = ControllerUtil.setQuote(oppId);
            }
            system.debug(oppId+'^^^^^^^'+lines);
            if(lines!='Fin'){
                errorflg = true;
                errormessage = lines;
            }
            //データチェック
            if (dataCheck() ==false) {
                return null;
            }
            // LHJ 授权check Start
            if (enableSales == true && opp.Trade__c == '内貿') {
                //经销商产品注册证匹配
                Map<Id, String> proMap = new Map<Id, String>();
                if (activities.size() > 0) {
                    for (QELine qli : activities) {
                        if (qli.Asset_Model != null && qli.Asset_Model != '') {
                            proMap.put(qli.pageObject.Id__c, qli.PageObject.Name__c);
                        }
                    }
                }


                //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, opp.Agency1__c +'1q----  '+proIdList));
                //String chk = OpportunityWebService.checkProRegisterDecide(proMap, opp.Agency1__c, '');
                //if (chk != 'OK') {
                //    List<String> errList = new List<String>();
                //    Integer i = 0;
                //    errList = chk.split('。');
                //    for (String err : errList) {
                //        i ++;
                //        if (i != errList.size()) {
                //            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, err));
                //        }
                //    }
                //}
                //
                if(opp.Agency1__c != null){
                    // GZW 画面出错误消息
                    Map<String,String> chkMap = OpportunityWebService.MapCheckProRegisterDecide(proMap, opp.Agency1__c, '');
                    //this.haveno_Register 没有注册证 状态红色
                    //this.wrong_Register  匹配不上  名字红色
                    System.debug('chkMap +++++' + chkMap);
                    //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.WARNING,  'chkMap +++++' + chkMap));
                    if (chkMap.size() > 0) {
                        errorflg = true;
                        if(chkMap.containsKey('agency')){
                            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.WARNING,  '第一经销商没有有效的医疗器械经营许可证。'));
                        }
                        Integer inerr = 0;
                        if (activities.size()>0) {
                            for (QELine s:activities) {
                                if (s.Asset_Model != null && s.Asset_Model != '') {
                                    s.haveno_Register = false;
                                    s.wrong_Register = false;
                                    if(chkMap.containsKey(s.PageObject.Id__c)){
                                        if(chkMap.get(s.PageObject.Id__c) == '1'){
                                            s.haveno_Register = true;
                                            inerr ++;
                                        }else if(chkMap.get(s.PageObject.Id__c) == '2'){
                                            s.wrong_Register = true;
                                            inerr ++;
                                        }
                                    }
                                }
                            }
                        }
                        if(inerr > 0){
                            errorMessagechack = '请检查红字内容（NMPA状态红字，不可销售产品；产品名称红字，超过经销商经营范围）。';
                        }
                        //return null;
                    }
                }
            }
            // LHJ End
            // SI询价取消报价确认按钮，逻辑迁移 20191209 by vivek start
            System.debug('======报价页面修改取消确认');
            QuoteConfirm();
            // SI询价取消报价确认按钮，逻辑迁移 20191209 by vivek end
            PageReference pageRef = new PageReference('/' + oppid);
            if (dataEntry()==false) {
                //msg
                return null;
            } else {
                //msg
                errorflg = true;
                errorMessage = System.Label.Message_002;
                return null;
            }
        } catch (DmlException de) {
            Database.rollback(sp);
            errorflg = true;
            errormessage = de.getDmlMessage(0);           // １件目のエラーのみ表示
            system.debug(Logginglevel.ERROR, de.getMessage());
            system.debug(Logginglevel.ERROR, de.getStackTraceString());
        } catch (Exception e) {
            Database.rollback(sp);
            errorflg = true;
            errormessage = e.getMessage();
            system.debug(Logginglevel.ERROR, e.getMessage());
            system.debug(Logginglevel.ERROR, e.getStackTraceString());
        }

        return null;
    }

    //OppReflection button
    public PageReference OppReflection() {
        //oppに画面の値を設定
        setOppFromOppInfo();
        Savepoint sp = Database.setSavepoint();
        try {
            errorflg = false;
            errormessage = null;

            //データチェック
            if (dataCheck() ==false) {
                return null;
            }

            PageReference pageRef = new PageReference('/' + oppid);
            if (dataEntry()==false) {
                //msg
                return null;
            } else {
                //msg
                return pageRef;
            }
        } catch (DmlException de) {
            Database.rollback(sp);
            errorflg = true;
            errormessage = de.getDmlMessage(0);           // １件目のエラーのみ表示
            system.debug(Logginglevel.ERROR, de.getMessage());
            system.debug(Logginglevel.ERROR, de.getStackTraceString());
        } catch (Exception e) {
            Database.rollback(sp);
            errorflg = true;
            errormessage = e.getMessage();
            system.debug(Logginglevel.ERROR, e.getMessage());
            system.debug(Logginglevel.ERROR, e.getStackTraceString());
        }

        return null;
    }

    //QuoteDecisionButton
    public PageReference QuoteDecision() {
        system.debug('○○○○○○○○○○○○○○○Welcome to QuoteDecision!!');
        Savepoint sp = Database.setSavepoint();
        try {
            //oppに画面の値を設定
            setOppFromOppInfo();
            //需求表没通过，没有需求表：报价不能Decide,
            List<IS_Opportunity_Demand__c> ISOstutas = [SELECT id,Approval_Date__c,Func_SOD_Status__c,Opportunity_ID__r.Stock_Confrim_Date__c from IS_Opportunity_Demand__c WHERE Opportunity_ID__c = :oppid];
            List<opportunity> oldListCheck = [select Old_Opportunity_ID__c from Opportunity where id =:oppid];
            integer PassFlg = 0;
            Integer StockFlg = 0;
            for(IS_Opportunity_Demand__c iso : ISOstutas){
                if( iso.Approval_Date__c != null ){
                    PassFlg ++;
                }
                if(iso.Opportunity_ID__r.Stock_Confrim_Date__c ==null){
                    StockFlg++;
                }
            }
            //20220215 fy lastbuy start
            if(!ReservedProductVerification()){
                if(flglastbuy==1){
                    errorflg = true;
                    errormessage =  '预留产品表中没有录入该报价的预留产品' ;
                    return null;
                  }else if(flglastbuy==2){
                    errorflg = true;
                    errormessage =  errorProductmodel+'产品数量不可超过产品预留数量' ;
                    return null;
                  }else if(flglastbuy==3){
                    errorflg = true;
                    errormessage =  '预留产品'+errorProductmodel+'未录入预留产品表';
                    return null;
                  }
            }
              //20220215 fy lastbuy end
            system.debug('PassFlg:'+PassFlg);
            system.debug('StockFlg:'+StockFlg);
            if(PassFlg == 0&&oldListCheck[0].Old_Opportunity_ID__c==null){
                errorflg = true;
                errormessage = '没有批准的需求表，不能Decide (From Apex 1120)';
                return null;
            }
            if(StockFlg>0){//&&ISOstutas.size()>0
                errorflg = true;
                errormessage = '备货确认日为空，不可以decide 报价 (From Apex 1125)';
                return null;
            }
            String updateStr = ISO_DemandOperAndDemonsController.SetQuoteDecide(oppid);
            errorflg = false;
            errormessage = null;

            if (enableSales == true) {
                //販売店状態チェック
                if (dataCheckDecide() ==false) {
                    return null;
                }
            }

            PageReference pageRef = new PageReference('/' + oppid);
            if (dataCheck() == false){
                return null;
            }
            if (dataEntry()==false) {
                return null;
            } else {
                //引合に見積決定をオン
                if (oppId==null) {
                    system.debug('Error is Opportunityid null!!!');
                } else {
                    List<Opportunity> opps = [Select Id,Estimation_Decision__c From Opportunity Where Id =: oppId];
                    if (opps.size()>0) {
                        opps[0].Estimation_Decision__c = true;
                        /*↓↓↓見積同期↓↓↓2012/11/28 未使用
                        opps[0].SyncedQuoteId = quoId;
                        ↑↑↑　　　　↑↑↑*/
                        ControllerUtil.updOpp(opps[0]);
                    }

                    errorflg = true;
                    errorMessage = System.Label.Message_002;

        // cic 134906 start
                    Quote q = [select Id from Quote where Id = :quoId];
                    q.Quote_Decision_Date__c = date.Today();
                    update q;
        // cic 134906 end

                    QuoteDecision=true;
                    enableContract = true;
                    //--Savebutton
                    Save_button=true;
                    //--Decisionbutton判定
                    if (verified==true) {
                        Decision_button =false;
                    } else if (QuoteCorrect==false) {
                        Decision_button = true;
                    } else if (QuoteDecision==true) {
                        Decision_button = true;
                    } else {
                        Decision_button = false;
                    }
                    //--SAPButton
                    if (QuoteDecision==false) {
                        sap_button = true;
                    } else if (specialAuthority==false) {
                        sap_button = true;
                    } else {
                        sap_button = false;
                    }
                    //--決定ボタン使えないようにする
                    Decision_button = true;

                    pageArrange();
                }
            }
        } catch (DmlException de) {
            Database.rollback(sp);
            errorflg = true;
            errormessage = de.getDmlMessage(0);           // １件目のエラーのみ表示
            system.debug(Logginglevel.ERROR, de.getMessage());
            system.debug(Logginglevel.ERROR, de.getStackTraceString());
        } catch (Exception e) {
            Database.rollback(sp);
            errorflg = true;
            errormessage = e.getMessage();
            system.debug(Logginglevel.ERROR, e.getMessage());
            system.debug(Logginglevel.ERROR, e.getStackTraceString());
        }

        //return pageRef;
        return null;
    }

    //PrintButton
    public PageReference Print() {
        Savepoint sp = Database.setSavepoint();
        try {
            //oppに画面の値を設定
            setOppFromOppInfo();

            errorflg = false;
            errormessage = null;

            system.debug('○○○○○○○○○○○○○○○Welcome to Print!!');
            PageReference pageRef;

            //Decide前or後
            if (QuoteDecision==true) {
                //NoSave
            } else {
                //データチェック
                if (dataCheck() ==false) {
                    return null;
                }
                if (dataEntry()==false) {
                    //msg
                    return null;
                }
            }

            //引合に見積提出日を保存
            List<Opportunity> opps = New List<Opportunity>();
            if (oppId==null) {
                system.debug('Error is Opportunityid null!!!');
            } else {
                opps = [Select Id, Estimation_Decision__c From Opportunity Where Id =: oppId];
                if (opps.size()>0) {
                    //見積に見積印刷日を保存
                    List<Quote> quos = New List<Quote>();
                    if (quoId==null) {
                        //印刷させない？
                        system.debug('▼▼▼見積保存前印刷▼▼▼');
                    } else {
                        quos = [Select Id, Quote_Decision__c, Quote_Print_Date__c, Quote_Date__c From Quote Where Id =: quoId];
                        if (quos.size()>0) {
                            //优惠成交价
                            quos[0].Preferential_Trading_Price__c = quo.Preferential_Trading_Price__c;
                            //优惠折扣
                            quos[0].Discount__c = quo.Discount__c;
                            //优惠价格
                            quos[0].Pricing__c = quo.Pricing__c;
                            //单价
                            quos[0].Unit_Price__c = quo.Unit_Price__c;
                            //报价金额
                            quos[0].Offer_Amount__c = quo.Offer_Amount__c;
                            //Total
                            quos[0].TOTAL__c = quo.TOTAL__c;
                            //契約内容
                            quos[0].Contract__c = quo.Contract__c;
                            //多年保修 start
                            quos[0].Preferential_Gurantee_Period__c = quo.Preferential_Gurantee_Period__c;
                            //多年保修 end
                            if (quos[0].Quote_Date__c == null) {
                                quos[0].Quote_Date__c = date.Today();
                                opps[0].Estimation_Proposal_Date__c = date.Today();
                                ControllerUtil.updOpp(opps[0]);
                            }
                            quos[0].Quote_Print_Date__c = date.Today();
                            ControllerUtil.updQuote(quos[0]);
                        }
                    }
                }
            }
            pageArrange();
        } catch (DmlException de) {
            Database.rollback(sp);
            errorflg = true;
            errormessage = de.getDmlMessage(0);           // １件目のエラーのみ表示
            system.debug(Logginglevel.ERROR, de.getMessage());
            system.debug(Logginglevel.ERROR, de.getStackTraceString());
        } catch (Exception e) {
            Database.rollback(sp);
            errorflg = true;
            errormessage = e.getMessage();
            system.debug(Logginglevel.ERROR, e.getMessage());
            system.debug(Logginglevel.ERROR, e.getStackTraceString());
        }

        return null;

    }

    //BackButton
    public PageReference Back() {
        return new Pagereference('/' + oppid);
    }
  public PageReference Jump() {
    System.debug('报价id1：'+quoId);
    // LHJ 授权check Start
    if (opp.If_Need_Authorize__c == true) {
      ID tmpid = opp.Agency2__c == null ? opp.Agency1__c : opp.Agency2__c;
      List<Account> accName = [select name from Account where id = : tmpid];
      if (accName[0].name != opp.Authorized_Finish_Sales__c) {
        ApexPages.addmessage(new ApexPages.message(ApexPages.severity.WARNING,  '请先授权后，再进行报价试算。'));
      }else{
        //报价试算点击时，保存行项目 精琢技术 wql 2021/05/07 start
        Save();
        //报价试算点击时，保存行项目 精琢技术 wql 2021/05/07  end
        System.debug('报价id2：'+quoId);
        if(errorMessage == System.Label.Message_002){
          return new Pagereference('/apex/QuoteTrial?Id=' + quoId);
        }
        return null;
      }
    }else{
      //报价试算点击时，保存行项目 精琢技术 wql 2021/05/07 start
      Save();
      //报价试算点击时，保存行项目 精琢技术 wql 2021/05/07  end
      System.debug('报价id2：'+quoId);
      return new Pagereference('/apex/QuoteTrial?Id=' + quoId);
    }
    return null;
  }
    // 0表示 対策
    private void pageArrange() {
        if (activities.size()>0) {
            for (QELine a:activities) {
                if ((a.Asset_Model==null) || (a.Asset_Model=='')) {
                    system.debug('○○○○○○○○○○○○Welcome to pageArrange Asset_Model is △');
                    a.pageobject.subtotal__c = null;
                    a.ListPrice_Page = null;
                } else {
                    system.debug('○○○○○○○○○○○○Welcome to pageArrange Asset_Model=[' + a.Asset_Model + ']');
                }
            }
        }
        if (quo.OCM_Agent1_Price_Page__c==null) {
            Salesprofit1 = null;
            qb.SalesCalculation1 = null;
        }
        if (quo.Agent1_Agent2_Price_Page__c==null) {
            Salesprofit2 = null;
            qb.SalesCalculation2 = null;
        }
    }

    public boolean dataCheck() {
        WinOrDecideAlert = false;
        system.debug('○○○○○○○○○○○○Welcome to dataCheck class!!○○○○○○○○○○○○');
        errorflg = false;
        errormessage = null;
        Boolean error = false;
        integer Gcnt = 0;
        List<String> product2Ids = New List<String>();

        if (activities.size()>0) {
            for (QELine a:activities){
                if (String.isBlank(a.PageObject.Id__c) == false) {
                    product2Ids.add(a.PageObject.Id__c);
                }
            }
            Map<String,String> loopMap = new Map<String,String>();
            if(CheckItem!=null){
                Gcnt = CheckItem.size();
                if(CheckItem.size()>0){
                    for(QuoteLineItem qli : CheckItem){
                        loopMap.put(qli.PricebookEntry.Product2Id,qli.SFDA_Status__c);
                    }
                }
            }
            //
            // ここを修正したら、NFM007.triggerも要確認
            prd2LatestValMap = new Map<Id, Product2>();
            integer cntPrd2 = 0;
            for (Product2 prd2: [Select Id, Estimation_Entry_Possibility__c, SFDA_Status__c,Packing_list_manual__c From Product2 Where Id IN :product2Ids]) {
                cntPrd2 = cntPrd2   +   1;
                if (prd2.Estimation_Entry_Possibility__c != '○') {
                    error = true;
                }
                if(prd2.Estimation_Entry_Possibility__c == 'M'){

                    error = false;
                }
                if(prd2.SFDA_Status__c != loopMap.get(prd2.Id)){
                    //
                    WinOrDecideAlert    =   true;
                }

                prd2LatestValMap.put(prd2.Id, prd2);
            }
            if(cntPrd2  !=  Gcnt){
                WinOrDecideAlert    =   false;
            }

        }

        if (error==true&&WinOrDecideAlert == false) {
            PageArrange();
            errorflg = true;
            errorMessage = System.Label.Error_Message37;
            return false;
        }

        if (checkAgentsDeleteFlag() == false) {
            return false;
        }


        PageArrange();
        errorflg = false;
        errorMessage = null;
        return true;
    }

    private boolean dataCheckDecide() {
        system.debug('○○○○○○○○○○○○Welcome to dataCheckDecide class!!○○○○○○○○○○○○');

        Boolean error = false;
        errorflg = false;
        errormessage = null;

        if (checkAgentsDeleteFlag() == false) {
            return false;
        }
        if(WinOrDecideAlert&&(!productStatusUpdated)){
            error = true;
            errorMessage = '产品状态发生变化，请更新';
        }
        if (opp.Agency1__c==null) {
                opp.Agency1__c.addError(System.Label.Error_Message3);
                error = true;
                errormessage = System.Label.Error_Message3;
        }
        if (quo.OCM_Agent1_Price_Page__c==null || quo.OCM_Agent1_Price_Page__c == 0) {
                quo.OCM_Agent1_Price__c.addError(System.Label.Error_Message3);
                error = true;
                errormessage = System.Label.Error_Message3;
        }
        if (opp.Agency2__c==null && quo.Agent1_Agent2_Price_Page__c!=null) {
                opp.Agency2__c.addError(System.Label.Error_Message3);
                error = true;
                errormessage = System.Label.Error_Message3;
        }
        if (opp.Agency2__c!=null && quo.Agent1_Agent2_Price_Page__c==null) {
                quo.Agent1_Agent2_Price__c.addError(System.Label.Error_Message3);
                error = true;
                errormessage = System.Label.Error_Message3;
        }
        // LHJ 授权check Start
        if (opp.If_Need_Authorize__c == true) {
            ID tmpid = opp.Agency2__c == null ? opp.Agency1__c : opp.Agency2__c;
            List<Account> accName = [select name from Account where id =: tmpid];
            if (accName[0].name != opp.Authorized_Finish_Sales__c) {
                error = true;
                errormessage =  '经销商未授权或授权未完成，请先授权。' ;
            }
        }

    //wql 报价试算 判断是否进行过报价试算 start
    if(!quo.IsQuoteTrial__c){
        //没有报价试算过进入
        error = true;
        errormessage =  'decide报价还没进行报价试算，请先报价试算！' ;

    }
    
    //wql 报价试算 判断是否进行过报价试算 end


    //wql 报价试算 检索促销政策是否有效 start
    //1.获取报价id
    //2.根据报价id 检索出所有报价试算行，并带出每一行，选择的政策的有效期  3个表
    //3.循环遍历 是否所有选择的政策有效期都为true 只有有一个为false 就返回true 直接跳出循环
    //如果报价id不为空的话
    if(quoId !=null){
      boolean IsActivePsp = true;
      String errorPsp ='';
      //根据id 检索 所有的试算行上面选择政策的有效期
      List<PromotionSalesProducts__c> promotionSalesProductsList =[select id,PromotionSales__c,QuantityId__c,PromotionSales__r.name,PromotionSales__r.IsPolicyEffective__c from PromotionSalesProducts__c where QuantityId__c=:  quoId];
      //如果有报价试算数据 说明选择了促销政策
      if(promotionSalesProductsList.size()>0){
        for(PromotionSalesProducts__c psp :promotionSalesProductsList){
          if(psp.PromotionSales__r.IsPolicyEffective__c == '无效'){
              IsActivePsp =false;
              errorPsp = psp.PromotionSales__r.name;
              break;
          }
        }
      }

      if(!IsActivePsp){
        error = true;
        errormessage =  '报价试算中，选择的促销政策:'+errorPsp+',不在有效期内，请检查！' ;
      }
    }
    
    //wql 报价试算 检索促销政策是否有效 end
        if (opp.Trade__c == '内貿') {
            //经销商产品注册证匹配
            Map<Id, String> proMap = new Map<Id, String>();
            if (activities.size() > 0) {
                for (QELine qli : activities) {
                    if (qli.Asset_Model != null && qli.Asset_Model != '') {
                        proMap.put(qli.pageObject.Id__c, qli.PageObject.Name__c);
                    }
                }
            }
            // String chk = OpportunityWebService.checkProRegisterDecide(proMap, opp.Agency1__c, '');
           //// ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR, opp.Agency1__c + chk));
           // if (chk != 'OK') {
           //     error = true;
           //     errormessage = chk;
           // }
           //
           // GZW 画面出错误消息
            Map<String,String> chkMap = OpportunityWebService.MapCheckProRegisterDecide(proMap, opp.Agency1__c, '');
            //this.haveno_Register 没有注册证 状态红色
            //this.wrong_Register  匹配不上  名字红色
            if (chkMap.size() > 0) {
                errorflg = true;
                error = true;
                //errormessage = '请检查红字内容（NMPA状态红字，不可销售产品；产品名称红字，超过经销商经营范围）。';
                if(chkMap.containsKey('agency')){
                    ApexPages.addmessage(new ApexPages.message(ApexPages.severity.WARNING,  '第一经销商没有有效的医疗器械经营许可证。'));
                }
                Integer inerr = 0;
                if (activities.size()>0) {
                    for (QELine s:activities) {
                        if (s.Asset_Model != null && s.Asset_Model != '') {
                            if(chkMap.containsKey(s.PageObject.Id__c)){
                                if(chkMap.get(s.PageObject.Id__c) == '1'){
                                    s.haveno_Register = true;
                                    inerr ++;
                                }else if(chkMap.get(s.PageObject.Id__c) == '2'){
                                    s.wrong_Register = true;
                                    inerr ++;
                                }
                            }
                        }
                    }
                }
                if(inerr > 0){
                    errormessage = '请检查红字内容（NMPA状态红字，不可销售产品；产品名称红字，超过经销商经营范围）。';
                }
                return false;
            }
        }
        // LHJ End

        if (error==true) {
            PageArrange();
            errorflg = true;
            return false;
        } else {
            return true;
        }
    }

    private Boolean checkAgentsDeleteFlag() {
        // Check Agents
        List<Id> accIds = new List<Id>();
        if (opp.Agency1__c != null) {
            accIds.add(opp.Agency1__c);
        }
        if (opp.Agency2__c != null) {
            accIds.add(opp.Agency2__c);
        }
        if (accIds.size() > 0) {
            List<Account> agentAccs = [SELECT Id, Delete_Flag__c, Is_Active_Formula__c, Sales_Shop_Class__c FROM Account WHERE Id IN :accIds];
            //Boolean deleteFlag1 = false, deleteFlag2 = false;
            String activeFormula1 = null, activeFormula2 = null;
            for (Account local : agentAccs) {
                if(local.Sales_Shop_Class__c == '医疗修理经销商'){
                    PageArrange();
                    errorflg = true;
                    //-------CHAN-B9TBG4; 20190301----------UpdateStart----------------------------------------
                    if(local.Id == opp.Agency1__c){
                        errorMessage = '请确认第一经销商的经销商资质';
                        return false;
                    }
                    //else{
                    //    errorMessage = '请确认第二经销商的经销商资质';
                    //}
                    //return false;
                    //-------CHAN-B9TBG4; 20190301----------UpdateStop----------------------------------------
                }

                if (local.Id == opp.Agency1__c) {
                    activeFormula1 = local.Is_Active_Formula__c;
                }
            }
            for (Account local : agentAccs) {
                if (local.Id == opp.Agency2__c) {
                    activeFormula2 = local.Is_Active_Formula__c;
                }
            }

            if (activeFormula1 == '无效' && activeFormula2 == '无效') {
                PageArrange();
                errorflg = true;
                errorMessage = System.Label.Agent1_and_Agent2_were_Deleted;
                return false;
            } else if (activeFormula1 == '无效') {
                PageArrange();
                errorflg = true;
                errorMessage = System.Label.Agent1_was_Deleted;
                return false;
            } else if (activeFormula2 == '无效') {
                PageArrange();
                errorflg = true;
                errorMessage = System.Label.Agent2_was_Deleted;
                return false;
            }
        }

        // 内貿の場合Check Agency1
        if (opp.Agency1__c != null && opp.Trade__c == '内貿') {
            Account acc = [select Sales_Shop_Class__c, Business_Authorization_No__c, Business_Paper_Expiration_Date__c,
                            Tax_Practice_No__c, Tax_Practice_Expiration_Date__c, Medical_Equipment_Num__c, Is_Active_Formula__c,
                            Medical_Equipment_Expiration_Date__c from Account where Id = :opp.Agency1__c];
             //经销商分类只有特约、一级或者集中采购才可以进行报价
            List<String> salesClazz = new List<String> {'特約販売店（区域）', '特約販売店（製品）', '特約販売店（製品+区域）', '一級販売店', '集采经销商'};
            // 有效/无效（公式）!= 有效
            if (acc.Is_Active_Formula__c != '有效') {
                PageArrange();
                errorflg = true;
                errorMessage = '请选择有效的经销商';
                return false;
            }
            // 经销商分类 是 二级 或 其他
            //else if (acc.Sales_Shop_Class__c == '二級販売店' || acc.Sales_Shop_Class__c == 'その他') {
            //CHAN-BQE6LA  【委托】【重要】询价经销商1判断逻辑 精琢技术 wql 2020/06/10 start
            //注释原来逻辑
            // else if (acc.Sales_Shop_Class__c == '二級販売店') {
            //     PageArrange();
            //     errorflg = true;
            //     errorMessage = '请确认第一经销商的经销商资质';
            //     return false;
            // }
            else if(!salesClazz.contains(acc.Sales_Shop_Class__c)){
                PageArrange();
                errorflg = true;
                errorMessage = '经销商1的经销商分类为：特约，一级，集中采购才可以报价';
                return false;
              }
            //CHAN-BQE6LA  【委托】【重要】询价经销商1判断逻辑 精琢技术 wql 2020/06/10 end
            // 营业执照有效期限” 或“税务登记证有效期限” 或“医疗器械经营企业许可证有效期限” 其中一个证超过有效期的话
            else if (!
                // 满足如下六个字段条件为有效，否则无效
                (String.isBlank(acc.Tax_Practice_No__c) == false
                    && (acc.Tax_Practice_Expiration_Date__c == null || acc.Tax_Practice_Expiration_Date__c >= Date.today())
                    && String.isBlank(acc.Medical_Equipment_Num__c) == false
                    && acc.Medical_Equipment_Expiration_Date__c != null && acc.Medical_Equipment_Expiration_Date__c >= Date.today()
                    && String.isBlank(acc.Business_Authorization_No__c) == false
                    && acc.Business_Paper_Expiration_Date__c != null && acc.Business_Paper_Expiration_Date__c >= Date.today())
            ) {
                PageArrange();
                errorflg = true;
                errorMessage = '请确认第一经销商的经销商资质';
                return false;
            }
            else {}
            /*
            if (acc.Sales_Shop_Class__c == '二級販売店' || acc.Sales_Shop_Class__c == 'その他') {
                if (!
                    (!String.isBlank(acc.Tax_Practice_No__c)
                        && (acc.Tax_Practice_Expiration_Date__c == null || acc.Tax_Practice_Expiration_Date__c >= Date.today())
                        && !String.isBlank(acc.Medical_Equipment_Num__c)
                        && (acc.Medical_Equipment_Expiration_Date__c != null && acc.Medical_Equipment_Expiration_Date__c >= Date.today())
                        && !String.isBlank(acc.Business_Authorization_No__c)
                        && (acc.Business_Paper_Expiration_Date__c != null && acc.Business_Paper_Expiration_Date__c >= Date.today()))) {
                    PageArrange();
                    errorflg = true;
                    errorMessage = '请确认第一经销商的经销商资质';
                    return false;
                }
            }
            */
        }

        return true;
    }

    public boolean dataEntry() {
        system.debug('○○○○○○○○○○○○Welcome to dataEntry class!!○○○○○○○○○○○○');
        Boolean error = false;
        Boolean detail = false;
        if ((quo.QuoteName__c == null) || (quo.QuoteName__c =='')) {
            quo.QuoteName__c.addError(System.Label.Error_Message3);
            error = true;
            errormessage = System.Label.Error_Message3;
        }
        if (quo.Dealer_Final_Price_Page__c == null) {
            quo.Dealer_Final_Price__c.addError(System.Label.Error_Message3);
            error = true;
            errormessage = System.Label.Error_Message3;
        }
        if (qb.Quote_Adjust_Calculate == null) {
            quo.Quote_Adjust_Calculate__c.addError(System.Label.Error_Message3);
            error = true;
            errormessage = System.Label.Error_Message3;
        }
        if (quo.Quote_Adjust_Amount_Page__c == null) {
            quo.Quote_Adjust_Amount__c.addError(System.Label.Error_Message3);
            error = true;
            errormessage = System.Label.Error_Message3;
        }
        if (quo.Quote_Expiration_Date__c == null) {
            quo.Quote_Expiration_Date__c.addError(System.Label.Error_Message3);
            error = true;
            errormessage = System.Label.Error_Message3;
        }
        Decimal initPrice = 0;
        for (QELine a : activities) {
            if ((a.Asset_Model!=null) && (a.Asset_Model!='')) {
                if (a.PageObject.Quantity__c==null || a.PageObject.Quantity__c==0) {
                    a.PageObject.Quantity__c.addError(System.Label.Error_Message3);
                    error = true;
                    errormessage = System.Label.Error_Message3;
                }
                if (a.PageObject.UnitPrice_Page__c==null) {
                    a.PageObject.UnitPrice__c.addError(System.Label.Error_Message3);
                    error = true;
                    errormessage = System.Label.Error_Message3;
                }
                if (a.PageObject.PricebookEntryId==null) {
                    error = true;
                    errormessage = System.Label.Error_Message27;
                }
                detail = true;
            }
            if(a.PageObject.UnitPrice_Page__c!=null){
                initPrice += (a.VenderName=='OSH'?(a.PageObject.UnitPrice_Page__c*0.45):a.PageObject.UnitPrice_Page__c)*(a.PageObject.Quantity__c==null?0:a.PageObject.Quantity__c);
            }
        }
        if (enableSales == true) {
          // LHJ Start
            String profileId = UserInfo.getProfileId();
            if(!profileId.left(15).equals('00e10000000NakP')
            && !profileId.left(15).equals('00e10000000NbDH')) {
                if (quo.Agency1__c == null) {
                    quo.Agency1__c.addError(System.Label.Error_Message3);
                    error = true;
                    errormessage = System.Label.Error_Message3;
                }
            }
            // LHJ End
            if (quo.OCM_Agent1_Price_Page__c==null) {
                    quo.OCM_Agent1_Price_Page__c = initPrice;
                    //quo.OCM_Agent1_Price__c.addError(System.Label.Error_Message3);
                    //error = true;
                    //errormessage = System.Label.Error_Message3;
            } else {

            }
        } else {

            if (opp.Agency1__c!=null) {
                    opp.Agency1__c.addError(System.Label.Error_Message30);
                    error = true;
                    errormessage = System.Label.Error_Message30;
            }
            if (quo.OCM_Agent1_Price_Page__c!=null) {
                    quo.OCM_Agent1_Price__c.addError(System.Label.Error_Message30);
                    error = true;
                    errormessage = System.Label.Error_Message30;
            }
            if (opp.Agency2__c!=null) {
                    opp.Agency2__c.addError(System.Label.Error_Message30);
                    error = true;
                    errormessage = System.Label.Error_Message30;
            }
            if (quo.Agent1_Agent2_Price_Page__c!=null) {
                    quo.Agent1_Agent2_Price__c.addError(System.Label.Error_Message30);
                    error = true;
                    errormessage = System.Label.Error_Message30;
            }

        }

        if (DisCalculation>=1000 || DisCalculation<=-1000) {
            error = true;
            errormessage = System.Label.Error_Message38;
        }
        if (qb.SalesCalculation1>=1000 || qb.SalesCalculation1<=-1000) {
            error = true;
            errormessage = System.Label.Error_Message38;
        }
        if (qb.SalesCalculation2>=1000 || qb.SalesCalculation2<=-1000) {
            error = true;
            errormessage = System.Label.Error_Message38;
        }

        if (error==true) {
            PageArrange();

            errorflg = true;
            return false;
        }

        //Quote-------------------------------------------------------------
        //商談Id、価格表Id
        //見積名称、標準定価合計、見積金額合計(積上)、病院の契約金額、原価、
        //値引金額計算、値引き金額金額、見積調整金額計算、見積調整金額金額
        //第一販売店名称、金額、利益、％、第二販売店名称、金額、利益、％
        //优惠成交价、优惠折扣、优惠价格、单价、报价金额、Total
        //契約内訳、印刷病院名称、見積有効期限日、見積表記コメント

        //引合単位の見積Noが必要
        List<Quote> maxQuote_No = [select Quote_No__c From Quote Where OpportunityId = :oppid and (not Quote_No__c like '%Old') order by Quote_No_last2__c desc NULLS LAST limit 1];
        String oppNo;
        Integer l = 1;
        if (maxQuote_No.size()>0) {
            try {
                oppNo = maxQuote_No[0].Quote_No__c;
                l = Integer.valueOf(oppNo.substring(oppNo.length() - 2)) + 1;
            } catch (System.TypeException e) {
                system.debug('maxQuote_No Error: quote.id=' + maxQuote_No[0].id);
            }
        } else {
            system.debug('first Quote');
        }
        oppNo = '00' + String.valueof(l);
        oppNo = oppNo.substring(oppNo.length() - 2);

        Quote q = New Quote();
        if (changedAfterPrint) {
            quoId = null;
        }
        // false伝票から新規作成
        if (changedAfterBid) {
            quoId = null;
        }
        //非创建者被人操作，则新建一份新的报价
        if ( quoteOwner !=null && quoteOwner != UserInfo.getUserId() ){
            quoId = null;
        }

        // 多年保修 start
    //报价试算 增加经销商前后对比 精琢技术 wql 20210508 start
        if ((quoteGurantee_Period != null &&
            !quoteGurantee_Period.equals(quo.Gurantee_Period__c))
            ||
            (quotemultiYearWarranty != null &&
            !quotemultiYearWarranty.equals('' + quo.multiYearWarranty__c))
        ||
        (agency1Name !=null &&!agency1Name.equals(quo.Agency1__c))
        ||
        (agency2Name !=null &&!agency2Name.equals(quo.Agency2__c))
            ) {
            quoId = null;
        }
    agency1Name = quo.Agency1__c;
    agency2Name = quo.Agency2__c;
    //报价试算 增加经销商前后对比 精琢技术 wql 20210508 end
        quoteGurantee_Period = quo.Gurantee_Period__c;
        quotemultiYearWarranty = '' + quo.multiYearWarranty__c;
        // 多年保修 end

        if (quoId==null) {
            q = New Quote();
            q.OpportunityId = oppId;
            if (detail == true) {
                if (standardPricebook==null) {
                  errormessage = System.Label.Error_Message27;
                  errorflg = true;
                  return false;
                } else {
                    q.Pricebook2Id = standardPricebook.Id;
                }
            }

        } else {
            List<Quote> qs = New List<Quote>();
            qs = [select Id,OpportunityId,Pricebook2Id,Name,Estimation_List_Price__c,Dealer_Final_Price__c,
                Stocking_Price__c,Discount_Amount__c,Discount_Amount_Calculate__c,Quote_Adjust_Amount__c,Quote_Adjust_Calculate__c,
                Agency1__c,OCM_Agent1_Price__c,Agency1_Profit__c,Agency1_Profit_Rate__c,Quote_No__c,
                Agency2__c,Agent1_Agent2_Price__c,Agency2_Profit__c,Agency2_Profit_Rate__c,
                Preferential_Trading_Price__c,Discount__c,Pricing__c,Unit_Price__c,Offer_Amount__c,TOTAL__c,
                Contract__c,Print_HP_Name__c,Quote_Expiration_Date__c,Quote_Comment__c,OCM_Sales_Forecast__c,Installation_location__c,HasType3Machine__c
                // 多年保修 start
                , Gurantee_Period__c , multiYearWarranty__c, MultiYearWarrantyTotalPrice__c,
                Preferential_Gurantee_Period__c
                // 多年保修 end
            //报价试算 start
            ,IsQuoteTrial__c 
            //报价试算 end
                From Quote Where Id =:quoId];
            if (qs.size()>0) {
                q = qs[0];
            }
            if (q.Pricebook2Id ==null) {
                if (detail == true) {
                    if (standardPricebook==null) {
                      errormessage = System.Label.Error_Message27;
                      errorflg = true;
                      return false;
                    } else {
                        q.Pricebook2Id = standardPricebook.Id;
                    }
                }
            }
        }

        if (quoId==null) {
            q.Quote_No__c = opp.Opportunity_No__c + '-' + oppNo;
            q.PriceRefreshDate__c = Date.today();
        }
        if (productStatusUpdated) {
            q.PriceRefreshDate__c = Date.today();
        }

        // 20150302 jo 見積の主机安装地点を設定
        List<String> pIds = new List<String>();
        for (QELine s:activities) {
            if (String.isBlank(s.PageObject.Id__c) == false) {
                pIds.add(s.PageObject.Id__c);
            }
        }
        List<Product2> pList = [select Id from Product2 where Id in :pids and Category3__c = '主机'];
        if (pList.size() > 0) q.HasType3Machine__c = true;

        q.Name = quo.QuoteName__c;
        // TODO katsu 新規じゃない場合セットする必要ですか？
        q.Estimation_List_Price__c = qb.Estimation_List_Price;
        //q.TotalPrice = quo.TotalPrice; ===============-Field is not writeable: Quote.TotalPrice
        q.Dealer_Final_Price__c =  quo.Dealer_Final_Price_Page__c;
        q.OCM_Sales_Forecast__c = opp.Wholesale_Price__c;
        q.Stocking_Price__c = quoStocking_Price_c;
        quo.Stocking_Price__c = quoStocking_Price_c;

        q.Quote_Adjust_Amount__c = quo.Quote_Adjust_Amount_Page__c;
        q.Quote_Adjust_Calculate__c = qb.Quote_Adjust_Calculate;
        q.Discount_Amount__c = DisAmount;
        q.Discount_Amount_Calculate__c = DisCalculation;

        q.Agency1__c = opp.Agency1__c;
        q.OCM_Agent1_Price__c = quo.OCM_Agent1_Price_Page__c;
        q.Agency1_Profit__c = Salesprofit1;
        q.AgencyDiscount__c  = AgencyDiscount; // 2018/09/28 CHAN-B4YAB8 经销商折扣

        //多年保修 start
        q.Gurantee_Period__c = quo.Gurantee_Period__c;
        q.multiYearWarranty__c = quo.multiYearWarranty__c;
        q.MultiYearWarrantyTotalPrice__c = quo.MultiYearWarrantyTotalPrice__c;
        q.quoteSavedDate__c = Date.today();
        //多年保修 end

        q.Agency1_Profit_Rate__c = qb.SalesCalculation1;
//        q.Agency1_Profit_Rate__c = quo.Agency1_Profit_Rate__c;
        q.Agency2__c = opp.Agency2__c;
        q.Agent1_Agent2_Price__c = quo.Agent1_Agent2_Price_Page__c;
        q.Agency2_Profit__c = Salesprofit2;
        q.Agency2_Profit_Rate__c = qb.SalesCalculation2;
        q.Opportunity_sub_owner__c = opp.Opportunity_sub_owner__c;
        //----checkbox は印刷直前に保存
        q.Print_HP_Name__c = selection_hp;
        q.Quote_Expiration_Date__c = quo.Quote_Expiration_Date__c;
        q.Quote_Comment__c = quo.Quote_Comment__c;

        q.Installation_location__c = quo.Installation_location__c;
        /*
        if (hasType3Machine) {
            q.Installation_location__c = '';
        }
*/
        if (quoId==null) {
            insert q;
            quo.Quote_No__c = q.Quote_No__c;
        } else {
            update q;
        }

system.debug('○○○○○Save1○○○○○');

        //QuoteLineItem;
        List<QuoteLineItem> qlist = New List<QuoteLineItem>();
        qlist=[Select Id From QuoteLineItem Where QuoteId =:quoId];
        if (qlist.size()>0) {
            //delete
            delete qlist;
        }

        //QuoteLineItem--------------------------------------------
        //製品型番、品目コード、SFDAステータス、品目名、ListPrice、数量
        //価格、単位、小計、OCM売上予測金額（税抜）、価格表
        qlist = New List<QuoteLineItem>();
        //Sap送信,Printに合わせて1～
        Integer i=1;
        if (activities.size()>0) {
            system.debug('activities+++***+++'+activities);
            for (QELine s:activities) {
                if (s.Asset_Model != null && s.Asset_Model != '') {
                    if (s.pageObject.PricebookEntryId != null) {
                        // TODO katsu なぜclone()しますか？意味不明。
                        QuoteLineItem ql = s.pageObject.clone();
                        ql.Quantity = ql.Quantity__c;
                        ql.UnitPrice = 0;                        // UnitPriceを使わないけど、必須なので、0を入れる
                        ql.QuoteId = q.Id;
                        ql.ProductSetName__c = s.Product_Set_Name;
                        ql.Cost__c = s.Cost_c;
                        ql.Cost_Subtotal__c = s.Cost_Subtotal_c;
                        s.pageObject.Cost__c = s.Cost_c;
                        s.pageObject.Cost_Subtotal__c = s.Cost_Subtotal_c;
                        ql.UnitPrice__c = ql.UnitPrice_Page__c;
                        ql.UnitPrice_Page__c = 0;
                        ql.ListPrice__c = s.ListPrice_Page;
                        // 多年保修  start
                        //不可取消多年保标识  fy 2021.10.15 start
                        ql.CanNotCancelFlag__c = s.CanNotCancelledGurantee;
                        //不可取消多年保标识  fy 2021.10.15 end
                        // 计提金额
                        ql.GuranteePrice__c        = s.GuranteePrice;
                        ql.ProductGuranteePrice__c = s.ProductGuranteePrice;
                        // 维修合同报价
                        ql.Maintenance_Price_Year__c = s.Maintenance_Price_Year;
                        // 多年保修  end
                        ql.SFDA_Status__c = prd2LatestValMap.get(s.pageObject.Id__c).SFDA_Status__c;
                        //並び順
                        ql.Item_Order__c = i;
                        //OCM売上予測金額(税込) = OCM成約予測金額(税込み) * (小計 / 見積合計)
                        if (s.PageObject.Subtotal__c != null && opp.Wholesale_Price__c != null && quo.QuoteTotal_Page__c != null) {
                            if (s.PageObject.Subtotal__c>0 && quo.QuoteTotal_Page__c>0) {
                                ql.OCM_Sales_Forecast__c =  opp.Wholesale_Price__c * (s.PageObject.Subtotal__c / quo.QuoteTotal_Page__c);
                            }
                        }
                        qlist.add(ql);
                        i++;
                    }
                }
            }
            insert qlist;

        }
system.debug('○○○○○Save2○○○○○');

        //Opportunity--------------------------------------------
        //標準定価合計価格、見積金額総合計（税抜き）、病院契約金額、
        //1次販売店、1次販売店利益金額、1次販売店利益率、
        //2次販売店、2次販売店利益金額、2次販売店利益率
        //見積番号、見積名
        Opportunity o = New Opportunity();
        List<Opportunity> os = New List<Opportunity>();
        os = [select Id,Estimation_List_Price__c,Dealer_Final_Price__c,Estimation_List_Price_Without_Tax__c,
            Stock_Submit_Date__c,Stock_Confrim_Date__c,Quote_Update_Sum__c,
            Agency1__c,OCM_Agent1_Price__c,Agency1_Profit__c,Agency1_Profit_Rate__c,Stocking_Price__c,
            Agency2__c,Agent1_Agent2_Price__c,Agency2_Profit__c,Agency2_Profit_Rate__c
            From Opportunity Where Id =:oppid];
        if (os.size()>0) {
            o = os[0];
            o.Estimation_List_Price__c =qb.Estimation_List_Price;
            o.Wholesale_Price__c = opp.Wholesale_Price__c;
            o.Dealer_Final_Price__c = quo.Dealer_Final_Price_Page__c;
            o.Agency1__c =opp.Agency1__c;
            o.OCM_Agent1_Price__c = quo.OCM_Agent1_Price_Page__c;
            o.Agency1_Profit__c =Salesprofit1;
            o.Agency1_Profit_Rate__c =qb.SalesCalculation1;
//            o.Agency1_Profit_Rate__c = quo.Agency1_Profit_Rate__c;
            o.Agency2__c = opp.Agency2__c;
            o.Agent1_Agent2_Price__c = quo.Agent1_Agent2_Price_Page__c;
            o.Agency2_Profit__c = Salesprofit2;
            o.Agency2_Profit_Rate__c = qb.SalesCalculation2;
//            o.Agency2_Profit_Rate__c = quo.Agency2_Profit_Rate__c;

            o.Stocking_Price__c = quo.Stocking_Price__c;

            o.Estimation_No__c = quo.Quote_No__c;
            //o.Estimation_Name__c = quo.Name;
            o.Estimation_Name__c = q.Name;
            o.Estimation_Id__c = q.Id;
            o.Installation_location__c = q.Installation_location__c;
            o.HasType3Machine__c = q.HasType3Machine__c;
             // 2018/09/29 CHAN-B4YAB8 经销商折扣 start
            o.AgencyDiscount__c  = AgencyDiscount;
            // 2018/09/29 CHAN-B4YAB8 经销商折扣 end
            // 多年保修 start
            o.Gurantee_Period__c              = quo.Gurantee_Period__c ;
            o.multiYearWarranty__c            = quo.multiYearWarranty__c ;
            o.MultiYearWarrantyTotalPrice__c  = quo.MultiYearWarrantyTotalPrice__c ;
            o.quoteSavedDate__c = Date.today();
            // 多年保修 end

            system.debug(UserInfo.getProfileId() +'233333'+ System.Label.ProfileId_2S6);
            if(quoId==null && UserInfo.getProfileId() != System.Label.ProfileId_2S6){
                o.Stock_Submit_Date__c = null;
                o.Stock_Confrim_Date__c = null;
            }
            if (o.Quote_Update_Sum__c == null) {
                o.Quote_Update_Sum__c = 1;
            } else {
                o.Quote_Update_Sum__c = o.Quote_Update_Sum__c + 1;
            }
            ControllerUtil.updOpp(o);

system.debug('○○○○○Save3○○○○○');

            //OpportunityLineItem--------------------------------------------
            //製品型番、品目コード、SFDAステータス、品目名、ListPrice、数量
            //価格、単位、小計、OCM売上予測金額（税抜）、価格表
            List<OpportunityLineItem> ols = New List<OpportunityLineItem>();
            OpportunityLineItem ol = New OpportunityLineItem();
            ols = [select Id from OpportunityLineItem Where OpportunityId =:oppid];
            if (ols.size()>0) {
                //delete
                ControllerUtil.delOppLine(ols);
system.debug('○○○○○Save4○○○○○');
            }
            //Sap送信,Printに合わせて1～
            i=1;
            ols = New List<OpportunityLineItem>();
            if (activities.size()>0) {
                for (QELine s:activities) {
                    if (s.Asset_Model != null && s.Asset_Model != '') {
                        if (s.PageObject.PricebookEntryId != null) {
                            ol = New OpportunityLineItem();
                            ol.OpportunityId = oppid;
                            ol.Id__c = s.PageObject.Id__c;
                            //ol.SFDA_Status__c = s.PageObject.SFDA_Status__c;
                            ol.SFDA_Status__c = prd2LatestValMap.get(s.pageObject.Id__c).SFDA_Status__c;
                            ol.Name__c = s.PageObject.Name__c;
                            ol.ListPrice__c = s.ListPrice_Page;
                            ol.Quantity = s.PageObject.Quantity__c;
                            ol.UnitPrice = 0;
                            ol.UnitPrice__c = s.PageObject.UnitPrice_Page__c;
                            // 2018-10-31 CHAN-B4YAB8 赠送、经销商单价和小计 start
                            ol.AgencyUnitPrice__c =  s.PageObject.AgencyUnitPrice__c;
                            ol.Present__c =  s.PageObject.Present__c;
                            ol.AgencySubtotal__c =  s.PageObject.AgencySubtotal__c;
                            // 2018-10-31 CHAN-B4YAB8 赠送、经销商单价和小计 end
                            // 多年保修 start
                            ol.GuaranteePeriod__c =  s.PageObject.GuaranteePeriod__c;
                            //外贸多年保 取消CNY 的判断 &&  oppInfo.CurrencyIsoCode.equals('CNY')
                            //外贸多年保 精琢技术 wql 2021/01/27 start 
                            if(oppInfo.CurrencyIsoCode !=null){
                                ol.multiYearWarranty__c =  s.PageObject.multiYearWarranty__c;
                                ol.ServicePrice__c =  s.PageObject.ServicePrice__c;
                                ol.If_Cancel_Guarantee__c =  s.PageObject.If_Cancel_Guarantee__c;
                                ol.ProductEntend_gurantee_period_all__c
                                    =  s.PageObject.ProductEntend_gurantee_period_all__c;
                                ol.GuranteeType__c =  s.PageObject.GuranteeType__c;
                                ol.NoDiscountTotal__c =  s.PageObject.NoDiscountTotal__c;
                                ol.warrantyType__c =  s.PageObject.warrantyType__c;
                                ol.productServicePrice__c =  s.PageObject.productServicePrice__c;
                                // 计提金额
                                ol.GuranteePrice__c        = s.GuranteePrice;
                                ol.ProductGuranteePrice__c = s.ProductGuranteePrice;
                                // 维修合同报价
                                ol.Maintenance_Price_Year__c = s.Maintenance_Price_Year;
                                ol.provistonPeriod__c = s.PageObject.provistonPeriod__c;
                            }
                            //外贸多年保 精琢技术 wql 2021/01/27 end
                            // 多年保修 end
                            ol.Qty_Unit__c = s.PageObject.Qty_Unit__c;
                            //コストは小計済を登録
                            ol.Cost__c = s.PageObject.Cost__c;
                            ol.BSS_Category__c = s.PageObject.BSS_Category__c;
                            //不可取消多年保标识  fy 2021.10.15 start
                            ol.CanNotCancelFlag__c = s.CanNotCancelledGurantee;
                            //不可取消多年保标识  fy 2021.10.15 end
                            //OCM売上予測金額 * (小計/見積合計)
                            if (s.PageObject.Subtotal__c != null && opp.Wholesale_Price__c != null && quo.QuoteTotal_Page__c != null) {
                                if (s.PageObject.Subtotal__c>0 && quo.QuoteTotal_Page__c>0) {
                                    ol.OCM_Sales_Forecast__c =  opp.Wholesale_Price__c * (s.PageObject.Subtotal__c / quo.QuoteTotal_Page__c);
                                }
                            }
                            //価格表
                            ol.PricebookEntryId = s.PageObject.PricebookEntryId;
                            //並び順
                            ol.Item_Order__c = i;
                            ols.add(ol);
                            i++;
                        }
                    }
                }
                ControllerUtil.insOppLine(ols);
system.debug('○○○○○Save5○○○○○');
            }

        } else {
            system.debug('*****SystemError OpportunityId is Null*****');
        }

        //保存時引合Pageに戻らない処理とした為にQuoteIdをここでセット
        if (quoId==null) {
            quoId = q.Id;
        }
        return true;
    }
//lastbuy  2022/2/15 fy start
public boolean ReservedProductVerification() {
    filg=true;
    Map<string,QuoteLineItem> quotlinitMap = new Map<string,QuoteLineItem>();
    List<Id> lastProductFLGListId = new List<Id>();
    List<QuoteLineItem> lastProductFLGList = new List<QuoteLineItem>();
    List<QuoteLineItem> act = new List<QuoteLineItem>();
    List<QuoteLineItem> act2 = new List<QuoteLineItem>();
    for(QELine aaa :activities){
      if(aaa.pageObject.PricebookEntry.Product2Id!=null){
        act.add(aaa.pageObject);
      }
    }
    act2=act.deepClone();
    Map<String,QuoteLineItem> map1 = new Map<String,QuoteLineItem>();
    System.debug('activities1111111111112为所当为多多!!!'+activities);
    integer i =0;
    for(QuoteLineItem pspsc :act2){
      if(pspsc.PricebookEntry.Product2Id!=null){
        if(map1.containsKey(pspsc.PricebookEntry.Product2Id)){
          QuoteLineItem quoteLine = map1.get(pspsc.PricebookEntry.Product2Id);
          quoteLine.Quantity__c =quoteLine.Quantity__c+pspsc.Quantity__c;
          map1.put(pspsc.PricebookEntry.Product2Id,quoteLine);
        }else{
          map1.put(pspsc.PricebookEntry.Product2Id,pspsc);
        }
        // System.debug('34499879!!!'+activities);
      }
    }
    System.debug('3434343!!!'+activities);
    System.debug('5656565!!!'+map1);
    for (QuoteLineItem value : map1.values()) {
      if(value.PricebookEntry.Product2.LastbuyProductFLG__c){
        lastProductFLGListId.add(value.PricebookEntry.Product2Id);
        quotlinitMap.put(value.PricebookEntry.Product2Id,value);
        lastProductFLGList.add(value);
      }
    }
    System.debug('activities++++!!!'+activities);
    System.debug('activities!!!'+map1.values());
    System.debug('oppId!!!'+oppId);
    System.debug('lastProductFLGList!!!'+lastProductFLGListId);
    if(lastProductFLGListId!=null&&lastProductFLGListId.size()!=0){
        List<LastbuyProduct__c> LastbuyObjList=[select id,LastbuyQuantity__c,InquiryCode__c,ProductName__c,effectiveFLG__c from LastbuyProduct__c where InquiryCode__c= : oppId and ProductName__c in :lastProductFLGListId and effectiveFLG__c = true];
        Map<string,LastbuyProduct__c> LastbuyObjMap = new Map<string,LastbuyProduct__c>();
        System.debug('LastbuyObjList+++++!!!'+LastbuyObjList);
        if(LastbuyObjList!=null&&LastbuyObjList.size()!=0){
          for(LastbuyProduct__c lastbuypr :LastbuyObjList){
            LastbuyObjMap.put(lastbuypr.ProductName__c,lastbuypr);
          }
        }else{
          flglastbuy=1;
          filg=false;
          return filg;
        }
        System.debug('LastbuyObjMap!!!'+LastbuyObjMap);
        System.debug('lastProductFLGList+++++++!!!'+lastProductFLGList);
        if(lastProductFLGList!=null&&lastProductFLGList.size()!=0){
          for(QuoteLineItem lastbuypr :lastProductFLGList){
            Decimal quoteLItemNum=0;
            if(LastbuyObjMap.containsKey(lastbuypr.PricebookEntry.Product2Id)){
                quoteLItemNum=LastbuyObjMap.get(lastbuypr.PricebookEntry.Product2Id).LastbuyQuantity__c;
                System.debug('quoteLItemNum!!!'+quoteLItemNum);
                System.debug('lastbuypr.pageObject.Quantity__c+++!!!'+lastbuypr.Quantity__c);
                if(lastbuypr.Quantity__c>quoteLItemNum){
                  errorProductmodel=lastbuypr.Asset_Model_No__c;
                  flglastbuy=2;
                  filg=false;
                  break;
                }
            }else{
              errorProductmodel=lastbuypr.Asset_Model_No__c;
              flglastbuy=3;
              filg=false;
              break;
            }
          }
        }
    }
    system.debug('filg====='+filg);
    return filg;
  }
  //lastbuy  2022/2/15 fy end
    //oppに画面の値を設定
    private void setOppFromOppInfo() {
        opp.Wholesale_Price__c = oppInfo.Wholesale_Price;
        opp.Agency1__c = quo.Agency1__c;
        opp.Agency2__c = quo.Agency2__c;
    }
    public void testI() {
        integer i= 0;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
        i ++;
    }

    public class OppInfo {
        public String Account_RecordType_DeveloperName { get; set; }
        public String Direct_Separate { get; set; }
        public String Trade { get; set; }
        public Decimal Wholesale_Price { get; set; }
        public String CurrencyIsoCode { get; set; }
        public String HP_Name { get; set; }
        public String Department_Name { get; set; }
        public String Sales_Root { get; set; }
        // LHJ Start
        public boolean If_Need_Authorize { get; set; }
        public String Authorized_DB_No { get; set; }
        // LHJ End

        public OppInfo(Opportunity opp) {
            Account_RecordType_DeveloperName = opp.Account.RecordType.DeveloperName;
            Direct_Separate = opp.Direct_Separate__c;
            Trade = opp.Trade__c;
            Wholesale_Price = opp.Wholesale_Price__c;
            CurrencyIsoCode = opp.CurrencyIsoCode;
            HP_Name = opp.HP_Name__c;
            Department_Name = opp.Department_Name__c;
            Sales_Root = opp.Sales_Root__c;
            // LHJ Start
            If_Need_Authorize = opp.If_Need_Authorize__c;
            Authorized_DB_No = opp.Authorized_DB_No__c;
            // LHJ End
        }
    }
    //TODO 1.Quoteオブジェクト追加
    //TODO 2.コンストラクタを追加
    public class QuoteBean {
        public Decimal Estimation_List_Price { get; set; }
        //TODO 999.99以下しか入力できない。
        public Decimal Quote_Adjust_Calculate { get; set; }
        public Decimal SalesCalculation1 { get; set; }
        public Decimal SalesCalculation2 { get; set; }
        public Integer PriceRefreshPeriod { get; set; }
        public void setPriceRefreshPeriodByDate(Date PriceRefreshDate) {
            this.PriceRefreshPeriod = PriceRefreshDate.daysBetween(Date.today());
        }
    }

    public class QELinelatestInfo {
        public String ProductCode { get; set; }
        public String ProductName { get; set; }

        public String SFDA_Status { get; set; }
        public String Sales_Possibility { get; set; }
        public Decimal ListPrice { get; set; }              // 最新
        public Decimal Cost { get; set; }                    // 最新
        public Integer Specifications {get;set;}
        // 多年保修 start
        public string GuranteeType {get;set;}
        public Decimal Intra_Trade_Gurantee {get; set;}
        public Decimal ProductEntend_gurantee_period_all {get; set;}
        public Decimal Intra_Trade_Service {get; set;}
        // 维修合同报价
        public decimal Maintenance_Price_Year {get; set;}
        // 多年保修 end
    }
    public class QELine {
        public Integer lineNo { get; set; }                                // 画面の順序
        public String Asset_Model { get; set; }
        public String Sales_Possibility { get; set; }                         // 販売可否○×判断用、使ってないようです。TODO 削除
        public QuoteLineItem pageObject { get; set; }                      // Id__cは空行判断用、SFDA_Status__c など、翻訳される項目表示するため使う必要があります
        public Decimal Cost_c { get; set; }
        public Decimal Cost_Subtotal_c { get; set; }
        public Decimal ListPrice_Page { get; set; }
        //*******************************liukun******************//
        public String StorageStatus { get; set; }
    //********************Insert [OLY_OCM-228] [20160706] [赵德芳] Start********************//
        public Integer Specifications {get;set;}
    //********************Insert [OLY_OCM-228] [20160706] [赵德芳] End**********************//
    //********************Insert [SI询价-产品配套] [20160315] [赵德芳] Start********************//
        public String VenderName { get; set; }
        public String Product_Set_Name {get;set;}
    //********************Insert [SI询价-产品配套] [20160315] [赵德芳] End**********************//
        // PriceStatusUpdate() 用の項目、TODO 初期値の設定
        public QELinelatestInfo latestInfo { get; set; }
    // TODO ほんとうはいらない、使うところのロジックを修正しなければいけない、削除するようにしたいです。
        //三方 产品注册证 报错标记用
        public boolean haveno_Register { get; set; }
        public boolean wrong_Register { get; set; }

        //SFDC停止预警 lt 20211009 start
        public String Estimated_ConsumptionDueDate { get; set; }
        //SFDC停止预警 lt 20211009 end

        // 多年保修  start
        // 计提金额
        public Decimal GuranteePrice { get; set; }
        public Decimal ProductGuranteePrice { get; set; }

        //不可取消多年保
        public Boolean CanNotCancelledGurantee {get;set;}

        // 维修合同报价
        public decimal Maintenance_Price_Year {get; set;}
        // 多年保修 end

        public QELine(Integer i) {
            pageObject = New QuoteLineItem();
            latestInfo = New QELinelatestInfo();
            this.lineNo = i;
            this.haveno_Register = false;
            this.wrong_Register  = false;
        }
        // tmp 直接使う場合のパターン
        public QELine(QELine tmp, Integer i) {
            pageObject = tmp.pageObject;
            this.lineNo = i;
            this.Asset_Model = tmp.Asset_Model;
            this.Sales_Possibility = tmp.Sales_Possibility;
            this.latestInfo = tmp.latestInfo;
            this.Cost_Subtotal_c = tmp.Cost_Subtotal_c;
            this.Cost_c = tmp.Cost_c;
            this.ListPrice_Page = tmp.ListPrice_Page;
            this.StorageStatus = tmp.StorageStatus;
            // 多年保修 计提金额 start
            this.GuranteePrice          = tmp.GuranteePrice;
            this.ProductGuranteePrice   = tmp.ProductGuranteePrice;
             //维修合同报价
            this.Maintenance_Price_Year = tmp.Maintenance_Price_Year;
            // 多年保修  end
            this.haveno_Register = false;
            this.wrong_Register  = false;
            //不可取消多年保
            this.CanNotCancelledGurantee = tmp.CanNotCancelledGurantee;
            //供应商名称
            this.VenderName = tmp.VenderName;
            
            //SFDC停止预警 lt 20211009 start
            this.Estimated_ConsumptionDueDate = tmp.Estimated_ConsumptionDueDate;
            //SFDC停止预警 lt 20211009 end

        }
        public QELine(OpportunityLineItem oli, Integer i) {
            pageObject = New QuoteLineItem();
            pageObject.Quantity__c = oli.Quantity;

            this.lineNo = i;
            this.Asset_Model = oli.Asset_Model_No__c;
            //********************Insert [OLY_OCM-228] [赵德芳] Start********************//
            this.VenderName = oli.PricebookEntry.Product2.VenderName__c;
           

            //SFDC停止预警 lt 20211009  ①不能定义date变量 因为前台返回的是String日期  ②将util里的方法转为日期格式 start
            if(oli.PricebookEntry.Product2.Estimated_ConsumptionDueDate__c != null){
                this.Estimated_ConsumptionDueDate = NFMUtil.formatDate2StrSpo(oli.PricebookEntry.Product2.Estimated_ConsumptionDueDate__c).replaceAll('-','/');
            }else{
                this.Estimated_ConsumptionDueDate = '';
            }
            //SFDC停止预警 lt 20211009 end

            if(VenderName==null||VenderName==''){
                this.VenderName =' 无 ';
            }else{
                this.VenderName = oli.PricebookEntry.Product2.VenderName__c;
            }
            //********************Insert [SI询价-产品配套] [赵德芳] End**********************//
            this.Sales_Possibility = oli.PricebookEntry.Product2.Sales_Possibility__c;
            this.StorageStatus = oli.PricebookEntry.Product2.StorageStatus__c;
            //********************Insert [OLY_OCM-228] [20160706] [赵德芳] Start********************//
            if(oli.PricebookEntry.Product2.Packing_list_manual__c!=null){
                this.Specifications =integer.valueof(oli.PricebookEntry.Product2.Packing_list_manual__c+'');
            }
            //********************Insert [OLY_OCM-228] [20160706] [赵德芳] End**********************//
            PageObject.Id__c = oli.PricebookEntry.Product2Id;
            PageObject.UnitPrice_Page__c = oli.UnitPrice__c;
            //CHAN-B4YAB8 2018/9/28 小计经销商单价和小计
            PageObject.AgencySubtotal__c = oli.AgencySubtotal__c;
            PageObject.AgencyUnitPrice__c = oli.AgencyUnitPrice__c;
            PageObject.Present__c = oli.Present__c;
            //不可取消多年保
            this.CanNotCancelledGurantee = oli.PricebookEntry.Product2.CanNotCancelledGurantee__c;
            // CHAN-B4YAB8 2018/9/28 经销商单价和小计
            // 多年保修 start
            PageObject.multiYearWarranty__c = oli.multiYearWarranty__c;
            PageObject.GuaranteePeriod__c = oli.GuaranteePeriod__c;
            PageObject.ServicePrice__c = oli.ServicePrice__c;
            PageObject.If_Cancel_Guarantee__c = oli.If_Cancel_Guarantee__c;

            PageObject.ProductEntend_gurantee_period_all__c =  oli.ProductEntend_gurantee_period_all__c;
            PageObject.GuranteeType__c = oli.GuranteeType__c;

            PageObject.warrantyType__c = oli.warrantyType__c;
            
            PageObject.NoDiscountTotal__c = oli.NoDiscountTotal__c;
            PageObject.provistonPeriod__c = oli.provistonPeriod__c;
             // 计提金额
            this.GuranteePrice          = oli.GuranteePrice__c;
            
            // 维修合同报价
            this.Maintenance_Price_Year = oli.Maintenance_Price_Year__c;
            // 多年保修 end

            PageObject.SFDA_Status__c = oli.PricebookEntry.Product2.SFDA_Status__c;


            PageObject.Name__c = oli.PricebookEntry.Product2.Name;

            Decimal cost;
            //外贸多年保 精琢技术 wql 2021/01/27 start
            if (oli.Opportunity.Trade__c == '内貿') {
                this.ListPrice_Page = oli.PricebookEntry.Product2.Intra_Trade_List_RMB__c;
                cost = oli.PricebookEntry.Product2.Intra_Trade_Cost_RMB__c;
                this.ProductGuranteePrice   = oli.PricebookEntry.Product2.Intra_Trade_Gurantee_RMB__c;
                PageObject.productServicePrice__c = oli.productServicePrice__c;
            } else if (oli.Opportunity.Trade__c == '外貿') {
                this.ListPrice_Page = oli.PricebookEntry.Product2.Foreign_Trade_List_US__c;
                cost = oli.PricebookEntry.Product2.Foreign_Trade_Cost_US__c;
                this.ProductGuranteePrice   = oli.PricebookEntry.Product2.Intra_Trade_Foreign_RMB__c;
                PageObject.productServicePrice__c = oli.PricebookEntry.Product2.NoDiscount_Foreign__c;
            }
            //外贸多年保 精琢技术 wql 2021/01/27 end
            if (cost>0 && oli.Quantity>0) {
                this.Cost_Subtotal_c = cost * oli.Quantity;
            }
            this.Cost_c = cost;
            if (oli.UnitPrice__c>0 && oli.Quantity>0) {
                oli.TotalPrice__c = oli.UnitPrice__c * oli.Quantity;
            }

            PageObject.BSS_Category__c = oli.BSS_Category__c;
            pageObject.Subtotal__c = oli.TotalPrice__c;
            pageObject.PricebookEntryId = oli.PricebookEntryId;
            latestInfo = New QELinelatestInfo();
            latestInfo.ProductCode = oli.ProductCode__c;
            latestInfo.ProductName = oli.PricebookEntry.Product2.Name;
            latestInfo.SFDA_Status = oli.PricebookEntry.Product2.SFDA_Status__c;
            latestInfo.Sales_Possibility = oli.PricebookEntry.Product2.Sales_Possibility__c;
            // 多年保修 start
            latestInfo.ProductEntend_gurantee_period_all    =  oli.PricebookEntry.Product2.Entend_gurantee_period_all__c;
            //外贸多年保 注释源代码 精琢技术 wql 2021/01/27 start 
            // latestInfo.Intra_Trade_Gurantee             =  oli.PricebookEntry.Product2.Intra_Trade_Gurantee_RMB__c;
            // latestInfo.Intra_Trade_Service              =  oli.PricebookEntry.Product2.Intra_Trade_Service_RMB__c;
            latestInfo.GuranteeType                        =  oli.PricebookEntry.Product2.GuranteeType__c;
            // 维修合同报价
            //latestInfo.Maintenance_Price_Year = oli.PricebookEntry.Product2.Maintenance_Price_Year__c;
            //外贸多年保 取产品主数据的外贸金额 以及 报价 精琢技术 wql 2021/01/27 start
            if (oli.Opportunity.Trade__c == '内貿') {
                latestInfo.Intra_Trade_Gurantee             =  oli.PricebookEntry.Product2.Intra_Trade_Gurantee_RMB__c;
                latestInfo.Intra_Trade_Service              =  oli.PricebookEntry.Product2.Intra_Trade_Service_RMB__c;

                // 维修合同报价
                latestInfo.Maintenance_Price_Year = oli.PricebookEntry.Product2.Maintenance_Price_Year__c;
              } else if (oli.Opportunity.Trade__c == '外貿') {
                latestInfo.Intra_Trade_Gurantee             =  oli.PricebookEntry.Product2.Intra_Trade_Foreign_RMB__c;
                latestInfo.Intra_Trade_Service              =  oli.PricebookEntry.Product2.NoDiscount_Foreign__c;
                

                // 维修合同报价
                latestInfo.Maintenance_Price_Year = oli.PricebookEntry.Product2.Repair_Contract_USD__c;
              }
            //外贸多年保 取产品主数据的外贸金额 以及 报价 精琢技术 wql 2021/01/27 end
            // 多年保修 end
            if(oli.PricebookEntry.Product2.Packing_list_manual__c!=null){
                latestInfo.Specifications = integer.valueof(oli.PricebookEntry.Product2.Packing_list_manual__c+'');
            }
            latestInfo.ListPrice = oli.Product_ListPrice__c;
            latestInfo.Cost = oli.Product_Cost__c;
            this.haveno_Register = false;
            this.wrong_Register  = false;
        }
        public QELine(QuoteLineItem qli, Integer i, String copyQuoId) {
            //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, ' qli Id__c=' + qli.PricebookEntry.Product2Id));
            pageObject = qli.clone();
            pageObject.Id__c = qli.PricebookEntry.Product2Id;
            pageObject.Quantity__c = qli.Quantity;
            //********************Insert [SI询价-产品配套] [赵德芳] Start********************//
            this.VenderName = qli.PricebookEntry.Product2.VenderName__c;
            //SFDC停止预警 lt 20211009  ①不能定义date变量 因为前台返回的是String日期  ②将util里的方法转为日期格式 start
            if(qli.PricebookEntry.Product2.Estimated_ConsumptionDueDate__c != null){
                this.Estimated_ConsumptionDueDate = NFMUtil.formatDate2StrSpo(qli.PricebookEntry.Product2.Estimated_ConsumptionDueDate__c).replaceAll('-','/');
            }else{
                this.Estimated_ConsumptionDueDate = '';
            }
            //SFDC停止预警 lt 20211009 end
            if(VenderName==null||VenderName==''){
                this.VenderName =' 无 ';
            }else{
                //this.VenderName = qli.PricebookEntry.Product2.VenderName__c;
            }
            this.Product_Set_Name = qli.ProductSetName__c;
            //********************Insert [SI询价-产品配套] [赵德芳] End**********************//
            if (copyQuoId != null) {
                pageObject.SFDA_Status__c = qli.PricebookEntry.Product2.SFDA_Status__c;
                pageObject.Name__c = qli.PricebookEntry.Product2.Name;
                //PageObject.PricebookEntry.Product2.Packing_list_manual__c = qli.PricebookEntry.Product2.Packing_list_manual__c;
                
            }

            this.lineNo = i;
            this.Asset_Model = qli.Asset_Model_No__c;
            if (qli.Cost__c>0 && qli.Quantity>0) {
                this.Cost_Subtotal_c = qli.Cost__c * qli.Quantity;
            }

            //************************************liukun*****************************************************//
            this.StorageStatus = qli.PricebookEntry.Product2.StorageStatus__c;

            this.ListPrice_Page = qli.ListPrice__c;
            this.Cost_c = qli.Cost__c;
            pageObject.Subtotal__c = qli.TotalPrice__c;
            pageObject.UnitPrice_Page__c = qli.UnitPrice__c;
            latestInfo = New QELinelatestInfo();
            latestInfo.ProductCode = qli.ProductCode__c;
            latestInfo.ProductName = qli.PricebookEntry.Product2.Name;
            latestInfo.SFDA_Status = qli.PricebookEntry.Product2.SFDA_Status__c;
            // 多年保修 start
            latestInfo.ProductEntend_gurantee_period_all    =  qli.PricebookEntry.Product2.Entend_gurantee_period_all__c;
            // latestInfo.Intra_Trade_Gurantee             =  qli.PricebookEntry.Product2.Intra_Trade_Gurantee_RMB__c;
            // latestInfo.Intra_Trade_Service              =  qli.PricebookEntry.Product2.Intra_Trade_Service_RMB__c;

            //外贸多年保 取产品主数据上的金额及报价 精琢技术 wql start
            if(qli.Quote.Opportunity.Trade__c == '内貿'){
                latestInfo.Intra_Trade_Gurantee             =  qli.PricebookEntry.Product2.Intra_Trade_Gurantee_RMB__c;
                latestInfo.Intra_Trade_Service             =  qli.PricebookEntry.Product2.Intra_Trade_Service_RMB__c;
                //维修合同报价
                //HWAG-BLDE4M decide后成本为空 精琢技术 20200227 start
                if(qli.PricebookEntry.Product2.Maintenance_Price_Year__c == null){
                  latestInfo.Maintenance_Price_Year = 0;
                }else{
                  latestInfo.Maintenance_Price_Year = qli.PricebookEntry.Product2.Maintenance_Price_Year__c;
                }
                //HWAG-BLDE4M decide后成本为空 精琢技术 20200227 end
              }else if(qli.Quote.Opportunity.Trade__c == '外貿'){
                  latestInfo.Intra_Trade_Gurantee             =  qli.PricebookEntry.Product2.Intra_Trade_Foreign_RMB__c;
                  latestInfo.Intra_Trade_Service              =  qli.PricebookEntry.Product2.NoDiscount_Foreign__c;
                  //维修合同报价
                  //HWAG-BLDE4M decide后成本为空 精琢技术 20200227 start
                  if(qli.PricebookEntry.Product2.Maintenance_Price_Year__c == null){
                    latestInfo.Maintenance_Price_Year = 0;
                  }else{
                    latestInfo.Maintenance_Price_Year = qli.PricebookEntry.Product2.Repair_Contract_USD__c;
                  }
                  //HWAG-BLDE4M decide后成本为空 精琢技术 20200227 end
            }
            latestInfo.GuranteeType                         =  qli.PricebookEntry.Product2.GuranteeType__c;
            // 计提金额
            this.GuranteePrice                              =  qli.GuranteePrice__c;
            //不可取消多年保
            this.CanNotCancelledGurantee = qli.PricebookEntry.Product2.CanNotCancelledGurantee__c;
            this.ProductGuranteePrice                       =  qli.ProductGuranteePrice__c;
            //维修合同报价
            //latestInfo.Maintenance_Price_Year = qli.PricebookEntry.Product2.Maintenance_Price_Year__c;
            // 多年保修 end
            latestInfo.Sales_Possibility = qli.PricebookEntry.Product2.Sales_Possibility__c;
            if(qli.PricebookEntry.Product2.Packing_list_manual__c!=null){
                latestInfo.Specifications = integer.valueof(qli.PricebookEntry.Product2.Packing_list_manual__c+'');
            }
            latestInfo.ListPrice = qli.Product_ListPrice__c;
            latestInfo.Cost = qli.Product_Cost__c;
            //********************Insert [OLY_OCM-228] [20160706] [赵德芳] Start********************//
            if(qli.PricebookEntry.Product2.Packing_list_manual__c!=null){
                this.Specifications = integer.valueof(qli.PricebookEntry.Product2.Packing_list_manual__c+'');
            }
            //********************Insert [OLY_OCM-228] [20160706] [赵德芳] End**********************//
            this.haveno_Register = false;
            this.wrong_Register  = false;
        }

        // TODO Subtotal__c、以前のロジックを確認
        // 多年保修 前 原来的代码 start
        //public QELine(Integer i,String VenderName,String ProductSetName,
        // String PricebookEntryId, String Asset_Model, 
        // String StorageStatus, String ProductCode, String Id_c,
        //  String SFDA_Status_c, String Sales_Possibility_c, 
        //  String Name_c, String BSS_Category_c, Integer Quantity, 
        //  Decimal ListPrice_c, Decimal UnitPrice_c, Decimal Cost_c,
        //  Decimal Packing_list_manual


        //  ) {
        //    pageObject = New QuoteLineItem();
        //    pageObject.Quantity__c = Quantity;
        //    this.lineNo = i;
        //    this.Asset_Model = Asset_Model;
        //    this.Sales_Possibility = Sales_Possibility_c;
        //    this.Product_Set_Name = ProductSetName;
        //    //********************Insert [SI询价-产品配套] [赵德芳] Start********************//
        //    system.debug('VenderName=========='+VenderName);
        //    if(VenderName==null||VenderName==''){
        //        this.VenderName =' 无 ';
        //    }else{
        //        this.VenderName = VenderName;
        //    }
        //    //********************Insert [SI询价-产品配套] [赵德芳] End**********************//
        //    this.StorageStatus = StorageStatus;
        //    pageObject.Id__c = Id_c;
        //    pageObject.SFDA_Status__c = SFDA_Status_c;
        //    pageObject.Name__c = Name_c;
        //    pageObject.BSS_Category__c = BSS_Category_c;
        //    this.ListPrice_Page = ListPrice_c;
        //    pageObject.UnitPrice_Page__c = UnitPrice_c;
        //    pageObject.Subtotal__c = UnitPrice_c * Quantity;
        //    //PageObject.PricebookEntry.Product2.Packing_list_manual__c = Packing_list_manual;
        //    this.Cost_c = Cost_c;
        //    // TODO katsu なぜここ > 0 の判断はいらない？
        //    this.Cost_Subtotal_c = Cost_c * Quantity;
        //    pageObject.PricebookEntryId = PricebookEntryId;
        //    latestInfo = New QELinelatestInfo();
        //    latestInfo.ProductCode = ProductCode;
        //    latestInfo.ProductName = Name_c;
        //    latestInfo.SFDA_Status = SFDA_Status_c;
        //    latestInfo.Sales_Possibility = Sales_Possibility_c;
        //    latestInfo.ListPrice = this.ListPrice_Page;
        //    latestInfo.Cost = pageObject.Cost__c;
        //    if(Packing_list_manual!=null){
        //        latestInfo.Specifications =integer.valueof(''+Packing_list_manual);
        //    }
        //    this.haveno_Register = false;
        //    this.wrong_Register  = false;
        //}
        // 多年保修 前 原来代码 end

        //20211009 lt add Date Estimated_ConsumptionDueDate,
        public QELine(Integer i,Boolean CanNotCancelledGurantee,String VenderName,Date Estimated_ConsumptionDueDate,String ProductSetName,
         String PricebookEntryId, String Asset_Model, 
         String StorageStatus, String ProductCode, String Id_c,
          String SFDA_Status_c, String Sales_Possibility_c, 
          String Name_c, String BSS_Category_c, Integer Quantity, 
          Decimal ListPrice_c, Decimal UnitPrice_c, Decimal Cost_c,
          Decimal Packing_list_manual
          , Decimal Entend_gurantee_period_all
          , decimal ProductGuranteePrice
          ,string GuranteeType
          ,Decimal productServicePrice
          ,Decimal productMaintenance_Price_Year
          ) {
            pageObject = New QuoteLineItem();
            pageObject.Quantity__c = Quantity;
            this.lineNo = i;
            this.Asset_Model = Asset_Model;
            this.Sales_Possibility = Sales_Possibility_c;
            this.Product_Set_Name = ProductSetName;
            //********************Insert [SI询价-产品配套] [赵德芳] Start********************//
            system.debug('VenderName=========='+VenderName);
            if(VenderName==null||VenderName==''){
                this.VenderName =' 无 ';
            }else{
                this.VenderName = VenderName;
            }
            //********************Insert [SI询价-产品配套] [赵德芳] End**********************//
            //SFDC停止预警 lt 20211009  ①不能定义date变量 因为前台返回的是String日期  ②将util里的方法转为日期格式 start
            if(Estimated_ConsumptionDueDate != null){
                this.Estimated_ConsumptionDueDate = NFMUtil.formatDate2StrSpo(Estimated_ConsumptionDueDate).replaceAll('-','/');
            }else{
                this.Estimated_ConsumptionDueDate = '';
            }
            //SFDC停止预警 lt 20211009 end
            this.StorageStatus = StorageStatus;
            pageObject.Id__c = Id_c;
            pageObject.SFDA_Status__c = SFDA_Status_c;
            pageObject.Name__c = Name_c;
            pageObject.BSS_Category__c = BSS_Category_c;
            this.ListPrice_Page = ListPrice_c;
            pageObject.UnitPrice_Page__c = UnitPrice_c;
            pageObject.Subtotal__c = UnitPrice_c * Quantity;
            //不可取消多年保
            this.CanNotCancelledGurantee = CanNotCancelledGurantee;
            // 多年保修 start
            pageObject.ProductEntend_gurantee_period_all__c = Entend_gurantee_period_all;
            pageObject.productServicePrice__c               = productServicePrice;
            pageObject.GuranteeType__c                      = GuranteeType;
            // 计提金额
            this.ProductGuranteePrice                       =  ProductGuranteePrice;
             // 维修合同报价
            this.Maintenance_Price_Year                     = productMaintenance_Price_Year;

            // 多年保修 end

            //PageObject.PricebookEntry.Product2.Packing_list_manual__c = Packing_list_manual;
            this.Cost_c = Cost_c;
            // TODO katsu なぜここ > 0 の判断はいらない？
            this.Cost_Subtotal_c = Cost_c * Quantity;
            pageObject.PricebookEntryId = PricebookEntryId;
            latestInfo = New QELinelatestInfo();
            latestInfo.ProductCode = ProductCode;
            latestInfo.ProductName = Name_c;
            latestInfo.SFDA_Status = SFDA_Status_c;
            latestInfo.Sales_Possibility = Sales_Possibility_c;
            latestInfo.ListPrice = this.ListPrice_Page;
            latestInfo.Cost = pageObject.Cost__c;
            // 多年保修 start
            latestInfo.ProductEntend_gurantee_period_all    =  Entend_gurantee_period_all;
            latestInfo.Intra_Trade_Gurantee            =  ProductGuranteePrice;
            latestInfo.Intra_Trade_Service             =  productServicePrice;
            latestInfo.GuranteeType                         =  GuranteeType;
            latestInfo.Maintenance_Price_Year               =  productMaintenance_Price_Year;
            // 多年保修 end
            if(Packing_list_manual!=null){
                latestInfo.Specifications =integer.valueof(''+Packing_list_manual);
            }
            this.haveno_Register = false;
            this.wrong_Register  = false;
        }
    }
}