// FIXME 見積もり商品の Asset_Model_No__c ですが、数式になっています。トランザクションデータとして、項目を持つべきかと思います。by katsu 20130216
// 商談商品のId__c を PricebookEntry.Product2Idに変更すべき
// 見積もり可否 ですが、保存時みていますが、Sales_Possibilityを見ないですか？いいえ、js側で見ています
public class 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
  //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy start
  public Boolean SkipQuotefilg { get; set; }
  //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 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; }
  public boolean QuoteDecide {get; set;}
  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;}

  public Boolean over3month { get; set; }
  public Boolean newQuoteFlag=false;

  // 多年保修 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 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;
    // CHAN-AVG3PW 询价报价画面规则变更
    over3month = false;
    newQuoteFlag = false;
  }

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

  public PageReference init() {
    //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy start
    SkipQuotefilg = false;
    //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy end
    system.debug('============start init==============');
    boolean quoteflg = true;
    WinOrDecideAlert = false;
    errorflg = false;
    displayFlg = true;
    //Quote
    standardPricebook = ControllerUtil.getStandardPricebook();
    quo = new Quote();
    qb = new QuoteBean();
    String DeveloperName = '';
    //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, Opportunity.RecordType.DeveloperName,LineItemCount From Quote Where Id = :quoId];
        if (ql.size() > 0) {
          oppId = ql[0].OpportunityId;
          //添加行
          if(ql[0].LineItemCount >quoteEntryMaxLine){
            quoteEntryMaxLine = ql[0].LineItemCount;
          }
          DeveloperName = ql[0].Opportunity.RecordType.DeveloperName;
        }
      } else {
        quoId = System.currentPageReference().getParameters().get('copyid');
        system.debug('copyid++++++++++++'+quoId);
        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;
          }
        }
      }
    }

    if (DeveloperName == 'SI_Oppor') {
      PageReference pageRef = new PageReference('/apex/SI_NewQuoteEntry?id=' + quoId);
      return pageRef;
    }
    system.debug('DeveloperName============' + DeveloperName);
    //--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 From User Where Id = :userid];
      if (us.size() > 0) {
        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, Account.RecordType.DeveloperName,
               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
               // CHAN-BEN5UC start
               , Hospital__c, Department_Class__c
               ,Is_Corrosion__c,
               // CHAN-BEN5UC end
               //【是否需要价格申请】 thh start
               If_Need_PriceApply__c
               //【是否需要价格申请】 thh end
               // Celon询价修改 2022-04-24 ssm start
               ,CelonOpportunity__c 
               // Celon询价修改 2022-04-24 ssm end
               // lastbuy判断变更用户询价 start
               , If_Account_Change__c 
               // lastbuy判断变更用户询价 end
               FROM Opportunity Where Id = :oppId];
    // 多年保修 start
    trade = '外貿';
    // 多年保修 end
    if (oppList.size() > 0) {

      opp = oppList[0];
      // 多年保修 start
      trade = opp.Trade__c;
      // 多年保修 end
      QuoteDecision = opp.Estimation_Decision__c;
      QuoteDecide = QuoteDecision;
      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,
                 //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start 增加字段,不可取消多年保&& 增加检索阿西赛多 2020/09/10start
                 Qty_Unit__c, Cost__c, UnitPrice, ListPrice__c, Quantity, BSS_Category__c, TotalPrice,PricebookEntry.Product2.VenderName__c,PricebookEntry.Product2.CanNotCancelledGurantee__c,PricebookEntry.Product2.Is_DangerousChemicals__c,
                 //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 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,
                 //ProductIfConsumable__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/04 精琢技术 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/04 精琢技术 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);
          }
          productStatusUpdated = true;

        } 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 =//SWAG-CKDATG 【委托】【OBSAP-报价委托】报价委托项目改善1 fy start QuotationChange__c,MainEngineWithoutMonitor__c,Interdepartmental__c,
        [ SELECT Id, Name, Cancel_Decide__c, CreatedDate, PriceRefreshDate__c, Quote_Print_Date__c,QuotationChange__c,MainEngineWithoutMonitor__c,Interdepartmental__c,
          Dealer_Final_Price__c, TotalPrice__c, Estimation_List_Price__c, QuoteNumber,
          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,LineItemCount 
          // 多年保修 end
          //报价试算 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,
        //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start 增加字段 不可取消多年保&&增加检索阿西赛多 2020/09/10
         Name__c, BSS_Category__c, Quote.Quote_Print_Date__c,PricebookEntry.Product2.VenderName__c,PricebookEntry.Product2.CanNotCancelledGurantee__c,PricebookEntry.Product2.Is_DangerousChemicals__c,
         //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end 增加字段
         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
         //ET促销标记 start
         , multiYearWarranty__c , If_Cancel_Guarantee__c , GuaranteePeriod__c,
         //ET促销标记 end
         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/04 精琢技术 wql start
         //维修合同报价（USD）
         ,PricebookEntry.Product2.Repair_Contract_USD__c
         //计提金额（不含税，USD）
         ,PricebookEntry.Product2.Intra_Trade_Foreign_RMB__c
         //NoDiscount 金额（USD）
         ,PricebookEntry.Product2.NoDiscount_Foreign__c 
         //fy 预留产品标识
         ,PricebookEntry.Product2.LastbuyProductFLG__c
         ,Quote.Opportunity.Trade__c 
         //外贸多年保 2021/01/04 精琢技术 wql end

         //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');
      system.debug('copyid2++++++++++++'+copyQuoId);
      CheckItem = items;

      if (copyQuoId == null) {
      } else {
        // copyの場合、quoIdをnullに戻す
        system.debug('id空6：');
        quoId = null;
        //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy start
        SkipQuotefilg = true;
        //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy end
      }
      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
          //HWAG-BLDE6J   带出字段 2020/02/10 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.QuoteName__c = '';
          quo = quoList[0];
          //再报价新出来的报价名称，把“已取消”三个字去掉  精琢技术 thh 2021-09-30 start
          Integer QX = quo.Name.indexof('已取消:');
          System.debug('Name is ' + quo.Name + ', QX is ' + QX);
          if (QX >= 0) {
            quo.Name = quo.Name.subString(QX + 4);
          }
          //再报价新出来的报价名称，把“已取消”三个字去掉  精琢技术 thh 2021-09-30 end
          //报价名称
          quo.QuoteName__c = quo.Name;
          //再报价时是否进行过报价计算设为未进行过报价计算  fy 2021-11-23 start
          quo.IsQuoteTrial__c = false;
          //再报价时是否进行过报价计算设为未进行过报价计算  fy 2021-11-23 end
          quo.Cancel_Decide__c = quo.Cancel_Decide__c;
          quo.Cancel_Decide__c = false;
          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);
        }
      }
      //******************************************************************************************
      //            增加检测产品状态是否发生变化
      //******************************************************************************************

      // CHAN-BHN7P5 start

      //全件洗い替えします。
      if (activities.size() > 0  && !QuoteDecision) {
        productStatusUpdated = false;
        for (QELine a : activities) {
          if (string.isNotEmpty(a.Asset_Model)) {
            // CHAN-AVG3PW 询价报价画面规则变更
            // 只要更新，就生成新报价编码
            if (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.ProductGuranteePrice != a.latestInfo.Intra_Trade_Gurantee
                || a.PageObject.productServicePrice__c  != a.latestInfo.Intra_Trade_Service
                // 维修合同报价
                || a.Maintenance_Price_Year != a.latestInfo.Maintenance_Price_Year
                || a.PageObject.GuranteeType__c != a.latestInfo.GuranteeType
                || a.PageObject.ProductEntend_gurantee_period_all__c != a.latestInfo.ProductEntend_gurantee_period_all
                //不可取消多年保 询价根据勾不同 自动更新价格 精琢技术 wql 20200924
                || a.PageObject.PricebookEntry.Product2.CanNotCancelledGurantee__c != a.latestInfo.CanNotCancelledGurantee
                //不可取消多年保 询价根据勾不同 自动更新价格 精琢技术 wql 20200924
                // 多年保修 end
               ) {
              system.debug('qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq:');
               system.debug('上次SFDA状态：'+a.PageObject.SFDA_Status__c);
                system.debug('最新的SFDA状态：'+a.latestInfo.SFDA_Status);
                system.debug('上次Name__c：'+a.PageObject.Name__c);
                system.debug('最新的ProductName：'+a.latestInfo.ProductName);
                system.debug('上次ListPrice：'+a.ListPrice_Page);
                system.debug('最新的上次ListPrice：'+a.latestInfo.ListPrice);
                system.debug('上次Cost__c：'+a.Cost_c);
                system.debug('最新的Cost：'+a.latestInfo.Cost);
                system.debug('上次Cost__c：'+a.Cost_c);
                system.debug('最新的Cost：'+a.latestInfo.Cost);
                system.debug('上次计提金额：'+a.ProductGuranteePrice);
                system.debug('最新的计提金额：'+a.latestInfo.Intra_Trade_Gurantee);
                system.debug('上次nodis：'+a.PageObject.productServicePrice__c);
                system.debug('最新的nodis：'+a.latestInfo.Intra_Trade_Service);
                system.debug('上次维修合同报价：'+a.Maintenance_Price_Year);
                system.debug('最新的维修合同报价：'+a.latestInfo.Maintenance_Price_Year);
                system.debug('上次GuranteeType__c：'+a.PageObject.GuranteeType__c);
                system.debug('最新的GuranteeType__c：'+a.latestInfo.GuranteeType);
                system.debug('上次ProductEntend_gurantee_period_all__c：'+a.PageObject.ProductEntend_gurantee_period_all__c);
                system.debug('最新的ProductEntend_gurantee_period_all__c：'+a.latestInfo.ProductEntend_gurantee_period_all);
                system.debug('上次CanNotCancelledGurantee__c：'+a.PageObject.PricebookEntry.Product2.CanNotCancelledGurantee__c);
                system.debug('最新的CanNotCancelledGurantee__c：'+a.latestInfo.CanNotCancelledGurantee);
                system.debug('newQuoteFlag11:'+newQuoteFlag);
              newQuoteFlag = true;
              productStatusUpdated = true;
            }
            if (a.pageObject.Name__c != a.latestInfo.ProductName) {
              a.changed_name = true;
              productStatusUpdated = true;
            }
            if (a.pageObject.SFDA_Status__c != a.latestInfo.SFDA_Status) {
              a.changed_sfda = true;
              productStatusUpdated = true;
            }
            if (a.ListPrice_Page != a.latestInfo.ListPrice) {
              a.changed_list = true;
              productStatusUpdated = true;
            }
            if (a.pageObject.Cost__c != a.latestInfo.Cost) {
              a.changed_cost = true;
              productStatusUpdated = true;
            }
            // 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.ProductGuranteePrice =  a.latestInfo.Intra_Trade_Gurantee;
            // 计提金额
            a.PageObject.productServicePrice__c = a.latestInfo.Intra_Trade_Service;
            // 维修合同报价
            a.Maintenance_Price_Year = a.latestInfo.Maintenance_Price_Year;
            // 多年保修年限
            a.PageObject.ProductEntend_gurantee_period_all__c
              = a.latestInfo.ProductEntend_gurantee_period_all;
            a.PageObject.GuranteeType__c = a.latestInfo.GuranteeType;
            //多年保修 end
          }
        }

      }
      pageArrange();

      // CHAN-BHN7P5 end
      // CHAN-BHN7P5 原逻辑 start
      // else {
      //   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, QuoteLineItem> loopMap = new Map<String, QuoteLineItem>();
      //   if (CheckItem.size() > 0) {
      //     for (QuoteLineItem qli : CheckItem) {
      //       loopMap.put(qli.PricebookEntry.Product2Id, qli);
      //     }
      //   }
      //   // ここを修正したら、NFM007.triggerも要確認
      //   prd2LatestValMap = new Map<Id, Product2>();
      //   if (CheckItem.size() > 0) {
      //     List<Product2> plo = [Select Id, Name, Estimation_Entry_Possibility__c, SFDA_Status__c, Packing_list_manual__c,
      //                           Intra_Trade_List_RMB__c, Foreign_Trade_List_US__c,
      //                           Intra_Trade_Cost_RMB__c, Foreign_Trade_Cost_US__c
      //                           // 多年保修 start
      //                           , Intra_Trade_Gurantee_RMB__c
      //                           , Intra_Trade_Service_RMB__c
      //                           , Maintenance_Price_Year__c
      //                           // 多年保修 end
      //                           From Product2 Where Id IN :product2Ids];
      //     if (plo.size() > 0) {
      //       for (Product2 prd2 : plo) {
      //         Decimal listPrice = 0;
      //         Decimal costPrice = 0;
      //         //多年保修 start
      //         decimal ProductGuranteePrice = 0;
      //         decimal productService = 0;
      //         decimal productMaintenance_Price_Year = 0;
      //         //多年保修 end
      //         if (opp.Trade__c == '内貿') {
      //           listPrice = prd2.Intra_Trade_List_RMB__c;
      //           costPrice = prd2.Intra_Trade_Cost_RMB__c;
      //           //多年保修 start
      //           ProductGuranteePrice = prd2.Intra_Trade_Gurantee_RMB__c;
      //           productService = prd2.Intra_Trade_Service_RMB__c;
      //           productMaintenance_Price_Year = prd2.Maintenance_Price_Year__c == null ? 0 : prd2.Maintenance_Price_Year__c;
      //           //多年保修 end
      //         } else if (opp.Trade__c == '外貿') {
      //           listPrice = prd2.Foreign_Trade_List_US__c;
      //           costPrice = prd2.Foreign_Trade_Cost_US__c;
      //         }
      //         if ( prd2.Name.replaceAll('\\s+', '')            != loopMap.get(prd2.Id).Name__c.replaceAll('\\s+', '')     ||
      //              prd2.SFDA_Status__c != loopMap.get(prd2.Id).SFDA_Status__c ||
      //              listPrice           != loopMap.get(prd2.Id).ListPrice__c   ||
      //              costPrice           != loopMap.get(prd2.Id).Cost__c
      //              // 多年保修 start
      //              || ( opp.Trade__c == '内貿' &&
      //                   (ProductGuranteePrice != loopMap.get(prd2.Id).ProductGuranteePrice__c
      //                    || productService != loopMap.get(prd2.Id).productServicePrice__c
      //                    || productMaintenance_Price_Year !=
      //                    loopMap.get(prd2.Id).Maintenance_Price_Year__c
      //                   ))
      //              // 多年保修 end
      //            ) {
      //           WinOrDecideAlert = true;
      //         }

      //       }
      //     }

      //   }
      //   system.debug('WinOrDecideAlert:::::::2' + WinOrDecideAlert );
      // }// CHAN-BHN7P5 原逻辑 end
      //******************************************************************************************
      //            增加检测产品状态是否发生变化==================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;
    }
    // CHAN-AVG3PW 询价报价画面规则变更
    Datetime cDate = quo.CreatedDate;
    over3month = cDate != null && cDate.date().addMonths(3) < Date.today();
