buli
2022-04-08 f50c0ec115e25dc7f980bafda8169ed5ddfe1a8f
force-app/main/default/classes/NewQuoteEntryController.cls
@@ -1,4887 +1,5058 @@
// 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; }
  //lastbuy  2022/2/9 fy end
public without sharing class NewQuoteEntryController {
    public Integer quoteEntryMaxLine {get; private set;}
    public Integer quoteEntryMaxSet {get; private set;}
  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 Id oppId { get; set; }
    public Id quoId {get;set;}
    public Id pricebook2Id {get;set;}
    public Id accountId {get;set;}
    public String currencyIsoCode {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 boolean specialerrorflg {get;set;}
    public boolean errorflg {get;set;}
    public String errorMessage {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 Messageflg {get;set;}
    public String Message {get;set;}
    public Quote quo {get;set;}
    public Decimal discount {get;set;}
    public List<QELine> activities {get;set;}
    private List<QELine> activitiesbk;
    public List<QELine> tmpactivities = new List<QELine>();
    public QELine active_activity;
    public Boolean productStatusUpdated;
    public List<Boolean> hidFlg {get;set;}
    public String excel_text { get; set; }
    public String baseUrl { get; set; }
    public String rtUrl { get; set; }
  public Boolean over3month { get; set; }
  public Boolean newQuoteFlag=false;
    public boolean decideFlg { get; set; }
    public boolean isdecide { get; set; }
    public boolean printFlg { get; set; }
    private boolean doDecide { get; set; }
    public String productSegment { get; set; }
    public boolean isAdmin { get; set; }
  // 多年保修 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; }
    public String fileName { get; set; }
    public String strExpirationDate { get; set; }
    public List<QELine> csv_activities {get;set;}
    public Blob contentFile { get; set; }
    public String nameFile { get; set; }
  //Get Opportunity Object
  public Opportunity opp;
    public String openType { get; set; }
    public boolean isService { get; set; }
    public boolean is_Parts_direct { get; set; }
    public boolean is_Parts_dealer { get; set; }
    public boolean is_hidden_user { get; set; }
    public boolean is_dealer_user { get; set; }
  private Map<Id, Product2> prd2LatestValMap;
    public boolean is_hidden_all { get; set; }
    public Decimal dealer_coefficient { get; set; }
  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 Boolean specialDealer { get; set; }
    //XHL-20190426-AddStart
    public String setProduct_text { get; set; }
    public Integer activitiesSize {get;set;}
    public Integer singleNo {get;set;}
    public Map<String,String> errorMap {get;set;}
    public String singleProduct {get; private set;}
    public Map<String,String> quoteLineSetNameDiscountMap {get; private set;}
    public String quoteLineSetNameDiscountJson {get; private set;}
    //XHL-20190426-AddEnd
    public Opportunity opp {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;
  }
    // WLIG-BTA8C2 XHL 20200925 -Start
    public String initStringConcatenation;
    public String saveStringConcatenation;
    public Boolean verifyProductValidFlag;
    // WLIG-BTA8C2 XHL 20200925 -End
    private static Map<String, String> paymentTermsMap = new Map<String, String> {
        'Z001' => '预收款/预付款',
        'Z002' => '立即付款',
        'Z003' => '月结30天内付款',
        'Z004' => '月结60天内付款',
        'Z005' => '月结90天内付款',
        'Z006' => '月结120天内付款',
        'Z007' => '月结25天内付款',
        'Z008' => '月结55天内付款',
        'Z009' => '月结85天内付款',
        'Z010' => '月结115天内付款',
        'Z011' => '月结175天内付款',
        'Z012' => '月结205天内付款',
        'Z013' => '半月结,15日之前发货,当月15日到期',
        'Z014' => '月结30天内付款',
        'Z015' => '验收后15天电汇',
        'Z020' => '100%发货后30天内支付',
        'Z021' => '100%发货后60天内电汇支付',
        'Z030' => '收到发票后30天内电汇',
        'Z045' => '月结45天内付款',
        'Z060' => '收到发票后60天内电汇',
        'Z075' => '收到发票后75天内电汇',
        'Z090' => '收到发票后90天内电汇',
        'Z0LC' => '100% L/C (90/10)',
        'Z120' => '收到发票后120天内电汇',
        'Z1LC' => '100% L/C (80/20)',
        'Z1TT' => '90%TT ADV,10%TT AFTER',
        'Z2LC' => '100% L/C (70/30)',
        'Z2TT' => '80%TT ADV,20%TT AFTER',
        'Z30E' => '下月末',
        'Z3LC' => '100% L/C 90 days',
        'Z3TT' => '70%TT ADV,30%TT AFTER',
        'Z4LC' => '90%L/CTransfer 10%TT AFTER',
        'Z4TT' => '100% TT AFTER',
        'Z5LC' => '100%L/C at sight Transfer',
        'Z5TT' => '30% TT ADV,50% TT AT SIGHT,20% TT AFTER',
        'Z60E' => '下2个月末',
        'Z6LC' => '100%L/C (85/15)',
        'Z6TT' => '30% TT ADV,60% TT AT SIGHT,10% TT AFTER',
        'Z7LC' => '100% L/C (60/40)',
        'Z7TT' => '100%TT AFTER(80/20)',
        'Z8TT' => '100% TT AFTER(70/30)',
        'Z9TT' => '100%TT发货后20天内支付',
        'ZCOD' => 'C.O.D.',
        'ZD60' => '立即应付的 到期净值',
        'ZFR1' => '半月结,15日之前发货,当月15日到期',
        'ZL6T' => '90% LC 60 days,10% TT AFTER',
        'ZL95' => '95% L/C AFTER,5% L/C AFTER 6M FROM ACCEPTANCE DATE',
        'ZLC1' => '100% L/C (90/10) Transfer',
        'ZLC2' => '100% L/C AT SIGHT (95/5)',
        'ZLT1' => '90%LC,10%TT',
        'ZLT2' => '80%LC,20%TT',
        'ZLT3' => '70%LC,30%TT',
        'ZLT4' => '95%LC,5%TT',
        'ZLT5' => '50%L/C,50%TT after',
        'ZT20' => '20% T/T ADV,80% T/T AFTER',
        'ZT30' => '30% T/T ADV, 70%T/T AFTER',
        'ZT35' => '35% TT ADV,65% TT AFTER',
        'ZT40' => '40% TT ADV,60% TT AFTER',
        'ZT50' => '50% TT ADV,50% TT AFTER',
        'ZT55' => '95%TT ADV,5%TT AFTER',
        'ZT90' => '验收合格后T/T支付90%,设备正常运行三个月T/T支付10%',
        'ZTT1' => 'TT AFTER DELIVERY 45 DAY',
        'ZTT2' => 'TT AFTER DELIVERY 120 DAY',
        'ZTT3' => '100%TT发货后15个工作日内支付',
        'ZTT4' => '验收合格后T/T支付80%,设备正常运行三个月T/T支付20%',
        'ZZ60' => '60 DAYS AFTER ISSUING INVOICE',
        'ZZ95' => '95% L/C AFTER,5% T/T AFTER 6M FROM ACCEPTANCE DATE',
        'ZZLC' => '100% L/C AT SIGHT',
        'ZZTT' => '100% TT IN ADVANCE',
        'Z022' => '100% T/T WITHIN 90 DAYS AFTER SHIPMENT'
    };
  public NewQuoteEntryController(ApexPages.StandardController controller) {
    this();
  }
    public NewQuoteEntryController() {
  public PageReference init() {
        initStringConcatenation = '';
        saveStringConcatenation = '';
        verifyProductValidFlag = false;
    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;
        singleProduct  = System.Label.SingleProduct;
        quoteEntryMaxLine = Integer.valueOf(System.Label.QuoteEntryMaxLine);
        quoteEntryMaxSet = Integer.valueOf(System.Label.QuoteEntryMaxSet);
        hidFlg = new List<Boolean>(30);
        for (Integer i = 0; i < 30; i++) {
            if (i<quoteEntryMaxSet) {
                hidFlg[i] = true;
            } else {
                hidFlg[i] = false;
            }
            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
               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 =
        [ SELECT Id, Name, Cancel_Decide__c, CreatedDate, PriceRefreshDate__c, Quote_Print_Date__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
         ,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に戻す
        quoId = null;
      }
      if (quoList.size() > 0) {
        //添加行
        if(quoList[0].LineItemCount >quoteEntryMaxLine){
            quoteEntryMaxLine = quoList[0].LineItemCount;
        }
        if (copyQuoId == null) {
          quo = quoList[0];
          quo.QuoteName__c = quo.Name;
          // 多年保修 start
          quoteGurantee_Period = quo.Gurantee_Period__c;
          quotemultiYearWarranty = '' + quo.multiYearWarranty__c;
          // 多年保修 end
          //报价试算 增加经销商前后对比 wql 20210508 start
          agency1Name = quo.Agency1__c;
          agency2Name = quo.Agency2__c;
          //报价试算 增加经销商前后对比 wql 20210508 end
          // 多年保修 start
          //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
          }
        baseUrl = URL.getSalesforceBaseUrl().toExternalForm();
        String path = URL.getCurrentRequestUrl().getPath();
        if (path.indexOf('/apex') > 0) {
            baseUrl += path.substring(0,path.indexOf('/apex'));
        } else if (path.indexOf('production/') > 0) {
            baseUrl += '/production';
        }
        rtUrl = System.currentPageReference().getParameters().get('retURL');
        System.debug('path: ' + path);
        System.debug('baseUrl: ' + baseUrl);
        System.debug('rtUrl: ' + rtUrl);
        if (rtUrl == null || rtUrl == 'null') {
            rtUrl = '';
        }
      }
      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
      //******************************************************************************************
        //system.debug('22222222222222' + quo);
    }
    // 多年保修 start
    if (quo.Gurantee_Period__c == null) {
      quo.Gurantee_Period__c = '1';
    public NewQuoteEntryController(ApexPages.StandardController controller) {
        this();
    }
    // 多年保修 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;
          }
        }
      }
    }
    public void init () {
        specialerrorflg = false ;
        activitiesSize = 0;
        errorflg = false;
        errormessage = null;
    if (quo.Quote_Expiration_Date__c == null) {
      quo.Quote_Expiration_Date__c = Date.today() + 30;
    }
        decideFlg = false;
        isdecide = false;
        printFlg = false;
        doDecide = false;
        productSegment = '';
        errorMap = new Map<String,String>();
        quoteLineSetNameDiscountMap = new Map<String,String>();
        quoteLineSetNameDiscountJson = '';
        isAdmin = false;
        String profileId = UserInfo.getProfileId();
        profileId = profileId.substring(0, 15);
    //--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();
        //新的获取简档ID  calendarUtil.getMemberProfileID  这里用到的人员ID 和获取到的简档ID都是15位的
        String new_profileId = calendarUtil.getMemberProfileID(UserInfo.getUserId().subString(0,15));
    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
                               //计提金额(不含税,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;
        //system.debug('profileId_20190517_' + profileId);
        String userid = UserInfo.getUserId();
        User loginUser = [select id, CanCancelDecideQuote__c from user where Id = :userid];
        if (new_profileId == System.Label.SystemAdmin || new_profileId == System.Label.SystemAdmin2
            || new_profileId == System.Label.SystemAdmin || new_profileId == System.Label.SystemAdmin2
            || loginUser.CanCancelDecideQuote__c == true) {
            isAdmin = true;
        }
        openType = System.currentPageReference().getParameters().get('openType');
        isService = openType == 'service' ? true : false;
        is_Parts_direct = false;
        is_Parts_dealer = false;
        is_hidden_user = false;
        if (profileId == System.Label.RT_BS_No_Price || new_profileId == System.Label.RT_BS_No_Price) {// || profileId == System.Label.SystemAdmin) {
            is_hidden_user = true;
            //system.debug('is_hidden_user_1_1_1_1_' + is_hidden_user);
        }
        is_dealer_user = false;
        //system.debug('UserInfo.getUserType()__20190517_'+UserInfo.getUserType());
        //system.debug('UserInfo.getUserId()__20190517_1_'+UserInfo.getUserId().substring(0, 15));
        if (UserInfo.getUserType() == 'PowerPartner' || UserInfo.getUserId().substring(0, 15) == '00528000002PBPf') {
            is_dealer_user = true;
            //system.debug('is_dealer_user_1_1_1_1_' + is_dealer_user);
        }
        is_hidden_all = false;
        specialDealer = false;
        //Quote
        
        //重画页面 重画新增行
        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
        //system.debug('quo---cccc: '+quo);
        quo = new Quote();
        quo.Quote_Type__c = 'sales';
        if (isService == true) {
            quo.Quote_Type__c = 'service';
        }
        quo.Comment__c  = '1)  The payment terms are - .\n';
        quo.Comment__c += '付款方式 - 。\n';
        quo.Comment__c += '2)  Quoation valid until - .\n';
        quo.Comment__c += '报价有效期到 - 。\n';
        quo.Comment__c += '3)  All the commodoties come with - year\'s manufacturer warranty.\n';
        quo.Comment__c += '所有商品含 - 年厂家保修。\n';
        if (isService == false) {
            quo.Comment__c += '4)  The above quotations are - prices, Commodoties shipped to the clien\'s requirements.\n';
            quo.Comment__c += '上述报价为 - 价,商品送至客户指定地点。\n';
            quo.Comment__c += '5)  The above quotations are all - .\n';
            quo.Comment__c += '上述报价均为 - 价。\n';
            quo.Comment__c += '6)  Configuration as per attached.\n';
            quo.Comment__c += '配置清单详见附件。';
        } 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;
              }
            quo.Comment__c += '4)  The above quotations are all - .\n';
            quo.Comment__c += '上述报价均为 - 价。\n';
            quo.Comment__c += '5)  Configuration as per attached.\n';
            quo.Comment__c += '配置清单详见附件。';
        }
        if (isService == true) {
            quo.SetName1__c = '零件费用';
            quo.SetQty1__c = 1;
            quo.SetName2__c = '维修费';
            quo.SetQty2__c = 1;
            quo.SetName3__c = '其他费用';
            quo.SetQty3__c = 1;
        }
        quo = new Quote();
        quo.Quote_Type__c = 'sales';
        if (isService == true) {
            quo.Quote_Type__c = 'service';
        }
        quo.Comment__c  = '1)  The payment terms are - .\n';
        quo.Comment__c += '付款方式 - 。\n';
        quo.Comment__c += '2)  Quoation valid until - .\n';
        quo.Comment__c += '报价有效期到 - 。\n';
        quo.Comment__c += '3)  All the commodoties come with - year\'s manufacturer warranty.\n';
        quo.Comment__c += '所有商品含 - 年厂家保修。\n';
        if (isService == false) {
            quo.Comment__c += '4)  The above quotations are - prices, Commodoties shipped to the clien\'s requirements.\n';
            quo.Comment__c += '上述报价为 - 价,商品送至客户指定地点。\n';
            quo.Comment__c += '5)  The above quotations are all - .\n';
            quo.Comment__c += '上述报价均为 - 价。\n';
            quo.Comment__c += '6)  Configuration as per attached.\n';
            quo.Comment__c += '配置清单详见附件。';
        } else {
            quo.Comment__c += '4)  The above quotations are all - .\n';
            quo.Comment__c += '上述报价均为 - 价。\n';
            quo.Comment__c += '5)  Configuration as per attached.\n';
            quo.Comment__c += '配置清单详见附件。';
        }
        if (isService == true) {
            quo.SetName1__c = '零件费用';
            quo.SetQty1__c = 1;
            quo.SetName2__c = '维修费';
            quo.SetQty2__c = 1;
            quo.SetName3__c = '其他费用';
            quo.SetQty3__c = 1;
        }
        //Opportunityid
        Opportunity oppRecord = null;
        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 From Quote Where Id =:quoId];
                if (ql.size()>0) {
                    oppId = ql[0].OpportunityId;
                }
            }
            List<Opportunity> oppList = New List<Opportunity>();
            oppList = [select Id,Pricebook2Id,CurrencyIsoCode,AccountId,Is_Decided__c,ProductSegment__c,Machine_Parts__c,SalesChannel__c,Dealer__r.DummyDealer__c,
                              IE_Discount_Normal__c,Subuse__c,IE_Discount_Special__c,Dealer_Code__c,Province__c,Dealer_Rank__c,Dealer__r.ParentId,Account.MarketVerticals__c,Trade_Type_D__c,
                              DealerId__c
                         From Opportunity Where Id =:oppId];
            if (oppList.size()>0) {
                opp = oppList[0];
                oppRecord = oppList[0];
                pricebook2Id = oppList[0].Pricebook2Id;
                currencyIsoCode = oppList[0].CurrencyIsoCode;
                accountId = oppList[0].AccountId;
                decideFlg = oppList[0].Is_Decided__c;
                productSegment = oppList[0].ProductSegment__c;
                if (oppList[0].Machine_Parts__c == 'Parts' && oppList[0].SalesChannel__c == 'direct') {
                    is_Parts_direct = true;
                } else if (oppList[0].Machine_Parts__c == 'Parts' && oppList[0].SalesChannel__c == 'dealer') {
                    is_Parts_dealer = true;
                }
                //if(specialdealer == true){
                   //is_hidden_all = true;
                //}
            }
            i++;
          }
          //mp.put(xlscode, xlsQuantity);
          xlscnt++;
        }
      }
    } catch (Exception ex) {
      activities = tmpactivities;
      errorflg = true;
      errormessage = System.Label.Error_Message31;
      pageArrange();
      return null;
    }
    system.debug(j);
    system.debug('xlscnt:::::' + xlscnt);
    if (codelist.size() == 0 || Quantitylist.size() == 0) {
      activities = tmpactivities;
      errorflg = true;
      errormessage = System.Label.Error_Message31;
      pageArrange();
      return null;
    }
    xlscnt = j + xlscnt;
    if (xlscnt > quoteEntryMaxLine) {
      activities = tmpactivities;
      errorflg = true;
      errormessage = System.Label.Error_Message32;
      pageArrange();
      return null;
    }
    i = 0;
    boolean lineflg = false;
    for (QELine t : tmpactivities) {
      if (i == j) {
        Map<String, Product2> mpProduct2 = new Map<String, Product2>();                     // keyがProductCodeです。
        List<Product2> items = [select Id, Name, ProductCode,
                                Foreign_Trade_Cost_US__c, Foreign_Trade_List_US__c, Intra_Trade_Cost_RMB__c, Intra_Trade_List_RMB__c,
                                //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
                                And Manual_Entry__c = false];
        for (Product2 prd : items) {
          system.debug('prd.ProductCode:::::' + prd.ProductCode);
          mpProduct2.put(prd.ProductCode, prd);
        //specialDealer = StaticParameter.specialDealerMap.containsKey(((String)opp.DealerId__c).substring(0,15));
        //specialDealer = IfspecialDealer(opp.DealerId__c);
        if (opp != null) {
            specialDealer = IfspecialDealer(opp.DealerId__c);
            if(specialDealer == true){
                is_hidden_all = true;
            }
        }
        Map<String, PricebookEntry> entries = new Map<String, PricebookEntry>();            // keyがProductCodeです。
        Boolean updateOrCopy = false;
        quoId = System.currentPageReference().getParameters().get('Id');
        if (quoId==null){
            quoId = System.currentPageReference().getParameters().get('copyid');
            if (quoId!=null){
                updateOrCopy = true;
            }
        } else {
            updateOrCopy = false;
        }
        Integer i;
        if (quoId==null){
            List<Quote> qlCk = New List<Quote>();
                qlCk = [select Id,OpportunityId,Opportunity.DealerId__c,OrderIsChange__c From Quote Where OpportunityId =:oppId];
            if (qlCk.size()>0) {
                //specialDealer =  StaticParameter.specialDealerMap.containsKey(qlCk[0].Opportunity.DealerId__c);
                specialDealer = IfspecialDealer(qlCk[0].Opportunity.DealerId__c);
                if(specialDealer == true){
                    is_hidden_all = true;
                }
                if (activities==null){
                    activities = new List<QELine>();
                    for (i=0;i<quoteEntryMaxLine;i++){
                        QELine active_activity = new QELine(i);
                        activities.add(active_activity);
                    }
                }
            } else {
                Integer k;
                List<OpportunityLineItem> oppItemList = New List<OpportunityLineItem>();
                oppItemList = [select Id,Product2Id,ProductCode,Product2.Product_ECCode__c,Product2.Name,Quantity,UnitPrice,Description,PricebookEntryId,
                                      PricebookEntry.SalesPrice__c,PricebookEntry.SalesPriceA__c,PricebookEntry.SalesPriceB__c,
                                      PricebookEntry.SalesPriceC__c,Product2.ProductModels__c,PricebookEntry.Hidden_flag__c,
                                      Opportunity.DealerId__c
                                 From OpportunityLineItem
                                Where OpportunityId =:oppId];
                if (oppItemList.size()>0) {
                    k = oppItemList.size();
                } else {
                    k = 0;
                }
                //新規リストコントローラの取得
                if (activities==null){
                    activities = new List<QELine>();
                    for (i=0;i<quoteEntryMaxLine;i++){
                        QELine active_activity = new QELine(i);
                        if (i<k) {
                            active_activity.productName = oppItemList[i].Product2.Name;
                            active_activity.productCode = oppItemList[i].ProductCode;
                            active_activity.productEC = oppItemList[i].Product2.Product_ECCode__c;
                            active_activity.pageObject.Quantity = oppItemList[i].Quantity;
                            active_activity.pageObject.UnitPrice = oppItemList[i].UnitPrice;
                            active_activity.pageObject.Description = oppItemList[i].Description;
                            active_activity.totalPrice = oppItemList[i].Quantity * oppItemList[i].UnitPrice;
                            if (isService == true) {
                                active_activity.setName = '零件费用';
                            } else {
                                active_activity.setName = '单品';
                            }
                            active_activity.pageObject.Set__c = '单品';
                            active_activity.pageObject.SingleProduct__c = true;
                            active_activity.pageObject.PricebookEntryId = oppItemList[i].PricebookEntryId;
                            active_activity.salesPrice = oppItemList[i].PricebookEntry.SalesPrice__c;
                            active_activity.salesPriceA = oppItemList[i].PricebookEntry.SalesPriceA__c;
                            active_activity.salesPriceB = oppItemList[i].PricebookEntry.SalesPriceB__c;
                            active_activity.salesPriceC = oppItemList[i].PricebookEntry.SalesPriceC__c;
                            active_activity.isProductModel = oppItemList[i].Product2.ProductModels__c;
                            active_activity.hiddenflg = oppItemList[i].PricebookEntry.Hidden_flag__c;
                            //StaticParameter.specialGroupMap.
                            //specialDealer =  StaticParameter.specialDealerMap.containsKey(oppItemList[i].Opportunity.DealerId__c);
                            specialDealer = IfspecialDealer(oppItemList[i].Opportunity.DealerId__c);
                            if(specialDealer == true){
                                is_hidden_all = true;
                            }
                            //system.debug();
                            //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '请选择目标客户---->'+oppItemList[i].Opportunity.DealerId__c));
                            if (specialDealer || is_hidden_user == true || is_dealer_user == true && oppItemList[i].PricebookEntry.Hidden_flag__c == true) {
                                active_activity.pageObject.UnitPrice = 0;
                                active_activity.totalPrice = 0;
                                system.debug('<---is_hidden_all--->03' + is_hidden_all);
                                is_hidden_all = true;
                                discount = 0;
                            }
                        }
                        activities.add(active_activity);
                    }
                }
            }
        } else {
            system.debug('○○○○○○○○○○○○Welcome to edit class!!○○○○○○○○○○○○');
            String accountid;
            List<Quote> quoList =
                [ SELECT Id,Name,QuoteNumber,Account.Name,ExpirationDate,Subtotal,Discount,TotalPrice,GrandTotal,PrintPrice__c,ShippingHandling,
                    DeliveryLeadTime__c,PaymentTerms__c,ValidDate__c,Warranty__c,SetName1__c,Is_Decided__c,Shipment_Term__c,Shipment_Term2__c,
                    SetName2__c,SetName3__c,SetName4__c,SetName5__c,SetName6__c,SetName7__c,SetName8__c,SetName9__c,SetName10__c,
                    SetName11__c,SetName12__c,SetName13__c,SetName14__c,SetName15__c,SetName16__c,SetName17__c,SetName18__c,SetName19__c,
                    SetName20__c,SetName21__c,SetName22__c,SetName23__c,SetName24__c,SetName25__c,SetName26__c,SetName27__c,SetName28__c,SetName29__c,
                    SetName30__c,SetQty1__c,SetQty2__c,SetQty3__c,SetQty4__c,SetQty5__c,SetQty6__c,SetQty7__c,SetQty8__c,SetQty9__c,SetQty10__c,SetQty11__c,
                    SetQty12__c,SetQty13__c,SetQty14__c,SetQty15__c,SetQty16__c,SetQty17__c,SetQty18__c,SetQty19__c,SetQty20__c,SetQty21__c,SetQty22__c,SetQty23__c,
                    SetQty24__c,SetQty25__c,SetQty26__c,SetQty27__c,SetQty28__c,SetQty29__c,SetQty30__c,Comment__c,Custom_Price_Total__c,Custom_Price_Total_Text__c,Quote_Type__c,
                    Main_Model__c,Main_Serial_Number__c,Service_Type__c,Contract_Number__c,Service_Date__c,Service_Finish_Date__c,Service_Engineer_Sign__c,
                    Service_Pickup_Sign__c,Service_Check_Sign__c,Service_Location__c,Service_Status__c,Service_Content__c, Is_upload__c, Total_Price_Text__c,
                    Discount_Normal__c,Discount_Special__c,OrderIsChange__c
                    FROM Quote Where Id =:quoId];
            List<QuoteLineItem> items =
                [Select Id,Product2Id,Product2.Name,Product2.ProductCode,Product2.Product_ECCode__c,Quantity,Subtotal,Discount,TotalPrice,PricebookEntryId,UnitPrice,Description,Set__c,Custom_Price__c,
                        PricebookEntry.SalesPrice__c,PricebookEntry.SalesPriceA__c,PricebookEntry.SalesPriceB__c,PricebookEntry.SalesPriceC__c,Product2.ProductModels__c,PricebookEntry.Hidden_flag__c,
                        SingleProduct__c,SetName__c,
                        Quote.Opportunity.DealerId__c
                   From QuoteLineItem where Quoteid = :quoId Order by Id];
            //system.debug('quoList==========>'+quoList);
            //system.debug('items==========>'+items);
            if (quoList.size() > 0) {
                if (updateOrCopy) {
                    quo = quoList[0];
                    quo.Id = null;
                    quo.name = null;
                    quo.Is_Decided__c = false;
                    quo.Is_upload__c = false;
                } else {
                    quo = quoList[0];
                }
                isdecide = quo.Is_Decided__c;
            }
            if (updateOrCopy) {
                quoId = null;
            }
            quoteLineSetNameDiscountMap = new Map<String,String>();
            activities = new List<QELine>();
            i=0;
            QELine c = new QELine(i);
            if (items.size()>0) {
                for (QuoteLineItem o:items) {
                    if (String.isNotBlank(o.SetName__c)) {
                        quoteLineSetNameDiscountMap.put(o.SetName__c,String.valueOf(o.Discount));
                    }
                    String setName = o.Set__c;
                    Integer qty = 1;
                    if (setName != null) {
                        //XHL-20190426-UpdateStart
                        if (!o.SingleProduct__c) {
                            String fieldName = setName.substring(3);
                            fieldName = fieldName.indexOf('0') == 0 ? fieldName.substring(1) : fieldName;
                            Decimal d_qty = (Decimal) quo.get('SetQty' + fieldName + '__c');
                            qty = d_qty == null ? 1 : d_qty.intValue();
                        }
                        //XHL-20190426-UpdateEnd
                    }
                    c = new QELine(isService,o,i,o.Product2.Name,o.Product2.ProductCode,o.Product2.Product_ECCode__c,qty,o.Product2.ProductModels__c,o.SingleProduct__c,o.SetName__c);
                    //specialDealer =  StaticParameter.specialDealerMap.containsKey(o.Quote.Opportunity.DealerId__c);
                    specialDealer = IfspecialDealer(o.Quote.Opportunity.DealerId__c);
                    if(specialDealer == true){
                        is_hidden_all = true;
                    }
                    //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '请选择目标客户----2>'+o.Quote.Opportunity.DealerId__c));
                    //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '请选择目标客户----n>'+specialDealer));
                    if ( specialDealer || is_hidden_user == true || is_dealer_user == true && c.hiddenflg == true) {
                        c.pageObject.UnitPrice = 0;
                        c.totalPrice = 0;
                        c.customPrice = 0;
                        system.debug('<---is_hidden_all---04>' + is_hidden_all);
                        is_hidden_all = true;
                        discount = 0;
                    }
                    activities.add(c);
                    i++;
                    if (quo.OrderIsChange__c) {
                        String productCode = o.Product2.ProductCode;
                        if (String.isNotBlank(productCode)) {
                            initStringConcatenation += productCode + '|' + o.Quantity;
                        }
                    }
                }
                for (integer j=i;j<quoteEntryMaxLine;j++) {
                    c = new QELine(j);
                    activities.add(c);
                }
                quoteLineSetNameDiscountJson(quoteLineSetNameDiscountMap);
            } else {
                activities = new List<QELine>();
                for (i=0;i<quoteEntryMaxLine;i++) {
                    QELine active_activity = new QELine(i);
                    activities.add(active_activity);
                }
            }
system.debug('=====is_hidden_all:' + is_hidden_all);
            if (is_hidden_all) {
                discount = quo.totalPrice.setScale(2, System.RoundingMode.HALF_UP);
            } else {
                discount = quo.Discount == null ? 0 : quo.Discount;
                discount = discount.setScale(2, System.RoundingMode.HALF_UP);
            }
system.debug('=====discount:' + discount);
            if (quoId != null) {
                printFlg = true;
            }
            system.debug('○○○○○○○○○○○○ edit class  End!!○○○○○○○○○○○○');
        }
        Map<String, Decimal> ddMap = new Map<String, Decimal>();
        String key1 = '';
        String key2 = '';
        List<Dealer_Discount__c> ddList = [select id, Dealer_Rank_F__c,Product_Segment__c, DimensionField1__c, DimensionField2__c, DimensionValue1__c, DimensionValue2__c, Dealer_Rank__c from Dealer_Discount__c where Product_Segment__c = :productSegment];
        for (Dealer_Discount__c dd : ddList) {
            ddMap.put(dd.DimensionValue1__c + '|' + dd.DimensionValue2__c, dd.Dealer_Rank_F__c);
            key1 = dd.DimensionField1__c == null ? '' : dd.DimensionField1__c;
            key2 = dd.DimensionField2__c == null ? '' : dd.DimensionField2__c;
        }
        String keyF = ((key1 == '' || oppRecord.get(key1) == null) ? 'null' : oppRecord.get(key1)) + '|' + ((key2 == '' || oppRecord.get(key2) == null) ? 'null' : oppRecord.get(key2));
        quo.Discount_Normal__c = 100 - (ddMap.get(keyF) == null ? 100.0 : ddMap.get(keyF));
        dealer_coefficient = quo.Discount_Normal__c;
system.debug('=====keyF:' + keyF);
system.debug('=====Discount_Normal__c:' + quo.Discount_Normal__c);
        activitiesSize = activities.size();
        system.debug(specialDealer);
    }
    public PageReference Refresh() {
        List<Id> Idlist = New List<Id>();
        for (QELine t:activities) {
            Idlist.add(t.pageObject.PricebookEntryId);
        }
        if (Idlist.size()==0) {
            errorflg = true;
            errormessage = System.Label.Error_Message01;
            return null;
        }
        //List<PricebookEntry> pbes = [
        //            select Id,Product2Id,ProductCode,Product2.Product_ECCode__c,SalesPrice__c,SalesPriceA__c,SalesPriceB__c,SalesPriceC__c,Hidden_flag__c,Product2.ProductStatus__c
        //            FROM PricebookEntry where Id in :Idlist];
        //20191113-XHL---Start-将产品状态用产品状态(公式)替换
        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のところ)1件ずつ検索していますが、今後、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 {
        // 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) {
                    select Id,Product2Id,ProductCode,Product2.Product_ECCode__c,SalesPrice__c,SalesPriceA__c,SalesPriceB__c,SalesPriceC__c,Hidden_flag__c,Product2.ProductStatus__c,Product2.ProductStatusFormula__c
                    FROM PricebookEntry where Id in :Idlist];
        //20191113-XHL---End-将产品状态用产品状态(公式)替换
        if (pbes.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 ++;
                    }
                  }
            errormessage = System.Label.Error_Message01;
            return null;
        }
        Map<String, PricebookEntry> tempMap = new Map<String, PricebookEntry>();
        for (PricebookEntry pbe:pbes) {
            tempMap.put(pbe.Id, pbe);
        }
        system.debug('<---is_hidden_all---05>' + is_hidden_all);
        is_hidden_all = false;
        for (QELine t:activities) {
            PricebookEntry tmpPbe = tempMap.get(t.pageObject.PricebookEntryId);
            if (tmpPbe != null) {
                if (tmpPbe.SalesPrice__c != null && tmpPbe.Product2.ProductStatus__c == '1' && ( specialDealer == false && is_hidden_user == false && (is_dealer_user == false || tmpPbe.Hidden_flag__c == false))) {
                //20191113-XHL---将产品状态用产品状态(公式)替换
                //if (tmpPbe.SalesPrice__c != null && tmpPbe.Product2.ProductStatusFormula__c == '1' && (is_hidden_user == false && (is_dealer_user == false || tmpPbe.Hidden_flag__c == false))) {
                    t.pageObject.UnitPrice = tmpPbe.SalesPrice__c;
                    t.salesPrice = tmpPbe.SalesPrice__c;
                    t.salesPriceA = tmpPbe.SalesPriceA__c;
                    t.salesPriceB = tmpPbe.SalesPriceB__c;
                    t.salesPriceC = tmpPbe.SalesPriceC__c;
                } else if (tmpPbe.SalesPrice__c != null && tmpPbe.Product2.ProductStatus__c == '0' && ( specialDealer == false && is_hidden_user == false && (is_dealer_user == false || tmpPbe.Hidden_flag__c == false))) {
                //20191113-XHL---将产品状态用产品状态(公式)替换
                //} else if (tmpPbe.SalesPrice__c != null && tmpPbe.Product2.ProductStatusFormula__c == '0' && (is_hidden_user == false && (is_dealer_user == false || tmpPbe.Hidden_flag__c == false))) {
                    t.pageObject.UnitPrice = 0;
                    t.salesPrice = 0;
                    t.salesPriceA = 0;
                    t.salesPriceB = 0;
                    t.salesPriceC = 0;
                } else {
                    t.pageObject.UnitPrice = 0;
                    t.salesPrice = 0;
                    t.salesPriceA = 0;
                    t.salesPriceB = 0;
                    t.salesPriceC = 0;
                    is_hidden_all = true;
                    discount = 0;
                }
              }
            }
            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);           // 1件目のエラーのみ表示
        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不可销售的时候,都是报错的,其中不可销售产品显示红字,不应该保存。
      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);           // 1件目のエラーのみ表示
      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;
  }
    //excelImport
    public PageReference excelImport() {
/*        system.debug('○○○○○○○○○○○○○○○Welcome to excelImport!!');
        system.debug('▼▼▼▼▼excel_text:' + excel_text);
        //oppに画面の値を設定
        setOppFromOppInfo();
  //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;
      errorflg = false;
      errormessage = null;
      //20220214 fy lastbuy start
      if(!ReservedProductVerification()){
        errorflg = true;
        errormessage =  '产品数量不可超过产品预留数量' ;
        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;
      }
      if (dataEntry() == false) {
        return null;
      } else {
        //引合に見積決定をオン
        if (oppId == null) {
          system.debug('Error is Opportunityid null!!!');
        } else {
          List<Opportunity> opps = [Select Id, Estimation_Decision__c From Opportunity Where Id = : oppId];
          if (opps.size() > 0) {
            opps[0].Estimation_Decision__c = true;
            /*↓↓↓見積同期↓↓↓2012/11/28 未使用
            opps[0].SyncedQuoteId = quoId;
            ↑↑↑    ↑↑↑*/
            ControllerUtil.updOpp(opps[0]);
          }
          errorflg = true;
          errorMessage = System.Label.Message_002;
          // cic 134906 start
          Quote q = [select Id from Quote where Id = :quoId];
          q.Quote_Decision_Date__c = date.Today();
          update q;
          // cic 134906 end
          QuoteDecision = true;
          enableContract = true;
          //--Savebutton
          Save_button = true;
          //--Decisionbutton判定
          if (verified == true) {
            Decision_button = false;
          } else if (QuoteCorrect == false) {
            Decision_button = true;
          } else if (QuoteDecision == true) {
            Decision_button = true;
          } else {
            Decision_button = false;
          }
          //--SAPButton
          if (QuoteDecision == false) {
            sap_button = true;
          } else if (specialAuthority == false) {
            sap_button = true;
          } else {
            sap_button = false;
          }
          //--決定ボタン使えないようにする
          Decision_button = true;
          pageArrange();
        }
      }
    } catch (DmlException de) {
      Database.rollback(sp);
      errorflg = true;
      errormessage = de.getDmlMessage(0);           // 1件目のエラーのみ表示
      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();
                ControllerUtil.updOpp(opps[0]);
              }
              quos[0].Quote_Print_Date__c = date.Today();
              ControllerUtil.updQuote(quos[0]);
            }
          }
        }
      }
      pageArrange();
    } catch (DmlException de) {
      Database.rollback(sp);
      errorflg = true;
      errormessage = de.getDmlMessage(0);           // 1件目のエラーのみ表示
      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
                            From Product2 Where Id IN :product2Ids]) {
        cntPrd2 = cntPrd2   +   1;
        if (prd2.Estimation_Entry_Possibility__c != '○') {
          error = true;
        }
        if (prd2.Estimation_Entry_Possibility__c == 'M') {
          error = false;
        }
        if (prd2.SFDA_Status__c != loopMap.get(prd2.Id)) {
          //
          WinOrDecideAlert    =   true;
        }
        prd2LatestValMap.put(prd2.Id, prd2);
      }
      if (cntPrd2  !=  Gcnt) {
        WinOrDecideAlert    =   false;
      }
    }
    if (error == true && WinOrDecideAlert == false) {
      PageArrange();
      errorflg = true;
      errorMessage = System.Label.Error_Message37;
      return false;
    }
    if (checkAgentsDeleteFlag() == false) {
      return false;
    }
    PageArrange();
    errorflg = false;
    errorMessage = null;
    return true;
  }
  private boolean 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;
        //既存データ数の確認
        Integer j = 0;
        for (QELine s:activities) {
            if ((s.productName==null) || (s.productName=='')) {
                break;
            }
          }
            j++;
        }
        if(!IsActivePsp){
          error = true;
          errormessage =  '报价试算中,选择的促销政策:'+errorPsp+',不在有效期内,请检查!' ;
        }
      }
      //wql 报价试算 检索促销政策是否有效 end
    }
    //询价上的【是否需要价格申请】为是的场合,才要检查做没做过报价试算 thh 2021-11-03 end
    return error;
  }
        //=======Temporary=====
        tmpactivities = activities;
  private boolean dataCheckDecide() {
    Boolean error = false;
    errorflg = false;
    errormessage = null;
        //=======Initialize=========
        activities = new List<QELine>();
        Integer i = 0;
        Integer xlscnt = 0;
        Integer rightcnt = 0; // 成功した数をカウント
    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;
    }
        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>();
        List<string> setlist = New List<string>();
    // 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 =  '经销商未授权或授权未完成,请先授权。' ;
      }
    }
        Map<String, Integer> mp = new Map<String, Integer>();
        string xlscode;
        Integer xlsQuantity;
        string xlset;
    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
  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);
            for (string xls:xlslists) {
                if (xls==null || xls=='') {
                    //null
                } else {
                    xlscode = null;
                    xlsQuantity = null;
                    xlset = null;
                    xlslist = xls.split('\t',-1);
                    Integer iCount = 0;
                    for (String s:xlslist) {
                        if (iCount== 1) {
                            if (s=='' || s==null) {
                                errorflg = true;
                                errormessage = System.Label.Error_Message02;
                                activities = tmpactivities;
                                return null;
                            } else {
                                s = s.trim();
                                xlsQuantity = Integer.valueOf(s);
                                Quantitylist.add(xlsQuantity);
                            }
                        } else if (iCount== 2) {
                            if (s=='' || s==null) {
                                errorflg = true;
                                errormessage = System.Label.Error_Message02;
                                activities = tmpactivities;
                                return null;
                            } else {
                                s = s.trim();
                                setlist.add(s);
                                xlset = s;
                            }
      Quote q = New Quote();
      if (changedAfterPrint) {
        system.debug('id空1:');
        quoId = null;
      }
      // false伝票から新規作成
      if (changedAfterBid) {
        system.debug('id空2:');
        quoId = null;
      }
      // CHAN-AVG3PW 询价报价画面规则变更
      if (newQuoteFlag) {
        system.debug('id空3:');
        quoId = null;
      }
      // 多年保修 start
      //报价试算 增加经销商前后对比 精琢技术 wql 20210508 start
      if ((quoteGurantee_Period != null &&
          !quoteGurantee_Period.equals(quo.Gurantee_Period__c))
          ||
          (quotemultiYearWarranty != null &&
          !quotemultiYearWarranty.equals('' + quo.multiYearWarranty__c))
          ||
          (agency1Name !=null &&!agency1Name.equals(quo.Agency1__c))
          ||
          (agency2Name !=null &&!agency2Name.equals(quo.Agency2__c))
        ) {
        quoId = null;
      }
      agency1Name = quo.Agency1__c;
      agency2Name = quo.Agency2__c;
      //报价试算 增加经销商前后对比 精琢技术 wql 20210508 end
      quoteGurantee_Period = quo.Gurantee_Period__c;
      quotemultiYearWarranty = '' + quo.multiYearWarranty__c;
      // 多年保修 end
      if (quoId == null) {
        q = New Quote();
        q.OpportunityId = oppId;
        if (detail == true) {
          if (standardPricebook == null) {
            errormessage = System.Label.Error_Message27;
                        } else {
                            if (s=='' || s==null) {
                                errorflg = true;
                                errormessage = System.Label.Error_Message02;
                                activities = tmpactivities;
                                return null;
                            } else {
                                s = s.trim();
                                codelist.add(s);
                                xlscode = s;
                            }
                        }
                        iCount++;
                        if (iCount == 3) {
                            iCount = 0;
                        }
                    }
                    //mp.put(xlscode, xlsQuantity);
                    xlscnt++;
                }
            }
        } catch(Exception ex) {
            activities = tmpactivities;
            errorflg = true;
            return false;
          } else {
            q.Pricebook2Id = standardPricebook.Id;
          }
            errormessage = System.Label.Error_Message02;
            return null;
        }
      } else {
        List<Quote> qs = New List<Quote>();
        qs = [select Id, OpportunityId, CreatedDate, Pricebook2Id, Name, Estimation_List_Price__c, Dealer_Final_Price__c,
              Stocking_Price__c, Discount_Amount__c, Discount_Amount_Calculate__c, Quote_Adjust_Amount__c, Quote_Adjust_Calculate__c,
              Agency1__c, OCM_Agent1_Price__c, Agency1_Profit__c, Agency1_Profit_Rate__c, Quote_No__c,
              Agency2__c, Agent1_Agent2_Price__c, Agency2_Profit__c, Agency2_Profit_Rate__c,
              Preferential_Trading_Price__c, Discount__c, Pricing__c, Unit_Price__c, Offer_Amount__c, TOTAL__c,
              Contract__c, Print_HP_Name__c, Quote_Expiration_Date__c, Quote_Comment__c, OCM_Sales_Forecast__c, Installation_location__c, HasType3Machine__c
              // 多年保修 start
              , Gurantee_Period__c , multiYearWarranty__c, MultiYearWarrantyTotalPrice__c
              , Preferential_Gurantee_Period__c
              // 多年保修 end
              //报价试算 start
              ,IsQuoteTrial__c
              //报价试算 end
              From Quote Where Id = :quoId];
        if (qs.size() > 0) {
          q = qs[0];
system.debug('codelist:::::'+codelist.size());
system.debug('xlscnt:::::' + xlscnt);
        if (codelist.size()==0 || Quantitylist.size()==0 || setlist.size()==0) {
            activities = tmpactivities;
            errorflg = true;
            errormessage = System.Label.Error_Message02;
            return null;
        }
        if (q.Pricebook2Id == null) {
          if (detail == true) {
            if (standardPricebook == null) {
              errormessage = System.Label.Error_Message27;
              errorflg = true;
              return false;
        xlscnt = j + xlscnt;
        if (xlscnt>quoteEntryMaxLine) {
            activities = tmpactivities;
            errorflg = true;
            errormessage = System.Label.Error_Message03;
            return null;
        }
        i = 0;
        boolean lineflg = false;
        for (QELine t:tmpactivities) {
            if (i==j) {
                Map<String, Product_Search__c> mpProduct2 = new Map<String, Product_Search__c>();                     // keyがProductCodeです。
                //List<Product_Search__c> items = [select Id,Name,ProductCode__c,
                //      ProductDescription__c,ProductStatus__c,Pricebook__c,Product__c
                //      FROM Product_Search__c Where Pricebook__c = :pricebook2Id and ProductCode__c In :codelist];
                List<Product_Search__c> items = [select Id,Name,ProductCode__c,
                        ProductDescription__c,ProductStatus__c,Product__c
                        FROM Product_Search__c Where ProductCode__c In :codelist];
                List<String> forSelect = new List<String>();
                for (Product_Search__c prd:items) {
                    mpProduct2.put(prd.ProductCode__c, prd);
                    forSelect.add(prd.Product__c);
                }
                Map<String, PricebookEntry> entries = new Map<String, PricebookEntry>();            // keyがProductCodeです。
                List<PricebookEntry> pbes = [
                    select Id,Product2Id,ProductCode,SalesPrice__c,SalesPriceA__c,SalesPriceB__c,SalesPriceC__c
                      FROM PricebookEntry where Pricebook2Id = :pricebook2Id
                       and CurrencyIsoCode =:currencyIsoCode and Product2Id in : forSelect];
                Map<String, String> tempMap = new Map<String, String>();
                for (PricebookEntry pbe:pbes) {
                    entries.put(pbe.ProductCode, pbe);
                    tempMap.put(pbe.Product2Id,pbe.Id);
                }
                for (Integer l=0;l<codelist.size();l++) {
                    Product_Search__c prd = mpProduct2.get(codelist[l]);
                    if (prd != null) {
                        PricebookEntry pbe = entries.get(codelist[l]);
                        QELine c = null;
                        if (pbe != null) {
                            Decimal sp0 = pbe.SalesPrice__c;
                            Decimal sp1 = pbe.SalesPriceA__c;
                            Decimal sp2 = pbe.SalesPriceB__c;
                            Decimal sp3 = pbe.SalesPriceC__c;
                            c = new QELine(isService, i, prd.Name, prd.ProductCode__c, pbe.Id, pbe.Product2Id, Quantitylist[l],setlist[l], sp0, sp1, sp2, sp3);
                        } else {
                            continue;
                        }
                        activities.add(c);
                        i++;
                        rightcnt++;
                        lineflg = true;
                    }
                }
                if (lineflg==true) {
                    i--;
                } else {
                    QELine a = New QELine(t, i);
                    activities.add(a);
                }
            } else {
              q.Pricebook2Id = standardPricebook.Id;
                QELine a = New QELine(t, i);
                activities.add(a);
            }
          }
        }
      }
      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;
      /*
      if (hasType3Machine) {
          q.Installation_location__c = '';
      }
      */
      System.debug('start save quote at: ' + System.currentTimeMillis());
      if (quoId == null) {
        insert q;
        quo.Quote_No__c = q.Quote_No__c;
      } else {
        update q;
      }
      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
            From Opportunity Where Id = :oppid];
      if (os.size() > 0) {
        o = os[0];
        o.Estimation_List_Price__c = qb.Estimation_List_Price;
        o.Wholesale_Price__c = opp.Wholesale_Price__c;
        o.Dealer_Final_Price__c = quo.Dealer_Final_Price_Page__c;
        o.Agency1__c = opp.Agency1__c;
        o.OCM_Agent1_Price__c = quo.OCM_Agent1_Price_Page__c;
        o.Agency1_Profit__c = Salesprofit1;
        o.Agency1_Profit_Rate__c = qb.SalesCalculation1;
        //            o.Agency1_Profit_Rate__c = quo.Agency1_Profit_Rate__c;
        o.Agency2__c = opp.Agency2__c;
        o.Agent1_Agent2_Price__c = quo.Agent1_Agent2_Price_Page__c;
        o.Agency2_Profit__c = Salesprofit2;
        o.Agency2_Profit_Rate__c = qb.SalesCalculation2;
        //            o.Agency2_Profit_Rate__c = quo.Agency2_Profit_Rate__c;
        o.Stocking_Price__c = quo.Stocking_Price__c;
        o.Estimation_No__c = quo.Quote_No__c;
        //o.Estimation_Name__c = quo.Name;
        o.Estimation_Name__c = q.Name;
        o.Estimation_Id__c = q.Id;
        o.Installation_location__c = q.Installation_location__c;
        o.HasType3Machine__c = q.HasType3Machine__c;
        // 2018/09/29 CHAN-B4YAB8 经销商折扣 start
        o.AgencyDiscount__c  = AgencyDiscount;
        // 2018/09/29 CHAN-B4YAB8 经销商折扣 end
        // 多年保修 start
        o.Gurantee_Period__c              = quo.Gurantee_Period__c ;
        o.multiYearWarranty__c            = quo.multiYearWarranty__c ;
        o.MultiYearWarrantyTotalPrice__c  = quo.MultiYearWarrantyTotalPrice__c ;
        o.quoteSavedDate__c = Date.today();
        // 多年保修 end
        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());
        ControllerUtil.updOpp(o);
        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();
        ols = [select Id from OpportunityLineItem Where OpportunityId = :oppid];
        if (ols.size() > 0) {
          //delete
          ControllerUtil.delOppLine(ols);
          system.debug('○○○○○Save4○○○○○');
        }
        //Sap送信,Printに合わせて1~
        i = 1;
        ols = New List<OpportunityLineItem>();
        if (activities.size() > 0) {
          for (QELine s : activities) {
            if (s.Asset_Model != null && s.Asset_Model != '') {
              if (s.PageObject.PricebookEntryId != null) {
                ol = New OpportunityLineItem();
                ol.OpportunityId = oppid;
                ol.Id__c = s.PageObject.Id__c;
                // 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> lastProductFLGList = new List<Id>();
    for(QELine qli : activities){
      lastProductFLGList.add(qli.pageObject.PricebookEntry.Product2Id);
      quotlinitMap.put(qli.pageObject.PricebookEntry.Product2Id,qli.pageObject);
    }
    System.debug('activities!!!'+activities);
    System.debug('oppId!!!'+oppId);
    System.debug('lastProductFLGList!!!'+lastProductFLGList);
    if(lastProductFLGList!=null){
        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 :lastProductFLGList and effectiveFLG__c = true];
        if(LastbuyObjList!=null){
            for(LastbuyProduct__c lastbuypr :LastbuyObjList){
              Decimal quoteLItemNum=0;
              if(quotlinitMap.containsKey(lastbuypr.ProductName__c)){
                  quoteLItemNum=quotlinitMap.get(lastbuypr.ProductName__c).Quantity__c;
              }else{
                  continue;
              }
              if(lastbuypr.LastbuyQuantity__c<quoteLItemNum){
                filg=false;
            i++;
            if (i>149) {
                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
    public OppInfo(Opportunity opp) {
      Account_RecordType_DeveloperName = opp.Account.RecordType.DeveloperName;
      Direct_Separate = opp.Direct_Separate__c;
      Trade = opp.Trade__c;
      Wholesale_Price = opp.Wholesale_Price__c;
      CurrencyIsoCode = opp.CurrencyIsoCode;
      HP_Name = opp.HP_Name__c;
      Department_Name = opp.Department_Name__c;
      Sales_Root = opp.Sales_Root__c;
      // LHJ Start
      If_Need_Authorize = opp.If_Need_Authorize__c;
      Authorized_DB_No = opp.Authorized_DB_No__c;
      // LHJ End
    }
  }
  //TODO 1.Quoteオブジェクト追加
  //TODO 2.コンストラクタを追加
  public class QuoteBean {
    public Decimal Estimation_List_Price { get; set; }
    //TODO 999.99以下しか入力できない。
    public Decimal Quote_Adjust_Calculate { get; set; }
    public Decimal SalesCalculation1 { get; set; }
    public Decimal SalesCalculation2 { get; set; }
    public Integer PriceRefreshPeriod { get; set; }
    public void setPriceRefreshPeriodByDate(Date PriceRefreshDate) {
      this.PriceRefreshPeriod = PriceRefreshDate.daysBetween(Date.today());
    }
  }
  public class QELinelatestInfo {
    public String ProductCode { get; set; }
    public String ProductName { get; set; }
    public String SFDA_Status { get; set; }
    public String Sales_Possibility { get; set; }
    public Decimal ListPrice { get; set; }              // 最新
    public Decimal Cost { get; set; }                    // 最新
    public Integer Specifications {get; set;}
    // 多年保修 start
    public string GuranteeType {get; set;}
    public Decimal Intra_Trade_Gurantee {get; set;}
    public Decimal ProductEntend_gurantee_period_all {get; set;}
    public Decimal Intra_Trade_Service {get; set;}
    // 维修合同报价
    public Decimal Maintenance_Price_Year {get; set;}
    // 多年保修 end
    // 维修合同报价
    //不可取消多年保
    public 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
        // messageを出す
        errorflg = true;
        errormessage = '数据导入结束,导入 ' + codelist.size() + ' 件,成功' + rightcnt + ' 件';
*/
        return null;
    }
    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 经销商单价和小计
     //BackButton
    public PageReference BackBtn() {
        String url = baseUrl;
        if (rtUrl != null && rtUrl.length() > 0) {
            url += rtUrl.replace('/production', '');
        } else {
            url += '\\' + oppid;
        }
        return new Pagereference(url);
    }
      //CHAN-BKU3XH 检查是否存在不是同一个供销商名称 精琢技术 2020/02/17 Start
      this.VenderName = oli.PricebookEntry.Product2.VenderName__c;
    public PageReference Save() {
      //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
        system.debug('○○○○○○○○○○○○Welcome to Save class!!○○○○○○○○○○○○');
        //system.debug('=====save discount:' + discount);
      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;
        errorflg = false;
        errormessage = null;
        Savepoint sp = Database.setSavepoint();
      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;
        try {
      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;
            //データチェック
            if (dataCheck() ==false) {
                return null;
            }
            String url = baseUrl;
            if (rtUrl != null && rtUrl.length() > 0) {
                url += rtUrl.replace('/production', '');
            } else {
                url += '\\' + oppid;
            }
            system.debug('url++++++' + url);
            PageReference pageRef = new Pagereference(url);
            if (dataEntry()==false) {
                //msg
                return null;
            } else {
                errorflg = true;
                if (specialerrorflg) {
                    errorMessage = String.isBlank(errorMessage) ?System.Label.Info_Message01:System.Label.Info_Message01 +errorMessage;
                } else {
                    // errorMessage = System.Label.Info_Message01 ;
                    errorMessage = String.isBlank(errorMessage) ?System.Label.Info_Message01:System.Label.Info_Message01 +errorMessage;
                    // ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.ERROR, '注意!!!'+errorMessage));
                }
                //system.debug('errorMessage20190524' + errorMessage);
                return null;
            }
        } catch (DmlException de) {
            Database.rollback(sp);
            errorflg = true;
            errormessage = de.getDmlMessage(0);           // 1件目のエラーのみ表示
            system.debug(Logginglevel.ERROR, de.getMessage());
            system.debug(Logginglevel.ERROR, de.getStackTraceString());
        } catch (Exception e) {
            Database.rollback(sp);
            errorflg = true;
            errormessage = e.getMessage();
            system.debug(Logginglevel.ERROR, e.getMessage());
            system.debug(Logginglevel.ERROR, e.getStackTraceString());
        }
        return null;
    }
    //OppReflection button
    public PageReference OppReflection() {
        //oppに画面の値を設定
        setOppFromOppInfo();
        Savepoint sp = Database.setSavepoint();
        try {
            errorflg = false;
            errormessage = null;
            //データチェック
            if (dataCheck() ==false) {
                return null;
            }
            String url = baseUrl;
            if (rtUrl != null && rtUrl.length() > 0) {
                url += rtUrl.replace('/production', '');
            } else {
                url += '\\' + oppid;
            }
            PageReference pageRef = new Pagereference(url);
            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;
    }
    public PageReference Decide() {
        system.debug('○○○○○○○○○○○○Welcome to Decide class!!○○○○○○○○○○○○');
        if (quo.Is_upload__c == true) {
            errorflg = true;
            errorMessage = '报价已经上传,不能再次决定。请再报价后,决定并上传新的报价。';
            return null;
        }
        boolean hasDetail = false;
        if (activities.size()>0) {
            for (QELine s:activities) {
                if (s.pageObject.PricebookEntryId != null && s.productName != null && s.productName != '') {
                    hasDetail = true;
                    break;
                }
            }
        }
        if (hasDetail == false) {
            errorflg = true;
            errorMessage = '不能决定没有产品明细的报价。';
            return null;
        }
        doDecide = true;
        Save();
        decideORundecideQuote(quo.Id,true);
        String url = baseUrl + '/apex/NewQuoteDevide?Id=' + quoId + '&retURL=' + rtUrl;
        PageReference pageRef = new Pagereference(url);
        if (errorflg == false || errorMessage.startsWith(System.Label.Info_Message01)) {
            return pageRef;
        }
        return null;
    }
    public PageReference UnDecide() {
        system.debug('○○○○○○○○○○○○Welcome to unDecide class!!○○○○○○○○○○○○');
        errorflg = false;
        errormessage = null;
        Savepoint sp = Database.setSavepoint();
        try {
            Quote q = New Quote();
            q.Id = quo.Id;
            q.Is_Decided__c = false;
            Opportunity o = New Opportunity();
            List<Opportunity> os = [select Id From Opportunity Where Id =:oppid];
            if (os.size()>0) {
                o = os[0];
                o.Is_Decided__c = false;
                o.Quote_Decide_User__c = null;
            }
            update q;
            update o;
            decideORundecideQuote(q.Id,true);
            String url = baseUrl + '/apex/NewQuoteDevide?Id=' + quoId + '&retURL=' + rtUrl;
            PageReference pageRef = new Pagereference(url);
            if (errorflg == false) {
                return pageRef;
            }
        } catch (DmlException de) {
            Database.rollback(sp);
            errorflg = true;
            errormessage = de.getDmlMessage(0);           // 1件目のエラーのみ表示
            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;
    }
    public boolean dataEntry() {
        system.debug('○○○○○○○○○○○○Welcome to dataEntry class!!○○○○○○○○○○○○');
        Boolean error = false;
        Boolean detail = true;
        //Quote-------------------------------------------------------------
        //List<Quote> maxQuote_No = [select QuoteNumber From Quote Where OpportunityId = :oppid order by QuoteNumber desc NULLS LAST limit 1];
        //String oppNo;
        //Integer l = 1;
        //if (maxQuote_No.size()>0) {
        //    try {
        //        oppNo = maxQuote_No[0].QuoteNumber;
        //        l = Integer.valueOf(oppNo) + 1;
        //    } catch (System.TypeException e) {
        //        system.debug('maxQuote_No Error: quote.id=' + maxQuote_No[0].id);
        //    }
        //} else {
        //    system.debug('first Quote');
        //}
        //oppNo = String.valueof(l);
        //while (oppNo.length() < 8){
        //    oppNo = '0' + oppNo;
        //}
        Quote q = New Quote();
        if (quoId==null) {
            q = quo.clone();
            q.OpportunityId = oppId;
            if (detail == true) {
                if (pricebook2Id==null) {
                    errormessage = System.Label.Error_Message04;
                    errorflg = true;
                    return false;
                } else {
                    q.Pricebook2Id = pricebook2Id;
                }
            }
        } else {
            q = quo.clone();
            q.Id = quoId;
            if (q.Pricebook2Id ==null) {
                if (detail == true) {
                    if (pricebook2Id==null) {
                        errormessage = System.Label.Error_Message04;
                        errorflg = true;
                         return false;
                    } else {
                        q.Pricebook2Id = pricebook2Id;
                    }
                }
            }
        }
        if (quoId==null) {
            //q.PriceRefreshDate__c = Date.today();
        }
        if (productStatusUpdated) {
            //q.PriceRefreshDate__c = Date.today();
        }
        q.Name = quo.name;
        system.debug(opp.Account.MarketVerticals__c +'@@@@@@@@'+opp.Trade_Type_D__c);
        if (doDecide == true) {
            List<Quote> decideQuote = new List<Quote>();
            //不能决定多个报价,戴宇
            decideQuote=[SELECT id FROM Quote WHERE OpportunityId = :opp.Id AND Is_Decided__c = true];
            if(decideQuote.size() > 0){
                errorflg = true;
                errorMessage = '已存在决定的报价,不能决定新的报价';
                return false;
            }
            q.Is_Decided__c = true;
            if(opp.Account.MarketVerticals__c == 'Clinical'&&opp.Trade_Type_D__c == 'Taxation'){
                if(opp.Dealer__r.DummyDealer__c == true){
                    String backStr = LicenseCheckUtil.LicenseCheck(opp.AccountId);
                    system.debug('DummyDealer__c ' + backStr);
                    if(backStr != '1'){
                        errorflg = true;
                        errorMessage = backStr + ',不能决定报价。';
                        return false;
                    }
                }else{
                    String backStr = LicenseCheckUtil.LicenseCheck(opp.Dealer__r.ParentID);
                    system.debug('Parent' + backStr);
                    if(backStr != '1'){
                        errorflg = true;
                        errorMessage = backStr + ',不能决定报价。';
                        return false;
                    }
                }
            }
        }else{
             if(opp.Account.MarketVerticals__c == 'Clinical'&&opp.Trade_Type_D__c == 'Taxation'){
                if(opp.Dealer__r.DummyDealer__c == true){
                    String backStr = LicenseCheckUtil.LicenseCheck(opp.AccountId);
                    system.debug('DummyDealer__c' + backStr);
                    if(backStr != '1'){
                        errorMessage = backStr;
                        specialerrorflg = true;
                    }
                }else{
                    String backStr = LicenseCheckUtil.LicenseCheck(opp.Dealer__r.ParentID);
                    system.debug('Parent' + backStr);
                    if(backStr != '1'){
                        errorMessage = backStr;
                        specialerrorflg = true;
                    }
                }
            }
        }
        String quoId1 = '';
        if (quoId==null) {
            insert q;
            quoId1 = q.Id;
            printFlg = true;
        } else {
            update q;
            quoId1 = q.Id;
        }
        List<QuoteLineItem> qlist = New List<QuoteLineItem>();
        qlist=[Select Id From QuoteLineItem Where QuoteId =:quoId1];
        if (qlist.size()>0) {
            delete qlist;
        }
        qlist = New List<QuoteLineItem>();
        List<QuoteLineItem> singleProductList = new List<QuoteLineItem>();
        Integer i=1;
        if (activities.size()>0) {
            Decimal all_price = 0.0;
            Decimal all_discount = 0.0;
            for (QELine s:activities) {
                if (is_hidden_all || is_hidden_user == true || is_dealer_user == true && s.hiddenflg == true) {
                    if (s.pageObject.PricebookEntryId != null &&  s.productName != null && s.productName != '') {
                        if (String.isBlank(s.pageObject.PricebookEntryId) == false) {
                            String setName = s.pageObject.Set__c;
                            Integer qty = 1 ;
                            //XHL-20190426-UpdateStart
                            if (!s.pageObject.SingleProduct__c ){
                                String fieldName = setName.substring(3);
                                fieldName = fieldName.indexOf('0') == 0 ? fieldName.substring(1) : fieldName;
                                Decimal d_qty = (Decimal) quo.get('SetQty' + fieldName + '__c');
                                // qty = d_qty == null ? 1 : d_qty.intValue();
                            }
                            //XHL-20190426-UpdateEnd
                            all_price += s.salesPrice * s.pageObject.Quantity * qty;
                        }
                    }
                }
                if (quo.OrderIsChange__c) {
                    String productCode = s.pageObject.Product2.ProductCode;
                    if (String.isNotBlank(productCode)) {
                        saveStringConcatenation += productCode + '|' +s.pageObject.Quantity;
                    }
                }
            }
      PageObject.Name__c = oli.PricebookEntry.Product2.Name;
            if (all_price > 0) {
                system.debug('all_price---->'+all_price);
                all_discount = (all_price - quo.Total_Price_Text__c) * 100 / all_price;
                system.debug('all_discount---->'+all_discount);
            }
      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;
      }
            if (quo.OrderIsChange__c) {
                if (initStringConcatenation != saveStringConcatenation) {
                    verifyProductValidFlag = true;
                }
            }
      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;
            // 产品首营状态Z5(停产) ---XHL 2021/02/07 Start
            Map<String,Decimal> productIdQuantityMap = new  Map<String,Decimal>();
            List<String> productIdList = new List<String>();
            String productSegmentZ5 = opp.ProductSegment__c == 'BS' ? 'LS':opp.ProductSegment__c;
            // String productSegment = opp.ProductSegment__c == 'BS' ? 'LS':opp.ProductSegment__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;
            String FGSPStr = 'Machine'.equals(opp.Machine_Parts__c) ? 'FG':'SP';
            // 产品首营状态Z5(停产) ---XHL 2021/02/07 End
            for (QELine s:activities) {
                if (s.pageObject.PricebookEntryId != null &&  s.productName != null && s.productName != '') {
                    if (String.isBlank(s.pageObject.PricebookEntryId) == false) {
                        String setName = s.pageObject.Set__c;
                        Integer qty = 1;
                        //XHL-20190426-UpdateStart
                        if (!s.pageObject.SingleProduct__c && String.isNotBlank(setName)){
                            String fieldName = setName.substring(3);
                            fieldName = fieldName.indexOf('0') == 0 ? fieldName.substring(1) : fieldName;
                            Decimal d_qty = (Decimal) quo.get('SetQty' + fieldName + '__c');
                            qty = d_qty == null ? 1 : d_qty.intValue();
                        }
                        //XHL-20190426-UpdateEnd
                        QuoteLineItem ql = s.pageObject.clone();
                        ql.QuoteId = q.Id;
                        ql.Quantity = ql.Quantity ;
                        if (is_hidden_all || is_hidden_user == true || is_dealer_user == true && s.hiddenflg == true) {
                            ql.UnitPrice = s.salesPrice;
                            ql.Discount = all_discount;
                            if (s.customPrice != 0) {
                                ql.Custom_Price__c = s.customPrice;
                            }
                        }
                        ql.Custom_Price__c = ql.Custom_Price__c == null ? 0 : ql.Custom_Price__c;// * qty;
                        ql.quoLiVerifyProductValid__c = verifyProductValidFlag;
                        if (s.pageObject.SingleProduct__c) {
                            singleProductList.add(ql);
                        } else {
                            qlist.add(ql);
                        }
                        productIdList.add(s.pageObject.Product2Id);
                        // 产品首营状态Z5(停产) ---XHL 2021/02/07 Start
                        Decimal quantity = ql.Quantity;
                        if (productIdQuantityMap.containsKey(s.pageObject.Product2Id)) {
                            quantity += productIdQuantityMap.get(s.pageObject.Product2Id);
                        }
                        productIdQuantityMap.put(s.pageObject.Product2Id,quantity);
                        // 产品首营状态Z5(停产) ---XHL 2021/02/07 End
                        i++;
                    }
                }
            }
            if (productIdList.size() > 0) {
                // 产品首营状态Z5(停产) ---XHL 2021/02/07 Start
                Map<String,Decimal> productQuantityMap = new  Map<String,Decimal>();
                List<Product2> getProductList = [SELECT Id,Name,ProductCode,NMPAStatus__c,ProductStatusFormula__c FROM Product2 WHERE Id IN:productIdList AND NMPAStatus__c = '停产' AND ProductStatusFormula__c = '1'];
                for (Product2 pro:getProductList) {
                    Decimal productQuantity = productIdQuantityMap.get(pro.Id);
                    String key = pro.ProductCode +'_'+ productSegmentZ5 +'_'+ FGSPStr;
                    // String key = pro.ProductCode +'_'+ productSegment +'_'+ FGSPStr;
                    productQuantityMap.put(key, productQuantity);
                }
                if (productQuantityMap.size() > 0) {
                    String result = OrderWebService.ProductInventoryCheck(productQuantityMap);
                    if (result != '1') {
                        if (String.isBlank(errorMessage)) {
                            errorMessage = '注意!!! '+ result;
                        } else {
                            errorMessage += result;
                        }
                    }
                }
                // 产品首营状态Z5(停产) ---XHL 2021/02/07 End
            }
            if (singleProductList.size() >0 ){
                insert singleProductList;
            }
            if (qlist.size()>0) {
                insert qlist;
            }
            Quote quoUpd = [select id, Discount, Discount_Normal__c, Discount_Special__c,OrderIsChange__c from Quote where Id = : quoId1];
            Decimal quoDis = quoUpd.Discount == null ? 0 : quoUpd.Discount;
            Decimal quoDisN = quoUpd.Discount_Normal__c == null ? 0 : quoUpd.Discount_Normal__c;
            if (productSegment == 'BS') {
                system.debug('quoDis---->'+quoDis);
                system.debug('quoDisN---->'+quoDisN);
                quoUpd.Discount_Special__c = quoDis - quoDisN;
                system.debug('quoUpd.Discount_Special__c---->'+quoUpd.Discount_Special__c);
            } else {
                quoUpd.Discount_Special__c = (quoDis - quoDisN) / (1 - quoDisN / 100);
            }
            quoUpd.QuoVerifyProductValid__c = verifyProductValidFlag;
            update quoUpd;
            List<QuoteLineItem> itemsRe =
                [Select Id,Product2Id,Product2.Name,Product2.ProductCode,Product2.Product_ECCode__c,Quantity,Subtotal,Discount,TotalPrice,PricebookEntryId,UnitPrice,Description,Set__c,Custom_Price__c,
                        PricebookEntry.SalesPrice__c,PricebookEntry.SalesPriceA__c,PricebookEntry.SalesPriceB__c,PricebookEntry.SalesPriceC__c,Product2.ProductModels__c,PricebookEntry.Hidden_flag__c,
                        Quote.Discount_Normal__c,SingleProduct__c,SetName__c,DontSingleProduct__c,
                        Quote.Opportunity.DealerId__c
                   From QuoteLineItem where Quoteid = :quoId1 Order by Id];
            activities = new List<QELine>();
            i=0;
            QELine c = new QELine(i);
            String includeEspecialProduct = '';
            is_hidden_all = false;
            if (itemsRe.size()>0) {
                for (QuoteLineItem o:itemsRe) {
                    if (o.DontSingleProduct__c != '1') {
                        if (String.isBlank(includeEspecialProduct)) {
                            includeEspecialProduct = o.DontSingleProduct__c;
                        } else {
                            includeEspecialProduct += ',' + o.DontSingleProduct__c;
                        }
                        specialerrorflg = true;
                    }
                    String setName = o.Set__c;
                    Integer qty = 1;
                    //XHL-20190426-UpdateStart
                    if (!o.SingleProduct__c && String.isNotBlank(setName)) {
                        String fieldName = setName.substring(3);
                        fieldName = fieldName.indexOf('0') == 0 ? fieldName.substring(1) : fieldName;
                        Decimal d_qty = (Decimal) quo.get('SetQty' + fieldName + '__c');
                        qty = d_qty == null ? 1 : d_qty.intValue();
                    }
                    //XHL-20190426-UpdateEnd
                    c = new QELine(isService, o,i,o.Product2.Name,o.Product2.ProductCode,o.Product2.Product_ECCode__c,qty,o.Product2.ProductModels__c,o.SingleProduct__c,o.SetName__c);
                    //c = new QELine(isService, o,i,o.Product2.Name,o.Product2.ProductCode,o.Product2.Product_ECCode__c,qty,o.Product2.ProductModels__c,quo.Discount_Normal__c);
                    //specialDealer =  StaticParameter.specialDealerMap.containsKey(o.Quote.Opportunity.DealerId__c);
                    specialDealer = IfspecialDealer(o.Quote.Opportunity.DealerId__c);
                    //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '请选择目标客户----3>'+o.Quote.Opportunity.DealerId__c));
                    if (specialDealer || is_hidden_user == true || is_dealer_user == true && c.hiddenflg == true) {
                        c.pageObject.UnitPrice = 0;
                        c.totalPrice = 0;
                        c.customPrice = 0;
                        system.debug('<---is_hidden_all---01>' + is_hidden_all);
                        is_hidden_all = true;
                        discount = 0;
                    }
                    activities.add(c);
                    i++;
                }
            }
            if (String.isNotBlank(includeEspecialProduct) && specialerrorflg) {
                if(!StaticParameter.specialDealerMap1.containsKey(opp.DealerId__c)) {
                    errormessage += '注意!!! 报价产品中包含特殊的单品产品[ ' +includeEspecialProduct+ ' ]';
                }
                //system.debug('errormessage__20190523__' + errormessage);
            }
            for (integer j=i;j<quoteEntryMaxLine;j++) {
                c = new QELine(j);
                activities.add(c);
            }
        }
        if (quo.OrderIsChange__c) {
            if (initStringConcatenation != saveStringConcatenation) {
                verifyProductValidFlag = true;
            }
        }
        List<Quote> quoListRe =
                [ SELECT Id,Name,QuoteNumber,Account.name,ExpirationDate,Subtotal,Discount,TotalPrice,GrandTotal,PrintPrice__c,ShippingHandling,
                    DeliveryLeadTime__c,PaymentTerms__c,ValidDate__c,Warranty__c,SetName1__c,Shipment_Term__c,Shipment_Term2__c,
                    SetName2__c,SetName3__c,SetName4__c,SetName5__c,SetName6__c,SetName7__c,SetName8__c,SetName9__c,SetName10__c,
                    SetName11__c,SetName12__c,SetName13__c,SetName14__c,SetName15__c,SetName16__c,SetName17__c,SetName18__c,SetName19__c,
                    SetName20__c,SetName21__c,SetName22__c,SetName23__c,SetName24__c,SetName25__c,SetName26__c,SetName27__c,SetName28__c,SetName29__c,
                    SetName30__c,SetQty1__c,SetQty2__c,SetQty3__c,SetQty4__c,SetQty5__c,SetQty6__c,SetQty7__c,SetQty8__c,SetQty9__c,SetQty10__c,SetQty11__c,
                    SetQty12__c,SetQty13__c,SetQty14__c,SetQty15__c,SetQty16__c,SetQty17__c,SetQty18__c,SetQty19__c,SetQty20__c,SetQty21__c,SetQty22__c,SetQty23__c,
                    SetQty24__c,SetQty25__c,SetQty26__c,SetQty27__c,SetQty28__c,SetQty29__c,SetQty30__c,Comment__c,Custom_Price_Total__c,Custom_Price_Total_Text__c,Quote_Type__c,
                    Main_Model__c,Main_Serial_Number__c,Service_Type__c,Contract_Number__c,Service_Date__c,Service_Finish_Date__c,Service_Engineer_Sign__c,
                    Service_Pickup_Sign__c,Service_Check_Sign__c,Service_Location__c,Service_Status__c,Service_Content__c, Is_upload__c, Total_Price_Text__c,
                    Discount_Normal__c,Discount_Special__c,OrderIsChange__c
                    FROM Quote Where Id =:quoId1];
        if (quoListRe.size() > 0) {
            quo = quoListRe[0];
        }
system.debug('=====is_hidden_all:' + is_hidden_all);
        if (is_hidden_all) {
            discount = quo.totalPrice.setScale(2, System.RoundingMode.HALF_UP);
        } else {
            discount = quo.Discount == null ? 0 : quo.Discount;
            //discount = quo.Discount_Special__c == null ? 0 : quo.Discount_Special__c;
            discount = discount.setScale(2, System.RoundingMode.HALF_UP);
        }
system.debug('○○○○○○○○○○○○Welcome Opportunity class!!○○○○○○○○○○○○');
        //Opportunity--------------------------------------------
        Opportunity o = New Opportunity();
        List<Opportunity> os = New List<Opportunity>();
        os = [select Id From Opportunity Where Id =:oppid];
        if (os.size()>0) {
            o = os[0];
            if (decideFlg == false) {
                o.SyncedQuoteId = quoId1;
                o.Quote_PaymentTerms_Text__c = paymentTermsMap.get(quo.PaymentTerms__c);
                o.is_hidden__c = is_hidden_all || specialDealer;
                if (doDecide == true) {
                    o.Is_Decided__c = true;
                    o.Quote_Decide_User__c = UserInfo.getUserId();
                }
                o.IE_Discount_Normal__c = quo.Discount_Normal__c;
                o.IE_Discount_Special__c = quo.Discount_Special__c;
                system.debug('IE_Discount_Special__c--->'+o.IE_Discount_Special__c);
                update o;
            }
        }
if (quoId == null) {
    quoId = quoId1;//q.Id;
}
        return true;
    }
    //oppに画面の値を設定
    private void setOppFromOppInfo() {
    }
    public PageReference csvExport() {
        if (fileName == null || fileName == '') {
            errorflg = true;
            errormessage = '请输入配置导出文件名。';
            return null;
        }
        Date dExpirationDate = quo.ExpirationDate;
        strExpirationDate = dExpirationDate == null ? '' : dExpirationDate.format();
        csv_activities = new List<QELine>();
        for (QELine s : activities) {
            if (s.pageObject.PricebookEntryId != null &&  s.productName != null && s.productName != '') {
                csv_activities.add(s);
            }
        }
        PageReference pr = page.QuoteCSVExport;
        return pr;
    }
    public PageReference csvRead() {
        String strFile = '';
        List<String> listFile = new List<String>();
        errorflg = false;
        errormessage = null;
try {
        if (contentFile != null) {
            strFile = contentFile.toString();
            listFile = strFile.split('\n');
system.debug('=====strFile:' + strFile);
        } else {
            errorflg = true;
            errormessage = '读取内容为空。';
            return null;
        }
} catch (Exception ex) {
    errorflg = true;
    errormessage = System.Label.Error_Message02;
    return null;
}
for (Integer i = 0; i < listFile.size(); i++) {
    system.debug('=====listFile_' + i + ':' + listFile[i]);
}
        List<String[]> arrayFile = new List<String[]>();
        String firstline = listFile[0];
        if (firstline.indexOf('套装/单品') < 0) {
            errorflg = true;
            errormessage = '读取内容格式不正确。';
            return null;
        } else {
            String strReplace = '';
            List<String> temp = strFile.split('"');
            for (Integer i = 0; i < temp.size(); i++) {
                if (math.mod(i, 2) == 1) {
                    temp[i] = temp[i].replace(',', '#%&');
                }
                strReplace += temp[i];
            }
system.debug('=====strReplace:' + strReplace);
            List<String> listReplace = strReplace.split('\n');
            for (String replace : listReplace) {
system.debug('=====replace:' + replace);
                if (replace != '\r' && replace.length() > 0) {
                    replace = replace.replace('\r', '');
                    String[] a = replace.split(',', -1);
                    for (Integer i = 0; i < a.size(); i++) {
                        if (a[i].indexOf('#%&') > 0) {
                            a[i] = a[i].replace('#%&', ',');
                        }
                    }
                    if (specialDealer) {
                        if (a.size() != 4) {
                            errorflg = true;
                            errormessage = '读取内容格式不正确。Line:' + arrayFile.size();
                            return null;
                        }
                    }  else {
                        if (a.size() != 5) {
                            errorflg = true;
                            errormessage = '读取内容格式不正确。Line:' + arrayFile.size();
                            return null;
                        }
                    }
                    //if (a.size() != 5) {
                    //    errorflg = true;
                    //    errormessage = '读取内容格式不正确。Line:' + arrayFile.size();
                    //    return null;
                    //}
                    arrayFile.add(a);
                }
            }
        }
        List<String> prdCodeList = new List<String>();
        //XHL-20190426-UpdateStart
        Map<String,String> productSetCodeMap = new Map<String,String>();
        for (Integer i = 1; i < arrayFile.size(); i++) {
            if (arrayFile[i] != null && arrayFile[i].size() > 1 && arrayFile[i][0] != '') {
                try {
                    if (String.isNotBlank(arrayFile[i][3])) {
                        Decimal quantity1 = Decimal.valueOf(arrayFile[i][3]);
                    }
                    if (!specialDealer) {
                        if (String.isNotBlank(arrayFile[i][4])) {
                            Decimal discount1 = Decimal.valueOf(arrayFile[i][4]);
                        }
                    }
                } catch (Exception e) {
                    errorflg = true;
                    if (arrayFile[i][0] != singleProduct ) {
                        errorMap.put(arrayFile[i][1],'[' + arrayFile[i][1] +']配套的数量或折扣存在非数字,请确认;');
                    } else {
                        errorMap.put(arrayFile[i][1],'[' + arrayFile[i][1] +']产品的数量或折扣存在非数字,请确认;');
                    }
                    continue;
                }
                if (arrayFile[i][0] != singleProduct ) {
                    productSetCodeMap.put(arrayFile[i][1], arrayFile[i][3] + ';'+arrayFile[i][4]);
                } else {
                    String tmp = '00000000000' + arrayFile[i][1];
                    prdCodeList.add(tmp);
                    prdCodeList.add(arrayFile[i][1]);
                }
            }
        }
        activities = new List<QELine>();
        Integer no =0;
        emptyData();
        if (productSetCodeMap.size() > 0) {
            acquireProductSetId(productSetCodeMap);
            no =  singleNo == null ? 0 : singleNo;
        }
        //XHL-20190426-UpdateEnd
        
        // 维修合同报价
        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;
system.debug('=====prdCodeList:' + prdCodeList);
        //return null;
        Map<String, Product_Search__c> psMap = new Map<String, Product_Search__c>(); // keyがProductCodeです。
        List<String> forSelect = new List<String>();
        List<Product_Search__c> psList = [
            select Id, Name, ProductCode__c, Product_ECCode__c, ProductDescription__c, ProductStatus__c, Product__c, ProductModels1__c
              from Product_Search__c
             where ProductCode__c in :prdCodeList];
        String errProduct = '';
        Map<String,String> errProductMap = new Map<String,String>();
        for (Product_Search__c ps : psList) {
            String pc = ps.ProductCode__c;
            if (pc.startsWith('00000000000')) {
                pc = pc.substring(11);
                psMap.put(pc, ps);
            }
      //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;
            psMap.put(ps.ProductCode__c, ps);
            forSelect.add(ps.Product__c);
            //system.debug(ps.ProductCode__c + ps.ProductStatus__c+'@@@@@@@->>>');
            if(ps.ProductStatus__c == '0'){
                system.debug(ps.ProductCode__c + ps.ProductStatus__c+'@@@@@@@');
                errorflg = true;
                errProduct += ps.ProductCode__c + ',';
                errProductMap.put(ps.ProductCode__c,ps.ProductCode__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;
        if (errorflg == true && errProduct != '') {
            errProduct = errProduct.substring(0, errProduct.length() - 1);
            errorMessage = '产品状态为无效,不能使用。产品:' + errProduct + '请确认;';
            errorMap.put(errorMessage,errorMessage);
            //return null;
        }
        system.debug('errorflg---->11111'+errorMessage);
        Map<String, PricebookEntry> pbeMap = new Map<String, PricebookEntry>(); // keyがProductCodeです。
        List<PricebookEntry> pbeList = [
            select Id, Product2Id, ProductCode, Product2.Product_ECCode__c, Product2.Dummy__c, CostPrice__c, SalesPrice__c, SalesPriceA__c, SalesPriceB__c, SalesPriceC__c, Hidden_flag__c
              from PricebookEntry
             where Pricebook2Id = :pricebook2Id
               and CurrencyIsoCode = :currencyIsoCode
               and Product2.ManualHidden__c = false
               and Product2Id in :forSelect];
        system.debug('forSelect_1_1_1_1_1_' + forSelect);
        system.debug('pbeList_2_2_2_2_2_2_2_' + pbeList);
        for (PricebookEntry pbe : pbeList) {
            String pc = pbe.ProductCode;
            if ((pbe.CostPrice__c == 0 && pbe.Product2.Dummy__c == false) || pbe.SalesPrice__c == 0) {
                errorflg = true;
                errProduct += pbe.productCode + ',';
            } else {
                if (pc.startsWith('00000000000')) {
                    pc = pc.substring(11);
                    pbeMap.put(pc, pbe);
                }
                pbeMap.put(pbe.ProductCode, pbe);
            }
        }
        if (arrayFile.size() > 1) {
            //XHL-20190426-UpdateStart
            for (Integer line = 1; line < arrayFile.size(); line++) {
                if (arrayFile[line][0] == singleProduct) {
                    Product_Search__c ps = psMap.get(arrayFile[line][1]);
                    PricebookEntry pbe = pbeMap.get(arrayFile[line][1]);
                    if (ps == null || pbe == null) {
                        errorflg = true;
                        errProduct += arrayFile[line][1] + ',';
                        errorMap.put(arrayFile[line][2],errProduct);
                    }
                }
            }
            if (errorflg) {
                system.debug('errorflg---->22222'+errorMessage);
                errorMessage = '';
                String intermediateVariable = '';
                for (String errorKey :errorMap.keySet()) {
                    errProduct = errorMap.get(errorKey).substring(0, errorMap.get(errorKey).length()-1);
                    system.debug('ceshi------>' + errProduct);
                    if (errProduct.endsWith('!!!')) {
                        errorMessage += errorMap.get(errorKey);
                    } else if(errProduct.startsWith('error')){
                        errorMessage += errorMap.get(errorKey);
                    }else if(errProduct.endsWith('请确认')){
                        errorMessage += errorMap.get(errorKey);
                    }else {
                        if (String.isBlank(intermediateVariable)) {
                            intermediateVariable = errorKey;
                        } else {
                            intermediateVariable += ',' + errorKey;
                        }
                    }
                }
                if (String.isNotBlank(intermediateVariable)) {
                    errorMessage += '[' + intermediateVariable + ']的产品价格信息不正确,不能使用;';
                }
                //return null ;
            }
            QELine c = new QELine(no);
            is_hidden_all = false;
            boolean isSingleProduct = false;
            for (Integer line = 1; line < arrayFile.size(); line++) {
                if (arrayFile[line][0] == singleProduct ){
                    if (errorMap.containsKey(arrayFile[line][2])) {
                        continue;
                    }
                    isSingleProduct = true;
                    Product_Search__c ps = psMap.get(arrayFile[line][1]);
                    PricebookEntry pbe = pbeMap.get(arrayFile[line][1]);
                    system.debug('=====key:' + arrayFile[line][1]);
                    system.debug('=====ps:' + ps);
                    system.debug('=====pbe:' + pbe);
                    system.debug('ps.ProductCode__c--->'+ps.ProductCode__c );
                    system.debug('ps.Product__c--->'+ps.Product__c);
                    //c = new QELine(isService, no, arrayFile[line][0], ps.Name, ps.ProductCode__c, ps.Product_ECCode__c, ps.Product__c, pbe, arrayFile[line][3], arrayFile[line][4], ps.ProductModels1__c, quo.Discount_Normal__c);
                    if (errProductMap != null && errProductMap.size() > 0) {
                        if (errProductMap.containsKey(arrayFile[line][1])) {
                            continue;
                        }
                    }
                    if (specialDealer) {
                        c = new QELine(isService, no, singleProduct, ps.Name, ps.ProductCode__c, ps.Product_ECCode__c, ps.Product__c, pbe, arrayFile[line][3],'', ps.ProductModels1__c, isSingleProduct, ps.ProductDescription__c, '');
                    } else {
                        c = new QELine(isService, no, singleProduct, ps.Name, ps.ProductCode__c, ps.Product_ECCode__c, ps.Product__c, pbe, arrayFile[line][3], arrayFile[line][4], ps.ProductModels1__c, isSingleProduct, ps.ProductDescription__c, '');
                    }
                    //c = new QELine(isService, no, singleProduct, ps.Name, ps.ProductCode__c, ps.Product_ECCode__c, ps.Product__c, pbe, arrayFile[line][3], arrayFile[line][4], ps.ProductModels1__c,isSingleProduct,ps.ProductDescription__c,'');
                    if (specialDealer || is_hidden_user == true || is_dealer_user == true && c.hiddenflg == true) {
                        c.pageObject.UnitPrice = 0;
                        c.totalPrice = 0;
                        system.debug('<---is_hidden_all--->02' + is_hidden_all);
                        is_hidden_all = true;
                        discount = 0;
                    }
                    activities.add(c);
                    no++;
                }
            }
            //XHL-20190426-UpdateEnd
            for (integer j = no; j < quoteEntryMaxLine; j++) {
                c = new QELine(j);
                activities.add(c);
            }
        } else {
            for (no = 0; no < quoteEntryMaxLine; no++) {
                QELine active_activity = new QELine(no);
                activities.add(active_activity);
            }
        }
        system.debug('quoName: '+quo.Name);
        return null;
    }
    // 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;
    public boolean dataCheck() {
        system.debug('○○○○○○○○○○○○Welcome to dataCheck class!!○○○○○○○○○○○○');
        errorflg = false;
        errormessage = null;
        Boolean error = false;
        List<String> product2Ids = New List<String>();
        Map<String,String> mapSet = new Map<String,String> ();
        Map<Id, Product_Search__c> prd2LatestValMap = new Map<Id, Product_Search__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);
        //报价优化 2021-05-08 start
        String shter = quo.Shipment_Term__c;
        if(String.isBlank(shter) && opp.Trade_Type_D__c =='Tax Exemption'){
            errorflg = true;
            errorMessage = '国际贸易条件不能为空!';
            return false;
        }
        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;
        String shter2 = quo.Shipment_Term2__c;
        if(String.isBlank(shter2) && opp.Trade_Type_D__c =='Tax Exemption'){
            errorflg = true;
            errorMessage = '国际贸易条件2不能为空!';
            return false;
        }
      //不可取消多年保
      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;
        //报价优化 2021-05-08 end
      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
        String qname = quo.Name;
        if (qname == null || qname.trim().length() == 0) {
            errorflg = true;
            errorMessage = '请输入报价名称!';
            return false;
        }
        String qpaymentTerms = quo.PaymentTerms__c;
        if (qpaymentTerms == null || qpaymentTerms.trim().length() == 0) {
            errorflg = true;
            errorMessage = '请输入付款条件!';
            return false;
        }
        Decimal qdeliveryLeadTime = quo.DeliveryLeadTime__c;
        if (qdeliveryLeadTime == null || qdeliveryLeadTime <= 0) {
            errorflg = true;
            errorMessage = '请输入交货周期!';
            return false;
        }
        Decimal qwarranty = quo.Warranty__c;
        if (qwarranty == null || qwarranty <= 0) {
            errorflg = true;
            errorMessage = '请输入保修期!';
            return false;
        }
        Date qexpirationDate = quo.ExpirationDate;
        if (qexpirationDate == null) {
            errorflg = true;
            errorMessage = '请输入报价到期日期!';
            return false;
        }
        Decimal qcustomPriceTotal = quo.Custom_Price_Total_Text__c;
        if (qcustomPriceTotal == null || qcustomPriceTotal == 0) {
            errorflg = true;
            errorMessage = '请输入客户总价';
            return false;
        }
        if (is_hidden_all) {
            quo.Total_Price_Text__c = discount;
            system.debug('discount----->123'+discount);
        }
system.debug('=====quo.Total_Price_Text__c:' + quo.Total_Price_Text__c);
        if (is_hidden_all && (quo.Total_Price_Text__c == null || quo.Total_Price_Text__c <= 0)) {
            errorflg = true;
            errorMessage = '总价不正确,请确认!';
            return false;
        }
        if (activities.size()>0) {
            for (QELine a:activities){
                if (String.isBlank(a.pageObject.Product2Id) == false) {
                    product2Ids.add(a.pageObject.Product2Id);
                }
                String tmpSet = a.pageObject.Set__c;
                if (tmpSet != null && tmpSet != '') {
                    String tmpSetId = tmpSet.substring(2);
                    if (!mapSet.containsKey(tmpSetId)) {
                        mapSet.put(tmpSetId,tmpSet);
                    }
                }
            }
            Map<String,String> mapHeaderSet = new Map<String,String> ();
            Map<String,Decimal> mapHeaderQty = new Map<String,Decimal> ();
            for (Integer i = 1; i <= 30; i++) {
                String field = String.valueOf(i);
                field = '00' + field;
                field = field.substring(field.length() - 2);
                mapHeaderSet.put('set' + field, (String) quo.get('SetName' + i + '__c'));
                mapHeaderQty.put('set' + field, (Decimal) quo.get('SetQty' + i + '__c'));
            }
            system.debug('mapSet class========>' + mapSet);
            system.debug('mapSet class========>' + mapSet.size());
            system.debug('mapHeaderSet class========>' + mapHeaderSet);
            system.debug('mapHeaderQty class========>' + mapHeaderQty);
            Map<String,String> mapErrSet = new Map<String,String> ();
      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;
        }
        if (error==true) {
            errorflg = true;
            return false;
        }
        errorflg = false;
        errorMessage = null;
        return true;
    }
    // 多年保修 end
  }
  @TestVisible private void testI() {
    integer i = 0;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
    i++;
  }
    public PageReference reloadPage() {
        if (is_hidden_all) {
            discount = 0;
        } else {
            discount = quo.Discount == null ? 0 : quo.Discount;
            discount = discount.setScale(2, System.RoundingMode.HALF_UP);
        }
        return null;
    }
    //导入数据时,根据产品配套的Code查找产品配套
    public void acquireProductSetId(Map<String,String> productSetCodeMap) {
        errorflg = false;
        errormessage = null;
        system.debug('<---productSetCodeMap--->' + productSetCodeMap );
        Map<String,Integer> productSetID_QuantityMap = new Map<String,Integer>();
        List<productSet__c> productSetList;  //= new List<productSet__c>();
        Map<String,String> codeMap = new Map<String,String>();
        if (productSetCodeMap.size() > 0 ) {
            productSetList = [select Id,Name,Code__c from productSet__c where Code__c in: productSetCodeMap.keyset()];
        }
        system.debug('<---productSetList--->' + productSetList.size() );
        if (productSetList.size() > 0) {
            for (productSet__c productSet :productSetList) {
                codeMap.put(productSet.Code__c, productSet.Code__c);
                Integer quantity = Integer.valueOf(productSetCodeMap.get(productSet.Code__c).split(';')[0]);
                productSetID_QuantityMap.put(productSet.Id,quantity);
            }
            queSetNameSetQty(productSetID_QuantityMap,productSetCodeMap);
        } else {
            for (String keyset : productSetCodeMap.keyset()) {
                errorflg = true;
                errorMap.put(keyset,'[' + keyset +']配套不存在,请确认!!!!;');
            }
        }
        String errorInformation = '';
        for (String keyset : productSetCodeMap.keyset()) {
            if (!codeMap.containsKey(keyset)) {
                errorMap.put(keyset,'[' + keyset +']配套不存在,请确认!!!!;');
            }
        }
    }
    //选择产品配套
    public PageReference setProductEntry () {
        errorflg = false;
        errormessage = null;
        Map<String,Integer> productSetID_QuantityMap = new Map<String,Integer>();
        Map<String,String> productSetID_DiscountMap = new Map<String,String>();
        //当setProduct_text为空时,认为删除该报价所有的产品配套
        if (String.isBlank(setProduct_text)) {
            List<QELine> singleProductSuitList = new List<QELine>();
            for (QELine q :activities) {
                if ( String.isBlank(q.pageObject.Product2Id) == false && q.pageObject.SingleProduct__c  == true) {
                    singleProductSuitList.add(q);
                }
            }
            activities = new List<QELine>();
            emptyData();
            //将单品套装放在产品配套套装的下面
            Integer singleNo = 0;
            QELine qeline = new QELine(singleNo);
            for (QELine q :singleProductSuitList) {
                q.lineNo = singleNo;
                activities.add(q);
                singleNo++;
            }
            for (integer j = singleNo; j < quoteEntryMaxLine; j++) {
                qeline = new QELine(j);
                activities.add(qeline);
            }
            return null;
        } else {
            List<String> productSetIdList = new List<String>();
            Map<String,String> productSetMap = new Map<String,String>();
            for (String str : setProduct_text.split(';')) {
                productSetIdList.add(str.split(',')[0]);
            }
            if (productSetIdList.size() > 0) {
                for (productSet__c proSet  :[select Id,Name,Code__c from productSet__c where Id in :productSetIdList]) {
                    productSetMap.put(proSet.Id, proSet.Code__c);
                }
            }
            for (String str : setProduct_text.split(';')) {
                if (String.isBlank(str.split(',')[1]) == false) {
                    productSetID_QuantityMap.put(str.split(',')[0], Integer.valueOf(str.split(',')[1]));
                    productSetID_DiscountMap.put(productSetMap.get(str.split(',')[0]), str.split(',')[1]+';'+str.split(',')[2]);
                    system.debug('productSetID_DiscountMap____' + productSetID_DiscountMap);
                }
            }
        }
       //queSetNameSetQty(productSetID_QuantityMap,null);
       queSetNameSetQty(productSetID_QuantityMap,productSetID_DiscountMap);
        for (integer j = singleNo; j < quoteEntryMaxLine; j++) {
            QELine qeline = new QELine(j);
            activities.add(qeline);
        }
        return null;
    }
    public class QELine {
        public Integer lineNo { get; set; }
        public String productName { get; set; }
        public String productCode { get; set; }
        public String productEC { get; set; }
        public QuoteLineItem pageObject { get; set; }
        public String setName { get; set; }
        public String productSetNameReference { get; set; }
        public Double totalPrice { get; set; }
        public Decimal salesPrice { get; set; }
        public Decimal salesPriceA { get; set; }
        public Decimal salesPriceB { get; set; }
        public Decimal salesPriceC { get; set; }
        public boolean isProductModel { get; set; }
        public boolean hiddenflg { get; set; }
        public Decimal customPrice { get; set; }
        //public Decimal discount { get; set; }
        private Map<String, String> setNameMap;
        private void setMap() {
            Integer quoteEntryMaxSet = Integer.valueOf(System.Label.QuoteEntryMaxSet);
            String singleProduct  = System.Label.SingleProduct;
            setNameMap = new Map<String, String>();
            for (Integer i = 0; i < quoteEntryMaxSet; i++) {
                if (i < 9) {
                    setNameMap.put('set0'+ String.valueOf(i+1),'套装0'+ String.valueOf(i+1));
                } else {
                    setNameMap.put('set'+ String.valueOf(i+1),'套装'+ String.valueOf(i+1));
                }
            }
            setNameMap.put(singleProduct,singleProduct);
        }
        private void setMap2() {
            setNameMap = new Map<String, String>();
            setNameMap.put('set01','零件费用');
            setNameMap.put('set02','服务费');
            setNameMap.put('set03','其他费用');
        }
        public QELine(Integer i) {
            this.pageObject = New QuoteLineItem();
            this.lineNo = i;
            this.totalPrice = 0;
            this.salesPrice = 0;
            this.salesPriceA = 0;
            this.salesPriceB = 0;
            this.salesPriceC = 0;
            this.isProductModel = true;
            this.hiddenflg = false;
        }
        //public QELine(boolean isService, QuoteLineItem tmp, Integer i, String pdtName, String pdtCode, String pdtEC, Integer sQty, boolean ispm, Decimal discount_n) {
        //XHL-20190428-Update isSingleProduct,在报价行项目上增加SingleProduct__c字段,区分是套装还是单品
        public QELine(boolean isService, QuoteLineItem tmp, Integer i, String pdtName, String pdtCode, String pdtEC, Integer sQty, boolean ispm, boolean isSingleProduct,String productSetName) {
            //system.debug('1234567_____');
            this.pageObject = tmp;
            //this.pageObject.Quantity = tmp.quantity / sQty;
            this.pageObject.Quantity = tmp.quantity ;
            this.pageObject.Custom_Price__c = tmp.Custom_Price__c == null ? 0 : tmp.Custom_Price__c;// / sQty;
            this.pageObject.SetName__c = productSetName;
            //this.totalPrice = tmp.TotalPrice / sQty;
            this.totalPrice = tmp.TotalPrice ;
            this.lineNo = i;
            this.productName = pdtName;
            this.productCode = pdtCode.startsWith('0000000000') ? pdtCode.substring(10) : pdtCode;
            this.productEC = pdtEC;
            if (isService == true) {
                setMap2();
            } else {
                setMap();
            }
            this.setName = setNameMap.get(tmp.Set__c);
            //this.setName = tmp.Set__c;
            this.salesPrice = tmp.PriceBookEntry.SalesPrice__c;
            this.salesPriceA = tmp.PriceBookEntry.SalesPriceA__c;
            this.salesPriceB = tmp.PriceBookEntry.SalesPriceB__c;
            this.salesPriceC = tmp.PriceBookEntry.SalesPriceC__c;
            this.isProductModel = ispm;
            this.hiddenflg = tmp.PricebookEntry.Hidden_flag__c;
            system.debug('hiddenflg__'+i+'__'+hiddenflg);
            this.customPrice = this.pageObject.Custom_Price__c;
            this.pageObject.SingleProduct__c  = isSingleProduct;
        }
        //XHL-20190428-Update isSingleProduct,在报价行项目上增加SingleProduct__c字段,区分是套装还是单品
        public QELine(boolean isService, Integer i, String setStr, String strName, String strCode, String strEC, String strId, PricebookEntry pbe, String quantity, String discount, boolean ispm, boolean isSingleProduct,String description,String productSetName) {
            this.lineNo = i;
            this.productSetNameReference = productSetName;
            if (isService == true) {
                setMap2();
            } else {
                setMap();
            }
            this.setName = setNameMap.get(setStr);
            this.productName = strName;
            String pCode = strCode;
            this.productCode = pCode.startsWith('0000000000') ? pCode.substring(10) : pCode;
            this.productEC = strEC;
            pageObject = new QuoteLineItem();
            this.pageObject.Product2Id = strId;
            this.pageObject.PricebookEntryId = pbe.Id;
            this.pageObject.Set__c = setStr;
            this.pageObject.UnitPrice = pbe.SalesPrice__c;
            this.pageObject.Quantity = quantity == '' ? 0 : Decimal.valueOf(quantity);
            this.pageObject.Discount = discount == '' ? 0 : Decimal.valueOf(discount);
            system.debug('this.pageObject.Discount---->'+this.pageObject.Discount);
            this.pageObject.SingleProduct__c = isSingleProduct;
            this.pageObject.Description = description;
            this.pageObject.SetName__c = productSetName;
/*            this.discount = discount == '' ? 0 : Decimal.valueOf(discount);
            this.discount = this.discount.setScale(2, System.RoundingMode.HALF_UP);
            discount_n = discount_n == null ? 0 : discou;nt_n;
            this.pageObject.Discount = discount_n + (100 - discount_n) * this.discount / 100;*/
            //this.pageObject.Custom_Price__c = customPrice == '' ? 0 : Decimal.valueOf(customPrice);
            //this.pageObject.Description = description;
            Decimal discount2 =  100-this.pageObject.Discount;
            //this.totalPrice = discount2 * this.pageObject.Quantity * this.pageObject.UnitPrice/100;
            this.totalPrice = this.pageObject.Quantity * this.pageObject.UnitPrice * (1 - this.pageObject.Discount / 100);
            system.debug('this.totalPrice----><'+this.totalPrice);
            this.salesPrice = pbe.SalesPrice__c;
            this.salesPriceA = pbe.SalesPriceA__c;
            this.salesPriceB = pbe.SalesPriceB__c;
            this.salesPriceC = pbe.SalesPriceC__c;
            this.isProductModel = ispm;
            this.hiddenflg = pbe.Hidden_flag__c;
        }
    }
    public void quoteLineSetNameDiscountJson(Map<String,String> quoteLineSetNameDiscountMap){
        if (quoteLineSetNameDiscountMap.size() > 0) {
            quoteLineSetNameDiscountJson =  JSON.serializePretty(quoteLineSetNameDiscountMap);
        }
    }
    //决定报价与取消报价时增加和删除相关的"决定报价产品配套"
    public void decideORundecideQuote(String quoteId,Boolean flag){
        if (String.isBlank(quoteId)) {
            return;
        }
        if (flag) {
            List<DecideQuoteProductSet__c> undecideList = new List<DecideQuoteProductSet__c>();
            undecideList = [select Id from DecideQuoteProductSet__c where DecideOpportunity__c = :oppId];
            if(undecideList.size() > 0 ){
                delete undecideList;
            }
        }
        system.debug('quoteId_1_2_3_4_' + quoteId);
        List<Quote>  decideQuoteList = [select Id,Name,QuoteNumber,Is_Decided__c,OpportunityId,
                                            SetName1__c,SetQty1__c,SetName2__c,SetQty2__c,SetName3__c,SetQty3__c,
                                            SetName4__c,SetQty4__c,SetName5__c,SetQty5__c,SetName6__c,SetQty6__c,
                                            SetName7__c,SetQty7__c,SetName8__c,SetQty8__c,SetName9__c,SetQty9__c,
                                            SetName10__c,SetQty10__c,
                                            SetName11__c,SetQty11__c,SetName12__c,SetQty12__c,SetName13__c,SetQty13__c,
                                            SetName14__c,SetQty14__c,SetName15__c,SetQty15__c,SetName16__c,SetQty16__c,
                                            SetName17__c,SetQty17__c,SetName18__c,SetQty18__c,SetName19__c,SetQty19__c,
                                            SetName20__c,SetQty20__c,
                                            SetName21__c,SetQty21__c,SetName22__c,SetQty22__c,SetName23__c,SetQty23__c,
                                            SetName24__c,SetQty24__c,SetName25__c,SetQty25__c,SetName26__c,SetQty26__c,
                                            SetName27__c,SetQty27__c,SetName28__c,SetQty28__c,SetName29__c,SetQty29__c,
                                            SetName30__c,SetQty30__c,OrderIsChange__c
                                        from Quote
                                        where Id = :quoteId];
        if (decideQuoteList[0].Is_Decided__c) {
            Map<String,Integer> quoteProductSetMap = new Map<String,Integer>();
            List<DecideQuoteProductSet__c> decideList = new List<DecideQuoteProductSet__c>();
            for (Integer i = 1; i <= 30; i++) {
                String setName = String.valueOf(decideQuoteList[0].get('SetName'+i+'__c')) ;
                Integer setQty =  Integer.valueOf(decideQuoteList[0].get('SetQty'+i+'__c')) ;
                if(setName != null && setName != ''){
                    quoteProductSetMap.put(setName, setQty);
                }
            }
            system.debug('quoteProductSetMap__0522__' + quoteProductSetMap);
            List<productSet__c> productSetList = [select Id,Name,Code__c
                                                  from productSet__c
                                                  where Name in : quoteProductSetMap.keyset()];
            List<QuoteLineItem> items =
                [Select Id,Product2Id,Product2.Name,Product2.ProductCode,Product2.Product_ECCode__c,Quantity,Subtotal,Discount,TotalPrice,PricebookEntryId,UnitPrice,Description,Set__c,Custom_Price__c,
                        PricebookEntry.SalesPrice__c,PricebookEntry.SalesPriceA__c,PricebookEntry.SalesPriceB__c,PricebookEntry.SalesPriceC__c,Product2.ProductModels__c,PricebookEntry.Hidden_flag__c,
                        SingleProduct__c,SetName__c ,QuoteId
                   From QuoteLineItem where SetName__c in: quoteProductSetMap.keyset() and QuoteId = :quoteId  Order by Id];
            List<Order> ordList = [Select id from Order where OpportunityId = : oppId and Status__c = 'Active'];
            system.debug('items11111_22222' + items);
            Decimal unitPrice = 0;
            Map<String,Decimal>  unitPriceMap  = new  Map<String,Decimal>();
            Map<String,Decimal>  discountMap  = new  Map<String,Decimal>();
            for (QuoteLineItem item :items) {
                if(unitPriceMap.containsKey(item.SetName__c)) {
                   unitPriceMap.put(item.SetName__c,unitPriceMap.get(item.SetName__c)+item.UnitPrice * item.Quantity);
                } else {
                    unitPriceMap.put(item.SetName__c, item.UnitPrice * item.Quantity);
                }
                system.debug('Discount_1_1_1_' + item.Discount + '(-)' + item.SetName__c);
                discountMap.put(item.SetName__c, item.Discount);
                //unitPriceMap.put(item.SetName__c, ANY value)
            }
            system.debug('20190531____'+discountMap);
            for (productSet__c productSet : productSetList) {
                system.debug('20190531__1__'+discountMap);
                DecideQuoteProductSet__c  decideProductSet = new  DecideQuoteProductSet__c();
                decideProductSet.DecideProductSetName__c = productSet.Name;
                decideProductSet.DecideProductSetCode__c = productSet.Code__c;
                decideProductSet.DecideProductSetCount__c = quoteProductSetMap.get(productSet.Name);
                decideProductSet.DecideProductSet__c = productSet.Id;
                decideProductSet.DecideOpportunity__c = decideQuoteList[0].OpportunityId;
                decideProductSet.DecideQuote__c = quoteId;
                decideProductSet.DecideProductSetUnivalence__c = unitPriceMap.get(productSet.Name) / quoteProductSetMap.get(productSet.Name);
                decideProductSet.DecideProductSetTotalprice__c = unitPriceMap.get(productSet.Name);
                //decideProductSet.DecideProductSetDiscount__c = 56;
                decideProductSet.DecideProductSetDiscount__c = discountMap.get(productSet.Name);
                if( ordList.size() > 0 ){
                    decideProductSet.DecideOrder__c = ordList[0].id;
                }
                decideList.add(decideProductSet);
            }
            system.debug('items11111_3333' + items);
            if (decideList.size() > 0) {
                Insert decideList;
            }
        }
        //else {
        //    List<DecideQuoteProductSet__c> undecideList = new List<DecideQuoteProductSet__c>();
        //    undecideList = [select Id from DecideQuoteProductSet__c where DecideQuote__c = :quoteId];
        //    if(undecideList.size() > 0 ){
        //        delete undecideList;
        //    }
        //}
    }
    //给报价的相关套装字段进行赋值
    public void queSetNameSetQty(Map<String,Integer> productSetID_QuantityMap,Map<String,String> productSetCodeMap){
        if (ProductSetCodeMap == null ){
            errorMap.clear();
        }
        List<productSet__c> ListProductSet = new List<productSet__c>();
        List<productSetItem__c> ListproductSetItem = new List<productSetItem__c>();
        List<String> productSetCodeList = new  List<String>();
        //获取"产品配套"的名称
        ListProductSet = [select Id,Name,Code__c
                          from productSet__c
                          where Id in :productSetID_QuantityMap.keyset()
                          order by Name];
        //获取"产品配套明细"中产品的Id
        ListproductSetItem = [select Id,Name,product__c,productSet__c,
                                product__r.Name,product__r.ProductCode,
                                product__r.Product_ECCode__c,productSet__r.Name,
                                Count__c,productSet__r.Code__c
                              from productSetItem__c
                              where productSet__c in :productSetID_QuantityMap.keyset()
                              order by productSet__r.Name];
        system.debug('ListproductSetItem___++++__' + ListproductSetItem);
        for (productSetItem__c productSetItem : ListproductSetItem) {
            productSetCodeList.add(productSetItem.product__r.ProductCode);
        }
        Map<String, Product_Search__c> psMap = new Map<String, Product_Search__c>(); // keyがProductCodeです。
        List<String> forSelect = new List<String>();
        //查找"产品检索"
        List<Product_Search__c> psList = [
            select Id, Name, ProductCode__c, Product_ECCode__c, ProductDescription__c,
                     ProductStatus__c, Product__c, ProductModels1__c
              from Product_Search__c
             where ProductCode__c in :productSetCodeList];
        for (Product_Search__c ps : psList) {
            String pc = ps.ProductCode__c;
            if (pc.startsWith('00000000000')) {
                pc = pc.substring(11);
                psMap.put(pc, ps);
            }
            psMap.put(ps.ProductCode__c, ps);
            forSelect.add(ps.Product__c);
        }
        //根据询价的价格手册的Id和产品Id查找价格手册条目
        List<PricebookEntry> pbeList = [
            select Id, Product2Id, ProductCode, Product2.Product_ECCode__c, Product2.Dummy__c,
                    CostPrice__c, SalesPrice__c, SalesPriceA__c, SalesPriceB__c, SalesPriceC__c,
                    Hidden_flag__c
              from PricebookEntry
             where Pricebook2Id = :pricebook2Id
               and CurrencyIsoCode = :currencyIsoCode
               and Product2.ManualHidden__c = false
               and Product2Id in :forSelect];
        Map<String, PricebookEntry> pbeMap = new Map<String, PricebookEntry>();
        String errProduct = '';
        for (PricebookEntry pbe : pbeList) {
            String pc = pbe.ProductCode;
            if ((pbe.CostPrice__c == 0 && pbe.Product2.Dummy__c == false) || pbe.SalesPrice__c == 0) {
                errorflg = true;
                errProduct += pbe.productCode + ',';
            } else {
                if (pc.startsWith('00000000000')) {
                    pc = pc.substring(11);
                    pbeMap.put(pc, pbe);
                }
                pbeMap.put(pbe.ProductCode, pbe);
            }
        }
        Integer no = 0 ;    String productSetName;  PricebookEntry pbe;
        String setNames;
        String errorProductSetName = '';
        Map<String,QELine> existQELineMap = new Map<String,QELine>();
        List<QELine> singleProductSuitList = new List<QELine>();
        QELine qeline = new QELine(no);
        //将报价行项目中单品获取出来放入singleProductSuitList中
        for (QELine q :activities) {
            if ( String.isBlank(q.pageObject.Product2Id) == false && q.pageObject.SingleProduct__c == true) {
                singleProductSuitList.add(q);
            }
        }
        activities = new List<QELine>();
        //找出"产品配套"中
        Map<String,String> errorproductSetMap = new Map<String,String>();
        for (productSetItem__c productSetItem : ListproductSetItem) {
            Product_Search__c ps = psMap.get(productSetItem.product__r.ProductCode);
            pbe = pbeMap.get(productSetItem.product__r.ProductCode);
            if (ps == null || pbe == null) {
                errorProductSetName = productSetItem.productSet__r.Name ;
                errorproductSetMap.put(errorProductSetName, errorProductSetName);
                errorflg = true;
                errProduct += productSetItem.product__r.ProductCode + ',';
                errorMap.put(errorProductSetName, 'error['+errorProductSetName+']产品配套内含有产品价格信息不正确,该产品配套不能使用。产品:' + errProduct);
                continue;
            }
        }
        Map<String,String> matchingProductSetItemMap = new  Map<String,String>();
        Map<String,String> productsetNameMap = new  Map<String,String>();
        Integer productSetNo = 1;
        //system.debug('errorMap____' + errorMap);
        for (productSet__c productSet : ListProductSet) {
            if (errorMap.containsKey(productSet.Name)) {
                continue;
            }
            if (!matchingProductSetItemMap.containsKey(productSet.Code__c)) {
                if (!errorproductSetMap.containsKey(productSet.Name)) {
                    matchingProductSetItemMap.put(productSet.Code__c, 'set0' + productSetNo);
                    productsetNameMap.put(productSet.Code__c, productSet.Name);
                    productSetNo++;
                }
            }
        }
        //system.debug('matchingProductSetItemMap_1111___' + matchingProductSetItemMap);
        //system.debug('errorMap20190521__' + errorMap);
        for (productSetItem__c productSetItem : ListproductSetItem) {
            errorProductSetName = productSetItem.productSet__r.Name ;
            //system.debug('errorproductSetMap_2061_' + errorproductSetMap);
            //system.debug('errorProductSetName_2062_' + errorProductSetName);
            if (errorproductSetMap.containsKey(errorProductSetName)) {
                continue;
            }
            Product_Search__c ps = psMap.get(productSetItem.product__r.ProductCode);
            pbe = pbeMap.get(productSetItem.product__r.ProductCode);
            //quantity1 = String.valueOf(productSetID_QuantityMap.get(productSetItem.productSet__c) * productSetItem.Count__c);
            String quantity = String.valueOf(productSetID_QuantityMap.get(productSetItem.productSet__c) * productSetItem.Count__c);
            //String quantity = String.valueOf(productSetItem.Count__c);
            String productSetCode =productSetItem.productSet__r.Code__c;
            String qty = '0';
            boolean isSingleProduct = false;
            if (ps == null || pbe == null) {
                errorflg = true;
                errProduct += productSetItem.product__r.ProductCode + ',';
                errorMap.put(errorProductSetName, errProduct);
                continue;
            }
            if (matchingProductSetItemMap.containsKey(productSetItem.productSet__r.Code__c)) {
                setNames = matchingProductSetItemMap.get(productSetItem.productSet__r.Code__c);
                productSetName = productsetNameMap.get(productSetItem.productSet__r.Code__c);
            } else {
                continue;
            }
            if (productSetCodeMap != null && productSetCodeMap.containsKey(productSetCode)) {
                qty = productSetCodeMap.get(productSetCode).split(';')[1];
            }
            qeline = new QELine(isService,no,setNames,ps.Name,ps.ProductCode__c,ps.Product_ECCode__c,ps.Product__c,pbe,quantity, qty, ps.ProductModels1__c,isSingleProduct,ps.ProductDescription__c,productSetName);
            if (String.isNotBlank(qeline.pageObject.SetName__c)) {
                quoteLineSetNameDiscountMap.put(qeline.pageObject.SetName__c,String.valueOf(qeline.pageObject.Discount));
            }
            quoteLineSetNameDiscountJson(quoteLineSetNameDiscountMap);
            //quoteLineSetNameDiscountJson =  JSON.serializePretty(quoteLineSetNameDiscountMap);
            activities.add(qeline);
            no++;
            //productSetNo++;
        }
        //将单品套装放在产品配套套装的下面
        singleNo = no;
        for (QELine q :singleProductSuitList) {
            q.lineNo = singleNo;
            activities.add(q);
            singleNo++;
        }
        emptyData();
        for (productSet__c productSet : ListProductSet) {
            if (errorMap.containsKey(productSet.Name)) {
                continue;
            }
            if (errorproductSetMap.containsKey(productSet.Name)) {
                continue;
            }
            Boolean flag = productSetID_QuantityMap.containsKey(productSet.Id);
            Integer quantity ;
            if (flag) {
                quantity = productSetID_QuantityMap.get(productSet.Id);
            }
            if (flag && quo.SetName1__c == null ) {
                quo.SetName1__c = productSet.Name ;
                quo.SetQty1__c = quantity;
            } else if (flag && quo.SetName2__c == null){
                quo.SetName2__c = productSet.Name ;
                quo.SetQty2__c = quantity;
            } else if (flag && quo.SetName3__c == null){
                quo.SetName3__c = productSet.Name ;
                quo.SetQty3__c = quantity;
            } else if (flag && quo.SetName4__c == null){
                quo.SetName4__c = productSet.Name ;
                quo.SetQty4__c = quantity;
            } else if (flag && quo.SetName5__c == null){
                quo.SetName5__c = productSet.Name ;
                quo.SetQty5__c = quantity;
            } else if (flag && quo.SetName6__c == null){
                quo.SetName6__c = productSet.Name ;
                quo.SetQty6__c = quantity;
            } else if (flag && quo.SetName7__c == null){
                quo.SetName7__c = productSet.Name ;
                quo.SetQty7__c = quantity;
            } else if (flag && quo.SetName8__c == null){
                quo.SetName8__c = productSet.Name ;
                quo.SetQty8__c = quantity;
            } else if (flag && quo.SetName9__c == null){
                quo.SetName9__c = productSet.Name ;
                quo.SetQty9__c = quantity;
            } else if (flag && quo.SetName10__c == null){
                quo.SetName10__c = productSet.Name ;
                quo.SetQty10__c = quantity;
            } else if (flag && quo.SetName11__c == null){
                quo.SetName11__c = productSet.Name ;
                quo.SetQty11__c = quantity;
            } else if (flag && quo.SetName12__c == null){
                quo.SetName12__c = productSet.Name ;
                quo.SetQty12__c = quantity;
            } else if (flag && quo.SetName13__c == null){
                quo.SetName13__c = productSet.Name ;
                quo.SetQty13__c = quantity;
            } else if (flag && quo.SetName14__c == null){
                quo.SetName14__c = productSet.Name ;
                quo.SetQty14__c = quantity;
            } else if (flag && quo.SetName15__c == null){
                quo.SetName15__c = productSet.Name ;
                quo.SetQty15__c = quantity;
            } else if (flag && quo.SetName16__c == null){
                quo.SetName16__c = productSet.Name ;
                quo.SetQty16__c = quantity;
            } else if (flag && quo.SetName17__c == null){
                quo.SetName17__c = productSet.Name ;
                quo.SetQty17__c = quantity;
            } else if (flag && quo.SetName18__c == null){
                quo.SetName18__c = productSet.Name ;
                quo.SetQty18__c = quantity;
            } else if (flag && quo.SetName19__c == null){
                quo.SetName19__c = productSet.Name ;
                quo.SetQty19__c = quantity;
            } else if (flag && quo.SetName20__c == null){
                quo.SetName20__c = productSet.Name ;
                quo.SetQty20__c = quantity;
            } else if (flag && quo.SetName21__c == null){
                quo.SetName21__c = productSet.Name ;
                quo.SetQty21__c = quantity;
            } else if (flag && quo.SetName22__c == null){
                quo.SetName22__c = productSet.Name ;
                quo.SetQty22__c = quantity;
            } else if (flag && quo.SetName23__c == null){
                quo.SetName23__c = productSet.Name ;
                quo.SetQty23__c = quantity;
            } else if (flag && quo.SetName24__c == null){
                quo.SetName24__c = productSet.Name ;
                quo.SetQty24__c = quantity;
            } else if (flag && quo.SetName25__c == null){
                quo.SetName25__c = productSet.Name ;
                quo.SetQty25__c = quantity;
            } else if (flag && quo.SetName26__c == null){
                quo.SetName26__c = productSet.Name ;
                quo.SetQty26__c = quantity;
            } else if (flag && quo.SetName27__c == null){
                quo.SetName27__c = productSet.Name ;
                quo.SetQty27__c = quantity;
            } else if (flag && quo.SetName28__c == null){
                quo.SetName28__c = productSet.Name ;
                quo.SetQty28__c = quantity;
            } else if (flag && quo.SetName29__c == null){
                quo.SetName29__c = productSet.Name ;
                quo.SetQty29__c = quantity;
            } else if (flag && quo.SetName30__c == null){
                quo.SetName30__c = productSet.Name ;
                quo.SetQty30__c = quantity;
            }
        }
        //system.debug('errorMap1231111_'+errorMap);
        if (errorflg) {
            errorMessage = '';
            for (String errorKey :errorMap.keySet()) {
                errProduct = errorMap.get(errorKey).substring(0, errorMap.get(errorKey).length()-1);
                errorMessage += errProduct + ';';
            }
        }
    }
    //清空页面套装名称和数量
    public void emptyData(){
        quo.SetName1__c = null ;
        quo.SetQty1__c = null;
        quo.SetName2__c = null ;
        quo.SetQty2__c = null;
        quo.SetName3__c = null;
        quo.SetQty3__c = null;
        quo.SetName4__c = null ;
        quo.SetQty4__c = null;
        quo.SetName5__c = null ;
        quo.SetQty5__c = null;
        quo.SetName6__c = null ;
        quo.SetQty6__c = null;
        quo.SetName7__c = null;
        quo.SetQty7__c = null;
        quo.SetName8__c = null ;
        quo.SetQty8__c = null;
        quo.SetName9__c = null ;
        quo.SetQty9__c = null;
        quo.SetName10__c = null ;
        quo.SetQty10__c = null;
        quo.SetName11__c = null;
        quo.SetQty11__c = null;
        quo.SetName12__c = null ;
        quo.SetQty12__c = null;
        quo.SetName13__c = null ;
        quo.SetQty13__c = null;
        quo.SetName14__c = null ;
        quo.SetQty14__c = null;
        quo.SetName15__c = null ;
        quo.SetQty15__c = null;
        quo.SetName16__c = null ;
        quo.SetQty16__c = null;
        quo.SetName17__c = null ;
        quo.SetQty17__c = null;
        quo.SetName18__c = null ;
        quo.SetQty18__c = null;
        quo.SetName19__c = null ;
        quo.SetQty19__c = null;
        quo.SetName20__c = null ;
        quo.SetQty20__c = null;
        quo.SetName21__c = null ;
        quo.SetQty21__c = null;
        quo.SetName22__c = null ;
        quo.SetQty22__c = null;
        quo.SetName23__c = null ;
        quo.SetQty23__c = null;
        quo.SetName24__c = null ;
        quo.SetQty24__c = null;
        quo.SetName25__c = null ;
        quo.SetQty25__c = null;
        quo.SetName26__c = null ;
        quo.SetQty26__c = null;
        quo.SetName27__c = null ;
        quo.SetQty27__c = null;
        quo.SetName28__c = null ;
        quo.SetQty28__c = null;
        quo.SetName29__c = null ;
        quo.SetQty29__c = null;
        quo.SetName30__c = null ;
        quo.SetQty30__c = null;
    }
    public static Boolean IfspecialDealer(String oppDealerId){
        if ( String.isBlank(oppDealerId)) {
            return false;
        }
        return StaticParameter.specialDealerMap.containsKey(oppDealerId.substring(0,15));
    }
    public void dummy2(){
    }
    @TestVisible private void testI() {
        integer i = 0;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
         i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
         i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
         i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
        i++;
    }
}