//SWAG-CKDATG 【委托】【OBSAP-报价委托】报价委托项目改善1 fy start
quo.Offer_Amount__c = true;
quo.TOTAL__c = true;
quo.Preferential_Gurantee_Period__c = true;
//SWAG-CKDATG 【委托】【OBSAP-报价委托】报价委托项目改善1 fy end
    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();
    List<String> productIDLIST = new List<String>();
    //既存データ数の確認
    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');
    //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start 增加字段&&增加检索阿西赛多 start
    List<Product_Set_Detail__c> productSetDetails = [SELECT Id, Product__c, Quantity__c, Product_Set__r.Name,Product__r.VenderName__c,Product__r.CanNotCancelledGurantee__c,Product__r.Is_DangerousChemicals__c FROM Product_Set_Detail__c Where Product_Set__c in :productIDLIST];
    //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end 增加字段
    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,
                               //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start 增加字段
                               Asset_Model_No__c, Sales_Possibility__c, Estimation_Entry_Possibility__c,VenderName__c,
                               //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end 增加字段
                               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
                               ,Is_DangerousChemicals__c
                               //外贸多年保 2021/01/04 精琢技术 wql start
                               //维修合同报价（USD）
                               ,Repair_Contract_USD__c
                               //fy 预留产品标识
                               ,LastbuyProductFLG__c
                               //计提金额（不含税，USD）
                               ,Intra_Trade_Foreign_RMB__c
                               //NoDiscount 金额（USD）
                               ,NoDiscount_Foreign__c
                               //外贸多年保 2021/01/04 精琢技术 wql end

                              //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) {
                  //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start 增加字段&& 增加检索阿西赛多
                  c = new QELine(i, prd.Is_DangerousChemicals__c,prd.CanNotCancelledGurantee__c,prd.VenderName__c,
                                prd.Estimated_ConsumptionDueDate__c, //20211009 lt add   ('',)
                                pbe.Id, prd.Asset_Model_No__c, prd.StorageStatus__c,
                    //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end 增加字段
                                 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/04 start
                                 , 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 (opp.Trade__c == '内貿') {
                if (prd.Intra_Trade_List_RMB__c > 0 && prd.Intra_Trade_Cost_RMB__c > 0) {
                  //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start 增加字段&&增加检索阿西赛多
                  c = new QELine(i,prd.Is_DangerousChemicals__c,prd.CanNotCancelledGurantee__c,prd.VenderName__c, 
                                prd.Estimated_ConsumptionDueDate__c,   //20211009 lt add
                                pbe.Id, prd.Asset_Model_No__c, prd.StorageStatus__c,
                    //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end 增加字段
                                 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;
      errormessage = productSetDetails[0].Product_Set__r.Name + ' 导入结束，导入 ' + productSetDetails.size() + ' 件，成功' + rightcnt + ' 件';
    }
    system.debug('-----:終了:' + errormessage);
    return null;
  }

  // xudan 20140626 行追加ロジック実装
  public void addRow() {
    List<QELine> tmpQELine = new List<QELine>();
    system.debug('添加行size：'+activities.size());
    system.debug('需要添加行：'+rowIdx);
    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() {
    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{
                tmpQELine.add(new QELine(i));
            } 
        }
        system.debug('tmpQELine:'+tmpQELine);
        //如果发生行数变化 则后台最大报价行也更新
        if(quoteEntryMaxLine < lineRows){
            quoteEntryMaxLine = lineRows;
        }

        
        //重画页面 重画新增行
        activities = new List<QELine>();
        activities.addAll(tmpQELine);
        PageArrange();
    }
    
  }

  //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です。
        // Celon询价修改 20220513 ssm start
        String celon_type = String.isNotBlank(oppInfo.CelonOpportunity) ? oppInfo.CelonOpportunity : null;
        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,
                                //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start 增加字段
                                Asset_Model_No__c, Sales_Possibility__c, Estimation_Entry_Possibility__c,VenderName__c,
                                //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end 增加字段
                                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
                               ,Is_DangerousChemicals__c
                               //外贸多年保 2021/01/04 精琢技术 wql start
                               //维修合同报价（USD）
                               ,Repair_Contract_USD__c
                               //计提金额（不含税，USD）
                               ,Intra_Trade_Foreign_RMB__c
                               //NoDiscount 金额（USD）
                               ,NoDiscount_Foreign__c
                               //外贸多年保 2021/01/04 精琢技术 wql end  

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

                                FROM Product2 Where ProductCode In :codelist
                                // Celon询价
                                And Celon_Product__c = :celon_type 
                                // Celon询价
                                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) {
                  //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start 增加字段&&增加阿西赛多
                  c = new QELine(i,prd.Is_DangerousChemicals__c,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,
                    //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end 增加字段
                                 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) {
                  //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start 增加字段&&增加检索阿西赛多
                  c = new QELine(i,prd.Is_DangerousChemicals__c,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,
                    //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end 增加字段
                                 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 != '')) {
          // CHAN-AVG3PW 询价报价画面规则变更
          // 只要更新，就生成新报价编码
          if (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.ProductGuranteePrice != a.latestInfo.Intra_Trade_Gurantee
              || a.PageObject.productServicePrice__c  != a.latestInfo.Intra_Trade_Service
              // 维修合同报价
              || a.Maintenance_Price_Year != a.latestInfo.Maintenance_Price_Year
              // 多年保修 end
             ) {
            system.debug('qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq:');
            system.debug('上次SFDA状态：'+a.PageObject.SFDA_Status__c);
            system.debug('最新的SFDA状态：'+a.latestInfo.SFDA_Status);
            system.debug('上次Name__c：'+a.PageObject.Name__c);
            system.debug('最新的ProductName：'+a.latestInfo.ProductName);
            system.debug('上次ListPrice：'+a.ListPrice_Page);
            system.debug('最新的上次ListPrice：'+a.latestInfo.ListPrice);
            system.debug('上次Cost__c：'+a.Cost_c);
            system.debug('最新的Cost：'+a.latestInfo.Cost);
            system.debug('上次Cost__c：'+a.Cost_c);
            system.debug('最新的Cost：'+a.latestInfo.Cost);
            system.debug('上次计提金额：'+a.ProductGuranteePrice);
            system.debug('最新的计提金额：'+a.latestInfo.Intra_Trade_Gurantee);
            system.debug('上次nodis：'+a.PageObject.productServicePrice__c);
            system.debug('最新的nodis：'+a.latestInfo.Intra_Trade_Service);
            system.debug('上次维修合同报价：'+a.Maintenance_Price_Year);
            system.debug('最新的维修合同报价：'+a.latestInfo.Maintenance_Price_Year);
            system.debug('newQuoteFlag6:'+newQuoteFlag);
            newQuoteFlag = true;
          }
          if (a.pageObject.Name__c != a.latestInfo.ProductName) {
            a.changed_name = true;
          }
          if (a.pageObject.SFDA_Status__c != a.latestInfo.SFDA_Status) {
            a.changed_sfda = true;
          }
          if (a.ListPrice_Page != a.latestInfo.ListPrice) {
            a.changed_list = true;
          }
          if (a.pageObject.Cost__c != a.latestInfo.Cost) {
            a.changed_cost = true;
          }
          // 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.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
        }
      }
      productStatusUpdated = true;
    }
    pageArrange();
  }

  //Save button
  public PageReference Save() {
    // Boolean ifdecide=false;
    // List<Opportunity> oppsde = [Select Id, Estimation_Decision__c From Opportunity Where Id = : oppId];
    // if (oppsde.size() > 0) {
    //   if(oppsde[0].Estimation_Decision__c){
    //     ifdecide=true;
    //   }else{
    //     ifdecide=false;
    //   }
    // }
    // system.debug('oppsde:::::::1' + oppsde );
    // if(!ifdecide){
      setOppFromOppInfo();
      System.debug('Save() start at: ' + System.currentTimeMillis());
      system.debug('WinOrDecideAlert:::::::3' + WinOrDecideAlert );
      errorflg = false;
      errormessage = null;
      errorMessagechack = null;
      Savepoint sp = Database.setSavepoint();
      try {
        // 2022-04-19 营业部门需求 没有行项目不能保存 ssm start
        if (activities != null && activities.size() > 0) {
          QELine line1 = activities[0];
          // System.debug('Save() line1: ' + line1);
          // System.debug('line1 != null: ' + (line1 != null));
          // System.debug('line1.pageObject.PricebookEntryId != null: ' + (line1.pageObject.PricebookEntryId != null));
          // System.debug('isNotBlank(line1.pageObject.PricebookEntryId): ' + (String.isNotBlank(line1.pageObject.PricebookEntryId)));
          // System.debug('Save() line1 flag: ' + (!(line1 != null && String.isNotBlank(line1.pageObject.PricebookEntryId))));
          if (!(line1 != null && String.isNotBlank(line1.pageObject.PricebookEntryId))) {
            errorflg = true;
            errorMessage = '不允许保存空的报价单，请选择产品';
            return null;
          }
        }
        // 2022-04-19 ssm end
        
        // CHAN-AVG3PW 询价报价画面规则变更
        // 报价创建日超过三个月时，点保存时强制更新
        // CHAN-AZG864 不管在不在报价有效期内，CFDA不可销售的时候，都是报错的，其中不可销售产品显示红字，不应该保存。
        if (WinOrDecideAlert && (!productStatusUpdated)) {
          errorflg = true;
          errorMessage = '产品状态发生变化，请更新';
          return null;
        }
        if (checkSFDAStatus1(false) == false) {
          errorflg = true;
          errormessage = '请更新不可销售的产品。';
          return null;
        }
        System.debug('checkSFDAStatus1 finished at: ' + System.currentTimeMillis());

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

        System.debug('dataCheck finished at: ' + System.currentTimeMillis());

        // 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);
              }
            }
          }
          
          // GZW 画面出错误消息
          Map<String, String> chkMap = OpportunityWebService.MapCheckProRegisterDecide(proMap, opp.Agency1__c, '');
          //this.haveno_Register 没有注册证 状态红色
          //this.wrong_Register  匹配不上  名字红色
          if (chkMap.size() > 0) {
            errorflg = true;
            //阿西塞多 取消该检查
            if (chkMap.containsKey('agency')&&!opp.Is_Corrosion__c) {
              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状态红字，不可销售产品；产品名称红字，超过经销商经营范围）。';
            }
          }
          //阿西赛多 是否危险化学品经营许可证 保存提示可以保存 decide提示不可decide 精琢技术 wql 2020/12/30 start

          //询价是阿西赛多 判断标识
          Boolean isDangerError = false;
          //询价不是阿西赛多 判断标识
          Boolean isNotDangerError = false;

          //条件是 内贸 && 经销商  && 是否是阿西赛多 为true
          //没有合并在上面的for循环的原因是，怕有冲突将标识置为false
          if (activities.size() > 0) {
            for (QELine qli : activities) {
              if (qli.Asset_Model != null && qli.Asset_Model != '') {
                  //阿西赛多 页面提示报错信息 2020/12/30 start
                  //如果询价是阿西赛多 则选择一般产品的标红
                  system.debug('是否阿西赛多询价');
                  system.debug(opp.Is_Corrosion__c);
                  if (opp.Is_Corrosion__c) {
                      //不是危化品
                      if(!qli.Is_DangerousChemicals){
                        //提示报错
                        isNotDangerError =true;
                        //名称报红
                        qli.wrong_Register = true;

                      }

                  }else{
                    //如果询价不是阿西赛多，则选择危化品的标红
                    if(qli.Is_DangerousChemicals){
                        //提示报错
                        isDangerError =true;
                        //名称报红
                        qli.wrong_Register = true;
                    }
                  }
                  //阿西赛多 页面提示报错信息 wql 2020/12/30 end
                
              }
              
              
            }
          }

          
          if (opp.Is_Corrosion__c) {
            String str = OpportunityWebService.checkDangerItem(opp.agency1__c);
            if (str != 'OK') {
              ApexPages.addmessage(new ApexPages.message(ApexPages.severity.WARNING,  str));
            } 
            system.debug('不是危化品标识：'+isNotDangerError);
              //代表行项目有不是危化品的
              if(isNotDangerError){
                //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.WARNING,  '当阿西塞多时，行项目的产品必须全选择危化品。'));
                errorflg = true;
                errormessage = '当阿西塞多时，行项目的产品必须全选择危化品。';
                return null;
              }
              
            
          }else{
        
            system.debug('危化品标识：'+isDangerError);
              //代表行项目有危化品
              if(isDangerError){
                //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.WARNING,  '当询价不是阿西塞多时，行项目的产品不能选择危化品。'));
                errorflg = true;
                errormessage = '当询价不是阿西塞多时，行项目的产品不能选择危化品。';
                return null;
              }
          }
          system.debug('阿西赛多~~~~~end');
          //阿西赛多 是否危险化学品经营许可证 保存提示可以保存 decide提示不可decide 精琢技术 wql 2020/12/30 end

        }
        // LHJ End

        System.debug('pageCheck finished at: ' + System.currentTimeMillis());

        PageReference pageRef = new PageReference('/' + oppid);
        if (dataEntry() == false) {
          //msg
          return null;
        } else {
          System.debug('data save finished at: ' + System.currentTimeMillis());
          //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());
      }
      
    // }
    // else{
    //   errorflg = true;
    //   errormessage = '该询价已经decide，不可再修改';
    //   return null;
    // }

    return null;
  }

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

      // CHAN-AVG3PW 询价报价画面规则变更
      // 报价创建日超过三个月时，点保存时强制更新
      // CHAN-AZG864 不管在不在报价有效期内，CFDA不可销售的时候，都是报错的，其中不可销售产品显示红字，不应该保存。

      // 2022-04-19 XYOU-CDLCMM 没有行项目不能保存 ssm start
      if (activities != null && activities.size() > 0) {
        QELine line1 = activities[0];
        // System.debug('Save() line1: ' + line1);
        // System.debug('line1 != null: ' + (line1 != null));
        // System.debug('line1.pageObject.PricebookEntryId != null: ' + (line1.pageObject.PricebookEntryId != null));
        // System.debug('isNotBlank(line1.pageObject.PricebookEntryId): ' + (String.isNotBlank(line1.pageObject.PricebookEntryId)));
        // System.debug('Save() line1 flag: ' + (!(line1 != null && String.isNotBlank(line1.pageObject.PricebookEntryId))));
        if (!(line1 != null && String.isNotBlank(line1.pageObject.PricebookEntryId))) {
          errorflg = true;
          errorMessage = '不允许保存空的报价单，请选择产品';
          return null;
        }
      }
      // 2022-04-19 ssm end
      
      if (WinOrDecideAlert && (!productStatusUpdated)) {
        errorflg = true;
        errorMessage = '产品状态发生变化，请更新';
        return null;
      }
      if (checkSFDAStatus1(false) == false) {
        errorflg = true;
        errormessage = '请更新不可销售的产品。';
        return 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();
      if (WinOrDecideAlert && (!productStatusUpdated)) {
        errorflg = true;
        errorMessage = '产品状态发生变化，请更新';
        return null;
      }

      errorflg = false;
      errormessage = null;
      //20220214 fy lastbuy start 
      if (!oppInfo.is_changed_opp) {
        if(!ReservedProductVerification()){
          system.debug('flglastbuy++++'+flglastbuy);
          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;
          }
        }
      }
      //20220214 fy lastbuy end
      // 2022-01-12 ssm 报价计算check
      if (checkIsQuoteTrial()) {
        errorflg = true;
        return null;
      }

      if (enableSales == true) {
        //販売店状態チェック
        if (dataCheckDecide() == false) {
          return null;
        }
      }
      system.debug('zzzzzzzz2:');
      // CHAN-AVG3PW 询价报价画面规则变更
      if (checkSFDAStatus2(true) == false) {
        errorflg = true;
        errormessage = '请更新不可销售的产品。';
        return null;
      }

      PageReference pageRef = new PageReference('/' + oppid);
      if (dataCheck() == false) {
        return null;
      }
      // 2022-04-06 SWAG-CC6AFQ【委托】又有询价跳过了报价计算 ssm start
      // 判断条件修改
      // 1.如果保存方法返回false，return
      // 2.如果保存通过但创建了新报价，return
      // 3.继续做decide
      if (dataEntry() == false) {
        return null;
      }
      //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy start
      if(SkipQuotefilg){
        errorflg = true;
        errormessage =  '产品配置或者经销商信息发生变化，已经生成新的报价单，请重新操作报价计算';
        quo.IsQuoteTrial__c = false;
        return null;
      }
      //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy end
      //引合に見積決定をオン
      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;
          ↑↑↑　　　　↑↑↑*/
          // SWAG-CER5R4 优化保存速度 start
          // ControllerUtil.updOpp(opps[0]);
          StaticParameter.EscapeOppandStaTrigger = true;
          update opps[0];
          StaticParameter.EscapeOppandStaTrigger = false;
          // SWAG-CER5R4 优化保存速度 end
        }

        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();
      }
      // 2022-04-06 SWAG-CC6AFQ【委托】又有询价跳过了报价计算 ssm end
    } 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 {
        // CHAN-AVG3PW 询价报价画面规则变更
        // 报价创建日超过三个月时，点保存时强制更新
        // CHAN-AZG864 不管在不在报价有效期内，CFDA不可销售的时候，都是报错的，其中不可销售产品显示红字，不应该保存。
        if (WinOrDecideAlert && (!productStatusUpdated)) {
          errorflg = true;
          errorMessage = '产品状态发生变化，请更新';
          return null;
        }


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

        if (dataEntry() == false) {
          //msg
          return null;
        }
      }

      //引合に見積提出日を保存
      List<Opportunity> opps = New List<Opportunity>();
      if (oppId == 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) {
            //印刷させない？
          } 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();
                // SWAG-CER5R4 优化保存速度 start
                // ControllerUtil.updOpp(opps[0]);
                StaticParameter.EscapeOppandStaTrigger = true;
                update opps[0];
                StaticParameter.EscapeOppandStaTrigger = false;
                // SWAG-CER5R4 优化保存速度 end
              }
              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);
    //SWAG-C9JCS8 【委托】【紧急】询价GZ-SP-GD0757135报价单问题 fy start
    Boolean isDecide = checkIsDecide();
    System.debug('询价：' + oppid + '|是否decide: ' + isDecide);
    //SWAG-C9JCS8 【委托】【紧急】询价GZ-SP-GD0757135报价单问题 fy end
    // 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];
      //授权前允许进行报价试算  精琢技术 thh 2021-09-30 
      // if (accName[0].name != opp.Authorized_Finish_Sales__c) {
      //   ApexPages.addmessage(new ApexPages.message(ApexPages.severity.WARNING,  '请先授权后，再进行报价试算。'));
      // }else{
        //报价试算点击时，保存行项目 精琢技术 wql 2021/05/07 start
        if (!isDecide) {
          Save();
        } else {
          errorflg = true;
          errorMessage = System.Label.Message_002;
        }
        //报价试算点击时，保存行项目 精琢技术 wql 2021/05/07  end
        //报价试算点击时,如果保存了会生成新的报价,进入新报价的报价试算页面  精琢技术 thh 2021-09-30 start
        Quote jump = [select id from Quote where Quote_No__c = :quo.Quote_No__c];
        System.debug('报价id2：'+jump.Id);
        if(errorMessage == System.Label.Message_002){
          return new Pagereference('/apex/QuoteTrial?Id=' + jump.Id);
        }
        return null;
        //报价试算点击时,如果保存了会生成新的报价,进入新报价的报价试算页面  精琢技术 thh 2021-09-30 end
      // }
    }else{
      //报价试算点击时，保存行项目 精琢技术 wql 2021/05/07 start
      if (!isDecide) {
        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) {
      system.debug('save:::'+activities);
      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,
      //fy 预留产品标识
      LastbuyProductFLG__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;
      }

    }
    //SWAG-CER5R4 【委托】报价合同金额增加限制 fy start
    if(ContractAmountLimitJudge()){
      return false;
    }
    //SWAG-CER5R4 【委托】报价合同金额增加限制 fy end
    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 checkIsQuoteTrial() {
    Boolean error = false;
    errorflg = false;
    errormessage = null;
    //询价上的【是否需要价格申请】为是的场合,才要检查做没做过报价试算 thh 2021-11-03 start
    if(opp.If_Need_PriceApply__c){
      //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,recordTypeName__c from PromotionSalesProducts__c where QuantityId__c=:  quoId];
        //如果有报价试算数据 说明选择了促销政策
        if(promotionSalesProductsList.size()>0){
          for(PromotionSalesProducts__c psp :promotionSalesProductsList){
            if(psp.PromotionSales__r.IsPolicyEffective__c == '无效'&&psp.recordTypeName__c!='NormalProduct'){
                IsActivePsp =false;
                errorPsp = psp.PromotionSales__r.name;
                break;
            }
          }
        }

        if(!IsActivePsp){
          error = true;
          errormessage =  '报价试算中，选择的促销政策:'+errorPsp+',不在有效期内，请检查！' ;
        }
      }
      //wql 报价试算 检索促销政策是否有效 end
    }
    //询价上的【是否需要价格申请】为是的场合,才要检查做没做过报价试算 thh 2021-11-03 end
    return error;
  }

  private boolean dataCheckDecide() {
    Boolean error = false;
    errorflg = false;
    errormessage = null;
    //obsap 最终用户合同金额验证 fy start
    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;
    }
    //obsap 最终用户合同金额验证 fy end
    if (checkAgentsDeleteFlag() == false) {
      return false;
    }
    if (WinOrDecideAlert && (!productStatusUpdated)) {
      //    error = true;
      //    // CHAN-AVG3PW 询价报价画面规则变更
      //    //errorMessage = '产品状态发生变化，请更新';
      PriceStatusUpdate();
      //    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;
      System.debug('tmpid==='+tmpid);
      List<Account> accName = [select name from Account where id = : tmpid];
      System.debug('accName==='+accName);
      System.debug('Authorized_Finish_Sales__c==='+opp.Authorized_Finish_Sales__c);
      if (accName[0].name != opp.Authorized_Finish_Sales__c) {
        error = true;
        errormessage =  '经销商未授权或授权未完成，请先授权。' ;
      }
    }

    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);
          }
        }
      }
      //阿西赛多 取消查询医疗器械经营许可证 精琢技术 wql  2021/01/14 start 
      Map<String, String> chkMap = new Map<String, String>();
      if(!opp.Is_Corrosion__c){
        // GZW 画面出错误消息
        chkMap = OpportunityWebService.MapCheckProRegisterDecide(proMap, opp.Agency1__c, '');
      }
      //阿西赛多 取消查询医疗器械经营许可证 精琢技术 wql  2021/01/14 end
      //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;
      }
      //阿西赛多 是否危险化学品经营许可证 保存提示可以保存 decide提示不可decide 精琢技术 wql 2020/12/30 start

      //询价是阿西赛多 判断标识
      Boolean isDangerError = false;
      //询价不是阿西赛多 判断标识
      Boolean isNotDangerError = false;
      
      //条件是 内贸 && 经销商  && 是否是阿西赛多 为true
      //没有合并在上面的for循环的原因是，怕有冲突将标识置为false
      if (activities.size() > 0) {
        for (QELine qli : activities) {
          if (qli.Asset_Model != null && qli.Asset_Model != '') {
              //阿西赛多 页面提示报错信息 2020/12/30 start
              //如果询价是阿西赛多 则选择一般产品的标红
              system.debug('是否阿西赛多询价');
              system.debug(opp.Is_Corrosion__c);
              if (opp.Is_Corrosion__c) {
                  //不是危化品
                  if(!qli.Is_DangerousChemicals){
                    //提示报错
                    isNotDangerError =true;
                    //名称报红
                    qli.wrong_Register = true;

                  }

              }else{
                //如果询价不是阿西赛多，则选择危化品的标红
                if(qli.Is_DangerousChemicals){
                    //提示报错
                    isDangerError =true;
                    //名称报红
                    qli.wrong_Register = true;
                }
              }
              //阿西赛多 页面提示报错信息 wql 2020/12/30 end
            
          }
          
          
        }
      }
      //阿西赛多 是否危险化学品经营许可证 保存提示可以保存 decide提示不可decide 精琢技术 wql 2020/09/10 start
      
      if (enableSales == true&&opp.Is_Corrosion__c&&opp.Trade__c == '内貿') {
        //条件是 内贸  && 经销商  && 是否是阿西赛多 为true
        String str = OpportunityWebService.checkDangerItem(opp.agency1__c);
        if (str != 'OK') {
          error = true;
          errormessage = str;
        }

        //代表行项目有不是危化品的
        if(isNotDangerError){
          error = true;
          errormessage = '当阿西塞多时，行项目的产品必须全选择危化品。';
        }
      }else if(!opp.Is_Corrosion__c){
        //代表行项目有危化品
        if(isDangerError){
          error = true;
          errormessage = '当询价不是阿西塞多时，行项目的产品不能选择危化品。';
        }
      }
      //阿西赛多 是否危险化学品经营许可证 保存提示可以保存 decide提示不可decide 精琢技术 wql 2020/09/10 end


    }
    // 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
      // 营业执照有效期限” 或“税务登记证有效期限” 或“医疗器械经营企业许可证有效期限” 其中一个证超过有效期的话
      //去掉营业许可证的检查 因为阿西赛多不用检查 一般产品上面检查过  精琢技术 wql 2021/01/15 start
      //&& String.isBlank(acc.Medical_Equipment_Num__c) == false
      //       && acc.Medical_Equipment_Expiration_Date__c != null && acc.Medical_Equipment_Expiration_Date__c >= Date.today()
      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.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;
      } 
      //去掉营业许可证的检查 因为阿西赛多不用检查 一般产品上面检查过  精琢技术 wql 2021/01/15 end
      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;
  }

  // CHAN-AVG3PW 询价报价画面规则变更
  // 报价创建日超过三个月时，如产品停产或CFDA失效，不可以保存，提示“请更新停止销售的产品”
  //             做DECIDE时，如产品停产或CFDA失效，不可以保存，提示“请更新停止销售的产品”
  private boolean checkSFDAStatus2(boolean dodecide) {
    // CHAN-AZG864 不管在不在报价有效期内，CFDA不可销售的时候，都是报错的，其中不可销售产品显示红字，不应该保存。
    //if (over3month == false && dodecide == false) {
    //    return true;
    //}

    for (QELine a : activities) {
      if ((a.Asset_Model != null) && (a.Asset_Model != '')) {
        system.debug('zzzzzzzz1:'+a.PageObject.SFDA_Status__c);
        if (a.PageObject.SFDA_Status__c != '有効' &&
            a.PageObject.SFDA_Status__c != '有効（再申請中）' &&
            a.PageObject.SFDA_Status__c != '不要' &&
            // LHJ 20181221 CBPR Start
            a.PageObject.SFDA_Status__c != '暂停出库（短期）' &&
            // LHJ 20181221 CBPR End
            a.PageObject.SFDA_Status__c != '失効（期限内生産済在庫対応）'
            /*&&
            (a.PageObject.SFDA_Status__c != '失効（再申請中）' || dodecide != false)*/
           ) {
          return false;
        }
      }
    }
    return true;
  }

  private boolean checkSFDAStatus1(boolean dodecide) {
    // CHAN-AZG864 不管在不在报价有效期内，CFDA不可销售的时候，都是报错的，其中不可销售产品显示红字，不应该保存。
    //if (over3month == false && dodecide == false) {
    //    return true;
    //}
    for (QELine a : activities) {
      if ((a.Asset_Model != null) && (a.Asset_Model != '')) {
        if (a.PageObject.SFDA_Status__c != '有効' &&
            a.PageObject.SFDA_Status__c != '有効（再申請中）' &&
            a.PageObject.SFDA_Status__c != '不要' &&
            a.PageObject.SFDA_Status__c != '失効（期限内生産済在庫対応）' &&
            // LHJ CBPR 20181221 Start
            (a.PageObject.SFDA_Status__c != '暂停出库（长期）') &&
            (a.PageObject.SFDA_Status__c != '暂停出库（短期）') &&
            // LHJ CBPR 20181221 End
            (a.PageObject.SFDA_Status__c != '失効（再申請中）' || dodecide != false)
           ) {
          return false;
        }
      }
    }
    return true;
  }

  //SWAG-C9JCS8 【委托】【紧急】询价GZ-SP-GD0757135报价单问题 fy start
  private boolean checkIsDecide() {
    List<Opportunity> oppsde = [Select Id, Estimation_Decision__c From Opportunity Where Id = : oppId];
    if (oppsde.size() > 0) {
      if(oppsde[0].Estimation_Decision__c){
        return true;
      }
    }
    return false;
  }
  //SWAG-C9JCS8 【委托】【紧急】询价GZ-SP-GD0757135报价单问题 fy end
  //SWAG-CER5R4 【委托】报价合同金额增加限制 fy start
  private boolean ContractAmountLimitJudge(){
    system.debug('oppInfo.Sales_Root+++='+oppInfo.Sales_Root);
    if(oppInfo.Sales_Root =='OCM直接销售'){
      return false;
    }
    Boolean error = false;
    // List<QuoteLineItem> act = new List<QuoteLineItem>();
    // List<QuoteLineItem> act2 = new List<QuoteLineItem>();
    Double AccrualTotal=0;
    Double sumContractAmount =0;
    for(QELine aaa :activities){
      // 2022-06-14 紧急修复 ssm
      if (String.isBlank(aaa.Asset_Model)) {
        continue;
      }
      if(aaa.pageObject.PricebookEntry.Product2Id!=null){
        if(aaa.GuranteePrice==null){
          aaa.GuranteePrice=0;
        }
        AccrualTotal += aaa.pageObject.Quantity__c*aaa.GuranteePrice;
        // act.add(aaa.pageObject);
      }
    }
    // act2=act.deepClone();
    // Double AccrualTotal=0;
    // Double sumContractAmount =0;
    // for(QuoteLineItem pspsc :act2){
    //   AccrualTotal += pspsc.Quantity__c*pspsc.GuranteePrice__c;
    // }
    if(quo.MultiYearWarrantyTotalPrice__c==null){
      quo.MultiYearWarrantyTotalPrice__c=0;
    }
    sumContractAmount = AccrualTotal+quo.MultiYearWarrantyTotalPrice__c;
    if(quo.OCM_Agent1_Price_Page__c<=sumContractAmount){
      error = true;
      errorflg = true;
      errormessage = '预测金额为负数，请正确填写合同金额。';
    }
    if(quo.multiYearWarranty__c){
      if(quo.OCM_Agent1_Price_Page__c<=0){
        error = true;
        errorflg = true;
        errormessage = '预测金额为负数，请正确填写合同金额。';
      }
    }
    return error;
  }
  //SWAG-CER5R4 【委托】报价合同金额增加限制 fy end
  public boolean dataEntry() {
    system.debug('activities++++----****3'+activities);
    //SWAG-C9JCS8 【委托】【紧急】询价GZ-SP-GD0757135报价单问题 fy start
    // Boolean ifdecide=false;
    // List<Opportunity> oppsde = [Select Id, Estimation_Decision__c From Opportunity Where Id = : oppId];
    // if (oppsde.size() > 0) {
    //   if(oppsde[0].Estimation_Decision__c){
    //     ifdecide=true;
    //   }else{
    //     ifdecide=false;
    //   }
    // }
    System.debug('start checkIsDecide at: ' + System.currentTimeMillis());
    Boolean ifdecide=checkIsDecide();
    System.debug('finished checkIsDecide at: ' + System.currentTimeMillis());
    if(!ifdecide){
      //SWAG-C9JCS8 【委托】【紧急】询价GZ-SP-GD0757135报价单问题 fy end
      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 temSalesAmount1 = 0; // 2018/09/28 CHAN-B4YAB8 经销商小计合计 end
      system.debug('activities++++----****2'+activities);
      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.AgencyUnitPrice__c == null) {
            a.PageObject.AgencyUnitPrice__c.addError(System.Label.Error_Message3);
            error = true;
            errormessage = System.Label.Error_Message3;
          }
          //temSalesAmount1 = temSalesAmount1 + a.PageObject.AgencySubtotal__c; // 2018/09/29 CHAN-B4YAB8 经销商小计累加
          if (a.PageObject.PricebookEntryId == null) {
            error = true;
            errormessage = System.Label.Error_Message27;
          }
          detail = true;
        }
      }
      if (enableSales == true) {
        // LHJ Start
        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__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();
      System.debug('quoId: ' + quoId);
      System.debug('changedAfterPrint: ' + changedAfterPrint);
      if (changedAfterPrint) {
        system.debug('id空1：');
        quoId = null;
        //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy start
        SkipQuotefilg = true;
        //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy end
      }
      // false伝票から新規作成
      System.debug('changedAfterBid: ' + changedAfterBid);
      if (changedAfterBid) {
        system.debug('id空2：');
        quoId = null;
        //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy start
        SkipQuotefilg = true;
        //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy end
      }
      // CHAN-AVG3PW 询价报价画面规则变更
      System.debug('newQuoteFlag: ' + newQuoteFlag);
      if (newQuoteFlag) {
        system.debug('id空3：');
        quoId = null;
        //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy start
        SkipQuotefilg = true;
        //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy end
      }
      // 多年保修 start
      //报价试算 增加经销商前后对比 精琢技术 wql 20210508 start
      System.debug('quoteGurantee_Period: ' + quoteGurantee_Period);
      System.debug('quo.Gurantee_Period__c: ' + quo.Gurantee_Period__c);
      System.debug('quotemultiYearWarranty: ' + quotemultiYearWarranty);
      System.debug('quo.multiYearWarranty__c: ' + quo.multiYearWarranty__c);
      System.debug('agency1Name: ' + agency1Name);
      System.debug('quo.Agency1__c: ' + quo.Agency1__c);
      System.debug('agency2Name: ' + agency2Name);
      System.debug('quo.Agency2__c: ' + quo.Agency2__c);
      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))
        ) {
          system.debug('id空8：');
        quoId = null;
        //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy start
        SkipQuotefilg = true;
        //SWAG-CC6AFQ【委托】又有询价跳过了报价计算 fy end
      }
      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>();//SWAG-CKDATG 【委托】【OBSAP-报价委托】报价委托项目改善1 fy start QuotationChange__c,MainEngineWithoutMonitor__c,Interdepartmental__c,
        qs = [select Id, OpportunityId, CreatedDate, Pricebook2Id, Name, Estimation_List_Price__c, Dealer_Final_Price__c,QuotationChange__c,MainEngineWithoutMonitor__c,Interdepartmental__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>();
      system.debug('activities++++----****1'+activities);
      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.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;

      //----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;

      //SWAG-CKDATG 【委托】【OBSAP-报价委托】报价委托项目改善1 fy start
      q.QuotationChange__c = quo.QuotationChange__c;
      q.MainEngineWithoutMonitor__c = quo.MainEngineWithoutMonitor__c;
      q.Interdepartmental__c = quo.Interdepartmental__c;
      //SWAG-CKDATG 【委托】【OBSAP-报价委托】报价委托项目改善1 fy end
      /*
      if (hasType3Machine) {
          q.Installation_location__c = '';
      }
      */
      System.debug('q.QuotationChange__c+++'+q.QuotationChange__c);
      System.debug('quo.QuotationChange__c++' + quo.QuotationChange__c);
      System.debug('quo.MainEngineWithoutMonitor__c++' + quo.MainEngineWithoutMonitor__c);
      if (quoId == null) {
        insert q;
        quo.Quote_No__c = q.Quote_No__c;
      } else {
        update q;
      }
      System.debug('q.QuotationChange__c2+++'+q.QuotationChange__c);
      System.debug('quo.QuotationChange__c2++' + quo.QuotationChange__c);
      System.debug('quo.MainEngineWithoutMonitor__c2++' + quo.MainEngineWithoutMonitor__c);
      System.debug('finished save quote at: ' + System.currentTimeMillis());

      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.Name__c = s.PageObject.Name__c;
              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
              // 计提金额
              ql.GuranteePrice__c        = s.GuranteePrice;
              ql.ProductGuranteePrice__c = s.ProductGuranteePrice;
              // 维修合同报价
              ql.Maintenance_Price_Year__c = s.Maintenance_Price_Year;
              // 多年保修  end
              //CHAN-BWH2WP 精琢技术 wql 2020/12/22 start 
              //如果产品为不可取消多年保 则打上标识
              system.debug(s.CanNotCancelledGurantee);
              ql.CanNotCancelFlag__c = s.CanNotCancelledGurantee;
              
              //CHAN-BWH2WP 精琢技术 wql 2020/12/22 end
              // CHAN-AVG3PW 询价报价画面规则变更
              //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++;
            }
          }
        }
        System.debug('start save quote lines at: ' + System.currentTimeMillis());
        system.debug('qlist+++---+++'+qlist);
        insert qlist;
        System.debug('finished save quote lines at: ' + System.currentTimeMillis());

      }
      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,
            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, Quote_Update_Sum__c , Hospital__c,Is_Corrosion__c 
            // lt 20221008 SWAG-CHL5XA【FY23询价改善】-统计主机台数 start
            ,StageName ,OlyNumberHosts__c
            // lt 20221008 SWAG-CHL5XA【FY23询价改善】-统计主机台数 end
            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 = q.Quote_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

        // lt 20221008 SWAG-CHL5XA【FY23询价改善】-统计主机台数 start
        System.debug('lt123询价状态(阶段): ' + o.StageName);
        System.debug('lt123activities: ' + activities);
        o.OlyNumberHosts__c = 0;
        System.debug('lt123主机数: ' + o.OlyNumberHosts__c);
        List<String> oppIds = New List<String>();
        List<String> product2Ids = New List<String>();
        Map<String,Decimal> product2IdsMap = new Map<String,Decimal>();
        if (activities.size() > 0) {
          for (QELine a : activities) {
            if (String.isBlank(a.PageObject.Id__c) == false) {
              product2Ids.add(a.PageObject.Id__c);
              product2IdsMap.put(a.PageObject.Id__c,a.PageObject.Quantity__c);
            }
          }

          for (Product2 prod : [Select Id,ProductClass__c
                                From Product2 Where Id IN :product2Ids]) {
            System.debug('lt123产品市场类别: ' + prod.ProductClass__c);

                if(o.StageName == '引合' || o.StageName == '注残' || o.StageName == '出荷' || o.StageName == '完了'){
                  if(prod.ProductClass__c == '主机'){
                    if(product2IdsMap.containsKey(prod.Id)){
                      o.OlyNumberHosts__c += product2IdsMap.get(prod.Id);
                      oppIds.add(o.Id);
                      ControllerUtil.UpdateBiddingFlag(oppIds);
                    }
                  }else{
                    o.OlyNumberHosts__c += 0;
                  }
                }
          }
        }
        // lt 20221008 SWAG-CHL5XA【FY23询价改善】-统计主机台数 end

        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;
        }
        System.debug('start 1st save Opportunity at: ' + System.currentTimeMillis());
        // SWAG-CER5R4 优化保存速度 start
        // ControllerUtil.updOpp(o);
        StaticParameter.EscapeOppandStaTrigger = true;
        update o;
        // SWAG-CER5R4 优化保存速度 end
        System.debug('finished 1st save Opportunity at: ' + System.currentTimeMillis());

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

        //OpportunityLineItem--------------------------------------------
        //製品型番、品目コード、SFDAステータス、品目名、ListPrice、数量
        //価格、単位、小計、OCM売上予測金額（税抜）、価格表
        List<OpportunityLineItem> ols = New List<OpportunityLineItem>();
        OpportunityLineItem ol = New OpportunityLineItem();
        // lt 20221008 SWAG-CHL5XA【FY23询价改善】-统计主机台数 end
        ols = [select Id, Quantity from OpportunityLineItem Where OpportunityId = :oppid];  //update
        System.debug('lt123询价产品: ' + ols);
        // lt 20221008 SWAG-CHL5XA【FY23询价改善】-统计主机台数 end
        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();
                System.debug('lt123询价产品数量: ' + ol.Quantity);   //lt CHL5XA【FY23询价改善】
                ol.OpportunityId = oppid;
                ol.Id__c = s.PageObject.Id__c;
                // CHAN-AVG3PW 询价报价画面规则变更
                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 赠送、经销商单价和小计 start
                // 多年保修 start
                ol.GuaranteePeriod__c =  s.PageObject.GuaranteePeriod__c;
                //外贸多年保 取消CNY 的判断 &&  oppInfo.CurrencyIsoCode.equals('CNY')
                //外贸多年保 精琢技术 wql 2021/01/18 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/18 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;
                //CHAN-BWH2WP 精琢技术 wql 2020/12/22 start 
                //如果产品为不可取消多年保 则打上标识
                system.debug(s.CanNotCancelledGurantee);
                ol.CanNotCancelFlag__c = s.CanNotCancelledGurantee;
                //CHAN-BWH2WP 精琢技术 wql 2020/12/22 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++;
              }
            }
          }
          // CHAN-BEN5UC   [委托]询价：创建报价后，判断询价一定期间内，是否出借备品 by vivek start
          // CHAN-C9Y3HL 【委托】【评估需求】询价里报价画面速度优化 2022-02-09 
          // 查询出借备品逻辑从保存逻辑中移除，由Batch进行统一操作，以提升保存速度及统计数据准确性。
          // Date createdDateStr;
          // if (quoId != null && quo.CreatedDate != null ) {
          //   // createdDateStr = [select id,CreatedDate from Quote where id = :quoId][0].CreatedDate.date();
          //   createdDateStr = quo.CreatedDate.date();
          // } else {
          //   createdDateStr = Date.today();
          // }
          // // 一年前的日期
          // Date createdDateYear = createdDateStr.addYears(-1);
          // List<Rental_Apply_Equipment_Set_Detail__c> raesdList = [select id, product__c, Bollow_Date__c, Rental_Apply__r.Hospital__c from Rental_Apply_Equipment_Set_Detail__c where Rental_Apply__r.Strategic_dept__c = : opp.Department_Class__c and Key_product__c != null and Bollow_Date__c >= :createdDateYear order by Bollow_Date__c ];

          // Map<String, Date> ProOfDate = new Map<String, Date>();
          // for (Rental_Apply_Equipment_Set_Detail__c raesd : raesdList) {
          //   ProOfDate.put(raesd.product__c, raesd.Bollow_Date__c);
          // }

          // o.WhetherTrySpareParts_3m__c = false;
          // o.WhetherTrySpareParts_6m__c = false;
          // o.WhetherTrySpareParts_1y__c = false;
          // for (OpportunityLineItem oppitem : ols) {
          //   if (ProOfDate.containsKey(((String)oppitem.Id__c).substring(0, 15))) {
          //     Date bollDate = ProOfDate.get(((String)oppitem.Id__c).substring(0, 15));
          //     if (bollDate != null && bollDate.addMonths(3) > createdDateStr) {
          //       o.WhetherTrySpareParts_3m__c = true;
          //     }
          //     if (bollDate != null && bollDate.addMonths(6) > createdDateStr && bollDate.addMonths(3) < createdDateStr) {
          //       o.WhetherTrySpareParts_6m__c = true;
          //     }
          //     if (bollDate != null && bollDate.addYears(1) > createdDateStr && bollDate.addMonths(6) < createdDateStr) {
          //       o.WhetherTrySpareParts_1y__c = true;
          //     }

          //   }
          // }

          
          // System.debug('start 2nd save Opportunity at: ' + System.currentTimeMillis());
          // ControllerUtil.updOpp(o);
          // System.debug('finished 2nd save Opportunity at: ' + System.currentTimeMillis());
          // CHAN-BEN5UC   [委托]询价：创建报价后，判断询价一定期间内，是否出借备品 by vivek end
          System.debug('start save Opportunity item lines at: ' + System.currentTimeMillis());
          ControllerUtil.insOppLine(ols);
          System.debug('finished save Opportunity item lines at: ' + System.currentTimeMillis());
        }

      } else {
        system.debug('*****SystemError OpportunityId is Null*****');
      }
      //保存時引合Pageに戻らない処理とした為にQuoteIdをここでセット
      if (quoId == null) {
        quoId = q.Id;
        newQuoteFlag = false;
      } 
    }else{
      errorflg = true;
      errormessage = '该询价已经decide，不可再修改';
      return false;
    }
    return true;
  }
  //lastbuy  2022/2/9 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/9 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 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

    // Celon询价修改 2022-04-24 ssm start
    public String CelonOpportunity { get; set; }
    // Celon询价修改 2022-04-24 ssm end
    // lastbuy判断变更用户询价 start
    public Boolean is_changed_opp { get; set; }
    // lastbuy判断变更用户询价 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
      // Celon询价修改 2022-04-24 ssm start
      CelonOpportunity = opp.CelonOpportunity__c;
      // Celon询价修改 2022-04-24 ssm end
      // lastbuy判断变更用户询价 start
      is_changed_opp = opp.If_Account_Change__c != null ? opp.If_Account_Change__c : false;
      // lastbuy判断变更用户询价 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 Boolean CanNotCancelledGurantee {get; set;}
    // 多年保修 end

    //阿西赛多
    public Boolean Is_DangerousChemicals {get; set;}
    //阿西赛多

  }
  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**********************//
    //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start
    public String VenderName { get; set; }
    //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end

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

    // PriceStatusUpdate() 用の項目、TODO 初期値の設定
    public QELinelatestInfo latestInfo { get; set; }

    public boolean changed_name { get; set; }
    public boolean changed_sfda { get; set; }
    public boolean changed_list { get; set; }
    public boolean changed_cost { get; set; }
    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 decimal Maintenance_Price_Year {get; set;}
    // 多年保修 end

    // TODO ほんとうはいらない、使うところのロジックを修正しなければいけない、削除するようにしたいです。
    public QELine(Integer i) {
      pageObject = New QuoteLineItem();
      latestInfo = New QELinelatestInfo();
      this.lineNo = i;
    }
    // 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.changed_name = tmp.changed_name;
      this.changed_sfda = tmp.changed_sfda;
      this.changed_list = tmp.changed_list;
      this.changed_cost = tmp.changed_cost;
      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;
      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;
      // CHAN-B4YAB8 2018/9/28 经销商单价和小计

      //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 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;
      }
      //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end
      //不可取消多年保
      this.CanNotCancelledGurantee = oli.PricebookEntry.Product2.CanNotCancelledGurantee__c;
      //阿西赛多
      this.Is_DangerousChemicals = oli.PricebookEntry.Product2.Is_DangerousChemicals__c;
      // 多年保修 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.warrantyType__c = oli.warrantyType__c;

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

      PageObject.ProductEntend_gurantee_period_all__c =  oli.PricebookEntry.Product2.Entend_gurantee_period_all__c;
      PageObject.GuranteeType__c = oli.PricebookEntry.Product2.GuranteeType__c;
      
      
      // 多年保修 end
      PageObject.SFDA_Status__c = oli.PricebookEntry.Product2.SFDA_Status__c;
      //不可取消多年保
//      PageObject.CanNotCancelledGurantee__c = oli.PricebookEntry.Product2.CanNotCancelledGurantee__c;


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

      Decimal cost;
      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.PricebookEntry.Product2.Intra_Trade_Service_RMB__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;
      }
      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
      //外贸多年保 取产品主数据的外贸金额 以及 报价 精琢技术 wql 2021/01/04 start 
      latestInfo.ProductEntend_gurantee_period_all    =  oli.PricebookEntry.Product2.Entend_gurantee_period_all__c;
      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/04 end
        latestInfo.GuranteeType                        =  oli.PricebookEntry.Product2.GuranteeType__c;
      // 多年保修 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;
      //不可取消多年保 
      latestInfo.CanNotCancelledGurantee  = oli.PricebookEntry.Product2.CanNotCancelledGurantee__c;
      this.changed_name = false;
      this.changed_sfda = false;
      this.changed_list = false;
      this.changed_cost = false;
      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;
      //ET促销标记 start
      // pageObject.ETPromotionalFlag__c = qli.ETPromotionalFlag__c;
      //ET促销标记 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;
      }
      //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 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;
            }
      //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start
      //不可取消多年保
      this.CanNotCancelledGurantee = qli.PricebookEntry.Product2.CanNotCancelledGurantee__c;
      //阿西赛多
      this.Is_DangerousChemicals = qli.PricebookEntry.Product2.Is_DangerousChemicals__c;
      //************************************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;
      //外贸多年保 取产品主数据上的金额及报价 精琢技术 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
      }
      //外贸多年保 取产品主数据上的金额及报价 精琢技术 wql end
      
      latestInfo.GuranteeType                         =  qli.PricebookEntry.Product2.GuranteeType__c;
      //不可取消多年保 
      latestInfo.CanNotCancelledGurantee  = qli.PricebookEntry.Product2.CanNotCancelledGurantee__c;
      // 计提金额
      this.Maintenance_Price_Year                     = qli.Maintenance_Price_Year__c;
      this.GuranteePrice                              =  qli.GuranteePrice__c;
      this.ProductGuranteePrice                       =  qli.ProductGuranteePrice__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.changed_name = false;
      this.changed_sfda = false;
      this.changed_list = false;
      this.changed_cost = false;
      this.haveno_Register = false;
      this.wrong_Register  = false;
    }

    // TODO Subtotal__c、以前のロジックを確認
    /*public QELine(Integer i, 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.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.changed_name = false;
        this.changed_sfda = false;
        this.changed_list = false;
        this.changed_cost = false;
        this.haveno_Register = false;
        this.wrong_Register  = false;
    }
    */

    //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start 增加字段
    // 多年保修 start
    public QELine(Integer i,Boolean Is_DangerousChemicals,Boolean CanNotCancelledGurantee,String VenderName,
                  Date Estimated_ConsumptionDueDate,   //20211009 lt add
                  String PricebookEntryId,
      //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end 增加字段
                  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;

      //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;

      //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start
       system.debug('VenderName=========='+VenderName);
        if(VenderName==null||VenderName==''){
            this.VenderName =' 无 ';
        }else{
            this.VenderName = VenderName;
        }
      //不可取消多年保
      this.CanNotCancelledGurantee = CanNotCancelledGurantee;
      //阿西赛多
      this.Is_DangerousChemicals = Is_DangerousChemicals;
      //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 end
      // 多年保修 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;
      //不可取消多年保
      latestInfo.CanNotCancelledGurantee = CanNotCancelledGurantee;
      //阿西赛多
      latestInfo.Is_DangerousChemicals = Is_DangerousChemicals;
      // 多年保修 end


      if (Packing_list_manual != null) {
        latestInfo.Specifications = integer.valueof('' + Packing_list_manual);
      }
      this.changed_name = false;
      this.changed_sfda = false;
      this.changed_list = false;
      this.changed_cost = false;
      this.haveno_Register = false;
      this.wrong_Register  = false;
    }
    // 多年保修 end
  }

  @TestVisible private void testI() {
    integer i = 0;
    
  }
}