张宇恒
2022-12-23 ec47f5ab5923a315bf22e0df5af7371e9668589e
force-app/main/default/classes/SelectAssetEstimateURFController.cls
@@ -1,370 +1,374 @@
global class SelectAssetEstimateURFController {
   //test
      private String targetHospitalId = null;            // 今後系列病院用
      private String targetMaintenanceContractId = null;
      public String typeresult {get; set;}
   private String targetMaintenanceContractId = null;
   public String typeresult {get; set;}
   
      public String targetEstimateId { get; private set; }
      public Boolean changedAfterPrint {get; set;}       // true の場合、画面に confirm メッセージが表示します。quoIdを新しいinsert。判定はjsにて実施
      public Decimal lastFriYearsPriceSum {get; set;}
      public Decimal lastSecYearsPriceSum {get; set;}
      Public String alertString {get; set;}
      Public String alertString2 {get; set;}
      Public String alertString3 {get; set;}
      public Boolean printAsset { get; private set; }
      public Boolean printContract { get; private set; }
      public Boolean printTripartite { get; private set; }
      public Boolean printAgent { get; private set; }
      public boolean inDicideFlag {get; set;}     //作为补充,对应报价决定之后,却未能讲合同起止日期传递给合同的问题
      public String isPaymentSet {get; set;}
   public String targetEstimateId { get; private set; }
   public Boolean changedAfterPrint {get; set;}           // true の場合、画面に confirm メッセージが表示します。quoIdを新しいinsert。判定はjsにて実施
   public Decimal lastFriYearsPriceSum {get; set;}
   public Decimal lastSecYearsPriceSum {get; set;}
   Public String alertString {get; set;}
   Public String alertString2 {get; set;}
   Public String alertString3 {get; set;}
   public Boolean printAsset { get; private set; }
   public Boolean printContract { get; private set; }
   public Boolean printTripartite { get; private set; }
   public Boolean printAgent { get; private set; }
   public boolean inDicideFlag {get; set;}         //作为补充,对应报价决定之后,却未能讲合同起止日期传递给合同的问题
   public String isPaymentSet {get; set;}
   //public String PaymentSet {get;set;}
   // 引数のサービス契約の情報を格納する。
      public Maintenance_Contract__c contract { get; private set; }
      public Maintenance_Contract_Estimate__c estimate { get; set; }
   public Maintenance_Contract__c contract { get; private set; }
   public Maintenance_Contract_Estimate__c estimate { get; set; }
   // 2021、8、26 合同报价页面的优化,无保有设备点检对象选择框变黑 fxk star
      public Asset ass { get; set; }
   public Asset ass { get; set; }
   // 2021、8、26 合同报价页面的优化,无保有设备点检对象选择框变黑 fxk end
   // 病院配下の納入機器の情報を格納する。
      private List<Asset> assetRecords;                       // TODO 系列病院の場合、この配列は固定できないです。
      public List<AssetInfo> checkedAssets { get; set; }
      private List<AssetInfo> unCheckedAssets = new List<AssetInfo>();
   private List<Asset> assetRecords;                           // TODO 系列病院の場合、この配列は固定できないです。
   public List<AssetInfo> checkedAssets { get; set; }
   private List<AssetInfo> unCheckedAssets = new List<AssetInfo>();
   
   //public List<List<AssetInfo>> checkedAssetsView { get; set; }
      public List<List<AssetInfo> > unCheckedAssetsView { get; set; }
   public List<List<AssetInfo> > unCheckedAssetsView { get; set; }
   
   // 分页用
      public Integer currPage { get; set; }     // 当前页
      public Integer totalPage { get; set; }     // 总页数
      public Integer selctRecordNum { get { return Integer.valueOf(selRecordOption); } }     // 选择的每页记录数
      public Integer totalRecords { get; set; }     // 总记录数
      public String selRecordOption { get; set; }
      public static List<SelectOption> recordNum { get; private set; }     // 选择每页记录数List
   public Integer currPage { get; set; }         // 当前页
   public Integer totalPage { get; set; }         // 总页数
   public Integer selctRecordNum { get { return Integer.valueOf(selRecordOption); } }         // 选择的每页记录数
   public Integer totalRecords { get; set; }         // 总记录数
   public String selRecordOption { get; set; }
   public static List<SelectOption> recordNum { get; private set; }         // 选择每页记录数List
   
   //HWAG-B399Q8 2018/08/20  检验是否显示'请提交待审批' start
      public Boolean IS_Clone_After_Decide { get; set; }
   public Boolean IS_Clone_After_Decide { get; set; }
   //HWAG-B399Q8 2018/08/20  检验是否显示'请提交待审批' end
      static {
         recordNum = new List<SelectOption>();
         recordNum.add(new SelectOption('10', '10'));
         recordNum.add(new SelectOption('20', '20'));
         recordNum.add(new SelectOption('50', '50'));
         recordNum.add(new SelectOption('100', '100'));
         recordNum.add(new SelectOption('200', '200'));
      }
      private List<String> checkIdList = new List<String> ();     // 合同对象设备的设备ID
   static {
      recordNum = new List<SelectOption>();
      recordNum.add(new SelectOption('10', '10'));
      recordNum.add(new SelectOption('20', '20'));
      recordNum.add(new SelectOption('50', '50'));
      recordNum.add(new SelectOption('100', '100'));
      recordNum.add(new SelectOption('200', '200'));
   }
   private List<String> checkIdList = new List<String> ();         // 合同对象设备的设备ID
   
   //-------HWAG-B4R3SS----------------update----------------------------
      public Boolean activeOn { get; set; }
      public String sortKey { get; set; }
      public Boolean sortOrderAsc { get; private set; }
      private String[] columus = new String[] {'Asset_situation__c', 'Name', 'SerialNumber', 'CurrentContract__r.Management_Code__c', 'Department_Name__c', 'Status', 'Installation_Site__c', 'Room_Number__c', 'InstallDate', 'Asset_Owner__c', 'Accumulation_Repair_Amount__c', 'AssetMark__c'};
      private Boolean isSoft;
   public Boolean activeOn { get; set; }
   public String sortKey { get; set; }
   public Boolean sortOrderAsc { get; private set; }
   private String[] columus = new String[] {'Asset_situation__c', 'Name', 'SerialNumber', 'CurrentContract__r.Management_Code__c', 'Department_Name__c', 'Status', 'Installation_Site__c', 'Room_Number__c', 'InstallDate', 'Asset_Owner__c', 'Accumulation_Repair_Amount__c', 'AssetMark__c'};
   private Boolean isSoft;
   // 显示数据条数限制
      private static Integer SELECT_LIMIT = 200;
      public List<AssetInfo> unCheckedInfoList { get; set; }
      private String text1ForSort = null;
      private String cond1ForSort = null;
      private String val1ForSort = null;
   private static Integer SELECT_LIMIT = 200;
   public List<AssetInfo> unCheckedInfoList { get; set; }
   private String text1ForSort = null;
   private String cond1ForSort = null;
   private String val1ForSort = null;
   /*****************select option******************/
      public static List<SelectOption> textOpts { get; private set; }
      public Decimal countorder { get; set; }
      public List<String> assetSerialNumberList = new List<String>();
   public static List<SelectOption> textOpts { get; private set; }
   public Decimal countorder { get; set; }
   public List<String> assetSerialNumberList = new List<String>();
   // 新规 或者 copy
      private Boolean newIns = false;
   private Boolean newIns = false;
   
   
      static {
         textOpts = new List<SelectOption>();
         //LJPH-BSS6E2  ---20200911 ---update by rentongxiao start
         // textOpts.add(new SelectOption('','-无-'));
         //LJPH-BSS6E2  ---20200911 ---update by rentongxiao end
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
         /* 在查询语句中 新增了 AssetMark__c 的字段 */
         // textOpts.add(new SelectOption('S:Asset_situation__c'  , Schema.SObjectType.Asset.fields.Asset_situation__c.label));
         // 添加新条件 -- 耗材/主机
         textOpts.add(new SelectOption('S:AssetMark__c', '主机/耗材'));
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
         textOpts.add(new SelectOption('S:Name', Schema.SObjectType.Asset.fields.Name.label));
         textOpts.add(new SelectOption('S:SerialNumber', Schema.SObjectType.Asset.fields.SerialNumber.label));
         textOpts.add(new SelectOption('S:CurrentContract__r.Management_Code__c', Schema.SObjectType.Asset.fields.CurrentContract__c.label));
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
         // textOpts.add(new SelectOption('S:Status'              , Schema.SObjectType.Asset.fields.Status.label));
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
         textOpts.add(new SelectOption('S:Installation_Site__c', Schema.SObjectType.Asset.fields.Installation_Site__c.label));
         textOpts.add(new SelectOption('S:Department_Name__c', Schema.SObjectType.Asset.fields.Department_Name__c.label));
      }
      public static List<SelectOption> equalOpts { get; private set; }
      static {
         equalOpts = new List<SelectOption>();
         equalOpts.add(new SelectOption('equals', '等于'));
         equalOpts.add(new SelectOption('contains', '包含'));
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
         //新加匹配符 不等于
         equalOpts.add(new SelectOption('notequals', '不等于'));
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
      }
      public String text1 { get; set; }     // 对象
      public String cond1 { get; set; }     // 条件
      public String val1 { get; set; }     // 值
   static {
      textOpts = new List<SelectOption>();
      //LJPH-BSS6E2  ---20200911 ---update by rentongxiao start
      // textOpts.add(new SelectOption('','-无-'));
      //LJPH-BSS6E2  ---20200911 ---update by rentongxiao end
      //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
      /* 在查询语句中 新增了 AssetMark__c 的字段 */
      // textOpts.add(new SelectOption('S:Asset_situation__c'  , Schema.SObjectType.Asset.fields.Asset_situation__c.label));
      // 添加新条件 -- 耗材/主机
      textOpts.add(new SelectOption('S:AssetMark__c', '主机/耗材'));
      //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
      textOpts.add(new SelectOption('S:Name', Schema.SObjectType.Asset.fields.Name.label));
      textOpts.add(new SelectOption('S:SerialNumber', Schema.SObjectType.Asset.fields.SerialNumber.label));
      textOpts.add(new SelectOption('S:CurrentContract__r.Management_Code__c', Schema.SObjectType.Asset.fields.CurrentContract__c.label));
      //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
      // textOpts.add(new SelectOption('S:Status'              , Schema.SObjectType.Asset.fields.Status.label));
      //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
      textOpts.add(new SelectOption('S:Installation_Site__c', Schema.SObjectType.Asset.fields.Installation_Site__c.label));
      textOpts.add(new SelectOption('S:Department_Name__c', Schema.SObjectType.Asset.fields.Department_Name__c.label));
   }
   public static List<SelectOption> equalOpts { get; private set; }
   static {
      equalOpts = new List<SelectOption>();
      equalOpts.add(new SelectOption('equals', '等于'));
      equalOpts.add(new SelectOption('contains', '包含'));
      //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
      //新加匹配符 不等于
      equalOpts.add(new SelectOption('notequals', '不等于'));
      //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
   }
   public String text1 { get; set; }         // 对象
   public String cond1 { get; set; }         // 条件
   public String val1 { get; set; }         // 值
   //LJPH-BSS6E2  ---20200911 ---add by rentongxiao start
      public String contr {get; set; }     //判断是否init
   public String contr {get; set; }         //判断是否init
   //LJPH-BSS6E2  ---20200911 ---add by rentongxiao end
   
   // 检索按钮
      public PageReference searchBtn() {
         countorder = 1;
         //验证
         assetSerialNumberList.clear();
         getAssetSerialNumber();
         totalRecords = 0;
         List<Asset> assetconfimList = getAssetconfim(text1, cond1, val1);
         for (Asset ast : assetconfimList) {
            totalRecords++;
         }
         // 获取assets
         List<Asset> assetList = getAsset(text1, cond1, val1);
         // 作成明细行
         getSortedUnCheckedInfoList(assetList);
         // 排序用检索条件退避
         text1ForSort = text1;
         cond1ForSort = cond1;
         val1ForSort = val1;
         currPage = 1;
         totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
         return null;
   public PageReference searchBtn() {
      countorder = 1;
      //验证
      assetSerialNumberList.clear();
      getAssetSerialNumber();
      totalRecords = 0;
      List<Asset> assetconfimList = getAssetconfim(text1, cond1, val1);
      for (Asset ast : assetconfimList) {
         totalRecords++;
      }
      // 获取assets
      List<Asset> assetList = getAsset(text1, cond1, val1);
      // 作成明细行
      getSortedUnCheckedInfoList(assetList);
      // 排序用检索条件退避
      text1ForSort = text1;
      cond1ForSort = cond1;
      val1ForSort = val1;
      currPage = 1;
      totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
      return null;
   }
   
   // 取已选择资产的机身编码
      public void getAssetSerialNumber() {
         //LJPH-BSS6E2  ---20200911 ---add by rentongxiao start
         contr = '2';
         //LJPH-BSS6E2  ---20200911 ---add by rentongxiao end
         assetSerialNumberList = new List<String>();
         assetSerialNumberList.clear();
         for (AssetInfo ai : this.checkedAssets) {
            system.debug('checkedAssets1111111' + this.checkedAssets);
            //system.debug('ai.ah.SerialNumber__c' + ai.ah.SerialNumber__c);
            if (String.isNotEmpty(ai.rec.SerialNumber)) {
               assetSerialNumberList.add(ai.rec.SerialNumber);
            }
   public void getAssetSerialNumber() {
      //LJPH-BSS6E2  ---20200911 ---add by rentongxiao start
      contr = '2';
      //LJPH-BSS6E2  ---20200911 ---add by rentongxiao end
      assetSerialNumberList = new List<String>();
      assetSerialNumberList.clear();
      for (AssetInfo ai : this.checkedAssets) {
         system.debug('checkedAssets1111111' + this.checkedAssets);
         //system.debug('ai.ah.SerialNumber__c' + ai.ah.SerialNumber__c);
         if (String.isNotEmpty(ai.rec.SerialNumber)) {
            assetSerialNumberList.add(ai.rec.SerialNumber);
         }
      }
   }
   
   //
      private void getSortedUnCheckedInfoList(List<Asset> assetList) {
         Boolean overLimit = false;
         Map<Id, AssetInfo> markUpUnCheckMap = new Map<Id, AssetInfo>();
         for (AssetInfo unCheckinfo : unCheckedAssets) {
   private void getSortedUnCheckedInfoList(List<Asset> assetList) {
      Boolean overLimit = false;
      Map<Id, AssetInfo> markUpUnCheckMap = new Map<Id, AssetInfo>();
      for (AssetInfo unCheckinfo : unCheckedAssets) {
   
            // 打勾,视为优先显示明细
            if (unCheckinfo.rec_checkBox_c == true) {
               // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , 'unCheckinfo.rec_checkBox_c' + unCheckinfo.rec_checkBox_c));
               markUpUnCheckMap.put(unCheckinfo.rec.Id, unCheckinfo);
            }
         }
         unCheckedAssets.clear();
         // 优先显示明细放在最前面
         unCheckedInfoList = new List<AssetInfo>();
         for (AssetInfo asInfo : markUpUnCheckMap.values()) {
            unCheckedAssets.add(asInfo);
         }
         SELECT_LIMIT = selctRecordNum;
         Integer selectCnt = unCheckedAssets.size();
         for (Asset asset : assetList) {
            // 201を超えた場合前200のみを出す
            if (unCheckedAssets.size() >= SELECT_LIMIT) { overLimit = true; break; }
            if (markUpUnCheckMap.containsKey(asset.Id) == false) {
               //unCheckedInfoList.add(unCheckMap.get(asset.Id));
               unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), asset));
            }
         // 打勾,视为优先显示明细
         if (unCheckinfo.rec_checkBox_c == true) {
            // ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , 'unCheckinfo.rec_checkBox_c' + unCheckinfo.rec_checkBox_c));
            markUpUnCheckMap.put(unCheckinfo.rec.Id, unCheckinfo);
         }
      }
      unCheckedAssets.clear();
      // 优先显示明细放在最前面
      unCheckedInfoList = new List<AssetInfo>();
      for (AssetInfo asInfo : markUpUnCheckMap.values()) {
         unCheckedAssets.add(asInfo);
      }
      SELECT_LIMIT = selctRecordNum;
      Integer selectCnt = unCheckedAssets.size();
      for (Asset asset : assetList) {
         // 201を超えた場合前200のみを出す
         if (unCheckedAssets.size() >= SELECT_LIMIT) { overLimit = true; break; }
         if (markUpUnCheckMap.containsKey(asset.Id) == false) {
            //unCheckedInfoList.add(unCheckMap.get(asset.Id));
            unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), asset));
         }
      }
   }
   
   //检索验证
      private List<Asset> getAssetconfim(String txt, String con, String val) {
         String soql = this.makeSoqlconfim();
         soql += makeTextSql(txt, con, val);
         system.debug('makeTextSql_soql' + soql);
         if (isSoft) {
            soql += ' order by ' + this.columus[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last ');
   private List<Asset> getAssetconfim(String txt, String con, String val) {
      String soql = this.makeSoqlconfim();
      soql += makeTextSql(txt, con, val);
      system.debug('makeTextSql_soql' + soql);
      if (isSoft) {
         soql += ' order by ' + this.columus[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last ');
      } else {
         soql += ' order by SerialNumber, Name, Department_Name__c, InstallDate';
      }
      system.debug('====getAssetconfim:' + soql);
      return Database.query(soql);
   }
   private List<Asset> getAsset(String txt, String con, String val) {
      String soql = this.makeSoqlconfim();
      soql += makeTextSql(txt, con, val);
      if (isSoft) {
         soql += ' order by ' + this.columus[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last ');
      } else {
         soql += ' order by SerialNumber, Name, Department_Name__c, InstallDate';
      }
      soql += ' limit ' + System.Label.Asset_Maxcount;
      soql += ' OFFSET ' + (countorder - 1) * Integer.valueOf(System.Label.Asset_Maxcount);
      return Database.query(soql);
   }
   public Integer soqlNos() {
      List<Asset> assetconfimList = getAssetconfim(text1, cond1, val1);
      totalRecords = assetconfimList.size();
      //totalPage = (totalRecords/selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
      return totalRecords;
   }
   private String makeSoqlconfim() {
      String sqlTail = '(\'';
      system.debug('assetSerialNumberList.size()' + assetSerialNumberList.size());
      for (Integer i = 0; i < assetSerialNumberList.size(); i++) {
         if (i < assetSerialNumberList.size() - 1) {
            sqlTail += assetSerialNumberList[i] + '\',\'';
         } else {
            soql += ' order by SerialNumber, Name, Department_Name__c, InstallDate';
            sqlTail += assetSerialNumberList[i] + '\')';
         }
         system.debug('====getAssetconfim:' + soql);
         return Database.query(soql);
      }
      private List<Asset> getAsset(String txt, String con, String val) {
         String soql = this.makeSoqlconfim();
         soql += makeTextSql(txt, con, val);
         if (isSoft) {
            soql += ' order by ' + this.columus[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last ');
         } else {
            soql += ' order by SerialNumber, Name, Department_Name__c, InstallDate';
         }
         soql += ' limit ' + System.Label.Asset_Maxcount;
         soql += ' OFFSET ' + (countorder - 1) * Integer.valueOf(System.Label.Asset_Maxcount);
         return Database.query(soql);
      //tcm 删除第4行 Maintenance_Contract_No_F__c 替换 Management_Code__c  20211201
            String soql = 'SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, '
                 + 'Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c, InstallDate,isNewDate_use__c, '
                 + 'Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c, '
                 + 'CurrentContract_F__c,CurrentContract_F__r.Management_Code__c,CurrentContract_F__r.Maintenance_Contract_No_F__c,CurrentContract_F__r.RecordType_DeveloperName__c,CurrentContract_F__r.Estimate_Num__c,CurrentContract_F__r.Contract_End_Date__c,'
                 + 'CurrentContract_F_asset__c,CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,CurrentContract_F_asset__r.endDateGurantee_Text__c,CurrentContract_F__r.Gurantee_Estimate_startDate__c, '
                 + 'CurrentContract_F__r.First_Estimate_Date__c,CurrentContract_F__r.Estimate_Contract_endDate__c,'
                 + 'CurrentContract_F__r.Contract_Consumption_rate__c,CurrentContract_F__r.First_contract_usage_Rate__c,CurrentContract_F__r.Contract_Range__c,'
                       + 'Product2.ProductURF__c,Product2.ProductURF__r.URFLimitSerial__c,Product2.ProductURF__r.UFR_MaxRepairCount__c,Product2.ProductURF__r.UFR_Maintenance_Price_Month__c,'
            //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
            + 'Product2.ProductURF__r.Maintenance_Price_Year_URF_Max__c, Product2.ProductURF__r.Maintenance_Price_Year_URF__c,'
            //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
            + 'CurrentContract_End_Date__c, Extend_Gurantee_DateTo__c,EquipmentGuaranteeFlg__c,AssetMark__c FROM Asset WHERE Product2.ProductURF__c != null AND Hospital__c = \'' + this.targetHospitalId + '\' ';
      //HWAG-BDJ43R ---XHL---20190729---
      //soql +=  ' AND AssetMark__c != \'耗材\' AND Product2.Family != \'ET\' ';
      //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
      // soql +=  ' AND ( AssetMark__c != \'耗材\' OR Product2.Family != \'ET\' ) ';
      //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
      //HWAG-BDJ43R ---XHL---20190729---
      if (assetSerialNumberList.size() > 0) {
         soql += ' AND SerialNumber not in ' + sqlTail;
      }
      public Integer soqlNos() {
         List<Asset> assetconfimList = getAssetconfim(text1, cond1, val1);
         totalRecords = assetconfimList.size();
         //totalPage = (totalRecords/selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
         return totalRecords;
      }
      private String makeSoqlconfim() {
         String sqlTail = '(\'';
         system.debug('assetSerialNumberList.size()' + assetSerialNumberList.size());
         for (Integer i = 0; i < assetSerialNumberList.size(); i++) {
            if (i < assetSerialNumberList.size() - 1) {
               sqlTail += assetSerialNumberList[i] + '\',\'';
            } else {
               sqlTail += assetSerialNumberList[i] + '\')';
            }
         }
         //tcm 删除第4行 Maintenance_Contract_No_F__c 替换 Management_Code__c  20211201
         String soql = 'SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, '
                    + 'Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c, InstallDate,isNewDate_use__c, '
                    + 'Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c, '
                    + 'CurrentContract_F__c,CurrentContract_F__r.Management_Code__c,CurrentContract_F__r.Maintenance_Contract_No_F__c,CurrentContract_F__r.RecordType_DeveloperName__c,CurrentContract_F__r.Estimate_Num__c,CurrentContract_F__r.Contract_End_Date__c,'
                    + 'CurrentContract_F_asset__c,CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,CurrentContract_F_asset__r.endDateGurantee_Text__c,CurrentContract_F__r.Gurantee_Estimate_startDate__c, '
                    + 'CurrentContract_F__r.First_Estimate_Date__c,CurrentContract_F__r.Estimate_Contract_endDate__c,'
                    + 'CurrentContract_F__r.Contract_Consumption_rate__c,CurrentContract_F__r.First_contract_usage_Rate__c,CurrentContract_F__r.Contract_Range__c,'
                    + 'Product2.ProductURF__c,Product2.ProductURF__r.URFLimitSerial__c,Product2.ProductURF__r.UFR_MaxRepairCount__c,Product2.ProductURF__r.UFR_Maintenance_Price_Month__c,'
                    + 'CurrentContract_End_Date__c, Extend_Gurantee_DateTo__c,EquipmentGuaranteeFlg__c,AssetMark__c FROM Asset WHERE Product2.ProductURF__c != null AND Hospital__c = \'' + this.targetHospitalId + '\' ';
         //HWAG-BDJ43R ---XHL---20190729---
         //soql +=  ' AND AssetMark__c != \'耗材\' AND Product2.Family != \'ET\' ';
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
         // soql +=  ' AND ( AssetMark__c != \'耗材\' OR Product2.Family != \'ET\' ) ';
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
         //HWAG-BDJ43R ---XHL---20190729---
         if (assetSerialNumberList.size() > 0) {
            soql += ' AND SerialNumber not in ' + sqlTail;
         }
         return soql;
      }
      return soql;
   }
   
   // 拼接检索条件sql文
      private String makeTextSql(String txt1, String con, String val) {
         String soql = '';
         if (String.isBlank(con)) {
            con = 'equals';
         }
         // containsの場合、日報画面の病院検索を真似し、spaceで分けて、and検索
         // equalsの場合、SF標準の検索を真似し、「,」で分けて、or検索
         if (!String.isBlank(txt1)) {
            if ((con == 'contains' || con == 'notcontains') && val.contains(' ')) {
               String[] vals = val.split(' ');
   private String makeTextSql(String txt1, String con, String val) {
      String soql = '';
      if (String.isBlank(con)) {
         con = 'equals';
      }
      // containsの場合、日報画面の病院検索を真似し、spaceで分けて、and検索
      // equalsの場合、SF標準の検索を真似し、「,」で分けて、or検索
      if (!String.isBlank(txt1)) {
         if ((con == 'contains' || con == 'notcontains') && val.contains(' ')) {
            String[] vals = val.split(' ');
   
               String cSql = '';
               if (vals.size() > 0) {
                  String txt = txt1.substring(2);
                  soql += ' and ( ';
                  for (String v : vals) {
                     if (String.isNotBlank(v)) {
                        if (con == 'contains') {
                           soql += txt + ' like \'%' + v + '%\' or ';
                        } else {
                           soql += txt + ' not like \'%' + v + '%\' and ';
                        }
                     }
                  }
                  soql = soql.substring(0, soql.length() - 4);
                  soql += ')';
               }
               system.debug('containssoql:     ' + soql);
            } else if ((con == 'equals' || con == 'notequals') && val.contains(',')) {
               String[] vals = val.split(',');
               if (vals.size() > 0) {
                  String txt = txt1.substring(2);     // S:Name 、最初の2文字がタイプです
                  soql += ' and ( ';
                  for (String v : vals) {
                     if (con == 'equals') {
                        soql += txt + ' = \'' + v + '\' or ';
            String cSql = '';
            if (vals.size() > 0) {
               String txt = txt1.substring(2);
               soql += ' and ( ';
               for (String v : vals) {
                  if (String.isNotBlank(v)) {
                     if (con == 'contains') {
                        soql += txt + ' like \'%' + v + '%\' or ';
                     } else {
                        // notequals
                        soql += txt + ' <> \'' + v + '\' and ';
                        soql += txt + ' not like \'%' + v + '%\' and ';
                     }
                  }
                  soql = soql.substring(0, soql.length() - 4);
                  soql += ')';
               }
            } else {
               String cSql = this.makeTextSqlStr(txt1, con, val);
               if (con != 'notcontains') {
                  soql += this.makeTextSqlStr(txt1, con, val);
               } else {
                  // notcontains
                  if (!String.isBlank(cSql)) {
                     cSql = cSql.substring(5);     // ' and ' の5文字を外す
                     soql += ' and (NOT ' + cSql + ') ';
                  }
               }
            }
         }
         // //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
         // else{
         //     soql += 'And AssetMark__c = \'主机\'';
         // }
         // //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
         return soql;
      }
   
      private String makeTextSqlStr(String txt1, String con, String val) {
         String soql = '';
         if (!String.isBlank(txt1)) {
            String txt = txt1.substring(2);
            String colType = txt1.substring(0, 2);
            String tmpVal = val.trim();
            // 空白の場合''にする
            if (String.isBlank(tmpVal)) {
               if (con == 'equals') {
                  //soql += ' and ' + txt + ' = ' + tmpVal;
                  soql += ' and ' + txt + ' = null';
               } else if (con == 'notequals') {
                  soql += ' and ' + txt + ' <> null';
               } else {
                  // 空白の場合、contains, notcontains と starts withは無視
               }
               soql = soql.substring(0, soql.length() - 4);
               soql += ')';
            }
            system.debug('containssoql:     ' + soql);
         } else if ((con == 'equals' || con == 'notequals') && val.contains(',')) {
            String[] vals = val.split(',');
            if (vals.size() > 0) {
               String txt = txt1.substring(2);         // S:Name 、最初の2文字がタイプです
               soql += ' and ( ';
               for (String v : vals) {
                  if (con == 'equals') {
                     soql += txt + ' = \'' + v + '\' or ';
                  } else {
                     // notequals
                     soql += txt + ' <> \'' + v + '\' and ';
                  }
               }
               soql = soql.substring(0, soql.length() - 4);
               soql += ')';
            }
         } else {
            String cSql = this.makeTextSqlStr(txt1, con, val);
            if (con != 'notcontains') {
               soql += this.makeTextSqlStr(txt1, con, val);
            } else {
               soql += ' and ' + txt;
               if (con == 'equals') {
                  if (colType == 'S:') {
                     soql += ' = \'' + tmpVal + '\'';
                  } else {
                     soql += ' = ' + tmpVal + ' ';
                  }
               } else if (con == 'notequals') {
                  if (colType == 'S:') {
                     soql += ' <> \'' + tmpVal + '\'';
                  } else {
                     soql += ' <> ' + tmpVal + ' ';
                  }
               } else if (con == 'contains' || con == 'notcontains') {
                  soql += ' like \'%' + String.escapeSingleQuotes(tmpVal.replaceAll('%', '\\%')) + '%\'';
               } else if (con == 'starts with') {
                  soql += ' like \'' + String.escapeSingleQuotes(tmpVal.replaceAll('%', '\\%')) + '%\'';
               } else {
                  if (colType == 'S:') {
                     soql += ' ' + con + '\'' + tmpVal + '\'';
                  } else {
                     soql += ' ' + con + ' ' + tmpVal + ' ';
                  }
               // notcontains
               if (!String.isBlank(cSql)) {
                  cSql = cSql.substring(5);         // ' and ' の5文字を外す
                  soql += ' and (NOT ' + cSql + ') ';
               }
            }
         }
         return soql;
      }
      // //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
      // else{
      //     soql += 'And AssetMark__c = \'主机\'';
      // }
      // //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
      return soql;
   }
   private String makeTextSqlStr(String txt1, String con, String val) {
      String soql = '';
      if (!String.isBlank(txt1)) {
         String txt = txt1.substring(2);
         String colType = txt1.substring(0, 2);
         String tmpVal = val.trim();
         // 空白の場合''にする
         if (String.isBlank(tmpVal)) {
            if (con == 'equals') {
               //soql += ' and ' + txt + ' = ' + tmpVal;
               soql += ' and ' + txt + ' = null';
            } else if (con == 'notequals') {
               soql += ' and ' + txt + ' <> null';
            } else {
               // 空白の場合、contains, notcontains と starts withは無視
            }
         } else {
            soql += ' and ' + txt;
            if (con == 'equals') {
               if (colType == 'S:') {
                  soql += ' = \'' + tmpVal + '\'';
               } else {
                  soql += ' = ' + tmpVal + ' ';
               }
            } else if (con == 'notequals') {
               if (colType == 'S:') {
                  soql += ' <> \'' + tmpVal + '\'';
               } else {
                  soql += ' <> ' + tmpVal + ' ';
               }
            } else if (con == 'contains' || con == 'notcontains') {
               soql += ' like \'%' + String.escapeSingleQuotes(tmpVal.replaceAll('%', '\\%')) + '%\'';
            } else if (con == 'starts with') {
               soql += ' like \'' + String.escapeSingleQuotes(tmpVal.replaceAll('%', '\\%')) + '%\'';
            } else {
               if (colType == 'S:') {
                  soql += ' ' + con + '\'' + tmpVal + '\'';
               } else {
                  soql += ' ' + con + ' ' + tmpVal + ' ';
               }
            }
         }
      }
      return soql;
   }
   
   //----------HWAG-B4R3SS------------------------------------------------------------
   
@@ -373,59 +377,59 @@
   
   
   
      public Boolean getEnablePrintContract() {
         if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
            return this.estimate.Estimation_Decision__c;
         } else {
   public Boolean getEnablePrintContract() {
      if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
         return this.estimate.Estimation_Decision__c;
      } else {
         return false;
      }
   }
   public Boolean getUnDecideBtnDisabled() {
      // 見積もりdecide取消しできない条件の判断
      if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
         if (this.estimate.Estimation_Decision__c) {
            return false;
         }
      }
      public Boolean getUnDecideBtnDisabled() {
         // 見積もりdecide取消しできない条件の判断
         if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
            if (this.estimate.Estimation_Decision__c) {
               return false;
            }
      // TODO 本当は特別資格があれば 決定可能にする
      return true;
   }
   public Boolean getDecideBtnDisabled() {
      // 見積もりdecideできない条件の判断
      if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
         if (this.estimate.Estimation_Decision__c) {
            return true;
         }
         // TODO 本当は特別資格があれば 決定可能にする
         // TODO 特別資格があれば 決定可能にする
         return true;
      }
      public Boolean getDecideBtnDisabled() {
         // 見積もりdecideできない条件の判断
         if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
            if (this.estimate.Estimation_Decision__c) {
               return true;
            }
            // TODO 特別資格があれば 決定可能にする
      if (this.estimate.Process_Status__c != '批准') {
         return true;
      } else {
         if (String.isBlank(this.estimate.Change_Dealer_Approval__c) == false
            && this.estimate.Change_Dealer_Approval__c != '批准'
            && this.estimate.Change_Dealer_Approval__c != '未批准') {
            return true;
         }
         if (this.estimate.Process_Status__c != '批准') {
            return true;
         } else {
            if (String.isBlank(this.estimate.Change_Dealer_Approval__c) == false
               && this.estimate.Change_Dealer_Approval__c != '批准'
               && this.estimate.Change_Dealer_Approval__c != '未批准') {
               return true;
            }
         }
         return false;
      }
      public Boolean getApprovalBtnDisabled() {
      return false;
   }
   public Boolean getApprovalBtnDisabled() {
   
         // 見積もり申請できない条件の判断
         if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
            // TODO 特別資格があれば 申請可能にする
            return true;
         }
         if (String.isBlank(this.estimate.Process_Status__c) == false
            && this.estimate.Process_Status__c != '草案中'
            //&& this.estimate.Process_Status__c != '不批准'
            ) {
            return true;
         }
         return false;
      // 見積もり申請できない条件の判断
      if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
         // TODO 特別資格があれば 申請可能にする
         return true;
      }
      if (String.isBlank(this.estimate.Process_Status__c) == false
         && this.estimate.Process_Status__c != '草案中'
         //&& this.estimate.Process_Status__c != '不批准'
         ) {
         return true;
      }
      return false;
   }
   // 20200307 不用
   // public Boolean getcontactBtnDisabled() {
   //     if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
@@ -440,44 +444,44 @@
   //     }
   //     return false;
   // }
      public Boolean getSaveBtnDisabled() {
         // 見積もりsaveできない条件の判断
         if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
            return true;
         }
         if (String.isBlank(this.estimate.Process_Status__c) == false
            && this.estimate.Process_Status__c != '草案中'
            //&& this.estimate.Process_Status__c != '不批准'
            ) {
            return true;
         }
         return false;
   public Boolean getSaveBtnDisabled() {
      // 見積もりsaveできない条件の判断
      if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
         return true;
      }
      public Boolean getPrintBtnDisabled() {
         // 印刷できない条件の判断
         if (this.estimate.Process_Status__c != '批准' || !this.contract.Status__c.equals('引合中') ) {
            return true;
         } else {
            if (String.isBlank(this.estimate.Change_Dealer_Approval__c) == false
               && this.estimate.Change_Dealer_Approval__c != '批准'
               && this.estimate.Change_Dealer_Approval__c != '未批准') {
               return true;
            }
         }
         return false;
      if (String.isBlank(this.estimate.Process_Status__c) == false
         && this.estimate.Process_Status__c != '草案中'
         //&& this.estimate.Process_Status__c != '不批准'
         ) {
         return true;
      }
      return false;
   }
   public Boolean getPrintBtnDisabled() {
      // 印刷できない条件の判断
      if (this.estimate.Process_Status__c != '批准' || !this.contract.Status__c.equals('引合中') ) {
         return true;
      } else {
         if (String.isBlank(this.estimate.Change_Dealer_Approval__c) == false
            && this.estimate.Change_Dealer_Approval__c != '批准'
            && this.estimate.Change_Dealer_Approval__c != '未批准') {
            return true;
         }
      }
      return false;
   }
   // 页面项目非活性设定
      public Boolean getPageDisabled() {
         if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
            return true;
         }
         if (String.isBlank(this.estimate.Process_Status__c) == false
            && this.estimate.Process_Status__c != '草案中'
            ) {
            return true;
         }
         return false;
   public Boolean getPageDisabled() {
      if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
         return true;
      }
      if (String.isBlank(this.estimate.Process_Status__c) == false
         && this.estimate.Process_Status__c != '草案中'
         ) {
         return true;
      }
      return false;
   }
   // 2021、8、26 合同报价页面的优化,无保有设备点检对象选择框变黑 fxk star
   // public Boolean getPageDisabled1() {
   
@@ -489,469 +493,483 @@
   //     return false;
   // }
   // 2021、8、26 合同报价页面的优化,无保有设备点检对象选择框变黑 fxk end
      public Integer productCount {
         get {
            return checkedAssets == null ? 0 : checkedAssets.size();
         }
   public Integer productCount {
      get {
         return checkedAssets == null ? 0 : checkedAssets.size();
      }
      public Integer productCount2 {
         get {
            return unCheckedAssets == null ? 0 : unCheckedAssets.size();
         }
   }
   public Integer productCount2 {
      get {
         return unCheckedAssets == null ? 0 : unCheckedAssets.size();
      }
      public Integer productCount3 {
         get {
            Integer cnt = 0;
            for (AssetInfo input : this.checkedAssets) {
               if (!input.isManual || input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
                  cnt += 1;
               }
   }
   public Integer productCount3 {
      get {
         Integer cnt = 0;
         for (AssetInfo input : this.checkedAssets) {
            if (!input.isManual || input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
               cnt += 1;
            }
            return cnt;
         }
         return cnt;
      }
   }
   // TODO カスタムラベルから取得
      public static Decimal oxygenPriceAdj { get { return 0.1; } }          // TODO katsu 酸化水を使用しないように変更
      public static Decimal isNewPriceAdj { get { return 1; } }
   public static Decimal oxygenPriceAdj { get { return 0.1; } }              // TODO katsu 酸化水を使用しないように変更
   public static Decimal isNewPriceAdj { get { return 1; } }
   
   //public String productName { get; set; }
      public Integer productIdx { get; set; }
   public Integer productIdx { get; set; }
   
      public Integer isNewAddMonth { get { return Integer.valueOf(System.Label.MC_New_AddMonth); } }
   public Integer isNewAddMonth { get { return Integer.valueOf(System.Label.MC_New_AddMonth); } }
   
      public Integer keepPriceMonth { get { return Integer.valueOf(System.Label.MC_KeepPrice_Month); } }
   public Integer keepPriceMonth { get { return Integer.valueOf(System.Label.MC_KeepPrice_Month); } }
   
      public Boolean isPageAction = false;
   public Boolean isPageAction = false;
   
      private Integer PosttoInstall { get { return Integer.valueOf(System.Label.Post_to_Install); }}
   private Integer PosttoInstall { get { return Integer.valueOf(System.Label.Post_to_Install); }}
   
      public Boolean changedSubmitPrice {get; set;}
   public Boolean changedSubmitPrice {get; set;}
   
      public Boolean isSaveOrApproval {get; set;}
      public String OldContractStartDate {get; set;}
      public String OldMaintenancePrice { get; set; }
   public Boolean isSaveOrApproval {get; set;}
   public String OldContractStartDate {get; set;}
   public String OldMaintenancePrice { get; set; }
   
   /**
    * コンストラクタ
    */
      public SelectAssetEstimateURFController() {
         currPage = 1;
         selRecordOption = '20';
         totalRecords = 0;
      }
   public SelectAssetEstimateURFController() {
      currPage = 1;
      selRecordOption = '20';
      totalRecords = 0;
   }
   /**
    * Visaulforceから呼ばれるコンストラクタ
    */
      public SelectAssetEstimateURFController(ApexPages.StandardController controller) {
         //HWAG-B4R3SS  START 20181026
         currPage = 1;
         selRecordOption = '20';
         //this.targetEstimateId = (String)(ApexPages.currentPage().getParameters().get('id'));
         totalRecords = 0;
         //HWAG-B4R3SS  END 20181026
   public SelectAssetEstimateURFController(ApexPages.StandardController controller) {
      //HWAG-B4R3SS  START 20181026
      currPage = 1;
      selRecordOption = '20';
      //this.targetEstimateId = (String)(ApexPages.currentPage().getParameters().get('id'));
      totalRecords = 0;
      //HWAG-B4R3SS  END 20181026
   }
   private void setThisEstimate() {
      //HWAG-B399Q8 2018/08/20  添加一额外字段 IS_Clone_After_Decide__c start
      this.estimate = [SELECT Id, Name, Maintenance_Contract__c, Estimation_Decision__c, CreatedDate, Service_Contract_Staff__c,
                   JingliApprovalManager__c, BuchangApprovalManager__c, ZongjianApprovalManager__c, Finally_Approved_Staff__c,
                   Contract_Esti_Start_Date__c, Contract_Esti_End_Date__c, Contract_Range__c, Contract_Start_Date__c, Contract_End_Date__c,
                   Maintenance_Contract_Status__c, Discount_reason__c, Improve_ConsumptionRate_Idea__c, Process_Status__c,
                   Estimate_Trial_Money__c, Maintenance_Price__c, Department__c, PrintDate__c, Quote_Date__c, Submit_quotation_day__c,
                   Examination_Price__c, Service_contract_target_number__c,
                   Maintenance_Contract__r.Payment_Plan_Sum_First__c, Maintenance_Contract__r.Payment_Plan_Date_First__c,
                   Maintenance_Contract__r.Payment_Plan_Sum_Second__c,
                   Maintenance_Contract__r.Payment_Plan_Sum_Third__c,
                   Maintenance_Contract__r.Payment_Plan_Sum_Forth__c,
                   Maintenance_Contract__r.Payment_Plan_Sum_Fifth__c,
                   Maintenance_Contract__r.Payment_Plan_Sum_Sixth__c,
                   Discount_Price__c, Discount_Percentage__c, IsSyncing__c,
                   NotUse_Oxygenated_Water__c, Estimate_Target__c, Dealer__c,
                   Append_Condition_Price__c, Asset_Sum_Price__c, Asset_Repair_Sum_Price__c,
                   Print_Contract__c, Print_RepairPrice__c, Print_DiscountPercentage__c, Print_Agent__c, Change_Dealer_Approval__c,
                   Print_DiscountPrice__c, Print_ListPrice__c, Print_MaintePrice__c, Print_SumPrice__c, Print_Tripartite__c, TKZongjianApprovalManager__c
                   //打印报价(简化版) 2019/12/18 start
                   , IS_Clone_After_Decide__c, New_contract_offer__c, NewEstimation_Amount__c, EndUserType__c, Print_Simplify__c
                   //打印报价(简化版) 2019/12/18 end
                   //最低价格 最高价格 申请背景相关字段 20200108 start
                   , GuidePrice_Up__c, GuidePrice_Down__c, finalPriceDecideWay__c, mainTalksTime__c, talksStartDate__c
                   , Combined_rate__c, New_Contract_Type_TxT__c, Estimate_Price_range__c
                   //最低价格 最高价格计算 20200108 end
                   , Sales_incidental__c, Consumption_rate_Forecast__c, AgencyHos_Price__c
                   // 申请报价金额 和 相对标准价格范围的折扣率
                   , Request_quotation_Amount__c, Service_discount_Rate__c, ContractPriceType__c
                   , LastMContract1__c, LastMContract2__c, LastMContract3__c, LastMContract4__c, LastMContract5__c
                   , LastMContract1_ConCount__c, LastMContract2_ConCount__c, LastMContract3_ConCount__c, LastMContract4_ConCount__c, LastMContract5_ConCount__c,
                   LastMContract1_NO__c, LastMContract2_NO__c, LastMContract3_NO__c, LastMContract4_NO__c, LastMContract5_NO__c
                   FROM Maintenance_Contract_Estimate__c WHERE Id = :this.targetEstimateId];
      //HWAG-B399Q8 2018/08/20  添加一额外字段 IS_Clone_After_Decide__c end
      decimal PriceSum =  (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_First__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_First__c) +
                     (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Second__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Second__c) +
                     (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Third__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Third__c) +
                     (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Forth__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Forth__c) +
                     (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Fifth__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Fifth__c) +
                     (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Sixth__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Sixth__c);
      if ( this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_First__c == null
          //102018/10/26 HWAG-B5C88S 不再根据是否填写第一次付款日期判断
          ) {
         isPaymentSet = 'false';
      } else if (this.estimate.Maintenance_Price__c != PriceSum) {
         isPaymentSet = 'Denied';
      } else {
         isPaymentSet = 'true';
      }
   }
   
      private void setThisEstimate() {
         //HWAG-B399Q8 2018/08/20  添加一额外字段 IS_Clone_After_Decide__c start
         this.estimate = [SELECT Id, Name, Maintenance_Contract__c, Estimation_Decision__c, CreatedDate, Service_Contract_Staff__c,
                      JingliApprovalManager__c, BuchangApprovalManager__c, ZongjianApprovalManager__c, Finally_Approved_Staff__c,
                      Contract_Esti_Start_Date__c, Contract_Esti_End_Date__c, Contract_Range__c, Contract_Start_Date__c, Contract_End_Date__c,
                      Maintenance_Contract_Status__c, Discount_reason__c, Improve_ConsumptionRate_Idea__c, Process_Status__c,
                      Estimate_Trial_Money__c, Maintenance_Price__c, Department__c, PrintDate__c, Quote_Date__c, Submit_quotation_day__c,
                      Examination_Price__c, Service_contract_target_number__c,
                      Maintenance_Contract__r.Payment_Plan_Sum_First__c, Maintenance_Contract__r.Payment_Plan_Date_First__c,
                      Maintenance_Contract__r.Payment_Plan_Sum_Second__c,
                      Maintenance_Contract__r.Payment_Plan_Sum_Third__c,
                      Maintenance_Contract__r.Payment_Plan_Sum_Forth__c,
                      Maintenance_Contract__r.Payment_Plan_Sum_Fifth__c,
                      Maintenance_Contract__r.Payment_Plan_Sum_Sixth__c,
                      Discount_Price__c, Discount_Percentage__c, IsSyncing__c,
                      NotUse_Oxygenated_Water__c, Estimate_Target__c, Dealer__c,
                      Append_Condition_Price__c, Asset_Sum_Price__c, Asset_Repair_Sum_Price__c,
                      Print_Contract__c, Print_RepairPrice__c, Print_DiscountPercentage__c, Print_Agent__c, Change_Dealer_Approval__c,
                      Print_DiscountPrice__c, Print_ListPrice__c, Print_MaintePrice__c, Print_SumPrice__c, Print_Tripartite__c, TKZongjianApprovalManager__c
                      //打印报价(简化版) 2019/12/18 start
                      , IS_Clone_After_Decide__c, New_contract_offer__c, NewEstimation_Amount__c, EndUserType__c, Print_Simplify__c
                      //打印报价(简化版) 2019/12/18 end
                      //最低价格 最高价格 申请背景相关字段 20200108 start
                      , GuidePrice_Up__c, GuidePrice_Down__c, finalPriceDecideWay__c, mainTalksTime__c, talksStartDate__c
                      , Combined_rate__c, New_Contract_Type_TxT__c, Estimate_Price_range__c
                      //最低价格 最高价格计算 20200108 end
                      , Sales_incidental__c, Consumption_rate_Forecast__c, AgencyHos_Price__c
                      // 申请报价金额 和 相对标准价格范围的折扣率
                      , Request_quotation_Amount__c, Service_discount_Rate__c, ContractPriceType__c
                      , LastMContract1__c, LastMContract2__c, LastMContract3__c, LastMContract4__c, LastMContract5__c
                      , LastMContract1_ConCount__c, LastMContract2_ConCount__c, LastMContract3_ConCount__c, LastMContract4_ConCount__c, LastMContract5_ConCount__c,
                      LastMContract1_NO__c, LastMContract2_NO__c, LastMContract3_NO__c, LastMContract4_NO__c, LastMContract5_NO__c
   public void init() {
      typeresult = null;
      changedAfterPrint = false;
      changedSubmitPrice = false;
      isSaveOrApproval = false;
      OldContractStartDate = null;
      OldMaintenancePrice = null;
   
                      FROM Maintenance_Contract_Estimate__c WHERE Id = : this.targetEstimateId];
         //HWAG-B399Q8 2018/08/20  添加一额外字段 IS_Clone_After_Decide__c end
         decimal PriceSum =  (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_First__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_First__c) +
                        (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Second__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Second__c) +
                        (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Third__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Third__c) +
                        (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Forth__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Forth__c) +
                        (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Fifth__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Fifth__c) +
                        (this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Sixth__c == null ? 0 : this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_Sixth__c);
         if ( this.estimate.Maintenance_Contract__r.Payment_Plan_Sum_First__c == null
             //102018/10/26 HWAG-B5C88S 不再根据是否填写第一次付款日期判断
             ) {
            isPaymentSet = 'false';
         } else if (this.estimate.Maintenance_Price__c != PriceSum) {
            isPaymentSet = 'Denied';
         } else {
            isPaymentSet = 'true';
         }
      }
      inDicideFlag = false;
   
      public void init() {
         typeresult = null;
         changedAfterPrint = false;
         changedSubmitPrice = false;
         isSaveOrApproval = false;
         OldContractStartDate = null;
         OldMaintenancePrice = null;
      isSoft = false;
      activeOn = true;
      //LJPH-BSS6E2  ---20200911 ---update by rentongxiao start
      contr = '1';
      val1 = '主机';
      //LJPH-BSS6E2  ---20200911 ---update by rentongxiao end
   
         inDicideFlag = false;
      Date systemToday = System.today();
      if (isPageAction == false) {
         //HWAG-B399Q8 2018/08/20  添加状态5,为按save 按键后状态 start
         if (String.isBlank(ApexPages.currentPage().getParameters().get('completion')) == false) {
            if (ApexPages.currentPage().getParameters().get('completion') == '1') {
               ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, System.Label.Message_002));
            } else if (ApexPages.currentPage().getParameters().get('completion') == '2') {
               ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '审批提交成功。'));
            } else if (ApexPages.currentPage().getParameters().get('completion') == '3') {
               ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'Decided。'));
            } else if (ApexPages.currentPage().getParameters().get('completion') == '4') {
   
         isSoft = false;
         activeOn = true;
         //LJPH-BSS6E2  ---20200911 ---update by rentongxiao start
         contr = '1';
         val1 = '主机';
         //LJPH-BSS6E2  ---20200911 ---update by rentongxiao end
         Date systemToday = System.today();
         if (isPageAction == false) {
            //HWAG-B399Q8 2018/08/20  添加状态5,为按save 按键后状态 start
            if (String.isBlank(ApexPages.currentPage().getParameters().get('completion')) == false) {
               if (ApexPages.currentPage().getParameters().get('completion') == '1') {
                  ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, System.Label.Message_002));
               } else if (ApexPages.currentPage().getParameters().get('completion') == '2') {
                  ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '审批提交成功。'));
               } else if (ApexPages.currentPage().getParameters().get('completion') == '3') {
                  ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'Decided。'));
               } else if (ApexPages.currentPage().getParameters().get('completion') == '4') {
               } else if (ApexPages.currentPage().getParameters().get('completion') == '5') {
                  ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, System.Label.Message_002));
               }
            } else if (ApexPages.currentPage().getParameters().get('completion') == '5') {
               ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, System.Label.Message_002));
            }
            //HWAG-B399Q8 2018/08/20  添加状态5,为按save 按键后状态 end
         }
         this.printAsset = false;
         this.printContract = false;
         this.printTripartite = false;
         this.printAgent = false;
         String copyid = '';
         if (isPageAction == false) {
            this.targetEstimateId = ApexPages.currentPage().getParameters().get('copyid');
            copyid = ApexPages.currentPage().getParameters().get('copyid');
            if (this.targetEstimateId == null) {
               String paramId = ApexPages.currentPage().getParameters().get('id');
               if (String.isBlank(paramId) == false && paramId.startsWith('a0z')) {
                  Maintenance_Contract_Asset_Estimate__c mcaeParam = [Select Maintenance_Contract_Estimate__c from Maintenance_Contract_Asset_Estimate__c where Id = : paramId];
                  this.targetEstimateId = mcaeParam.Maintenance_Contract_Estimate__c;
               } else {
                  this.targetEstimateId = paramId;
               }
         //HWAG-B399Q8 2018/08/20  添加状态5,为按save 按键后状态 end
      }
      this.printAsset = false;
      this.printContract = false;
      this.printTripartite = false;
      this.printAgent = false;
      String copyid = '';
      if (isPageAction == false) {
         this.targetEstimateId = ApexPages.currentPage().getParameters().get('copyid');
         copyid = ApexPages.currentPage().getParameters().get('copyid');
         if (this.targetEstimateId == null) {
            String paramId = ApexPages.currentPage().getParameters().get('id');
            if (String.isBlank(paramId) == false && paramId.startsWith('a0z')) {
               Maintenance_Contract_Asset_Estimate__c mcaeParam = [Select Maintenance_Contract_Estimate__c from Maintenance_Contract_Asset_Estimate__c where Id = :paramId];
               this.targetEstimateId = mcaeParam.Maintenance_Contract_Estimate__c;
            } else {
               this.newIns = true;
               this.targetEstimateId = paramId;
            }
            this.targetMaintenanceContractId = ApexPages.currentPage().getParameters().get('mcid');
         }
         // 編集から
         if (String.isBlank(this.targetEstimateId) == false) {
            setThisEstimate();
            this.targetMaintenanceContractId = this.estimate.Maintenance_Contract__c;
            this.setContractInfo(this.targetMaintenanceContractId);
         }
         // 新規から
         else if (!String.isBlank(this.targetMaintenanceContractId)) {
            this.estimate = new Maintenance_Contract_Estimate__c();
            this.estimate.Maintenance_Contract__c = this.targetMaintenanceContractId;
            this.estimate.Contract_Esti_Start_Date__c = systemToday;
            this.estimate.Contract_Start_Date__c = systemToday;
            this.setContractInfo(this.targetMaintenanceContractId);
         } else {
            this.newIns = true;
         }
         // 何もなければ、念のため
         else {
            throw new ControllerUtil.myException('无法显示维修合同报价');
            //return;
         }
         //HWAG-B399Q8 2018/08/20  检验是否显示'请提交待审批' start
         IS_Clone_After_Decide = false;
         if (String.isBlank(ApexPages.currentPage().getParameters().get('completion')) == false &&
            ApexPages.currentPage().getParameters().get('completion') == '5' &&
            this.estimate != null && this.estimate.IS_Clone_After_Decide__c) {
            IS_Clone_After_Decide = true;
         this.targetMaintenanceContractId = ApexPages.currentPage().getParameters().get('mcid');
      }
      // 編集から
      if (String.isBlank(this.targetEstimateId) == false) {
         setThisEstimate();
         this.targetMaintenanceContractId = this.estimate.Maintenance_Contract__c;
         this.setContractInfo(this.targetMaintenanceContractId);
      }
      // 新規から
      else if (!String.isBlank(this.targetMaintenanceContractId)) {
         this.estimate = new Maintenance_Contract_Estimate__c();
         this.estimate.Maintenance_Contract__c = this.targetMaintenanceContractId;
         this.estimate.Contract_Esti_Start_Date__c = systemToday;
          this.estimate.Contract_Start_Date__c = systemToday;
         this.setContractInfo(this.targetMaintenanceContractId);
         this.newIns = true;
      }
      // 何もなければ、念のため
      else {
         throw new ControllerUtil.myException('无法显示维修合同报价');
         //return;
      }
      //HWAG-B399Q8 2018/08/20  检验是否显示'请提交待审批' start
      IS_Clone_After_Decide = false;
      if (String.isBlank(ApexPages.currentPage().getParameters().get('completion')) == false &&
         ApexPages.currentPage().getParameters().get('completion') == '5' &&
         this.estimate != null && this.estimate.IS_Clone_After_Decide__c) {
         IS_Clone_After_Decide = true;
   
         }
         //HWAG-B399Q8 2018/08/20  检验是否显示'请提交待审批' end
         // 納入機器の情報を取得
         //tcm 删除第4行 Maintenance_Contract_No_F__c 替换 Management_Code__c  20211201 start
         if (!String.isBlank(this.targetHospitalId) && (this.targetHospitalId.length() == 15 || this.targetHospitalId.length() == 18)) {
            assetRecords = [SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, Posting_Date__c, Management_Code__c, IF_Warranty__c, Reson_Can_not_Warranty__c,
                        InstallDate, isNewDate_use__c, Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c, CurrentContract_End_Date__c, EquipmentGuaranteeFlg__c,
      }
      //HWAG-B399Q8 2018/08/20  检验是否显示'请提交待审批' end
      // 納入機器の情報を取得
      //tcm 删除第4行 Maintenance_Contract_No_F__c 替换 Management_Code__c  20211201 start
      if (!String.isBlank(this.targetHospitalId) && (this.targetHospitalId.length() == 15 || this.targetHospitalId.length() == 18)) {
         assetRecords = [SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, Posting_Date__c, Management_Code__c, IF_Warranty__c, Reson_Can_not_Warranty__c,
                     InstallDate, isNewDate_use__c, Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c, CurrentContract_End_Date__c, EquipmentGuaranteeFlg__c,
                        CurrentContract_F__c, CurrentContract_F__r.Management_Code__c,CurrentContract_F__r.Maintenance_Contract_No_F__c, CurrentContract_F__r.RecordType_DeveloperName__c, CurrentContract_F__r.Estimate_Num__c, CurrentContract_F__r.Contract_End_Date__c, CurrentContract_F__r.Estimate_Contract_endDate__c,
                        CurrentContract_F_asset__c, CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c, CurrentContract_F_asset__r.endDateGurantee_Text__c, CurrentContract_F__r.Gurantee_Estimate_startDate__c,
                        CurrentContract_F__r.First_Estimate_Date__c,
                        CurrentContract_F__r.Contract_Consumption_rate__c, CurrentContract_F__r.First_contract_usage_Rate__c,
                        CurrentContract_F__r.Contract_Range__c, AssetMark__c
                        // 限次合同信息 add by gzw start
                        , Product2.ProductURF__c, Product2.ProductURF__r.URFLimitSerial__c, Product2.ProductURF__r.UFR_MaxRepairCount__c, Product2.ProductURF__r.UFR_Maintenance_Price_Month__c
                        // 限次合同信息 add by gzw end
                        FROM Asset WHERE Hospital__c = : this.targetHospitalId AND ( AssetMark__c != '耗材' OR Product2.Family != 'ET' ) ORDER BY ID, IF_Warranty__c asc];
            //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
            // assetRecords = [SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c,
            //                      InstallDate,isNewDate_use__c, Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c,CurrentContract_End_Date__c,EquipmentGuaranteeFlg__c,
            //                      CurrentContract_F__c,CurrentContract_F__r.Maintenance_Contract_No_F__c,CurrentContract_F__r.RecordType_DeveloperName__c,CurrentContract_F__r.Estimate_Num__c,CurrentContract_F__r.Contract_End_Date__c,CurrentContract_F__r.Estimate_Contract_endDate__c,
            //                      CurrentContract_F_asset__c,CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,CurrentContract_F_asset__r.endDateGurantee_Text__c,CurrentContract_F__r.Gurantee_Estimate_startDate__c,
            //                      CurrentContract_F__r.First_Estimate_Date__c,
            //                     CurrentContract_F__r.Contract_Consumption_rate__c,CurrentContract_F__r.First_contract_usage_Rate__c,
            //                     CurrentContract_F__r.Contract_Range__c ,AssetMark__c
            //                      FROM Asset WHERE Hospital__c = :this.targetHospitalId AND AssetMark__c = '主机' ORDER BY ID,IF_Warranty__c asc];
            //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
         } else {
            assetRecords = new List<Asset>();
         }
         //sqlStr += ' AND AssetMark__c != \'耗材\' AND Product2.Family != \'ET\' ';
         this.checkedAssets = new List<AssetInfo>();
         this.unCheckedAssets = new List<AssetInfo>();
                     CurrentContract_F_asset__c, CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c, CurrentContract_F_asset__r.endDateGurantee_Text__c, CurrentContract_F__r.Gurantee_Estimate_startDate__c,
                     CurrentContract_F__r.First_Estimate_Date__c,
                     CurrentContract_F__r.Contract_Consumption_rate__c, CurrentContract_F__r.First_contract_usage_Rate__c,
                     CurrentContract_F__r.Contract_Range__c, AssetMark__c
                     // 限次合同信息 add by gzw start
                     , Product2.ProductURF__c, Product2.ProductURF__r.URFLimitSerial__c, Product2.ProductURF__r.UFR_MaxRepairCount__c, Product2.ProductURF__r.UFR_Maintenance_Price_Month__c
                     // 限次合同信息 add by gzw end
                     //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
                     , Product2.ProductURF__r.Maintenance_Price_Year_URF_Max__c, Product2.ProductURF__r.Maintenance_Price_Year_URF__c
                     //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
                     FROM Asset WHERE Hospital__c = :this.targetHospitalId AND ( AssetMark__c != '耗材' OR Product2.Family != 'ET' ) ORDER BY ID, IF_Warranty__c asc];
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
         // assetRecords = [SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c,
         //                      InstallDate,isNewDate_use__c, Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c,CurrentContract_End_Date__c,EquipmentGuaranteeFlg__c,
         //                      CurrentContract_F__c,CurrentContract_F__r.Maintenance_Contract_No_F__c,CurrentContract_F__r.RecordType_DeveloperName__c,CurrentContract_F__r.Estimate_Num__c,CurrentContract_F__r.Contract_End_Date__c,CurrentContract_F__r.Estimate_Contract_endDate__c,
         //                      CurrentContract_F_asset__c,CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,CurrentContract_F_asset__r.endDateGurantee_Text__c,CurrentContract_F__r.Gurantee_Estimate_startDate__c,
         //                      CurrentContract_F__r.First_Estimate_Date__c,
         //                     CurrentContract_F__r.Contract_Consumption_rate__c,CurrentContract_F__r.First_contract_usage_Rate__c,
         //                     CurrentContract_F__r.Contract_Range__c ,AssetMark__c
         //                      FROM Asset WHERE Hospital__c = :this.targetHospitalId AND AssetMark__c = '主机' ORDER BY ID,IF_Warranty__c asc];
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
      } else {
         assetRecords = new List<Asset>();
      }
      //sqlStr += ' AND AssetMark__c != \'耗材\' AND Product2.Family != \'ET\' ';
      this.checkedAssets = new List<AssetInfo>();
      this.unCheckedAssets = new List<AssetInfo>();
   
         // 選択済みの納入機器情報を取得
         Map<Id, Integer> selectedAssetIds = new Map<Id, Integer>();
         List<Maintenance_Contract_Asset_Estimate__c> selectedMcaes = new List<Maintenance_Contract_Asset_Estimate__c>();
         List<Maintenance_Contract_Asset_Estimate__c> newMcaes = new List<Maintenance_Contract_Asset_Estimate__c>();
         // 新規、且つ1つ目見積もりの場合、コピー元の保有設備を持つ
         if (String.isBlank(this.targetEstimateId) && this.contract.Estimate_Num__c == 0) {
            // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '00000000000000000000000000'));
            List<Maintenance_Contract_Asset__c> oldVals = [
               select Id, Name, Asset__c, Asset__r.InstallDate, Asset__r.isNewDate_use__c,
               Asset__r.Posting_Date__c, Asset__r.Maintenance_Price_Month__c,
               Asset__r.EquipmentGuaranteeFlg__c,
               Asset__r.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,
               Asset__r.CurrentContract_F_asset__r.endDateGurantee_Text__c,
               Asset__r.CurrentContract_F__r.First_Estimate_Date__c,
               Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c,
               Asset__r.CurrentContract_F__r.First_contract_usage_Rate__c,
               Asset__r.CurrentContract_F__r.Estimate_Contract_endDate__c,
               Asset__r.CurrentContract_F__r.Contract_Range__c,
               Asset__r.CurrentContract_F__r.Contract_End_Date__c,
               Asset__r.CurrentContract_F__r.Gurantee_Estimate_startDate__c
               // 20210315 gzw 追加限次产品信息 start
               , Asset__r.Product2.ProductURF__c
               , Asset__r.Product2.ProductURF__r.URFLimitSerial__c,
               Asset__r.Product2.ProductURF__r.UFR_MaxRepairCount__c,
               Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c
               // 20210315 gzw 追加限次产品信息 start
               from Maintenance_Contract_Asset__c
               where Maintenance_Contract__c = : this.targetMaintenanceContractId AND Asset__r.Product2.ProductURF__c != null
            ];
            Date mon1stDate = Date.newInstance(Date.today().year(), Date.today().month(), 1);
            for (Maintenance_Contract_Asset__c mca : oldVals) {
               // oldより更新したい項目
               Boolean isNew = false;
      // 選択済みの納入機器情報を取得
      Map<Id, Integer> selectedAssetIds = new Map<Id, Integer>();
      List<Maintenance_Contract_Asset_Estimate__c> selectedMcaes = new List<Maintenance_Contract_Asset_Estimate__c>();
      List<Maintenance_Contract_Asset_Estimate__c> newMcaes = new List<Maintenance_Contract_Asset_Estimate__c>();
      // 新規、且つ1つ目見積もりの場合、コピー元の保有設備を持つ
      if (String.isBlank(this.targetEstimateId) && this.contract.Estimate_Num__c == 0) {
         // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '00000000000000000000000000'));
         List<Maintenance_Contract_Asset__c> oldVals = [
            select Id, Name, Asset__c, Asset__r.InstallDate, Asset__r.isNewDate_use__c,
            Asset__r.Posting_Date__c, Asset__r.Maintenance_Price_Month__c,
            Asset__r.EquipmentGuaranteeFlg__c,
            Asset__r.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,
            Asset__r.CurrentContract_F_asset__r.endDateGurantee_Text__c,
            Asset__r.CurrentContract_F__r.First_Estimate_Date__c,
            Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c,
            Asset__r.CurrentContract_F__r.First_contract_usage_Rate__c,
            Asset__r.CurrentContract_F__r.Estimate_Contract_endDate__c,
            Asset__r.CurrentContract_F__r.Contract_Range__c,
            Asset__r.CurrentContract_F__r.Contract_End_Date__c,
            Asset__r.CurrentContract_F__r.Gurantee_Estimate_startDate__c
            // 20210315 gzw 追加限次产品信息 start
            , Asset__r.Product2.ProductURF__c
            , Asset__r.Product2.ProductURF__r.URFLimitSerial__c,
            Asset__r.Product2.ProductURF__r.UFR_MaxRepairCount__c,
            Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c
            // 20210315 gzw 追加限次产品信息 start
            //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
            , Asset__r.Product2.ProductURF__r.Maintenance_Price_Year_URF_Max__c, Asset__r.Product2.ProductURF__r.Maintenance_Price_Year_URF__c
            //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
            from Maintenance_Contract_Asset__c
            where Maintenance_Contract__c = :this.targetMaintenanceContractId AND Asset__r.Product2.ProductURF__c != null
         ];
         Date mon1stDate = Date.newInstance(Date.today().year(), Date.today().month(), 1);
         for (Maintenance_Contract_Asset__c mca : oldVals) {
            // oldより更新したい項目
            Boolean isNew = false;
            // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
            boolean isCheck = true;
            // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk End
            // 20210315 gzw 追加限次产品信息 start
            // Decimal listPrice = mca.Asset__r.Maintenance_Price_Month__c;
            Decimal listPrice = mca.Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
            // 20210315 gzw 追加限次产品信息 end
            Decimal asset_Consumption_rate = null;
            // 取上一期合同消费率
            if (mca.Asset__r.CurrentContract_F__r.First_Estimate_Date__c != null && mca.Asset__r.CurrentContract_F__r.Estimate_Contract_endDate__c > mon1stDate) {
               asset_Consumption_rate = mca.Asset__r.CurrentContract_F__r.First_contract_usage_Rate__c;
            } else {
               asset_Consumption_rate = mca.Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c;
            }
            // InstallDate と 今日を比較
            // 1.安装日或者发货日和今天比较 实时变化
            // 2.提交后不再变化
            //Date createdDate = (estimate.CreatedDate == null || !String.isBlank(copyid)) ? systemToday : estimate.CreatedDate.date();
            Date createdDate = systemToday;
            if (createdDate.addMonths(isNewAddMonth) < mca.Asset__r.isNewDate_use__c) {
               isNew = true;
               // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
               boolean isCheck = true;
               isCheck = true;
               // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk End
               // 20210315 gzw 追加限次产品信息 start
               // Decimal listPrice = mca.Asset__r.Maintenance_Price_Month__c;
               Decimal listPrice = mca.Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
               // listPrice = mca.Asset__r.Maintenance_Price_Month__c * isNewPriceAdj;
               listPrice = mca.Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c  * isNewPriceAdj;
               // 20210315 gzw 追加限次产品信息 end
               Decimal asset_Consumption_rate = null;
               // 取上一期合同消费率
               if (mca.Asset__r.CurrentContract_F__r.First_Estimate_Date__c != null && mca.Asset__r.CurrentContract_F__r.Estimate_Contract_endDate__c > mon1stDate) {
                  asset_Consumption_rate = mca.Asset__r.CurrentContract_F__r.First_contract_usage_Rate__c;
               } else {
                  asset_Consumption_rate = mca.Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c;
               }
               // InstallDate と 今日を比較
               // 1.安装日或者发货日和今天比较 实时变化
               // 2.提交后不再变化
               //Date createdDate = (estimate.CreatedDate == null || !String.isBlank(copyid)) ? systemToday : estimate.CreatedDate.date();
               Date createdDate = systemToday;
               if (createdDate.addMonths(isNewAddMonth) < mca.Asset__r.isNewDate_use__c) {
                  isNew = true;
                  // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
                  isCheck = true;
                  // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk End
                  // 20210315 gzw 追加限次产品信息 start
                  // listPrice = mca.Asset__r.Maintenance_Price_Month__c * isNewPriceAdj;
                  listPrice = mca.Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c  * isNewPriceAdj;
                  // 20210315 gzw 追加限次产品信息 end
   
               }
               selectedAssetIds.put(mca.Asset__c, selectedMcaes.size());
               selectedMcaes.add(new Maintenance_Contract_Asset_Estimate__c(
                                Asset__c = mca.Asset__c,
                                isNew__c = isNew,
                                // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
                                Check_Object__c = isCheck,
                                // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk End
                                Estimate_List_Price__c = listPrice,
                                // 取上一期合同价格
                                LastMContract_Price__c = mca.Asset__r.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,
                                Asset_Consumption_rate__c = asset_Consumption_rate,
                                EquipmentGuaranteeFlgTxt__c = mca.Asset__r.EquipmentGuaranteeFlg__c
                                ));
            }
         } else {
            List<Maintenance_Contract_Asset_Estimate__c> selectlist = [SELECT Id FROM
                                                         Maintenance_Contract_Asset_Estimate__c
                                                         WHERE Maintenance_Contract_Estimate__c = : this.targetEstimateId ];
            selectedAssetIds.put(mca.Asset__c, selectedMcaes.size());
            selectedMcaes.add(new Maintenance_Contract_Asset_Estimate__c(
                       Asset__c = mca.Asset__c,
                       isNew__c = isNew,
                       // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
                       Check_Object__c = isCheck,
                       // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk End
                       Estimate_List_Price__c = listPrice,
                       // 取上一期合同价格
                       LastMContract_Price__c = mca.Asset__r.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,
   
            // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '111111111111111111111111' + selectlist.size()));
            for (Maintenance_Contract_Asset_Estimate__c mcae : [SELECT Id,
                                                   Name,
                                                   Maintenance_Contract_Estimate__c,
                                                   Asset__c,
                                                   Asset__r.Maintenance_Price_Month__c,
                                                   Asset__r.InstallDate,
                                                   Asset__r.isNewDate_use__c,
                                                   Asset__r.EquipmentGuaranteeFlg__c,
                                                   Asset_Consumption_rate__c,
                                                   Asset__r.CurrentContract_F__c,
                                                   Asset__r.CurrentContract_F__r.First_Estimate_Date__c,
                                                   Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c,
                                                   Asset__r.CurrentContract_F__r.First_contract_usage_Rate__c,
                                                   Asset__r.CurrentContract_F__r.Estimate_Contract_endDate__c,
                                                   Asset__r.CurrentContract_F__r.Contract_Range__c,
                                                   Asset__r.CurrentContract_F__r.Contract_End_Date__c,
                                                   Asset__r.CurrentContract_F__r.Gurantee_Estimate_startDate__c,
                                                   LastMContract_Price__c,
                                                   Asset__r.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,
                                                   Asset__r.CurrentContract_F_asset__r.endDateGurantee_Text__c,
                                                   Product_Manual__c,
                                                   Product_Manual__r.EquipmentGuaranteeFlg__c,
                                                   Product_Manual__r.Maintenance_Price_Month__c,
                                                   Product_Manual__r.Name,
                                                   // 20210315 gzw 追加限次产品信息 start
                                                   Product_Manual__r.ProductURF__c,
                                                   Product_Manual__r.ProductURF__r.URFLimitSerial__c,
                                                   Product_Manual__r.ProductURF__r.UFR_MaxRepairCount__c,
                                                   Product_Manual__r.ProductURF__r.UFR_Maintenance_Price_Month__c,
                                                   Asset__r.Product2.ProductURF__c,
                                                   Asset__r.Product2.ProductURF__r.URFLimitSerial__c,
                                                   Asset__r.Product2.ProductURF__r.UFR_MaxRepairCount__c,
                                                   Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c,
                                                   URF_Series__c,
                                                   Series_RepairCount__c,
                                                   Series_MaxRepairCount__c,
                                                   Asset_RepairCount__c,
                                                   Asset_MaxRepairCount__c,
                                                   // 20210315 gzw 追加限次产品信息 start
                                                   IsNew__c,
                                                   //add 2021.6.4 fxk  Start
                                                   Check_Object__c,
                                                   //add 2021.6.4 fxk  end
                                                   Estimate_List_Price__c,
                                                   //Maintenance_Price_YearTXT__c,
                                                   Estimate_Cost__c,
                                                   Adjustment_ratio_Upper__c,
                                                   Adjustment_ratio_Lower__c,
                                                   Adjustment_Lower_price__c,
                                                   Adjustment_Upper_price__c,
                                                   Last_inspection_day__c,
                                                   Check_Result__c,
                                                   Repair_Price__c,
                                                   Comment__c,
                                                   Asset__r.Posting_Date__c,
                                                   EquipmentGuaranteeFlgTxt__c,
                                                   EquipmentGuaranteeFlg__c,
                                                   ifHaveleftInPrevious__c,
                                                   // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 start
                                                   Last_MContract__c
                                                   // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 eng
                                                   // LJPH-C9GD34 gzw fix start
                                                   ,Estimate_List_Price_Page__c
                                                   // LJPH-C9GD34 gzw fix end
                                                   FROM Maintenance_Contract_Asset_Estimate__c
                                                   WHERE Maintenance_Contract_Estimate__c = :this.targetEstimateId
                                                                                  ORDER BY
                                                                                  Id,
                                                   Asset__c,
                                                   Product_Manual__c,
                                                   Asset__r.SerialNumber,
                                                   Asset__r.Name,
                                                   Asset__r.Department_Name__c,
                                                   Asset__r.InstallDate
                ]) {
               if (!getPageDisabled() || (getPageDisabled() && String.isBlank(copyid) == false)) {
                  //if (String.isBlank(copyid) == false) {
                  if (mcae.Asset__c <> null) {
                     mcae.EquipmentGuaranteeFlgTxt__c = mcae.Asset__r.EquipmentGuaranteeFlg__c;
                     if (systemToday.addMonths(isNewAddMonth) < mcae.Asset__r.isNewDate_use__c) {
                        mcae.IsNew__c = true;
                        if (String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c)) {
                           mcae.Estimate_List_Price__c = mcae.Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c * isNewPriceAdj;
                           // mcae.Estimate_List_Price__c = mcae.Asset__r.Maintenance_Price_Month__c * isNewPriceAdj;
                        }
                     } else {
                        mcae.IsNew__c = false;
                        if (String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c)) {
                           mcae.Estimate_List_Price__c = mcae.Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
                           // mcae.Estimate_List_Price__c = mcae.Asset__r.Maintenance_Price_Month__c;
                        }
                       Asset_Consumption_rate__c = asset_Consumption_rate,
                       EquipmentGuaranteeFlgTxt__c = mca.Asset__r.EquipmentGuaranteeFlg__c
                       ));
         }
      } else {
         List<Maintenance_Contract_Asset_Estimate__c> selectlist = [SELECT Id FROM
                                                      Maintenance_Contract_Asset_Estimate__c
                                                      WHERE Maintenance_Contract_Estimate__c = :this.targetEstimateId ];
   
                     }
                  } else if (mcae.Product_Manual__c <> null) {
         // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '111111111111111111111111' + selectlist.size()));
         for (Maintenance_Contract_Asset_Estimate__c mcae : [SELECT Id,
                                                Name,
                                                Maintenance_Contract_Estimate__c,
                                                Asset__c,
                                                Asset__r.Maintenance_Price_Month__c,
                                                Asset__r.InstallDate,
                                                Asset__r.isNewDate_use__c,
                                                Asset__r.EquipmentGuaranteeFlg__c,
                                                Asset_Consumption_rate__c,
                                                Asset__r.CurrentContract_F__c,
                                                Asset__r.CurrentContract_F__r.First_Estimate_Date__c,
                                                Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c,
                                                Asset__r.CurrentContract_F__r.First_contract_usage_Rate__c,
                                                Asset__r.CurrentContract_F__r.Estimate_Contract_endDate__c,
                                                Asset__r.CurrentContract_F__r.Contract_Range__c,
                                                Asset__r.CurrentContract_F__r.Contract_End_Date__c,
                                                Asset__r.CurrentContract_F__r.Gurantee_Estimate_startDate__c,
                                                LastMContract_Price__c,
                                                Asset__r.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,
                                                Asset__r.CurrentContract_F_asset__r.endDateGurantee_Text__c,
                                                Product_Manual__c,
                                                Product_Manual__r.EquipmentGuaranteeFlg__c,
                                                Product_Manual__r.Maintenance_Price_Month__c,
                                                Product_Manual__r.Name,
                                                // 20210315 gzw 追加限次产品信息 start
                                                Product_Manual__r.ProductURF__c,
                                                Product_Manual__r.ProductURF__r.URFLimitSerial__c,
                                                Product_Manual__r.ProductURF__r.UFR_MaxRepairCount__c,
                                                Product_Manual__r.ProductURF__r.UFR_Maintenance_Price_Month__c,
                                                //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
                                                Product_Manual__r.ProductURF__r.Maintenance_Price_Year_URF_Max__c,
                                                Product_Manual__r.ProductURF__r.Maintenance_Price_Year_URF__c,
                                                //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
                                                Asset__r.Product2.ProductURF__c,
                                                Asset__r.Product2.ProductURF__r.URFLimitSerial__c,
                                                Asset__r.Product2.ProductURF__r.UFR_MaxRepairCount__c,
                                                Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c,
                                                //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
                                                Asset__r.Product2.ProductURF__r.Maintenance_Price_Year_URF_Max__c,
                                                Asset__r.Product2.ProductURF__r.Maintenance_Price_Year_URF__c,
                                                //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
                                                URF_Series__c,
                                                Series_RepairCount__c,
                                                Series_MaxRepairCount__c,
                                                Asset_RepairCount__c,
                                                Asset_MaxRepairCount__c,
                                                // 20210315 gzw 追加限次产品信息 start
                                                IsNew__c,
                                                //add 2021.6.4 fxk  Start
                                                Check_Object__c,
                                                //add 2021.6.4 fxk  end
                                                Estimate_List_Price__c,
                                                //Maintenance_Price_YearTXT__c,
                                                Estimate_Cost__c,
                                                Adjustment_ratio_Upper__c,
                                                Adjustment_ratio_Lower__c,
                                                Adjustment_Lower_price__c,
                                                Adjustment_Upper_price__c,
                                                Last_inspection_day__c,
                                                Check_Result__c,
                                                Repair_Price__c,
                                                Comment__c,
                                                Asset__r.Posting_Date__c,
                                                EquipmentGuaranteeFlgTxt__c,
                                                EquipmentGuaranteeFlg__c,
                                                ifHaveleftInPrevious__c,
                                                // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 start
                                                Last_MContract__c
                                                // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 eng
                                                // LJPH-C9GD34 gzw fix start
                                                ,Estimate_List_Price_Page__c
                                                // LJPH-C9GD34 gzw fix end
                                                FROM Maintenance_Contract_Asset_Estimate__c
                                                WHERE Maintenance_Contract_Estimate__c = :this.targetEstimateId
                                                                               ORDER BY
                                                                               Id,
                                                Asset__c,
                                                Product_Manual__c,
                                                Asset__r.SerialNumber,
                                                Asset__r.Name,
                                                Asset__r.Department_Name__c,
                                                Asset__r.InstallDate
             ]) {
            if (!getPageDisabled() || (getPageDisabled() && String.isBlank(copyid) == false)) {
               //if (String.isBlank(copyid) == false) {
               if (mcae.Asset__c <> null) {
                  mcae.EquipmentGuaranteeFlgTxt__c = mcae.Asset__r.EquipmentGuaranteeFlg__c;
                  if (systemToday.addMonths(isNewAddMonth) < mcae.Asset__r.isNewDate_use__c) {
                     mcae.IsNew__c = true;
                     if (String.isNotBlank(mcae.Product_Manual__r.ProductURF__c)) {
                        mcae.Estimate_List_Price__c = mcae.Product_Manual__r.ProductURF__r.UFR_Maintenance_Price_Month__c * isNewPriceAdj;
                     if (String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c)) {
                        mcae.Estimate_List_Price__c = mcae.Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c * isNewPriceAdj;
                        // mcae.Estimate_List_Price__c = mcae.Asset__r.Maintenance_Price_Month__c * isNewPriceAdj;
                     }
                  } else {
                     mcae.IsNew__c = false;
                     if (String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c)) {
                        mcae.Estimate_List_Price__c = mcae.Asset__r.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
                        // mcae.Estimate_List_Price__c = mcae.Asset__r.Maintenance_Price_Month__c;
                     }
                  }
               } else if (mcae.Product_Manual__c <> null) {
                  mcae.IsNew__c = true;
                  if (String.isNotBlank(mcae.Product_Manual__r.ProductURF__c)) {
                     mcae.Estimate_List_Price__c = mcae.Product_Manual__r.ProductURF__r.UFR_Maintenance_Price_Month__c * isNewPriceAdj;
                  }
               }
               if (mcae.Asset__c <> null) {
                  // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '22222222222222' +));
                  // 1 copy URF   追加
                  // 2 非copy 提交   追加
                  // 3 非copy 未提交 URF   追加
                  if ((String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c) && String.isNotBlank(copyid) ) ||
                     ((getSaveBtnDisabled() && String.isBlank(copyid)) ||
                      (String.isBlank(copyid) && !getSaveBtnDisabled() && String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c)))) {
                     // if ((getSaveBtnDisabled() && String.isBlank(copyid) )|| (((!getSaveBtnDisabled() && String.isBlank(copyid)) && String.isNotBlank(copyid)) && String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c))){
                     // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '1 +  ' + selectedMcaes.size()));
                     selectedAssetIds.put(mcae.Asset__c, selectedMcaes.size());
                     selectedMcaes.add(mcae);
                  }
                  // else if (String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c)) {
                  //     // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '2 +  ' + selectedMcaes.size()));
                  //     selectedAssetIds.put(mcae.Asset__c, selectedMcaes.size());
                  //     selectedMcaes.add(mcae);
                  // }
               } else {
                  if ((String.isNotBlank(mcae.Product_Manual__r.ProductURF__c) && String.isNotBlank(copyid) ) ||
                     ((getSaveBtnDisabled() && String.isBlank(copyid)) ||
                      (String.isBlank(copyid) && !getSaveBtnDisabled() && String.isNotBlank(mcae.Product_Manual__r.ProductURF__c)))) {
                     // if (getSaveBtnDisabled() || (!getSaveBtnDisabled() && String.isNotBlank(mcae.Product_Manual__r.ProductURF__c))){
                     newMcaes.add(mcae);
                  }
            }
            if (mcae.Asset__c <> null) {
               // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '22222222222222' +));
               // 1 copy URF   追加
               // 2 非copy 提交   追加
               // 3 非copy 未提交 URF   追加
               if ((String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c) && String.isNotBlank(copyid) ) ||
                  ((getSaveBtnDisabled() && String.isBlank(copyid)) ||
                   (String.isBlank(copyid) && !getSaveBtnDisabled() && String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c)))) {
                  // if ((getSaveBtnDisabled() && String.isBlank(copyid) )|| (((!getSaveBtnDisabled() && String.isBlank(copyid)) && String.isNotBlank(copyid)) && String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c))){
                  // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '1 +  ' + selectedMcaes.size()));
                  selectedAssetIds.put(mcae.Asset__c, selectedMcaes.size());
                  selectedMcaes.add(mcae);
               }
               // else if (String.isNotBlank(mcae.Asset__r.Product2.ProductURF__c)) {
               //     // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '2 +  ' + selectedMcaes.size()));
               //     selectedAssetIds.put(mcae.Asset__c, selectedMcaes.size());
               //     selectedMcaes.add(mcae);
               // }
            } else {
               if ((String.isNotBlank(mcae.Product_Manual__r.ProductURF__c) && String.isNotBlank(copyid) ) ||
                  ((getSaveBtnDisabled() && String.isBlank(copyid)) ||
                   (String.isBlank(copyid) && !getSaveBtnDisabled() && String.isNotBlank(mcae.Product_Manual__r.ProductURF__c)))) {
                  // if (getSaveBtnDisabled() || (!getSaveBtnDisabled() && String.isNotBlank(mcae.Product_Manual__r.ProductURF__c))){
                  newMcaes.add(mcae);
               }
            }
         }
         // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '+++++++++++++' + selectedMcaes.size()));
      }
      // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '+++++++++++++' + selectedMcaes.size()));
   
         // 選択済みのものにチェックを付ける
         // TODO xudan 一覧に出る明細件数が足りないケースがある
         // ①AssetA―明細Aで明細登録
         // ②Assetの検索条件変更により、AssetAは永遠に取得できない
         // ③Assetを元にデータをマッピングする時、明細マップからAssetAを取得できない?一覧に明細Aが出ない
         // 次回、Assetの検索条件が大きく変更する時、対応必要
         // 限次合同不需要上下限 20210315 gzw start
         // List<Data> datatemp = new List<Data>();
         // datatemp = getChartData();
         // 限次合同不需要上下限 20210315 gzw end
         for (Asset ast : this.assetRecords) {
            Boolean isNew = false;
            // Decimal listPrice = ast.Maintenance_Price_Month__c;
            Decimal listPrice = ast.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
            if (selectedAssetIds.containsKey(ast.Id)) {
               Maintenance_Contract_Asset_Estimate__c selectedLocal = selectedMcaes.get(selectedAssetIds.get(ast.Id));
               isNew = selectedLocal.isNew__c;
               listPrice = selectedLocal.Estimate_List_Price__c;
               // xudan 20160110 新品判断ここ要らない、contractStartDateChangeがやる
      // 選択済みのものにチェックを付ける
      // TODO xudan 一覧に出る明細件数が足りないケースがある
      // ①AssetA―明細Aで明細登録
      // ②Assetの検索条件変更により、AssetAは永遠に取得できない
      // ③Assetを元にデータをマッピングする時、明細マップからAssetAを取得できない?一覧に明細Aが出ない
      // 次回、Assetの検索条件が大きく変更する時、対応必要
      // 限次合同不需要上下限 20210315 gzw start
      // List<Data> datatemp = new List<Data>();
      // datatemp = getChartData();
      // 限次合同不需要上下限 20210315 gzw end
      for (Asset ast : this.assetRecords) {
         Boolean isNew = false;
         // Decimal listPrice = ast.Maintenance_Price_Month__c;
         Decimal listPrice = ast.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
         if (selectedAssetIds.containsKey(ast.Id)) {
            Maintenance_Contract_Asset_Estimate__c selectedLocal = selectedMcaes.get(selectedAssetIds.get(ast.Id));
            isNew = selectedLocal.isNew__c;
            listPrice = selectedLocal.Estimate_List_Price__c;
            // xudan 20160110 新品判断ここ要らない、contractStartDateChangeがやる
   //                if (systemToday.addMonths(-6) < ast.InstallDate) {
   //                if (estimate.Contract_Esti_Start_Date__c.addMonths(isNewAddMonth) < ast.InstallDate) {
   //                Date createdDate = (estimate.CreatedDate == null || !String.isBlank(copyid)) ? systemToday : estimate.CreatedDate.date();
@@ -962,853 +980,867 @@
   //                }
   //              // 计算上下线调整比例
   //              没有提交 或者在报价时从新计算
               // 限次合同不需要上下限 20210315 gzw start
               if (!getPageDisabled() || (getPageDisabled() && String.isBlank(copyid) == false)) {
                  Date mon1stDate = Date.newInstance(Date.today().year(), Date.today().month(), 1);
                  selectedLocal.LastMContract_Price__c = selectedLocal.Asset__r.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c == null ?   selectedLocal.LastMContract_Price__c : selectedLocal.Asset__r.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c;
                  //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , 'LastMContract_Price__c--' + selectedLocal.LastMContract_Price__c));
                  if (selectedLocal.Asset__r.CurrentContract_F__r.First_Estimate_Date__c != null && selectedLocal.Asset__r.CurrentContract_F__r.Estimate_Contract_endDate__c > mon1stDate) {
                     selectedLocal.Asset_Consumption_rate__c = selectedLocal.Asset__r.CurrentContract_F__r.First_contract_usage_Rate__c == null ? selectedLocal.Asset_Consumption_rate__c : selectedLocal.Asset__r.CurrentContract_F__r.First_contract_usage_Rate__c;
                  } else {
                     selectedLocal.Asset_Consumption_rate__c = selectedLocal.Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c == null ? selectedLocal.Asset_Consumption_rate__c : selectedLocal.Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c;
                  }
                  //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , selectedLocal.Asset__r.CurrentContract_F__r.First_Estimate_Date__c + 'Asset_Consumption--- ' + selectedLocal.Asset__r.CurrentContract_F__r.Estimate_Contract_endDate__c));
                  // if(String.isNotBlank(String.valueOf(selectedLocal.Asset_Consumption_rate__c))){
                  //     //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , 'Contract_Consumption_rate__c ' + selectedLocal.Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c));
                  //     for (Data da : datatemp) {
                  //         if (String.isBlank(String.valueOf(da.rate_Lower)) &&  selectedLocal.Asset_Consumption_rate__c < da.rate_Upper) {
                  //             selectedLocal.Adjustment_ratio_Lower__c = da.price_Lower;
                  //             selectedLocal.Adjustment_ratio_Upper__c = da.price_Upper;
                  //             continue;
                  //         }else if (selectedLocal.Asset_Consumption_rate__c >= da.rate_Lower && String.isBlank(String.valueOf(da.rate_Upper))) {
                  //             selectedLocal.Adjustment_ratio_Lower__c = da.price_Lower;
                  //             selectedLocal.Adjustment_ratio_Upper__c = da.price_Upper;
                  //             continue;
                  //         }else if (selectedLocal.Asset_Consumption_rate__c >= da.rate_Lower
                  //                 && selectedLocal.Asset_Consumption_rate__c < da.rate_Upper) {
                  //             selectedLocal.Adjustment_ratio_Lower__c = da.price_Lower;
                  //             selectedLocal.Adjustment_ratio_Upper__c = da.price_Upper;
                  //             continue;
                  //         }
                  //         //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , '下限+上限--- ' + selectedLocal.Adjustment_ratio_Lower__c + '  ' + selectedLocal.Adjustment_ratio_Upper__c));
                  //     }
                  //    //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , '下限+上限+++ ' + selectedLocal.Adjustment_ratio_Lower__c + '  ' + selectedLocal.Adjustment_ratio_Upper__c));
                  // }
            // 限次合同不需要上下限 20210315 gzw start
            if (!getPageDisabled() || (getPageDisabled() && String.isBlank(copyid) == false)) {
               Date mon1stDate = Date.newInstance(Date.today().year(), Date.today().month(), 1);
               selectedLocal.LastMContract_Price__c = selectedLocal.Asset__r.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c == null ?   selectedLocal.LastMContract_Price__c : selectedLocal.Asset__r.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c;
               //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , 'LastMContract_Price__c--' + selectedLocal.LastMContract_Price__c));
               if (selectedLocal.Asset__r.CurrentContract_F__r.First_Estimate_Date__c != null && selectedLocal.Asset__r.CurrentContract_F__r.Estimate_Contract_endDate__c > mon1stDate) {
                  selectedLocal.Asset_Consumption_rate__c = selectedLocal.Asset__r.CurrentContract_F__r.First_contract_usage_Rate__c == null ? selectedLocal.Asset_Consumption_rate__c : selectedLocal.Asset__r.CurrentContract_F__r.First_contract_usage_Rate__c;
               } else {
                  selectedLocal.Asset_Consumption_rate__c = selectedLocal.Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c == null ? selectedLocal.Asset_Consumption_rate__c : selectedLocal.Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c;
               }
               // 限次合同不需要上下限 20210315 gzw end
               //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , selectedLocal.Asset__r.CurrentContract_F__r.First_Estimate_Date__c + 'Asset_Consumption--- ' + selectedLocal.Asset__r.CurrentContract_F__r.Estimate_Contract_endDate__c));
   
   //
   //
   //
               checkedAssets.add(new AssetInfo(checkedAssets.size(), ast, isNew, listPrice, selectedLocal));
            } else {
               if (String.isBlank(ast.Product2.ProductURF__c)) continue;
               //update by rentongxiao 2020-09-23 start
               if (ast.AssetMark__c == '主机') {
                  totalRecords++;
                  if (unCheckedAssets.size() < selctRecordNum) {
                     unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), ast));
                  }
               }
               //update by rentongxiao 2020-09-23 end
               // if(String.isNotBlank(String.valueOf(selectedLocal.Asset_Consumption_rate__c))){
               //     //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , 'Contract_Consumption_rate__c ' + selectedLocal.Asset__r.CurrentContract_F__r.Contract_Consumption_rate__c));
               //     for (Data da : datatemp) {
               //         if (String.isBlank(String.valueOf(da.rate_Lower)) &&  selectedLocal.Asset_Consumption_rate__c < da.rate_Upper) {
               //             selectedLocal.Adjustment_ratio_Lower__c = da.price_Lower;
               //             selectedLocal.Adjustment_ratio_Upper__c = da.price_Upper;
               //             continue;
               //         }else if (selectedLocal.Asset_Consumption_rate__c >= da.rate_Lower && String.isBlank(String.valueOf(da.rate_Upper))) {
               //             selectedLocal.Adjustment_ratio_Lower__c = da.price_Lower;
               //             selectedLocal.Adjustment_ratio_Upper__c = da.price_Upper;
               //             continue;
               //         }else if (selectedLocal.Asset_Consumption_rate__c >= da.rate_Lower
               //                 && selectedLocal.Asset_Consumption_rate__c < da.rate_Upper) {
               //             selectedLocal.Adjustment_ratio_Lower__c = da.price_Lower;
               //             selectedLocal.Adjustment_ratio_Upper__c = da.price_Upper;
               //             continue;
   
               //         }
               //         //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , '下限+上限--- ' + selectedLocal.Adjustment_ratio_Lower__c + '  ' + selectedLocal.Adjustment_ratio_Upper__c));
               //     }
               //    //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , '下限+上限+++ ' + selectedLocal.Adjustment_ratio_Lower__c + '  ' + selectedLocal.Adjustment_ratio_Upper__c));
               // }
            }
            // listCut(unCheckedAssets);
            /*
               if (ast.CheckBox__c) {
               checkedAssets.add(new AssetInfo(checkedAssets.size(), ast, isNew, listPrice));
               } else {
               unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), ast));
               }
             */
            // 限次合同不需要上下限 20210315 gzw end
   //
   //
   //
            checkedAssets.add(new AssetInfo(checkedAssets.size(), ast, isNew, listPrice, selectedLocal));
         } else {
            if (String.isBlank(ast.Product2.ProductURF__c)) continue;
            //update by rentongxiao 2020-09-23 start
            if (ast.AssetMark__c == '主机') {
               totalRecords++;
               if (unCheckedAssets.size() < selctRecordNum) {
                  unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), ast));
               }
            }
            //update by rentongxiao 2020-09-23 end
         }
         listCut(unCheckedAssets);
         // listCut(unCheckedAssets);
         /*
            if (ast.CheckBox__c) {
            checkedAssets.add(new AssetInfo(checkedAssets.size(), ast, isNew, listPrice));
            } else {
            unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), ast));
            }
          */
      }
      listCut(unCheckedAssets);
   
         totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
      totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
   
         system.debug('顺序检测' + checkedAssets);
         // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '----------------' + newMcaes.size()));
         for (Maintenance_Contract_Asset_Estimate__c mcae : newMcaes) {
            checkedAssets.add(new AssetInfo(checkedAssets.size(), mcae));
         }
         // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '2222222222222222' + checkedAssets.size()));
         // 最後10行追加
         if (Schema.getGlobalDescribe().get('Maintenance_Contract_Asset_Estimate__c').getDescribe().isCreateable()) {
            this.addNewRows();
         }
         if (!String.isBlank(copyid)) {
            this.targetEstimateId = null;
            this.estimate = new Maintenance_Contract_Estimate__c();
            this.estimate.Maintenance_Contract__c = this.targetMaintenanceContractId;
         }
         // 2021-02-07  gzw add  LJPH-BWY5QB start
         setEndUserType(this.targetMaintenanceContractId);
         // 2021-02-07  gzw add  LJPH-BWY5QB start
         assetRecords.clear();
         // 根据合同开始日重新计算维修合同价格
         //contractStartDateChange();
      system.debug('顺序检测' + checkedAssets);
      // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '----------------' + newMcaes.size()));
      for (Maintenance_Contract_Asset_Estimate__c mcae : newMcaes) {
         checkedAssets.add(new AssetInfo(checkedAssets.size(), mcae));
      }
   
      // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '2222222222222222' + checkedAssets.size()));
      // 最後10行追加
      if (Schema.getGlobalDescribe().get('Maintenance_Contract_Asset_Estimate__c').getDescribe().isCreateable()) {
         this.addNewRows();
      }
      if (!String.isBlank(copyid)) {
         this.targetEstimateId = null;
         this.estimate = new Maintenance_Contract_Estimate__c();
         this.estimate.Maintenance_Contract__c = this.targetMaintenanceContractId;
      }
      // 2021-02-07  gzw add  LJPH-BWY5QB start
      setEndUserType(this.targetMaintenanceContractId);
      // 2021-02-07  gzw add  LJPH-BWY5QB start
      assetRecords.clear();
      // 根据合同开始日重新计算维修合同价格
      //contractStartDateChange();
      }
   //
   
   // 取得分页数据
      private void setPageRecord() {
         checkIdList = new List<String> ();
         for (AssetInfo ass : this.checkedAssets) {
            if (!ass.isManual) {
               checkIdList.add(ass.rec.Id);
            }
   private void setPageRecord() {
      checkIdList = new List<String> ();
      for (AssetInfo ass : this.checkedAssets) {
         if (!ass.isManual) {
            checkIdList.add(ass.rec.Id);
         }
         if ((currPage * selctRecordNum) <= 2000) {
            String notInId = '(\'';
            if (checkIdList.size() > 0) {
               for (String str : checkIdList) {
                  notInId += str + '\', \'';
               }
            }
            notInId += '\')';
            //tcm 删除第4行 Maintenance_Contract_No_F__c 替换 Management_Code__c  20211201 start
            String sqlStr = 'SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, '
                        + 'Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c, InstallDate,isNewDate_use__c, '
                        + 'Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c, '
                        + 'CurrentContract_End_Date__c, Extend_Gurantee_DateTo__c,EquipmentGuaranteeFlg__c, '
                        + 'CurrentContract_F__c,CurrentContract_F__r.Management_Code__c,CurrentContract_F__r.Maintenance_Contract_No_F__c,CurrentContract_F__r.RecordType_DeveloperName__c,CurrentContract_F__r.Estimate_Num__c,CurrentContract_F__r.Contract_End_Date__c,'
                        + 'CurrentContract_F_asset__c,CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,CurrentContract_F_asset__r.endDateGurantee_Text__c,CurrentContract_F__r.Gurantee_Estimate_startDate__c, '
                        + 'CurrentContract_F__r.First_Estimate_Date__c,CurrentContract_F__r.Estimate_Contract_endDate__c,'
                        + 'CurrentContract_F__r.Contract_Consumption_rate__c,CurrentContract_F__r.First_contract_usage_Rate__c,'
                        + 'Product2.ProductURF__c,Product2.ProductURF__r.URFLimitSerial__c,Product2.ProductURF__r.UFR_MaxRepairCount__c,Product2.ProductURF__r.UFR_Maintenance_Price_Month__c,'
                        + 'CurrentContract_F__r.Contract_Range__c,AssetMark__c FROM Asset WHERE Product2.ProductURF__c != null AND Hospital__c = \'' + this.targetHospitalId + '\' '
                        + 'AND Id NOT IN ' + notInId;
            //HWAG-B4R3SS  START 20181026
            if (String.isNotBlank(text1) && String.isNotBlank(cond1) && String.isNotBlank(val1)) {
               sqlStr += makeTextSql(text1, cond1, val1);
            }
            //JZHG-BSDUT4 ---20200904---update By rentongxiao---Start
            // else{
            //     sqlStr += 'AND AssetMark__c = \'主机\'';
            // }
            //JZHG-BSDUT4 ---20200904---update By rentongxiao---end
            //HWAG-B4R3SS  END 20181026
            //HWAG-BDJ43R---XHL---20190729---
            sqlStr += ' AND ( AssetMark__c != \'耗材\' OR Product2.Family != \'ET\' )';
            //HWAG-BDJ43R---XHL---20190729---
            sqlStr += ' ORDER BY ID,IF_Warranty__c asc ';
            if (currPage == 1) {
               sqlStr += 'limit ' + selRecordOption;
            } else {
               sqlStr += 'limit ' + selRecordOption + ' offset ' + String.valueOf((currPage - 1) * selctRecordNum);
            }
            //system.debug();
            //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR,
            //               '222222222222_____'+sqlStr));
            //return;
            assetRecords = Database.query(sqlStr);
         } else {
            assetRecords.clear();
            Integer sqlLimit = currPage * selctRecordNum;
            List<Asset> temAsset = new List<Asset> ();
            //HWAG-BDJ43R ---XHL---20190729---
            String sqlStr = '';
            //tcm 删除第4行 Maintenance_Contract_No_F__c 替换 Management_Code__c  20211201 start
            sqlStr  = 'SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c,';
            sqlStr += 'Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c,InstallDate,isNewDate_use__c,';
            sqlStr += 'Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c,';
            sqlStr += 'CurrentContract_End_Date__c,Extend_Gurantee_DateTo__c,EquipmentGuaranteeFlg__c,';
            sqlStr += 'CurrentContract_F__c,CurrentContract_F__r.Management_Code__c,CurrentContract_F__r.Maintenance_Contract_No_F__c,CurrentContract_F__r.RecordType_DeveloperName__c,CurrentContract_F__r.Estimate_Num__c,CurrentContract_F__r.Contract_End_Date__c,';
            sqlStr += 'CurrentContract_F_asset__c,CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,CurrentContract_F_asset__r.endDateGurantee_Text__c,CurrentContract_F__r.Gurantee_Estimate_startDate__c,';
            sqlStr += 'CurrentContract_F__r.First_Estimate_Date__c,CurrentContract_F__r.Estimate_Contract_endDate__c,';
            sqlStr += 'CurrentContract_F__r.Contract_Consumption_rate__c,CurrentContract_F__r.First_contract_usage_Rate__c,';
            sqlStr += 'Product2.ProductURF__c,Product2.ProductURF__r.URFLimitSerial__c,Product2.ProductURF__r.UFR_MaxRepairCount__c,Product2.ProductURF__r.UFR_Maintenance_Price_Month__c,';
            sqlStr += ' CurrentContract_F__r.Contract_Range__c,AssetMark__c FROM Asset WHERE Product2.ProductURF__c != null AND Hospital__c = \'' + this.targetHospitalId + '\'';
            //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
            // sqlStr += '  AND ( AssetMark__c != \'耗材\' OR Product2.Family != \'ET\' ) ';
            //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
            //HWAG-B4R3SS  START 20181026
            if (String.isNotBlank(text1) && String.isNotBlank(cond1) && String.isNotBlank(val1)) {
               sqlStr += makeTextSql(text1, cond1, val1);
            }
            //JZHG-BSDUT4 ---20200904---update By rentongxiao---Start
            // else{
            //     sqlStr += 'AND AssetMark__c = \'主机\'';
            // }
            //JZHG-BSDUT4 ---20200904---update By rentongxiao---end
            //HWAG-B4R3SS  END 20181026
            if (checkIdList.size() > 0) {
               sqlStr += '  AND Id NOT IN ' + checkIdList;
               //temAsset = [SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c,
               //            InstallDate, Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c,CurrentContract_End_Date__c,Extend_Gurantee_DateTo__c
               //            FROM Asset WHERE Hospital__c = :this.targetHospitalId AND Id NOT IN : checkIdList AND AssetMark__c != '耗材' AND Product2.Family != 'ET' ORDER BY ID,IF_Warranty__c asc limit : sqlLimit];
            } else {
               //temAsset = [SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c,
               //            InstallDate, Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c,CurrentContract_End_Date__c,Extend_Gurantee_DateTo__c
               //            FROM Asset WHERE Hospital__c = :this.targetHospitalId AND AssetMark__c != '耗材' AND Product2.Family != 'ET' ORDER BY ID,IF_Warranty__c asc limit : sqlLimit];
            }
            sqlStr += ' ORDER BY ID,IF_Warranty__c asc limit ' + sqlLimit;
            temAsset = Database.query(sqlStr);
            //HWAG-BDJ43R ---XHL---20190729---
            if (temAsset.size() >= (currPage * selctRecordNum)) {
               for (Integer i = ((currPage - 1) * selctRecordNum); i < (currPage * selctRecordNum); i++) {
                  assetRecords.add(temAsset.get(i));
               }
            } else {
               for (Integer i = ((currPage - 1) * selctRecordNum); i < temAsset.size(); i++) {
                  assetRecords.add(temAsset.get(i));
               }
            }
         }
         this.unCheckedAssets = new List<AssetInfo>();
         for (Asset ast : assetRecords) {
            this.unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), ast));
         }
         listCut(unCheckedAssets);
         // 根据合同开始日重新计算维修合同价格
         //contractStartDateChange();
      }
      if ((currPage * selctRecordNum) <= 2000) {
         String notInId = '(\'';
         if (checkIdList.size() > 0) {
            for (String str : checkIdList) {
               notInId += str + '\', \'';
            }
         }
         notInId += '\')';
         //tcm 删除第4行 Maintenance_Contract_No_F__c 替换 Management_Code__c  20211201 start
         String sqlStr = 'SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, '
                     + 'Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c, InstallDate,isNewDate_use__c, '
                     + 'Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c, '
                     + 'CurrentContract_End_Date__c, Extend_Gurantee_DateTo__c,EquipmentGuaranteeFlg__c, '
                        + 'CurrentContract_F__c,CurrentContract_F__r.Management_Code__c,CurrentContract_F__r.Maintenance_Contract_No_F__c,CurrentContract_F__r.RecordType_DeveloperName__c,CurrentContract_F__r.Estimate_Num__c,CurrentContract_F__r.Contract_End_Date__c,'
                     + 'CurrentContract_F_asset__c,CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,CurrentContract_F_asset__r.endDateGurantee_Text__c,CurrentContract_F__r.Gurantee_Estimate_startDate__c, '
                     + 'CurrentContract_F__r.First_Estimate_Date__c,CurrentContract_F__r.Estimate_Contract_endDate__c,'
                     + 'CurrentContract_F__r.Contract_Consumption_rate__c,CurrentContract_F__r.First_contract_usage_Rate__c,'
                     + 'Product2.ProductURF__c,Product2.ProductURF__r.URFLimitSerial__c,Product2.ProductURF__r.UFR_MaxRepairCount__c,Product2.ProductURF__r.UFR_Maintenance_Price_Month__c,'
                     //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
                     + 'Product2.ProductURF__r.Maintenance_Price_Year_URF__c, Product2.ProductURF__r.Maintenance_Price_Year_URF_Max__c,'
                     //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
                     + 'CurrentContract_F__r.Contract_Range__c,AssetMark__c FROM Asset WHERE Product2.ProductURF__c != null AND Hospital__c = \'' + this.targetHospitalId + '\' '
                     + 'AND Id NOT IN ' + notInId;
         //HWAG-B4R3SS  START 20181026
         if (String.isNotBlank(text1) && String.isNotBlank(cond1) && String.isNotBlank(val1)) {
            sqlStr += makeTextSql(text1, cond1, val1);
         }
         //JZHG-BSDUT4 ---20200904---update By rentongxiao---Start
         // else{
         //     sqlStr += 'AND AssetMark__c = \'主机\'';
         // }
         //JZHG-BSDUT4 ---20200904---update By rentongxiao---end
         //HWAG-B4R3SS  END 20181026
         //HWAG-BDJ43R---XHL---20190729---
         sqlStr += ' AND ( AssetMark__c != \'耗材\' OR Product2.Family != \'ET\' )';
         //HWAG-BDJ43R---XHL---20190729---
         sqlStr += ' ORDER BY ID,IF_Warranty__c asc ';
         if (currPage == 1) {
            sqlStr += 'limit ' + selRecordOption;
         } else {
            sqlStr += 'limit ' + selRecordOption + ' offset ' + String.valueOf((currPage - 1) * selctRecordNum);
         }
         //system.debug();
         //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.ERROR,
         //               '222222222222_____'+sqlStr));
         //return;
         assetRecords = Database.query(sqlStr);
      } else {
         assetRecords.clear();
         Integer sqlLimit = currPage * selctRecordNum;
         List<Asset> temAsset = new List<Asset> ();
         //HWAG-BDJ43R ---XHL---20190729---
         String sqlStr = '';
         //tcm 删除第4行 Maintenance_Contract_No_F__c 替换 Management_Code__c  20211201 start
         sqlStr  = 'SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c,';
         sqlStr += 'Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c,InstallDate,isNewDate_use__c,';
         sqlStr += 'Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c,';
         sqlStr += 'CurrentContract_End_Date__c,Extend_Gurantee_DateTo__c,EquipmentGuaranteeFlg__c,';
            sqlStr += 'CurrentContract_F__c,CurrentContract_F__r.Management_Code__c,CurrentContract_F__r.Maintenance_Contract_No_F__c,CurrentContract_F__r.RecordType_DeveloperName__c,CurrentContract_F__r.Estimate_Num__c,CurrentContract_F__r.Contract_End_Date__c,';
         sqlStr += 'CurrentContract_F_asset__c,CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c,CurrentContract_F_asset__r.endDateGurantee_Text__c,CurrentContract_F__r.Gurantee_Estimate_startDate__c,';
         sqlStr += 'CurrentContract_F__r.First_Estimate_Date__c,CurrentContract_F__r.Estimate_Contract_endDate__c,';
         sqlStr += 'CurrentContract_F__r.Contract_Consumption_rate__c,CurrentContract_F__r.First_contract_usage_Rate__c,';
         sqlStr += 'Product2.ProductURF__c,Product2.ProductURF__r.URFLimitSerial__c,Product2.ProductURF__r.UFR_MaxRepairCount__c,Product2.ProductURF__r.UFR_Maintenance_Price_Month__c,';
         sqlStr += ' CurrentContract_F__r.Contract_Range__c,AssetMark__c FROM Asset WHERE Product2.ProductURF__c != null AND Hospital__c = \'' + this.targetHospitalId + '\'';
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
         // sqlStr += '  AND ( AssetMark__c != \'耗材\' OR Product2.Family != \'ET\' ) ';
         //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
         //HWAG-B4R3SS  START 20181026
         if (String.isNotBlank(text1) && String.isNotBlank(cond1) && String.isNotBlank(val1)) {
            sqlStr += makeTextSql(text1, cond1, val1);
         }
         //JZHG-BSDUT4 ---20200904---update By rentongxiao---Start
         // else{
         //     sqlStr += 'AND AssetMark__c = \'主机\'';
         // }
         //JZHG-BSDUT4 ---20200904---update By rentongxiao---end
         //HWAG-B4R3SS  END 20181026
         if (checkIdList.size() > 0) {
            sqlStr += '  AND Id NOT IN ' + checkIdList;
            //temAsset = [SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c,
            //            InstallDate, Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c,CurrentContract_End_Date__c,Extend_Gurantee_DateTo__c
            //            FROM Asset WHERE Hospital__c = :this.targetHospitalId AND Id NOT IN : checkIdList AND AssetMark__c != '耗材' AND Product2.Family != 'ET' ORDER BY ID,IF_Warranty__c asc limit : sqlLimit];
         } else {
            //temAsset = [SELECT Id, Name, Asset_situation__c, SerialNumber, Department_Name__c, Installation_Site__c, Posting_Date__c,Management_Code__c,IF_Warranty__c,Reson_Can_not_Warranty__c,
            //            InstallDate, Asset_Owner__c, Accumulation_Repair_Amount__c, Maintenance_Price_Month__c, Final_Examination_Date__c,CurrentContract_End_Date__c,Extend_Gurantee_DateTo__c
            //            FROM Asset WHERE Hospital__c = :this.targetHospitalId AND AssetMark__c != '耗材' AND Product2.Family != 'ET' ORDER BY ID,IF_Warranty__c asc limit : sqlLimit];
         }
         sqlStr += ' ORDER BY ID,IF_Warranty__c asc limit ' + sqlLimit;
         temAsset = Database.query(sqlStr);
         //HWAG-BDJ43R ---XHL---20190729---
         if (temAsset.size() >= (currPage * selctRecordNum)) {
            for (Integer i = ((currPage - 1) * selctRecordNum); i < (currPage * selctRecordNum); i++) {
               assetRecords.add(temAsset.get(i));
            }
         } else {
            for (Integer i = ((currPage - 1) * selctRecordNum); i < temAsset.size(); i++) {
               assetRecords.add(temAsset.get(i));
            }
         }
      }
      this.unCheckedAssets = new List<AssetInfo>();
      for (Asset ast : assetRecords) {
         this.unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), ast));
      }
      listCut(unCheckedAssets);
      // 根据合同开始日重新计算维修合同价格
      //contractStartDateChange();
   }
   
   // 翻页到首页
      public void firstPage() {
         getAssetSerialNumber();
         currPage = 1;
         //HWAG-B4R3SS  END 20181026
         totalRecords = soqlNos();
         totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
         //HWAG-B4R3SS  END 20181026
         this.setPageRecord();
      }
   public void firstPage() {
      getAssetSerialNumber();
      currPage = 1;
      //HWAG-B4R3SS  END 20181026
      totalRecords = soqlNos();
      totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
      //HWAG-B4R3SS  END 20181026
      this.setPageRecord();
   }
   
   // 向前翻页
      public void previousPage() {
         getAssetSerialNumber();
         currPage--;
         //HWAG-B4R3SS  START 20181026
         totalRecords = soqlNos();
         totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
         //HWAG-B4R3SS  END 20181026
         this.setPageRecord();
      }
   public void previousPage() {
      getAssetSerialNumber();
      currPage--;
      //HWAG-B4R3SS  START 20181026
      totalRecords = soqlNos();
      totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
      //HWAG-B4R3SS  END 20181026
      this.setPageRecord();
   }
   
   // 向后翻页
      public void nextPage() {
         getAssetSerialNumber();
         //HWAG-B4R3SS  START 20181026
         totalRecords = soqlNos();
         //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , 'totalRecords——————' + totalRecords));
         totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
         if (totalRecords == 0) {
            currPage  = 1;
            //this.unCheckedAssets.clear();
         } else {
            currPage++;
            this.setPageRecord();
         }
         //HWAG-B4R3SS  END 20181026
      }
   // 翻页到尾页
      public void endPage() {
         getAssetSerialNumber();
         //HWAG-B4R3SS  START 20181026
         totalRecords = soqlNos();
         totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
         if (totalRecords == 0) {
            currPage  = 1;
            this.unCheckedAssets.clear();
         } else {
            currPage = totalPage;
            this.setPageRecord();
         }
         //HWAG-B4R3SS  END 20181026
      }
   // 每页显示记录数变更
      public void recordNumChange() {
         currPage = 1;
         //totalRecords = soqlNos();
         totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
   public void nextPage() {
      getAssetSerialNumber();
      //HWAG-B4R3SS  START 20181026
      totalRecords = soqlNos();
      //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , 'totalRecords——————' + totalRecords));
      totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
      if (totalRecords == 0) {
         currPage  = 1;
         //this.unCheckedAssets.clear();
      } else {
         currPage++;
         this.setPageRecord();
      }
      //HWAG-B4R3SS  END 20181026
   }
   // 翻页到尾页
   public void endPage() {
      getAssetSerialNumber();
      //HWAG-B4R3SS  START 20181026
      totalRecords = soqlNos();
      totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
      if (totalRecords == 0) {
         currPage  = 1;
         this.unCheckedAssets.clear();
      } else {
         currPage = totalPage;
         this.setPageRecord();
      }
      //HWAG-B4R3SS  END 20181026
   }
   // 每页显示记录数变更
   public void recordNumChange() {
      currPage = 1;
      //totalRecords = soqlNos();
      totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
      this.setPageRecord();
   }
   
   //list分割 集合大小超过1000对应
      private void listCut(List<AssetInfo> records) {
         List<AssetInfo> recordsbreak = new List<AssetInfo>();
         List<AssetInfo> recordsbreakover = new List<AssetInfo>();
         unCheckedAssetsView = new List<List<AssetInfo> >();
         AssetInfo c = null;
         recordsbreak.clear();
         recordsbreakover.clear();
         unCheckedAssetsView.clear();
         unCheckedAssetsView.add(records);
      }
   private void listCut(List<AssetInfo> records) {
      List<AssetInfo> recordsbreak = new List<AssetInfo>();
      List<AssetInfo> recordsbreakover = new List<AssetInfo>();
      unCheckedAssetsView = new List<List<AssetInfo> >();
      AssetInfo c = null;
      recordsbreak.clear();
      recordsbreakover.clear();
      unCheckedAssetsView.clear();
      unCheckedAssetsView.add(records);
   }
   /*
    *显示过去两年的维修实绩
    *计算该维修合同报价的所有保佑设备,过去两年的修理实绩
    */
      public static void ComputeLTYRepair(String targetHospitalId) {
         system.debug('ComputeLTYRepair=====Start');
         List<Maintenance_Contract_Asset_Estimate__c> McaeList = new List<Maintenance_Contract_Asset_Estimate__c>();
         McaeList = [select id, asset__c, Lastyear_Repair_Cost_Text__c, Last_Second_Years_Repair_Cost_Text__c, Last_Third_Years_Repair_Cost_Text__c, Three_Years_Repair_Cost_Text__c
                  from Maintenance_Contract_Asset_Estimate__c
                  where Maintenance_Contract_Estimate__c = : targetHospitalId];
         List<id> AsList = new List<id>();
         Map<id, id> McaecToAsset = new Map<id, id>();
         for (Maintenance_Contract_Asset_Estimate__c Mcaes : McaeList) {
            AsList.add(Mcaes.asset__c);
            McaecToAsset.put(Mcaes.id, Mcaes.asset__c);
         }
         Maintenance_Contract_Estimate__c mcec = [select id, createdDate, Submit_quotation_day__c from Maintenance_Contract_Estimate__c where id = : targetHospitalId];
         //1年前维修实绩
         Date today = null;
         Date LastYearDate = null;
         Date LastSecondYearDate = null;
         Date LastThirdYearDate = null;
         Decimal LastYearPriceForMCAEC = 0;
   public static void ComputeLTYRepair(String targetHospitalId) {
      system.debug('ComputeLTYRepair=====Start');
      List<Maintenance_Contract_Asset_Estimate__c> McaeList = new List<Maintenance_Contract_Asset_Estimate__c>();
      McaeList = [select id, asset__c, Lastyear_Repair_Cost_Text__c, Last_Second_Years_Repair_Cost_Text__c, Last_Third_Years_Repair_Cost_Text__c, Three_Years_Repair_Cost_Text__c
               from Maintenance_Contract_Asset_Estimate__c
               where Maintenance_Contract_Estimate__c = :targetHospitalId];
      List<id> AsList = new List<id>();
      Map<id, id> McaecToAsset = new Map<id, id>();
      for (Maintenance_Contract_Asset_Estimate__c Mcaes : McaeList) {
         AsList.add(Mcaes.asset__c);
         McaecToAsset.put(Mcaes.id, Mcaes.asset__c);
      }
      Maintenance_Contract_Estimate__c mcec = [select id, createdDate, Submit_quotation_day__c from Maintenance_Contract_Estimate__c where id = :targetHospitalId];
      //1年前维修实绩
      Date today = null;
      Date LastYearDate = null;
      Date LastSecondYearDate = null;
      Date LastThirdYearDate = null;
      Decimal LastYearPriceForMCAEC = 0;
   
         if (mcec.Submit_quotation_day__c != null && String.valueOf(mcec.Submit_quotation_day__c) != '') {
            today = mcec.Submit_quotation_day__c;
            LastYearDate = mcec.Submit_quotation_day__c;
            LastSecondYearDate = mcec.Submit_quotation_day__c;
            LastThirdYearDate = mcec.Submit_quotation_day__c;
         } else {
            today = Date.valueOf(mcec.createdDate);
            LastYearDate = Date.valueOf(mcec.createdDate);
            LastSecondYearDate = Date.valueOf(mcec.createdDate);
            LastThirdYearDate = Date.valueOf(mcec.createdDate);
         }
         system.debug('去年' + LastYearDate + '前年' + LastSecondYearDate + '大前年' + LastThirdYearDate);
         LastYearDate = LastYearDate.addYears(-1);
         // LastYearDate = LastYearDate.addDays(1);
         //LastSecondYearDate = LastSecondYearDate.addDays(1);
         LastSecondYearDate = LastSecondYearDate.addYears(-2);
         // LastThirdYearDate = LastThirdYearDate.addDays(1);
         LastThirdYearDate = LastThirdYearDate.addYears(-3);
         system.debug('去年' + LastYearDate + '前年' + LastSecondYearDate + '大前年' + LastThirdYearDate);
         // 20191210 Gzw 服务合同过去3年修理实绩合并
         List<AggregateResult> FriRepairList = [
            select
            sum(Discount_Price_formula__c) SumPrice,
            //2019/1添加
            sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
            sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
            sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
            sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
            sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
            sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
            sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
            sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
            sum(Repair_Quotation_Id__r.Other_discount__c) other,
            AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
            Delivered_Product__c
            from
            Repair__c
            where
            Delivered_Product__c in : AsList
            and Agreed_Date__c != null
            and Agreed_Date__c > : LastYearDate
            and Agreed_Date__c <= : today
            group by Delivered_Product__c
         ];
         List<AggregateResult> SecRepairList = [
            select
            sum(Discount_Price_formula__c) SumPrice,
            //2019/1添加
            sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
            sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
            sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
            sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
            sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
            sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
            sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
            sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
            sum(Repair_Quotation_Id__r.Other_discount__c) other,
            AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
            Delivered_Product__c
            from
            Repair__c
            where
            Delivered_Product__c in : AsList
            and Agreed_Date__c != null
            and Agreed_Date__c <= : LastYearDate
            and Agreed_Date__c > : LastSecondYearDate
            group by Delivered_Product__c
         ];
         // 过去3年间修理实绩
         List<AggregateResult> ThiRepairList = [
            select
            sum(Discount_Price_formula__c) SumPrice,
            //2019/1添加
            sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
            sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
            sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
            sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
            sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
            sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
            sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
            sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
            sum(Repair_Quotation_Id__r.Other_discount__c) other,
            AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
            Delivered_Product__c
            from
            Repair__c
            where
            Delivered_Product__c in : AsList
            and Agreed_Date__c != null
            and Agreed_Date__c <= : LastSecondYearDate
            and Agreed_Date__c > : LastThirdYearDate
            group by Delivered_Product__c
         ];
         // 过去3年修理实绩
         List<AggregateResult> ThreeyearList = [
            select
            sum(Discount_Price_formula__c) SumPrice,
            //2019/1添加
            sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
            sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
            sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
            sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
            sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
            sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
            sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
            sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
            sum(Repair_Quotation_Id__r.Other_discount__c) other,
            AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
            Delivered_Product__c
            from
            Repair__c
            where
            Delivered_Product__c in : AsList
            and Agreed_Date__c != null
            and Agreed_Date__c <= : today
            and Agreed_Date__c > : LastThirdYearDate
            group by Delivered_Product__c
         ];
         // system.debug('++++++++'+FriRepairList+'++++++++'+SecRepairList+'+++++++'+ThiRepairList+'+++++');
         // 过去1年间
         Map<id, Decimal> LastFriYearPriceSumMap = new Map<id, Decimal>();
         // 过去2年间
         Map<id, Decimal> LastSecYearPriceSumMap = new Map<id, Decimal>();
         // 过去3年间
         Map<id, Decimal> LastThiYearPriceSumMap = new Map<id, Decimal>();
         // 过去3年
         Map<id, Decimal> ThreeYearPriceSumMap = new Map<id, Decimal>();
         Map<id, Decimal> ThiYearMonthMap = new Map<id, Decimal>();
         for (AggregateResult Rpc : FriRepairList) {
            id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
            //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
            Decimal Defir = sumPrice1(Rpc);
            LastFriYearPriceSumMap.put(idf, Defir);
         }
         for (AggregateResult Rpc : SecRepairList) {
            id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
            //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
            Decimal Defir = sumPrice1(Rpc);
            LastSecYearPriceSumMap.put(idf, Defir);
         }
         for (AggregateResult Rpc : ThiRepairList) {
            id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
            //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
            Decimal Defir = sumPrice1(Rpc);
            LastThiYearPriceSumMap.put(idf, Defir);
         }
         for (AggregateResult Rpc : ThreeyearList) {
            id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
            //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
            Decimal threeYearM = decimal.valueOf(Rpc.get('threeYearM') + '');
            Decimal Defir = sumPrice1(Rpc);
            ThreeYearPriceSumMap.put(idf, Defir);
            ThiYearMonthMap.put(idf, threeYearM);
         }
         for (Maintenance_Contract_Asset_Estimate__c Mca : McaeList) {
            Mca.Lastyear_Repair_Cost_Text__c = LastFriYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastFriYearPriceSumMap.get(McaecToAsset.get(Mca.id));
            Mca.Last_Second_Years_Repair_Cost_Text__c = LastSecYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastSecYearPriceSumMap.get(McaecToAsset.get(Mca.id));
            Mca.Last_Third_Years_Repair_Cost_Text__c = LastThiYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastThiYearPriceSumMap.get(McaecToAsset.get(Mca.id));
            Mca.Three_Years_Repair_Cost_Text__c = ThreeYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : ThreeYearPriceSumMap.get(McaecToAsset.get(Mca.id));
            Mca.The_Date_Of_Compute_The_RPCost__c = Date.today();
            Mca.Last_Third_Years_Repair_Month__c = ThiYearMonthMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : ThiYearMonthMap.get(McaecToAsset.get(Mca.id));
         }
         try {
            system.debug('McaeList:::::' + McaeList);
            update McaeList;
            //return '';
         } catch (Exception e) {
            //return 'McaeList Update Failed : '+e;
         }
      if (mcec.Submit_quotation_day__c != null && String.valueOf(mcec.Submit_quotation_day__c) != '') {
         today = mcec.Submit_quotation_day__c;
         LastYearDate = mcec.Submit_quotation_day__c;
         LastSecondYearDate = mcec.Submit_quotation_day__c;
         LastThirdYearDate = mcec.Submit_quotation_day__c;
      } else {
         today = Date.valueOf(mcec.createdDate);
         LastYearDate = Date.valueOf(mcec.createdDate);
         LastSecondYearDate = Date.valueOf(mcec.createdDate);
         LastThirdYearDate = Date.valueOf(mcec.createdDate);
      }
   
      system.debug('去年' + LastYearDate + '前年' + LastSecondYearDate + '大前年' + LastThirdYearDate);
   
      LastYearDate = LastYearDate.addYears(-1);
      // LastYearDate = LastYearDate.addDays(1);
   
      public void ComputeLTYRepair() {
         system.debug('ComputeLTYRepair=====Start');
         List<Maintenance_Contract_Asset_Estimate__c> McaeList = new List<Maintenance_Contract_Asset_Estimate__c>();
         McaeList = [select id, asset__c, Lastyear_Repair_Cost_Text__c, Last_Second_Years_Repair_Cost_Text__c, Last_Third_Years_Repair_Cost_Text__c, Three_Years_Repair_Cost_Text__c
                  from Maintenance_Contract_Asset_Estimate__c
                  where Maintenance_Contract_Estimate__c = : targetEstimateId];
         List<id> AsList = new List<id>();
         Map<id, id> McaecToAsset = new Map<id, id>();
         for (Maintenance_Contract_Asset_Estimate__c Mcaes : McaeList) {
            AsList.add(Mcaes.asset__c);
            McaecToAsset.put(Mcaes.id, Mcaes.asset__c);
         }
         Maintenance_Contract_Estimate__c mcec = new Maintenance_Contract_Estimate__c();
         List<Maintenance_Contract_Estimate__c>  mcecList = new List<Maintenance_Contract_Estimate__c>();
         mcecList = [select id, createdDate, Submit_quotation_day__c from Maintenance_Contract_Estimate__c where id = : targetEstimateId];
         if (mcecList.size() == 0) {
            ApexPages.addMessage(new ApexPages.message(ApexPages.severity.Error, '请先保存报价!'));
            return;
         } else {
            mcec = mcecList[0];
         }
         //1年前维修实绩
         Date today = null;
         Date LastYearDate = null;
         Date LastSecondYearDate = null;
         Date LastThirdYearDate = null;
         Decimal LastYearPriceForMCAEC = 0;
      //LastSecondYearDate = LastSecondYearDate.addDays(1);
      LastSecondYearDate = LastSecondYearDate.addYears(-2);
   
         if (mcec.Submit_quotation_day__c != null && String.valueOf(mcec.Submit_quotation_day__c) != '') {
            today = mcec.Submit_quotation_day__c;
            LastYearDate = mcec.Submit_quotation_day__c;
            LastSecondYearDate = mcec.Submit_quotation_day__c;
            LastThirdYearDate = mcec.Submit_quotation_day__c;
         } else {
            today = Date.valueOf(mcec.createdDate);
            LastYearDate = Date.valueOf(mcec.createdDate);
            LastSecondYearDate = Date.valueOf(mcec.createdDate);
            LastThirdYearDate = Date.valueOf(mcec.createdDate);
         }
      // LastThirdYearDate = LastThirdYearDate.addDays(1);
      LastThirdYearDate = LastThirdYearDate.addYears(-3);
      system.debug('去年' + LastYearDate + '前年' + LastSecondYearDate + '大前年' + LastThirdYearDate);
      // 20191210 Gzw 服务合同过去3年修理实绩合并
      List<AggregateResult> FriRepairList = [
         select
         sum(Discount_Price_formula__c) SumPrice,
         //2019/1添加
         sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
         sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
         sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
         sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
         sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
         sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
         sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
         sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
         sum(Repair_Quotation_Id__r.Other_discount__c) other,
         AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
         Delivered_Product__c
         from
         Repair__c
         where
         Delivered_Product__c in:AsList
         and Agreed_Date__c != null
         and Agreed_Date__c > :LastYearDate
         and Agreed_Date__c <= :today
         group by Delivered_Product__c
      ];
      List<AggregateResult> SecRepairList = [
         select
         sum(Discount_Price_formula__c) SumPrice,
         //2019/1添加
         sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
         sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
         sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
         sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
         sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
         sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
         sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
         sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
         sum(Repair_Quotation_Id__r.Other_discount__c) other,
         AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
         Delivered_Product__c
         from
         Repair__c
         where
         Delivered_Product__c in:AsList
         and Agreed_Date__c != null
         and Agreed_Date__c <= :LastYearDate
         and Agreed_Date__c > :LastSecondYearDate
         group by Delivered_Product__c
      ];
      // 过去3年间修理实绩
      List<AggregateResult> ThiRepairList = [
         select
         sum(Discount_Price_formula__c) SumPrice,
         //2019/1添加
         sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
         sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
         sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
         sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
         sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
         sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
         sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
         sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
         sum(Repair_Quotation_Id__r.Other_discount__c) other,
         AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
         Delivered_Product__c
         from
         Repair__c
         where
         Delivered_Product__c in:AsList
         and Agreed_Date__c != null
         and Agreed_Date__c <= :LastSecondYearDate
         and Agreed_Date__c > :LastThirdYearDate
         group by Delivered_Product__c
      ];
      // 过去3年修理实绩
      List<AggregateResult> ThreeyearList = [
         select
         sum(Discount_Price_formula__c) SumPrice,
         //2019/1添加
         sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
         sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
         sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
         sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
         sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
         sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
         sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
         sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
         sum(Repair_Quotation_Id__r.Other_discount__c) other,
         AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
         Delivered_Product__c
         from
         Repair__c
         where
         Delivered_Product__c in:AsList
         and Agreed_Date__c != null
         and Agreed_Date__c <= :today
         and Agreed_Date__c > :LastThirdYearDate
         group by Delivered_Product__c
      ];
   
         LastYearDate = LastYearDate.addYears(-1);
         // LastYearDate = LastYearDate.addDays(1);
      // system.debug('++++++++'+FriRepairList+'++++++++'+SecRepairList+'+++++++'+ThiRepairList+'+++++');
      // 过去1年间
      Map<id, Decimal> LastFriYearPriceSumMap = new Map<id, Decimal>();
      // 过去2年间
      Map<id, Decimal> LastSecYearPriceSumMap = new Map<id, Decimal>();
      // 过去3年间
      Map<id, Decimal> LastThiYearPriceSumMap = new Map<id, Decimal>();
      // 过去3年
      Map<id, Decimal> ThreeYearPriceSumMap = new Map<id, Decimal>();
      Map<id, Decimal> ThiYearMonthMap = new Map<id, Decimal>();
      for (AggregateResult Rpc : FriRepairList) {
         id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
         //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
         Decimal Defir = sumPrice1(Rpc);
         LastFriYearPriceSumMap.put(idf, Defir);
      }
      for (AggregateResult Rpc : SecRepairList) {
         id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
         //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
         Decimal Defir = sumPrice1(Rpc);
         LastSecYearPriceSumMap.put(idf, Defir);
      }
      for (AggregateResult Rpc : ThiRepairList) {
         id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
         //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
         Decimal Defir = sumPrice1(Rpc);
         LastThiYearPriceSumMap.put(idf, Defir);
      }
      for (AggregateResult Rpc : ThreeyearList) {
         id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
         //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
         Decimal threeYearM = decimal.valueOf(Rpc.get('threeYearM') + '');
         Decimal Defir = sumPrice1(Rpc);
         ThreeYearPriceSumMap.put(idf, Defir);
         ThiYearMonthMap.put(idf, threeYearM);
      }
      for (Maintenance_Contract_Asset_Estimate__c Mca : McaeList) {
         Mca.Lastyear_Repair_Cost_Text__c = LastFriYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastFriYearPriceSumMap.get(McaecToAsset.get(Mca.id));
         Mca.Last_Second_Years_Repair_Cost_Text__c = LastSecYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastSecYearPriceSumMap.get(McaecToAsset.get(Mca.id));
         Mca.Last_Third_Years_Repair_Cost_Text__c = LastThiYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastThiYearPriceSumMap.get(McaecToAsset.get(Mca.id));
         Mca.Three_Years_Repair_Cost_Text__c = ThreeYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : ThreeYearPriceSumMap.get(McaecToAsset.get(Mca.id));
         Mca.The_Date_Of_Compute_The_RPCost__c = Date.today();
         Mca.Last_Third_Years_Repair_Month__c = ThiYearMonthMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : ThiYearMonthMap.get(McaecToAsset.get(Mca.id));
   
         // LastSecondYearDate = LastSecondYearDate.addDays(1);
         LastSecondYearDate = LastSecondYearDate.addYears(-2);
         // LastThirdYearDate = LastThirdYearDate.addDays(1);
         LastThirdYearDate = LastThirdYearDate.addYears(-3);
         system.debug('去年' + LastYearDate + '前年' + LastSecondYearDate + '大前年' + LastThirdYearDate);
         // 20191210 Gzw 服务合同过去3年修理实绩合并
         List<AggregateResult> FriRepairList = [
            select
            sum(Discount_Price_formula__c) SumPrice,
            //2019/1添加
            sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
            sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
            sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
            sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
            sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
            sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
            sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
            sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
            sum(Repair_Quotation_Id__r.Other_discount__c) other,
            AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
            Delivered_Product__c
            from
            Repair__c
            where
            Delivered_Product__c in : AsList
            and Agreed_Date__c != null
            and Agreed_Date__c > : LastYearDate
            and Agreed_Date__c <= : today
            group by Delivered_Product__c
         ];
         List<AggregateResult> SecRepairList = [
            select
            sum(Discount_Price_formula__c) SumPrice,
            //2019/1添加
            sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
            sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
            sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
            sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
            sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
            sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
            sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
            sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
            sum(Repair_Quotation_Id__r.Other_discount__c) other,
            AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
            Delivered_Product__c
            from
            Repair__c
            where
            Delivered_Product__c in : AsList
            and Agreed_Date__c != null
            and Agreed_Date__c <= : LastYearDate
            and Agreed_Date__c > : LastSecondYearDate
            group by Delivered_Product__c
         ];
         // 过去3年间修理实绩
         List<AggregateResult> ThiRepairList = [
            select
            sum(Discount_Price_formula__c) SumPrice,
            //2019/1添加
            sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
            sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
            sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
            sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
            sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
            sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
            sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
            sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
            sum(Repair_Quotation_Id__r.Other_discount__c) other,
            AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
            Delivered_Product__c
            from
            Repair__c
            where
            Delivered_Product__c in : AsList
            and Agreed_Date__c != null
            and Agreed_Date__c <= : LastSecondYearDate
            and Agreed_Date__c > : LastThirdYearDate
            group by Delivered_Product__c
         ];
         // 过去3年修理实绩
         List<AggregateResult> ThreeyearList = [
            select
            sum(Discount_Price_formula__c) SumPrice,
            //2019/1添加
            sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
            sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
            sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
            sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
            sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
            sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
            sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
            sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
            sum(Repair_Quotation_Id__r.Other_discount__c) other,
            AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
            Delivered_Product__c
            from
            Repair__c
            where
            Delivered_Product__c in : AsList
            and Agreed_Date__c != null
            and Agreed_Date__c <= : today
            and Agreed_Date__c > : LastThirdYearDate
            group by Delivered_Product__c
         ];
         // 过去1年间
         Map<id, Decimal> LastFriYearPriceSumMap = new Map<id, Decimal>();
         // 过去2年间
         Map<id, Decimal> LastSecYearPriceSumMap = new Map<id, Decimal>();
         // 过去3年间
         Map<id, Decimal> LastThiYearPriceSumMap = new Map<id, Decimal>();
         // 过去3年
         Map<id, Decimal> ThreeYearPriceSumMap = new Map<id, Decimal>();
         Map<id, Decimal> ThiYearMonthMap = new Map<id, Decimal>();
         // system.debug('1'+FriRepairList);
         // system.debug('2'+SecRepairList);
         system.debug('3' + ThiRepairList);
         for (AggregateResult Rpc : FriRepairList) {
            id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
            //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
            Decimal Defir = this.sumPrice(Rpc);
            LastFriYearPriceSumMap.put(idf, Defir);
         }
         for (AggregateResult Rpc : SecRepairList) {
            id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
            //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
            Decimal Defir = this.sumPrice(Rpc);
            LastSecYearPriceSumMap.put(idf, Defir);
         }
         for (AggregateResult Rpc : ThiRepairList) {
            id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
            //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
            Decimal Defir = sumPrice1(Rpc);
            LastThiYearPriceSumMap.put(idf, Defir);
         }
         for (AggregateResult Rpc : ThreeyearList) {
            id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
            //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
            Decimal threeYearM = decimal.valueOf(Rpc.get('threeYearM') + '');
            Decimal Defir = sumPrice1(Rpc);
            ThreeYearPriceSumMap.put(idf, Defir);
            ThiYearMonthMap.put(idf, threeYearM);
         }
         for (Maintenance_Contract_Asset_Estimate__c Mca : McaeList) {
            Mca.Lastyear_Repair_Cost_Text__c = LastFriYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastFriYearPriceSumMap.get(McaecToAsset.get(Mca.id));
            Mca.Last_Second_Years_Repair_Cost_Text__c = LastSecYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastSecYearPriceSumMap.get(McaecToAsset.get(Mca.id));
            Mca.Last_Third_Years_Repair_Cost_Text__c = LastThiYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastThiYearPriceSumMap.get(McaecToAsset.get(Mca.id));
            Mca.Three_Years_Repair_Cost_Text__c = ThreeYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : ThreeYearPriceSumMap.get(McaecToAsset.get(Mca.id));
            Mca.The_Date_Of_Compute_The_RPCost__c = Date.today();
            Mca.Last_Third_Years_Repair_Month__c = ThiYearMonthMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : ThiYearMonthMap.get(McaecToAsset.get(Mca.id));
            system.debug('过去3年天数111 ' + Mca.id + '---' + Mca.Last_Third_Years_Repair_Cost_Text__c + ' +++ ' + Mca.Last_Third_Years_Repair_Month__c);
         }
         try {
            update McaeList;
            //return '';
         } catch (Exception e) {
            //return 'McaeList Update Failed : '+e;
         }
   
      }
      try {
         system.debug('McaeList:::::' + McaeList);
         update McaeList;
   
      private Decimal sumPrice(AggregateResult rpc) {
         Decimal SumPrice = Decimal.valueOf(rpc.get('SumPrice') + '');
         system.debug(rpc.get('sales_discount') == null ? 0 : rpc.get('sales_discount'));
         Decimal sales_discount = Decimal.valueOf((rpc.get('sales_discount') == null ? 0 : rpc.get('sales_discount')) + '') * -1;
         Decimal contract_target = Decimal.valueOf((rpc.get('contract_target') == null ? 0 : rpc.get('contract_target')) + '') * -1;
         Decimal loaner_repair = Decimal.valueOf((rpc.get('loaner_repair') == null ? 0 : rpc.get('loaner_repair')) + '') * -1;
         Decimal long_term_insurance = Decimal.valueOf((rpc.get('long_term_insurance') == null ? 0 : rpc.get('long_term_insurance')) + '') * -1;
         Decimal set_discount = Decimal.valueOf((rpc.get('set_discount') == null ? 0 : rpc.get('set_discount')) + '') * -1;
         Decimal sercince = Decimal.valueOf((rpc.get('sercince') == null ? 0 : rpc.get('sercince')) + '') * -1;
         Decimal long_term_insuranceMD = Decimal.valueOf((rpc.get('long_term_insuranceMD') == null ? 0 : rpc.get('long_term_insuranceMD')) + '') * -1;
         Decimal delivery = Decimal.valueOf((rpc.get('delivery') == null ? 0 : rpc.get('delivery')) + '') * -1;
         Decimal other = Decimal.valueOf((rpc.get('other') == null ? 0 : rpc.get('other')) + '') * -1;
         system.debug(rpc.get('SumPrice') + '--' + rpc.get('sales_discount') + '--' + rpc.get('contract_target') + '--' +
                   rpc.get('loaner_repair') + '--' + rpc.get('long_term_insurance') + '--' + rpc.get('set_discount') + '--' + rpc.get('long_term_insuranceMD')
                   + '--' + rpc.get('delivery') + '--' + rpc.get('other') + '--');
         return SumPrice + sales_discount + contract_target + loaner_repair + long_term_insurance + sercince + set_discount + long_term_insuranceMD + delivery + other;
         //return '';
      } catch (Exception e) {
         //return 'McaeList Update Failed : '+e;
      }
   
      private static Decimal sumPrice1(AggregateResult rpc) {
         Decimal SumPrice = Decimal.valueOf(rpc.get('SumPrice') + '');
         Decimal sales_discount = Decimal.valueOf((rpc.get('sales_discount') == null ? 0 : rpc.get('sales_discount')) + '') * -1;
         Decimal contract_target = Decimal.valueOf((rpc.get('contract_target') == null ? 0 : rpc.get('contract_target')) + '') * -1;
         Decimal loaner_repair = Decimal.valueOf((rpc.get('loaner_repair') == null ? 0 : rpc.get('loaner_repair')) + '') * -1;
         Decimal long_term_insurance = Decimal.valueOf((rpc.get('long_term_insurance') == null ? 0 : rpc.get('long_term_insurance')) + '') * -1;
         Decimal set_discount = Decimal.valueOf((rpc.get('set_discount') == null ? 0 : rpc.get('set_discount')) + '') * -1;
         Decimal sercince = Decimal.valueOf((rpc.get('sercince') == null ? 0 : rpc.get('sercince')) + '') * -1;
         Decimal long_term_insuranceMD = Decimal.valueOf((rpc.get('long_term_insuranceMD') == null ? 0 : rpc.get('long_term_insuranceMD')) + '') * -1;
         Decimal delivery = Decimal.valueOf((rpc.get('delivery') == null ? 0 : rpc.get('delivery')) + '') * -1;
         Decimal other = Decimal.valueOf((rpc.get('other') == null ? 0 : rpc.get('other')) + '') * -1;
         system.debug(rpc.get('SumPrice') + '--' + rpc.get('sales_discount') + '--' + rpc.get('contract_target') + '--' +
                   rpc.get('loaner_repair') + '--' + rpc.get('long_term_insurance') + '--' + rpc.get('set_discount') + '--' + rpc.get('long_term_insuranceMD')
                   + '--' + rpc.get('delivery') + '--' + rpc.get('other') + '--');
         return SumPrice + sales_discount + contract_target + loaner_repair + long_term_insurance + sercince + set_discount + long_term_insuranceMD + delivery + other;
   }
   public void ComputeLTYRepair() {
      system.debug('ComputeLTYRepair=====Start');
      List<Maintenance_Contract_Asset_Estimate__c> McaeList = new List<Maintenance_Contract_Asset_Estimate__c>();
      McaeList = [select id, asset__c, Lastyear_Repair_Cost_Text__c, Last_Second_Years_Repair_Cost_Text__c, Last_Third_Years_Repair_Cost_Text__c, Three_Years_Repair_Cost_Text__c
               from Maintenance_Contract_Asset_Estimate__c
               where Maintenance_Contract_Estimate__c = :targetEstimateId];
      List<id> AsList = new List<id>();
      Map<id, id> McaecToAsset = new Map<id, id>();
      for (Maintenance_Contract_Asset_Estimate__c Mcaes : McaeList) {
         AsList.add(Mcaes.asset__c);
         McaecToAsset.put(Mcaes.id, Mcaes.asset__c);
      }
      Maintenance_Contract_Estimate__c mcec = new Maintenance_Contract_Estimate__c();
      List<Maintenance_Contract_Estimate__c>  mcecList = new List<Maintenance_Contract_Estimate__c>();
      mcecList = [select id, createdDate, Submit_quotation_day__c from Maintenance_Contract_Estimate__c where id = :targetEstimateId];
      if (mcecList.size() == 0) {
         ApexPages.addMessage(new ApexPages.message(ApexPages.severity.Error, '请先保存报价!'));
         return;
      } else {
         mcec = mcecList[0];
      }
      //1年前维修实绩
      Date today = null;
      Date LastYearDate = null;
      Date LastSecondYearDate = null;
      Date LastThirdYearDate = null;
      Decimal LastYearPriceForMCAEC = 0;
      if (mcec.Submit_quotation_day__c != null && String.valueOf(mcec.Submit_quotation_day__c) != '') {
         today = mcec.Submit_quotation_day__c;
         LastYearDate = mcec.Submit_quotation_day__c;
         LastSecondYearDate = mcec.Submit_quotation_day__c;
         LastThirdYearDate = mcec.Submit_quotation_day__c;
      } else {
         today = Date.valueOf(mcec.createdDate);
         LastYearDate = Date.valueOf(mcec.createdDate);
         LastSecondYearDate = Date.valueOf(mcec.createdDate);
         LastThirdYearDate = Date.valueOf(mcec.createdDate);
      }
      LastYearDate = LastYearDate.addYears(-1);
      // LastYearDate = LastYearDate.addDays(1);
      // LastSecondYearDate = LastSecondYearDate.addDays(1);
      LastSecondYearDate = LastSecondYearDate.addYears(-2);
      // LastThirdYearDate = LastThirdYearDate.addDays(1);
      LastThirdYearDate = LastThirdYearDate.addYears(-3);
      system.debug('去年' + LastYearDate + '前年' + LastSecondYearDate + '大前年' + LastThirdYearDate);
      // 20191210 Gzw 服务合同过去3年修理实绩合并
      List<AggregateResult> FriRepairList = [
         select
         sum(Discount_Price_formula__c) SumPrice,
         //2019/1添加
         sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
         sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
         sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
         sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
         sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
         sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
         sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
         sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
         sum(Repair_Quotation_Id__r.Other_discount__c) other,
         AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
         Delivered_Product__c
         from
         Repair__c
         where
         Delivered_Product__c in:AsList
         and Agreed_Date__c != null
         and Agreed_Date__c > :LastYearDate
         and Agreed_Date__c <= :today
         group by Delivered_Product__c
      ];
      List<AggregateResult> SecRepairList = [
         select
         sum(Discount_Price_formula__c) SumPrice,
         //2019/1添加
         sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
         sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
         sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
         sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
         sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
         sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
         sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
         sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
         sum(Repair_Quotation_Id__r.Other_discount__c) other,
         AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
         Delivered_Product__c
         from
         Repair__c
         where
         Delivered_Product__c in:AsList
         and Agreed_Date__c != null
         and Agreed_Date__c <= :LastYearDate
         and Agreed_Date__c > :LastSecondYearDate
         group by Delivered_Product__c
      ];
      // 过去3年间修理实绩
      List<AggregateResult> ThiRepairList = [
         select
         sum(Discount_Price_formula__c) SumPrice,
         //2019/1添加
         sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
         sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
         sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
         sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
         sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
         sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
         sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
         sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
         sum(Repair_Quotation_Id__r.Other_discount__c) other,
         AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
         Delivered_Product__c
         from
         Repair__c
         where
         Delivered_Product__c in:AsList
         and Agreed_Date__c != null
         and Agreed_Date__c <= :LastSecondYearDate
         and Agreed_Date__c > :LastThirdYearDate
         group by Delivered_Product__c
      ];
      // 过去3年修理实绩
      List<AggregateResult> ThreeyearList = [
         select
         sum(Discount_Price_formula__c) SumPrice,
         //2019/1添加
         sum(Repair_Quotation_Id__r.sales_discount__c) sales_discount,
         sum(Repair_Quotation_Id__r.Contract_target__c) contract_target,
         sum(Repair_Quotation_Id__r.Loaner_repair__c) loaner_repair,
         sum(Repair_Quotation_Id__r.long_term_insurance__c) long_term_insurance,
         sum(Repair_Quotation_Id__r.Set_discount__c) set_discount,
         sum(Repair_Quotation_Id__r.Servince_contract_discount_amount__c) sercince,
         sum(Repair_Quotation_Id__r.long_term_insurance_MD__c) long_term_insuranceMD,
         sum(Repair_Quotation_Id__r.Delivery_compensation__c) delivery,
         sum(Repair_Quotation_Id__r.Other_discount__c) other,
         AVG(Delivered_Product__r.Last_Years_Repair_Month__c) threeYearM,
         Delivered_Product__c
         from
         Repair__c
         where
         Delivered_Product__c in:AsList
         and Agreed_Date__c != null
         and Agreed_Date__c <= :today
         and Agreed_Date__c > :LastThirdYearDate
         group by Delivered_Product__c
      ];
      // 过去1年间
      Map<id, Decimal> LastFriYearPriceSumMap = new Map<id, Decimal>();
      // 过去2年间
      Map<id, Decimal> LastSecYearPriceSumMap = new Map<id, Decimal>();
      // 过去3年间
      Map<id, Decimal> LastThiYearPriceSumMap = new Map<id, Decimal>();
      // 过去3年
      Map<id, Decimal> ThreeYearPriceSumMap = new Map<id, Decimal>();
      Map<id, Decimal> ThiYearMonthMap = new Map<id, Decimal>();
      // system.debug('1'+FriRepairList);
      // system.debug('2'+SecRepairList);
      system.debug('3' + ThiRepairList);
      for (AggregateResult Rpc : FriRepairList) {
         id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
         //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
         Decimal Defir = this.sumPrice(Rpc);
         LastFriYearPriceSumMap.put(idf, Defir);
      }
      for (AggregateResult Rpc : SecRepairList) {
         id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
         //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
         Decimal Defir = this.sumPrice(Rpc);
         LastSecYearPriceSumMap.put(idf, Defir);
      }
      for (AggregateResult Rpc : ThiRepairList) {
         id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
         //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
         Decimal Defir = sumPrice1(Rpc);
         LastThiYearPriceSumMap.put(idf, Defir);
      }
      for (AggregateResult Rpc : ThreeyearList) {
         id idf        = String.valueOf(Rpc.get('Delivered_Product__c'));
         //Decimal Defir = decimal.valueOf(Rpc.get('SumPrice')+'');
         Decimal threeYearM = decimal.valueOf(Rpc.get('threeYearM') + '');
         Decimal Defir = sumPrice1(Rpc);
         ThreeYearPriceSumMap.put(idf, Defir);
         ThiYearMonthMap.put(idf, threeYearM);
      }
      for (Maintenance_Contract_Asset_Estimate__c Mca : McaeList) {
         Mca.Lastyear_Repair_Cost_Text__c = LastFriYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastFriYearPriceSumMap.get(McaecToAsset.get(Mca.id));
         Mca.Last_Second_Years_Repair_Cost_Text__c = LastSecYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastSecYearPriceSumMap.get(McaecToAsset.get(Mca.id));
         Mca.Last_Third_Years_Repair_Cost_Text__c = LastThiYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : LastThiYearPriceSumMap.get(McaecToAsset.get(Mca.id));
         Mca.Three_Years_Repair_Cost_Text__c = ThreeYearPriceSumMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : ThreeYearPriceSumMap.get(McaecToAsset.get(Mca.id));
         Mca.The_Date_Of_Compute_The_RPCost__c = Date.today();
         Mca.Last_Third_Years_Repair_Month__c = ThiYearMonthMap.get(McaecToAsset.get(Mca.id)) == null ? 0 : ThiYearMonthMap.get(McaecToAsset.get(Mca.id));
         system.debug('过去3年天数111 ' + Mca.id + '---' + Mca.Last_Third_Years_Repair_Cost_Text__c + ' +++ ' + Mca.Last_Third_Years_Repair_Month__c);
      }
      try {
         update McaeList;
         //return '';
      } catch (Exception e) {
         //return 'McaeList Update Failed : '+e;
      }
   }
   private Decimal sumPrice(AggregateResult rpc) {
      Decimal SumPrice = Decimal.valueOf(rpc.get('SumPrice') + '');
      system.debug(rpc.get('sales_discount') == null ? 0 : rpc.get('sales_discount'));
      Decimal sales_discount = Decimal.valueOf((rpc.get('sales_discount') == null ? 0 : rpc.get('sales_discount')) + '') * -1;
      Decimal contract_target = Decimal.valueOf((rpc.get('contract_target') == null ? 0 : rpc.get('contract_target')) + '') * -1;
      Decimal loaner_repair = Decimal.valueOf((rpc.get('loaner_repair') == null ? 0 : rpc.get('loaner_repair')) + '') * -1;
      Decimal long_term_insurance = Decimal.valueOf((rpc.get('long_term_insurance') == null ? 0 : rpc.get('long_term_insurance')) + '') * -1;
      Decimal set_discount = Decimal.valueOf((rpc.get('set_discount') == null ? 0 : rpc.get('set_discount')) + '') * -1;
      Decimal sercince = Decimal.valueOf((rpc.get('sercince') == null ? 0 : rpc.get('sercince')) + '') * -1;
      Decimal long_term_insuranceMD = Decimal.valueOf((rpc.get('long_term_insuranceMD') == null ? 0 : rpc.get('long_term_insuranceMD')) + '') * -1;
      Decimal delivery = Decimal.valueOf((rpc.get('delivery') == null ? 0 : rpc.get('delivery')) + '') * -1;
      Decimal other = Decimal.valueOf((rpc.get('other') == null ? 0 : rpc.get('other')) + '') * -1;
      system.debug(rpc.get('SumPrice') + '--' + rpc.get('sales_discount') + '--' + rpc.get('contract_target') + '--' +
                rpc.get('loaner_repair') + '--' + rpc.get('long_term_insurance') + '--' + rpc.get('set_discount') + '--' + rpc.get('long_term_insuranceMD')
                + '--' + rpc.get('delivery') + '--' + rpc.get('other') + '--');
      return SumPrice + sales_discount + contract_target + loaner_repair + long_term_insurance + sercince + set_discount + long_term_insuranceMD + delivery + other;
   }
   private static Decimal sumPrice1(AggregateResult rpc) {
      Decimal SumPrice = Decimal.valueOf(rpc.get('SumPrice') + '');
      Decimal sales_discount = Decimal.valueOf((rpc.get('sales_discount') == null ? 0 : rpc.get('sales_discount')) + '') * -1;
      Decimal contract_target = Decimal.valueOf((rpc.get('contract_target') == null ? 0 : rpc.get('contract_target')) + '') * -1;
      Decimal loaner_repair = Decimal.valueOf((rpc.get('loaner_repair') == null ? 0 : rpc.get('loaner_repair')) + '') * -1;
      Decimal long_term_insurance = Decimal.valueOf((rpc.get('long_term_insurance') == null ? 0 : rpc.get('long_term_insurance')) + '') * -1;
      Decimal set_discount = Decimal.valueOf((rpc.get('set_discount') == null ? 0 : rpc.get('set_discount')) + '') * -1;
      Decimal sercince = Decimal.valueOf((rpc.get('sercince') == null ? 0 : rpc.get('sercince')) + '') * -1;
      Decimal long_term_insuranceMD = Decimal.valueOf((rpc.get('long_term_insuranceMD') == null ? 0 : rpc.get('long_term_insuranceMD')) + '') * -1;
      Decimal delivery = Decimal.valueOf((rpc.get('delivery') == null ? 0 : rpc.get('delivery')) + '') * -1;
      Decimal other = Decimal.valueOf((rpc.get('other') == null ? 0 : rpc.get('other')) + '') * -1;
      system.debug(rpc.get('SumPrice') + '--' + rpc.get('sales_discount') + '--' + rpc.get('contract_target') + '--' +
                rpc.get('loaner_repair') + '--' + rpc.get('long_term_insurance') + '--' + rpc.get('set_discount') + '--' + rpc.get('long_term_insuranceMD')
                + '--' + rpc.get('delivery') + '--' + rpc.get('other') + '--');
      return SumPrice + sales_discount + contract_target + loaner_repair + long_term_insurance + sercince + set_discount + long_term_insuranceMD + delivery + other;
   }
   
   
   //废弃中=========20161024==============//
      public void ShowLTYRepair() {
         system.debug('ShowLTYRepair=====Start');
         lastFriYearsPriceSum = 0;
         lastSecYearsPriceSum = 0;
         //
         List<Maintenance_Contract_Estimate__c> McecList = new List<Maintenance_Contract_Estimate__c>();
         McecList = [select
                  Last_Year_Repair_Sum__c,
                  Year_Before_Last_Year_Re_Sum__c,
                  Last_Two_Year_Repair_sum__c,
                  Process_Status__c,    //报价状态
                  Repair_Sum_Compute_Date__c
                  from
                  Maintenance_Contract_Estimate__c
                  where
                  id = : targetEstimateId
         ];
         Maintenance_Contract_Estimate__c McecEle = new Maintenance_Contract_Estimate__c();
         if (McecList.size() > 0) {
            McecEle = McecList[0];
            Date ComputeD = McecEle.Repair_Sum_Compute_Date__c == null ? Date.today() : McecEle.Repair_Sum_Compute_Date__c;
            String DateString1 = ComputeD + '';
            String DateString2 = ComputeD.addYears(-2).addDays(1) + '';
            alertString = '集計対象期間:' + DateString1.substring(0, 10) + '~' + DateString2.substring(0, 10) + '';
            alertString2 = '去年修理実績合計:' + McecEle.Last_Year_Repair_Sum__c + ' RMB ';
            alertString3 = '前年修理実績合計:' + McecEle.Year_Before_Last_Year_Re_Sum__c + ' RMB';
         } else {
            alertString = '没有有效的维修合同报价';
         }
   public void ShowLTYRepair() {
      system.debug('ShowLTYRepair=====Start');
      lastFriYearsPriceSum = 0;
      lastSecYearsPriceSum = 0;
      //
      List<Maintenance_Contract_Estimate__c> McecList = new List<Maintenance_Contract_Estimate__c>();
      McecList = [select
               Last_Year_Repair_Sum__c,
               Year_Before_Last_Year_Re_Sum__c,
               Last_Two_Year_Repair_sum__c,
               Process_Status__c,        //报价状态
               Repair_Sum_Compute_Date__c
               from
               Maintenance_Contract_Estimate__c
               where
               id = :targetEstimateId
      ];
      Maintenance_Contract_Estimate__c McecEle = new Maintenance_Contract_Estimate__c();
      if (McecList.size() > 0) {
         McecEle = McecList[0];
         Date ComputeD = McecEle.Repair_Sum_Compute_Date__c == null ? Date.today() : McecEle.Repair_Sum_Compute_Date__c;
         String DateString1 = ComputeD + '';
         String DateString2 = ComputeD.addYears(-2).addDays(1) + '';
         alertString = '集計対象期間:' + DateString1.substring(0, 10) + '~' + DateString2.substring(0, 10) + '';
         alertString2 = '去年修理実績合計:' + McecEle.Last_Year_Repair_Sum__c + ' RMB ';
         alertString3 = '前年修理実績合計:' + McecEle.Year_Before_Last_Year_Re_Sum__c + ' RMB';
      } else {
         alertString = '没有有效的维修合同报价';
      }
   }
   /**
    * 手動で商品選択後のリフレッシュ
    **/
      public void refreshProductData() {
         System.debug('1535.......................进入refreshProductData方法');
         System.debug('1536.......................进入refreshProductData方法');
         for (Integer i = 0; i < checkedAssets.size(); i++) {
            if (i == productIdx) {
               AssetInfo ai = checkedAssets[i];
               if (ai.mcae.Product_Manual__c == null) {
                  ai.mcae.Estimate_List_Price__c = null;
                  // add by fxk 2021/9/9 控制点检对象是否可选 Star
                  ai.CheckRows = true;
                  // add by fxk 2021/9/9 控制点检对象是否可选 End
                  System.debug('1540--');
               } else {
                  List<Product2> prd = [select Id, Maintenance_Price_Month__c, EquipmentGuaranteeFlg__c, Name,
                                   ProductURF__c, ProductURF__r.URFLimitSerial__c, ProductURF__r.UFR_MaxRepairCount__c, ProductURF__r.UFR_Maintenance_Price_Month__c
                                   from Product2 where Id = : ai.mcae.Product_Manual__c];
                  ai.mcae.EquipmentGuaranteeFlgTxt__c = prd[0].EquipmentGuaranteeFlg__c;
                  ai.etGFlg = prd[0].EquipmentGuaranteeFlg__c;
                  //add by rentx 2020-11-12 LJPH-BV93RZ start
                  ai.proName = prd[0].Name;
                  //add by rentx 2020-11-12 LJPH-BV93RZ end
                  // add by fxk 2021/9/9 控制点检对象是否可选 Star
                  ai.CheckRows = false;
                  // add by fxk 2021/9/9 控制点检对象是否可选 End
                  // 限次信息 gzw 20210316 start
                  if (String.isBlank(prd[0].ProductURF__c)) {
                     ai.mcae.Product_Manual__c.addError(prd[0].Name + ' 不是限次产品,请重新选择!');
                     return;
                  }
                  ai.mcae.Estimate_List_Price__c = prd[0].ProductURF__r.UFR_Maintenance_Price_Month__c * isNewPriceAdj;
                  //ai.mcae.Maintenance_Price_YearTXT__c = ai.mcae.Estimate_List_Price__c * 12;
                  ai.orgPrice = prd[0].ProductURF__r.UFR_Maintenance_Price_Month__c;
                  ai.uFRPrice = prd[0].ProductURF__r.UFR_Maintenance_Price_Month__c;
                  ai.uFRSerial = prd[0].ProductURF__r.URFLimitSerial__c;
                  ai.uFRRepairCount = prd[0].ProductURF__r.UFR_MaxRepairCount__c;
                  // 限次信息 gzw 20210316 end
   public void refreshProductData() {
      System.debug('1535.......................进入refreshProductData方法');
      System.debug('1536.......................进入refreshProductData方法');
      for (Integer i = 0; i < checkedAssets.size(); i++) {
         if (i == productIdx) {
            AssetInfo ai = checkedAssets[i];
            if (ai.mcae.Product_Manual__c == null) {
               ai.mcae.Estimate_List_Price__c = null;
               // add by fxk 2021/9/9 控制点检对象是否可选 Star
               ai.CheckRows = true;
               // add by fxk 2021/9/9 控制点检对象是否可选 End
               System.debug('1540--');
            } else {
               List<Product2> prd = [select Id, Maintenance_Price_Month__c, EquipmentGuaranteeFlg__c, Name,
                                ProductURF__c, ProductURF__r.URFLimitSerial__c, ProductURF__r.UFR_MaxRepairCount__c, ProductURF__r.UFR_Maintenance_Price_Month__c
                                //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
                                , ProductURF__r.Maintenance_Price_Year_URF__c, ProductURF__r.Maintenance_Price_Year_URF_Max__c
                                //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
                                from Product2 where Id = :ai.mcae.Product_Manual__c];
               ai.mcae.EquipmentGuaranteeFlgTxt__c = prd[0].EquipmentGuaranteeFlg__c;
               ai.etGFlg = prd[0].EquipmentGuaranteeFlg__c;
               //add by rentx 2020-11-12 LJPH-BV93RZ start
               ai.proName = prd[0].Name;
               //add by rentx 2020-11-12 LJPH-BV93RZ end
               // add by fxk 2021/9/9 控制点检对象是否可选 Star
               ai.CheckRows = false;
               // add by fxk 2021/9/9 控制点检对象是否可选 End
               // 限次信息 gzw 20210316 start
               if (String.isBlank(prd[0].ProductURF__c)) {
                  ai.mcae.Product_Manual__c.addError(prd[0].Name + ' 不是限次产品,请重新选择!');
                  return;
               }
               ai.mcae.Estimate_List_Price__c = prd[0].ProductURF__r.UFR_Maintenance_Price_Month__c * isNewPriceAdj;
               //ai.mcae.Maintenance_Price_YearTXT__c = ai.mcae.Estimate_List_Price__c * 12;
               ai.orgPrice = prd[0].ProductURF__r.UFR_Maintenance_Price_Month__c;
               ai.uFRPrice = prd[0].ProductURF__r.UFR_Maintenance_Price_Month__c;
               ai.uFRSerial = prd[0].ProductURF__r.URFLimitSerial__c;
               ai.uFRRepairCount = prd[0].ProductURF__r.UFR_MaxRepairCount__c;
               // 限次信息 gzw 20210316 end
               //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
               ai.uFRMaxPrice = prd[0].ProductURF__r.Maintenance_Price_Year_URF_Max__c;
               ai.uFRMinPrice = prd[0].ProductURF__r.Maintenance_Price_Year_URF__c;
               //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
            }
         }
         // HWAG-BA73ZP
         //contractStartDateChange();
      }
      // HWAG-BA73ZP
      //contractStartDateChange();
   }
   
   /**
    * 選択済み/未選択製品の置き換え
    */
      public PageReference exchangeAsset() {
         System.debug('exchangeAsset start');
         Date systemToday = System.today();
         List<AssetInfo> tmpChecked = new List<AssetInfo>();
         List<AssetInfo> tmpNewRows = new List<AssetInfo>();
         List<AssetInfo> tmpUnChecked = new List<AssetInfo>();
         // 限次合同不需要上下限 20210315 gzw start
         // List<Data> datatemp = new List<Data>();
         // datatemp = getChartData();
         // 限次合同不需要上下限 20210315 gzw end
         for (AssetInfo ass : this.checkedAssets) {
            if (ass.isManual) {
               tmpNewRows.add(ass);
            } else if (ass.rec_checkBox_c) {
               tmpChecked.add(ass);
            } else {
               ass.mcae = null;
               tmpUnChecked.add(ass);
               totalRecords++;
            }
   public PageReference exchangeAsset() {
      System.debug('exchangeAsset start');
      Date systemToday = System.today();
      List<AssetInfo> tmpChecked = new List<AssetInfo>();
      List<AssetInfo> tmpNewRows = new List<AssetInfo>();
      List<AssetInfo> tmpUnChecked = new List<AssetInfo>();
      // 限次合同不需要上下限 20210315 gzw start
      // List<Data> datatemp = new List<Data>();
      // datatemp = getChartData();
      // 限次合同不需要上下限 20210315 gzw end
      for (AssetInfo ass : this.checkedAssets) {
         if (ass.isManual) {
            tmpNewRows.add(ass);
         } else if (ass.rec_checkBox_c) {
            tmpChecked.add(ass);
         } else {
            ass.mcae = null;
            tmpUnChecked.add(ass);
            totalRecords++;
         }
         for (AssetInfo ass : this.unCheckedAssets) {
            Boolean isNew = false;
            // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
            boolean isCheck = true;
            // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk End
            // Decimal listPrice = ass.rec.Maintenance_Price_Month__c;
            Decimal listPrice = ass.rec.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
            if (ass.rec_checkBox_c) {
               //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , 'unCheckedAssets ' ));
               // xudan 20160110 新品判断ここ要らない、contractStartDateChangeがやる
      }
      for (AssetInfo ass : this.unCheckedAssets) {
         Boolean isNew = false;
         // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
         boolean isCheck = true;
         // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk End
         // Decimal listPrice = ass.rec.Maintenance_Price_Month__c;
         Decimal listPrice = ass.rec.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
         //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220510 start
         Decimal MaxPrice = ass.rec.Product2.ProductURF__r.Maintenance_Price_Year_URF_Max__c;
         Decimal MinPrice = ass.rec.Product2.ProductURF__r.Maintenance_Price_Year_URF__c;
         //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220510 end
         if (ass.rec_checkBox_c) {
            //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , 'unCheckedAssets ' ));
            // xudan 20160110 新品判断ここ要らない、contractStartDateChangeがやる
   //                if (systemToday.addMonths(-6) < ass.rec.InstallDate) {
   //                if (estimate.Contract_Esti_Start_Date__c.addMonths(isNewAddMonth) < ass.rec.InstallDate) {
   //                Date createdDate = estimate.CreatedDate == null ? systemToday : estimate.CreatedDate.date();
@@ -1816,77 +1848,81 @@
   //                    isNew = true;
   //                    listPrice = ass.rec.Maintenance_Price_Month__c * isNewPriceAdj;
   //                }
               Maintenance_Contract_Asset_Estimate__c mcae = new Maintenance_Contract_Asset_Estimate__c(
                  isNew__c = isNew,
                  // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
                  Check_Object__c = isCheck,
                  // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk end
                  Estimate_List_Price__c = listPrice,
                  EquipmentGuaranteeFlgTxt__c = ass.rec.EquipmentGuaranteeFlg__c
                  );
               ass.mcae = mcae;
               // 计算上下线调整比例
               // 限次合同不需要上下限 20210315 gzw start
               if (!getPageDisabled()) {
                  // 取当前月第一天
                  Date mon1stDate = Date.newInstance(Date.today().year(), Date.today().month(), 1);
                  mcae.LastMContract_Price__c = ass.rec.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c == null ? mcae.LastMContract_Price__c : ass.rec.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c;
                  if (ass.rec.CurrentContract_F__r.First_Estimate_Date__c != null && ass.rec.CurrentContract_F__r.Estimate_Contract_endDate__c > mon1stDate) {
                     mcae.Asset_Consumption_rate__c = ass.rec.CurrentContract_F__r.First_contract_usage_Rate__c == null ? mcae.Asset_Consumption_rate__c : ass.rec.CurrentContract_F__r.First_contract_usage_Rate__c;
                  } else {
                     mcae.Asset_Consumption_rate__c = ass.rec.CurrentContract_F__r.Contract_Consumption_rate__c == null ? mcae.Asset_Consumption_rate__c : ass.rec.CurrentContract_F__r.Contract_Consumption_rate__c;
                  }
                  // if(String.isNotBlank(String.valueOf(mcae.Asset_Consumption_rate__c))){
                  //     for (Data da : datatemp) {
                  //         if (String.isBlank(String.valueOf(da.rate_Lower)) &&  mcae.Asset_Consumption_rate__c < da.rate_Upper) {
                  //             mcae.Adjustment_ratio_Lower__c = da.price_Lower;
                  //             mcae.Adjustment_ratio_Upper__c = da.price_Upper;
                  //             continue;
                  //         }else if (mcae.Asset_Consumption_rate__c >= da.rate_Lower && String.isBlank(String.valueOf(da.rate_Upper))) {
                  //             mcae.Adjustment_ratio_Lower__c = da.price_Lower;
                  //             mcae.Adjustment_ratio_Upper__c = da.price_Upper;
                  //             continue;
                  //         }else if (mcae.Asset_Consumption_rate__c >= da.rate_Lower
                  //                 && mcae.Asset_Consumption_rate__c < da.rate_Upper) {
                  //             mcae.Adjustment_ratio_Lower__c = da.price_Lower;
                  //             mcae.Adjustment_ratio_Upper__c = da.price_Upper;
                  //             continue;
                  //         }
                  //     }
                  // }
            Maintenance_Contract_Asset_Estimate__c mcae = new Maintenance_Contract_Asset_Estimate__c(
               isNew__c = isNew,
               // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
               Check_Object__c = isCheck,
               // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk end
               Estimate_List_Price__c = listPrice,
               //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
               Adjustment_Upper_price__c = MaxPrice,
               Adjustment_Lower_price__c = MinPrice,
               //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
               EquipmentGuaranteeFlgTxt__c = ass.rec.EquipmentGuaranteeFlg__c
               );
            ass.mcae = mcae;
            // 计算上下线调整比例
            // 限次合同不需要上下限 20210315 gzw start
            if (!getPageDisabled()) {
               // 取当前月第一天
               Date mon1stDate = Date.newInstance(Date.today().year(), Date.today().month(), 1);
               mcae.LastMContract_Price__c = ass.rec.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c == null ? mcae.LastMContract_Price__c : ass.rec.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c;
               if (ass.rec.CurrentContract_F__r.First_Estimate_Date__c != null && ass.rec.CurrentContract_F__r.Estimate_Contract_endDate__c > mon1stDate) {
                  mcae.Asset_Consumption_rate__c = ass.rec.CurrentContract_F__r.First_contract_usage_Rate__c == null ? mcae.Asset_Consumption_rate__c : ass.rec.CurrentContract_F__r.First_contract_usage_Rate__c;
               } else {
                  mcae.Asset_Consumption_rate__c = ass.rec.CurrentContract_F__r.Contract_Consumption_rate__c == null ? mcae.Asset_Consumption_rate__c : ass.rec.CurrentContract_F__r.Contract_Consumption_rate__c;
               }
               // 限次合同不需要上下限 20210315 gzw end
               tmpChecked.add(ass);
               totalRecords--;
            } else {
               ass.mcae = null;
               tmpUnChecked.add(ass);
               // if(String.isNotBlank(String.valueOf(mcae.Asset_Consumption_rate__c))){
               //     for (Data da : datatemp) {
               //         if (String.isBlank(String.valueOf(da.rate_Lower)) &&  mcae.Asset_Consumption_rate__c < da.rate_Upper) {
               //             mcae.Adjustment_ratio_Lower__c = da.price_Lower;
               //             mcae.Adjustment_ratio_Upper__c = da.price_Upper;
               //             continue;
               //         }else if (mcae.Asset_Consumption_rate__c >= da.rate_Lower && String.isBlank(String.valueOf(da.rate_Upper))) {
               //             mcae.Adjustment_ratio_Lower__c = da.price_Lower;
               //             mcae.Adjustment_ratio_Upper__c = da.price_Upper;
               //             continue;
               //         }else if (mcae.Asset_Consumption_rate__c >= da.rate_Lower
               //                 && mcae.Asset_Consumption_rate__c < da.rate_Upper) {
               //             mcae.Adjustment_ratio_Lower__c = da.price_Lower;
               //             mcae.Adjustment_ratio_Upper__c = da.price_Upper;
               //             continue;
               //         }
               //     }
               // }
            }
         }
            // 限次合同不需要上下限 20210315 gzw end
   
         this.checkedAssets = new List<AssetInfo>();
         for (AssetInfo ass : tmpChecked) {
            ass.lineNo = this.checkedAssets.size();
            this.checkedAssets.add(ass);
         }
         for (AssetInfo ass : tmpNewRows) {
            ass.lineNo = this.checkedAssets.size();
            this.checkedAssets.add(ass);
         }
         this.unCheckedAssets = new List<AssetInfo>();
         this.unCheckedAssets.addAll(tmpUnChecked);
   
         totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
         this.setPageRecord();
   
         //listCut(unCheckedAssets);
         // 根据合同开始日重新计算维修合同价格
         //contractStartDateChange();
         return null;
            tmpChecked.add(ass);
            totalRecords--;
         } else {
            ass.mcae = null;
            tmpUnChecked.add(ass);
         }
      }
      this.checkedAssets = new List<AssetInfo>();
      for (AssetInfo ass : tmpChecked) {
         ass.lineNo = this.checkedAssets.size();
         this.checkedAssets.add(ass);
      }
      for (AssetInfo ass : tmpNewRows) {
         ass.lineNo = this.checkedAssets.size();
         this.checkedAssets.add(ass);
      }
      this.unCheckedAssets = new List<AssetInfo>();
      this.unCheckedAssets.addAll(tmpUnChecked);
      totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
      this.setPageRecord();
      //listCut(unCheckedAssets);
      // 根据合同开始日重新计算维修合同价格
      //contractStartDateChange();
      return null;
   }
   
   // 合同开始日变更,重新计算新品
   // 合同开始日变更,不计算新品,设备上的新品只看报价时点的状态 注释 BY GZW 20200325
@@ -1982,1312 +2018,1347 @@
   /**
    * 保存メソッド
    */
      public PageReference save() {
         System.debug('save start');
         //add by rentx 2020-11-13 LJPH-BV93RZ start
         if (estimate.Contract_Range__c == null) {
            System.debug('save start00');
            this.estimate.Contract_Range__c.addError('必须输入合同月数!');
            return null;
         }
         //add by rentx 2020-11-13 LJPH-BV93RZ end
         System.debug('save start1');
         Id vmMaintenance_Contract = Schema.SObjectType.Maintenance_Contract_Estimate__c.getRecordTypeInfosByDeveloperName().get('NewMaintenance_Quote').getRecordTypeId();
         estimate.recordtypeid = vmMaintenance_Contract;
         if (changedSubmitPrice) {
            priceChangeReset();
            return null;
         }
         System.debug('save start2');
         if (syncEstimate(false, false)) {
            ComputeLTYRepair();
            //return null;
            return new PageReference('/' + this.targetEstimateId + '/e?completion=5');
         }
         System.debug('save start3');
   public PageReference save() {
      System.debug('save start');
      //add by rentx 2020-11-13 LJPH-BV93RZ start
      if (estimate.Contract_Range__c == null) {
         System.debug('save start00');
         this.estimate.Contract_Range__c.addError('必须输入合同月数!');
         return null;
      }
      //add by rentx 2020-11-13 LJPH-BV93RZ end
      System.debug('save start1');
      Id vmMaintenance_Contract = Schema.SObjectType.Maintenance_Contract_Estimate__c.getRecordTypeInfosByDeveloperName().get('NewMaintenance_Quote').getRecordTypeId();
      estimate.recordtypeid = vmMaintenance_Contract;
      if (changedSubmitPrice) {
         priceChangeReset();
         return null;
      }
      System.debug('save start2');
      if (syncEstimate(false, false)) {
         ComputeLTYRepair();
         //return null;
         return new PageReference('/' + this.targetEstimateId + '/e?completion=5');
      }
      System.debug('save start3');
      return null;
   }
   
   /**
    * 印刷メソッド、decide前は保有設備、decide後は合同配置
    */
      public void print() {
         System.debug('print start');
         this.printAsset = false;
         this.printContract = false;
         this.printTripartite = false;
         this.printAgent = false;
         this.estimate.PrintDate__c = Date.today();
         //SelectAssetEstimateURFController.ComputeLTYRepair(targetEstimateId);
         if (this.estimate.Quote_Date__c == null) {
            this.estimate.Quote_Date__c = Date.today();
         }
         if (this.estimate.Print_Tripartite__c && this.estimate.Print_Agent__c) {
            ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '不能同时选中三方协议和代理商合同!'));
         } else
         // 保存ボタンできない場合、印刷ボタンはフラグのみ保存
         if (this.getSaveBtnDisabled()) {
            if (savePrintFlg()) {
               // 2018/10/26 HWAG-B5C88S 原来打印逻辑 start
               /*if (this.estimate.Print_Contract__c && !this.estimate.Print_Tripartite__c && !this.estimate.Print_Agent__c) {
                  // 打印医院合同配置
                  this.printContract = true;
                  } else if(this.estimate.Print_Tripartite__c && !this.estimate.Print_Agent__c){
                  //打印三方合同
                  this.printTripartite = true;
                  } else if(!this.estimate.Print_Tripartite__c && this.estimate.Print_Agent__c){
                  //打印经销商合同
                  this.printAgent = true;
                  }else{
                  // 打印保有設備
                  this.printAsset = true;
                  }*/
               // 2018/10/26 HWAG-B5C88S 原来打印逻辑 end
               // 2018/10/26 HWAG-B5C88S start 选择三方打印三方,否则decide前打印保有设备,decide后根据报价对象打印医院或经销商合同
               if (this.estimate.Print_Tripartite__c ) {
                  //打印三方合同
                  this.printTripartite = true;
               } else if (!this.estimate.Estimation_Decision__c) {
                  this.printAsset = true;
               } else if (this.estimate.Estimate_Target__c != null && this.estimate.Estimate_Target__c.equals('医院')) {
                  this.printContract = true;
               } else if (this.estimate.Estimate_Target__c != null && this.estimate.Estimate_Target__c.equals('经销商')) {
                  this.printAgent = true;
               }
               // 2018/10/26 HWAG-B5C88S end
            }
         }
         // 保存ボタンできる場合、印刷ボタンは全部保存
         else {
            if (syncEstimate(false, false)) {
               // 2018/10/26 HWAG-B5C88S 原来打印逻辑 start
               /*
                  if (this.estimate.Print_Contract__c && !this.estimate.Print_Tripartite__c && !this.estimate.Print_Agent__c) {
                  // 打印医院合同配置
                  this.printContract = true;
                  } else if(this.estimate.Print_Tripartite__c && !this.estimate.Print_Agent__c){
                  //打印三方合同
                  this.printTripartite = true;
                  } else if(!this.estimate.Print_Tripartite__c && this.estimate.Print_Agent__c){
                  //打印经销商合同
                  this.printAgent = true;
                  }else{
                  // 打印保有設備
                  this.printAsset = true;
                  }
                */
               // 2018/10/26 HWAG-B5C88S 原来打印逻辑 end
               // 2018/10/26 HWAG-B5C88S start 选择三方打印三方,否则decide前打印保有设备,decide后根据报价对象打印医院或经销商合同
               if (this.estimate.Print_Tripartite__c ) {
                  //打印三方合同
                  this.printTripartite = true;
               } else if (!this.estimate.Estimation_Decision__c) {
                  this.printAsset = true;
               } else if (this.estimate.Estimate_Target__c != null && this.estimate.Estimate_Target__c.equals('医院')) {
                  this.printContract = true;
               } else if (this.estimate.Estimate_Target__c != null && this.estimate.Estimate_Target__c.equals('经销商')) {
                  this.printAgent = true;
               }
               // 2018/10/26 HWAG-B5C88S end
            }
         }
         //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '合同'+this.printContract +'三方'+this.printTripartite+'保有'+this.printAsset+'经销商合同'+this.printAgent));
   public void print() {
      System.debug('print start');
      this.printAsset = false;
      this.printContract = false;
      this.printTripartite = false;
      this.printAgent = false;
      this.estimate.PrintDate__c = Date.today();
      //SelectAssetEstimateURFController.ComputeLTYRepair(targetEstimateId);
      if (this.estimate.Quote_Date__c == null) {
         this.estimate.Quote_Date__c = Date.today();
      }
      if (this.estimate.Print_Tripartite__c && this.estimate.Print_Agent__c) {
         ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '不能同时选中三方协议和代理商合同!'));
      } else
      // 保存ボタンできない場合、印刷ボタンはフラグのみ保存
      if (this.getSaveBtnDisabled()) {
         if (savePrintFlg()) {
            // 2018/10/26 HWAG-B5C88S 原来打印逻辑 start
            /*if (this.estimate.Print_Contract__c && !this.estimate.Print_Tripartite__c && !this.estimate.Print_Agent__c) {
               // 打印医院合同配置
               this.printContract = true;
               } else if(this.estimate.Print_Tripartite__c && !this.estimate.Print_Agent__c){
               //打印三方合同
               this.printTripartite = true;
               } else if(!this.estimate.Print_Tripartite__c && this.estimate.Print_Agent__c){
               //打印经销商合同
               this.printAgent = true;
               }else{
               // 打印保有設備
               this.printAsset = true;
               }*/
            // 2018/10/26 HWAG-B5C88S 原来打印逻辑 end
            // 2018/10/26 HWAG-B5C88S start 选择三方打印三方,否则decide前打印保有设备,decide后根据报价对象打印医院或经销商合同
            if (this.estimate.Print_Tripartite__c ) {
               //打印三方合同
               this.printTripartite = true;
            } else if (!this.estimate.Estimation_Decision__c) {
               this.printAsset = true;
            } else if (this.estimate.Estimate_Target__c != null && this.estimate.Estimate_Target__c.equals('医院')) {
               this.printContract = true;
            } else if (this.estimate.Estimate_Target__c != null && this.estimate.Estimate_Target__c.equals('经销商')) {
               this.printAgent = true;
            }
            // 2018/10/26 HWAG-B5C88S end
         }
      }
      // 保存ボタンできる場合、印刷ボタンは全部保存
      else {
         if (syncEstimate(false, false)) {
            // 2018/10/26 HWAG-B5C88S 原来打印逻辑 start
            /*
               if (this.estimate.Print_Contract__c && !this.estimate.Print_Tripartite__c && !this.estimate.Print_Agent__c) {
               // 打印医院合同配置
               this.printContract = true;
               } else if(this.estimate.Print_Tripartite__c && !this.estimate.Print_Agent__c){
               //打印三方合同
               this.printTripartite = true;
               } else if(!this.estimate.Print_Tripartite__c && this.estimate.Print_Agent__c){
               //打印经销商合同
               this.printAgent = true;
               }else{
               // 打印保有設備
               this.printAsset = true;
               }
             */
            // 2018/10/26 HWAG-B5C88S 原来打印逻辑 end
            // 2018/10/26 HWAG-B5C88S start 选择三方打印三方,否则decide前打印保有设备,decide后根据报价对象打印医院或经销商合同
            if (this.estimate.Print_Tripartite__c ) {
               //打印三方合同
               this.printTripartite = true;
            } else if (!this.estimate.Estimation_Decision__c) {
               this.printAsset = true;
            } else if (this.estimate.Estimate_Target__c != null && this.estimate.Estimate_Target__c.equals('医院')) {
               this.printContract = true;
            } else if (this.estimate.Estimate_Target__c != null && this.estimate.Estimate_Target__c.equals('经销商')) {
               this.printAgent = true;
            }
            // 2018/10/26 HWAG-B5C88S end
         }
      }
      //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '合同'+this.printContract +'三方'+this.printTripartite+'保有'+this.printAsset+'经销商合同'+this.printAgent));
   }
   
   /**
    * 申請メソッド、最後必ず承認プロセスに載せる
    */
      public PageReference approvalProcess() {
   public PageReference approvalProcess() {
   
   
         Id vmMaintenance_Contract = Schema.SObjectType.Maintenance_Contract_Estimate__c.getRecordTypeInfosByDeveloperName().get('NewMaintenance_Quote').getRecordTypeId();
         estimate.recordtypeid = vmMaintenance_Contract;
      Id vmMaintenance_Contract = Schema.SObjectType.Maintenance_Contract_Estimate__c.getRecordTypeInfosByDeveloperName().get('NewMaintenance_Quote').getRecordTypeId();
      estimate.recordtypeid = vmMaintenance_Contract;
   
         // Date systemToday = System.today();
         // // 创建日/提交日
         // Date createdDate = systemToday;
         // // 创建日6个月
         // Date isNewAfter = createdDate.addMonths(-isNewAddMonth);
         // // 合同开始预定日
         // Date contractEstiDate = estimate.Contract_Esti_Start_Date__c == null ? systemToday : estimate.Contract_Esti_Start_Date__c;
         //  for (AssetInfo info : checkedAssets) {
         //       // 合同预定开始日 大于提交日6个月,都不算新品 20200218 Gzw 服务合同对应
         //       //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'contractEstiDate '+ contractEstiDate +'isNewAfter '+isNewAfter));
         //       if (contractEstiDate >= isNewAfter) {
         //           if (!info.isManual) {
         //               info.mcae.isNew__c = false;
         //               info.mcae.Estimate_List_Price__c = info.orgPrice;
         //            } else if (info.isManual && !String.isBlank(info.mcae.Product_Manual__c)) {
         //               info.mcae.isNew__c = false;
         //               info.mcae.Estimate_List_Price__c = info.orgPrice;
         //            }
         //        }
         // }
      // Date systemToday = System.today();
      // // 创建日/提交日
      // Date createdDate = systemToday;
      // // 创建日6个月
      // Date isNewAfter = createdDate.addMonths(-isNewAddMonth);
      // // 合同开始预定日
      // Date contractEstiDate = estimate.Contract_Esti_Start_Date__c == null ? systemToday : estimate.Contract_Esti_Start_Date__c;
      //  for (AssetInfo info : checkedAssets) {
      //       // 合同预定开始日 大于提交日6个月,都不算新品 20200218 Gzw 服务合同对应
      //       //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'contractEstiDate '+ contractEstiDate +'isNewAfter '+isNewAfter));
      //       if (contractEstiDate >= isNewAfter) {
      //           if (!info.isManual) {
      //               info.mcae.isNew__c = false;
      //               info.mcae.Estimate_List_Price__c = info.orgPrice;
      //            } else if (info.isManual && !String.isBlank(info.mcae.Product_Manual__c)) {
      //               info.mcae.isNew__c = false;
      //               info.mcae.Estimate_List_Price__c = info.orgPrice;
      //            }
      //        }
      // }
   
         if (changedSubmitPrice) {
            priceChangeReset();
            return null;
         }
         if (syncEstimate(true, false)) {
            Savepoint sp = Database.setSavepoint();
            // 承認プロセスに載せる
            try {
               // 已填写申请状态
               this.estimate.ApprovalProcess_Status__c = '已填写完并申请';
               ControllerUtil.updateMaintenance_Contract_Estimate(new Maintenance_Contract_Estimate__c[] {this.estimate});
               // 承認プロセス
               Approval.ProcessSubmitRequest psr = new Approval.ProcessSubmitRequest();
               psr.setObjectId(this.estimate.id);
               Approval.ProcessResult submitResult = Approval.process(psr);
               ComputeLTYRepair();
               if (changedAfterPrint) {
                  return new PageReference('/' + this.targetEstimateId);
                  //return new PageReference('/' + this.targetEstimateId + '/e?completion=1');
               } else {
                  return new PageReference('/' + this.targetEstimateId);
                  //return new PageReference('/' + this.targetEstimateId + '/e?completion=2');
               }
            } catch (Exception ex) {
               System.debug('=====Exception:' + ex.getMessage());
               Database.rollback(sp);
               this.estimate.ApprovalProcess_Status__c = null;
               ApexPages.addMessages(ex);
            }
         }
      if (changedSubmitPrice) {
         priceChangeReset();
         return null;
      }
      if (syncEstimate(true, false)) {
         Savepoint sp = Database.setSavepoint();
         // 承認プロセスに載せる
         try {
            // 已填写申请状态
            this.estimate.ApprovalProcess_Status__c = '已填写完并申请';
            ControllerUtil.updateMaintenance_Contract_Estimate(new Maintenance_Contract_Estimate__c[] {this.estimate});
            // 承認プロセス
            Approval.ProcessSubmitRequest psr = new Approval.ProcessSubmitRequest();
            psr.setObjectId(this.estimate.id);
            Approval.ProcessResult submitResult = Approval.process(psr);
            ComputeLTYRepair();
            if (changedAfterPrint) {
               return new PageReference('/' + this.targetEstimateId);
               //return new PageReference('/' + this.targetEstimateId + '/e?completion=1');
            } else {
               return new PageReference('/' + this.targetEstimateId);
               //return new PageReference('/' + this.targetEstimateId + '/e?completion=2');
            }
         } catch (Exception ex) {
            System.debug('=====Exception:' + ex.getMessage());
            Database.rollback(sp);
            this.estimate.ApprovalProcess_Status__c = null;
            ApexPages.addMessages(ex);
         }
      }
      return null;
   }
   
   /**
    * 決定取消メソッド
    */
      public PageReference undecide() {
   public PageReference undecide() {
   
   
         System.debug('undecide start');
         this.estimate.Estimation_Decision__c = false;
         this.estimate.Print_Contract__c = false;
      System.debug('undecide start');
      this.estimate.Estimation_Decision__c = false;
      this.estimate.Print_Contract__c = false;
   
         //清空报价批准时间
         this.estimate.Quotation_Determines_Time__c = null;
      //清空报价批准时间
      this.estimate.Quotation_Determines_Time__c = null;
   
         try {
            ControllerUtil.updateMaintenance_Contract_Estimate(new Maintenance_Contract_Estimate__c[] {this.estimate});
            return new PageReference('/' + this.targetEstimateId + '/e?completion=1');
         } catch (Exception ex) {
            ApexPages.addMessages(ex);
         }
         return null;
      try {
         ControllerUtil.updateMaintenance_Contract_Estimate(new Maintenance_Contract_Estimate__c[] {this.estimate});
         return new PageReference('/' + this.targetEstimateId + '/e?completion=1');
      } catch (Exception ex) {
         ApexPages.addMessages(ex);
      }
      return null;
   }
   
   /**
    * 決定メソッド
    */
      public PageReference decide() {
         System.debug('decide start');
         inDicideFlag = true;
         // TODO check decide 资格
         Savepoint sp = Database.setSavepoint();
   public PageReference decide() {
      System.debug('decide start');
      inDicideFlag = true;
      // TODO check decide 资格
      Savepoint sp = Database.setSavepoint();
   
         if (syncEstimate(false, true)) {
            //提交 报价决定日期
            this.estimate.Quotation_Determines_Time__c = date.today();
      if (syncEstimate(false, true)) {
         //提交 报价决定日期
         this.estimate.Quotation_Determines_Time__c = date.today();
   
            if (changedAfterPrint) {
               return new PageReference('/' + this.targetEstimateId + '/e?completion=1');
            } else {
               return new PageReference('/' + this.targetEstimateId + '/e?completion=3');
            }
         if (changedAfterPrint) {
            return new PageReference('/' + this.targetEstimateId + '/e?completion=1');
         } else {
            return new PageReference('/' + this.targetEstimateId + '/e?completion=3');
         }
         return null;
      }
   
      public PageReference decideCancle() {
      return null;
   }
   
         return new PageReference('/' + this.targetEstimateId + '/e?completion=4');
   public PageReference decideCancle() {
   
      }
      return new PageReference('/' + this.targetEstimateId + '/e?completion=4');
   }
   
   /**
    * Process用のユーザー情報をセット、新規見積もり時用
    */
   
      private void setApprovalManager() {
         User loginUser = [SELECT Id, Name, JingliApprovalManager__c, BuchangApprovalManager__c, ZongjianApprovalManager__c, TongkuoZongjian__c FROM User WHERE Id = : UserInfo.getUserId()];
         // 要注意 SaveMaintenanceByCopyController と copyのurlにも、下記の項目もクリア
         this.estimate.JingliApprovalManager__c = loginUser.JingliApprovalManager__c == null ? loginUser.Id : loginUser.JingliApprovalManager__c;
         this.estimate.BuchangApprovalManager__c = loginUser.BuchangApprovalManager__c == null ? loginUser.Id : loginUser.BuchangApprovalManager__c;
         this.estimate.ZongjianApprovalManager__c = loginUser.ZongjianApprovalManager__c == null ? loginUser.Id : loginUser.ZongjianApprovalManager__c;
         this.estimate.Service_Contract_Staff__c = this.contract.Service_Contract_Staff__c;
         this.estimate.TKZongjianApprovalManager__c = loginUser.TongkuoZongjian__c == null ? loginUser.Id : loginUser.TongkuoZongjian__c;
      }
   private void setApprovalManager() {
      User loginUser = [SELECT Id, Name, JingliApprovalManager__c, BuchangApprovalManager__c, ZongjianApprovalManager__c, TongkuoZongjian__c FROM User WHERE Id = :UserInfo.getUserId()];
      // 要注意 SaveMaintenanceByCopyController と copyのurlにも、下記の項目もクリア
      this.estimate.JingliApprovalManager__c = loginUser.JingliApprovalManager__c == null ? loginUser.Id : loginUser.JingliApprovalManager__c;
      this.estimate.BuchangApprovalManager__c = loginUser.BuchangApprovalManager__c == null ? loginUser.Id : loginUser.BuchangApprovalManager__c;
      this.estimate.ZongjianApprovalManager__c = loginUser.ZongjianApprovalManager__c == null ? loginUser.Id : loginUser.ZongjianApprovalManager__c;
      this.estimate.Service_Contract_Staff__c = this.contract.Service_Contract_Staff__c;
      this.estimate.TKZongjianApprovalManager__c = loginUser.TongkuoZongjian__c == null ? loginUser.Id : loginUser.TongkuoZongjian__c;
   }
   
   /**
    * 印刷フラグのみを保存
    */
      @TestVisible
      private Boolean savePrintFlg() {
         try {
            Maintenance_Contract_Estimate__c mce = new Maintenance_Contract_Estimate__c();
            mce.Id = this.targetEstimateId;
            //打印报价(简化版) 2019/12/18 start
            mce.Print_Simplify__c = this.estimate.Print_Simplify__c;
            //打印报价(简化版) 2019/12/18 end
            mce.Print_ListPrice__c = this.estimate.Print_ListPrice__c;
            mce.Print_RepairPrice__c = this.estimate.Print_RepairPrice__c;
            mce.Print_SumPrice__c = this.estimate.Print_SumPrice__c;
            mce.Print_DiscountPercentage__c = this.estimate.Print_DiscountPercentage__c;
            mce.Print_DiscountPrice__c = this.estimate.Print_DiscountPrice__c;
            mce.Print_MaintePrice__c = this.estimate.Print_MaintePrice__c;
            mce.Print_Contract__c = this.estimate.Print_Contract__c;
   @TestVisible
   private Boolean savePrintFlg() {
      try {
         Maintenance_Contract_Estimate__c mce = new Maintenance_Contract_Estimate__c();
         mce.Id = this.targetEstimateId;
         //打印报价(简化版) 2019/12/18 start
         mce.Print_Simplify__c = this.estimate.Print_Simplify__c;
         //打印报价(简化版) 2019/12/18 end
         mce.Print_ListPrice__c = this.estimate.Print_ListPrice__c;
         mce.Print_RepairPrice__c = this.estimate.Print_RepairPrice__c;
         mce.Print_SumPrice__c = this.estimate.Print_SumPrice__c;
         mce.Print_DiscountPercentage__c = this.estimate.Print_DiscountPercentage__c;
         mce.Print_DiscountPrice__c = this.estimate.Print_DiscountPrice__c;
         mce.Print_MaintePrice__c = this.estimate.Print_MaintePrice__c;
         mce.Print_Contract__c = this.estimate.Print_Contract__c;
   
            ControllerUtil.updateMaintenance_Contract_Estimate(new Maintenance_Contract_Estimate__c[] {mce});
            return true;
         } catch (Exception ex) {
            ApexPages.addMessages(ex);
         }
         return false;
         ControllerUtil.updateMaintenance_Contract_Estimate(new Maintenance_Contract_Estimate__c[] {mce});
         return true;
      } catch (Exception ex) {
         ApexPages.addMessages(ex);
      }
      return false;
   }
   
   /**
    * 画面で入力データcheck, save, 親と同期 のロジック
    */
   // TODO xudan チェック追加、clsにも合計金額を計算、clsの合計金額と画面からjsの合計金額を比較
   // 異なる場合、保存完了したらwarningを出す
      public Boolean syncEstimate(boolean isApproval, boolean isDecide) {
         System.debug('syncEstimate start');
         // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'syncEstimates--tart'));
         Boolean hasDatabaseError = false;
         Savepoint sp = Database.setSavepoint();
   public Boolean syncEstimate(boolean isApproval, boolean isDecide) {
      System.debug('syncEstimate start');
      // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'syncEstimates--tart'));
      Boolean hasDatabaseError = false;
      Savepoint sp = Database.setSavepoint();
   
         //bug修复
         //提交 报价决定日期
         // this.estimate.Quotation_Determines_Time__c = date.today();
      //bug修复
      //提交 报价决定日期
      // this.estimate.Quotation_Determines_Time__c = date.today();
   
         try {
            System.debug('checkValidate start----------------');
            // 保存限次系列最大次数 20210309
            Map<String, Integer> limitSerialMap = new Map<String, Integer>();
            if (!checkValidate()) {
               return false;
            }
            System.debug('checkValidate end----------------');
            if (checkChangedAfterPrint()) {
               if (isDecide) {
                  // まず Approval
                  isApproval = true;
                  isDecide = false;
               }
            }
            // 验证 开始日期,最早允许制定日之前半年
            Date createdDate = this.estimate.CreatedDate == null ? System.today() : this.estimate.CreatedDate.date();
            createdDate = createdDate.addMonths(isNewAddMonth);
            // if (estimate.Contract_Start_Date__c < createdDate) {
            //     this.estimate.Contract_Start_Date__c.addError('合同开始日最早允许追溯制定日之前半年');
            //     return false;
            // }
            // 验证 用户类型,必填
            if (String.isBlank(estimate.EndUserType__c) ) {
               this.estimate.EndUserType__c.addError('请选择用户类型!');
               return false;
            }
            // 验证 申请报价金额,需要大于0
            if (estimate.Request_quotation_Amount__c <= 0 || estimate.Request_quotation_Amount__c == null) {
               this.estimate.Request_quotation_Amount__c.addError('申请报价金额必需大于0');
               return false;
            }
            // fxk 改报错位置 2021、9、9 Star
            if (estimate.Request_quotation_Amount__c > estimate.GuidePrice_Up__c || estimate.Request_quotation_Amount__c < estimate.GuidePrice_Down__c) {
               if (!(this.estimate.mainTalksTime__c > 0)) {
                  this.estimate.mainTalksTime__c.addError('主要谈判次数必填');
                  return false;
               }
               if (this.estimate.talksStartDate__c == null) {
                  this.estimate.talksStartDate__c.addError('谈判的开始时间必填');
                  return false;
               }
               if (String.isBlank(this.estimate.Discount_reason__c)) {
                  this.estimate.Discount_reason__c.addError('价格申请理由必填');
                  return false;
               }
               if (String.isBlank(this.estimate.Improve_ConsumptionRate_Idea__c)) {
                  this.estimate.Improve_ConsumptionRate_Idea__c.addError('消费率改善方案必填');
                  return false;
               }
            }
            // fxk 改报错位置 2021、9、9 End
            //>>>
            if (isApproval || isDecide) {
               Boolean hasError = false;
               if (this.estimate.Maintenance_Price__c <= 0) {
                  this.estimate.Maintenance_Price__c.addError('合同价格必需大于0');
                  hasError = true;
               }
               // for (AssetInfo input : this.checkedAssets) {
               //     if (!input.isManual || input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
               //         if (String.isBlank(input.mcae.Check_Result__c)) {
               //             input.mcae.Check_Result__c.addError('点检结果必填');
               //             hasError = true;
               //         }
               //     }
               // }
               // if (this.estimate.Discount_Price__c > 0 && String.isBlank(this.estimate.Discount_reason__c)) {
               //     this.estimate.Discount_reason__c.addError('减价申请理由必填');
               //     hasError = true;
               // }
               // if (this.estimate.Discount_Price__c > 0 && String.isBlank(this.estimate.Improve_ConsumptionRate_Idea__c)) {
               //     this.estimate.Improve_ConsumptionRate_Idea__c.addError('消费率改善方案必填');
               //     hasError = true;
               // }
               if (hasError) {
                  return false;
               }
            }
            System.debug('验证规则条件验证1: ' + '主要谈判次数 ' + estimate.mainTalksTime__c + '谈判的开始时间 ' + estimate.talksStartDate__c + '价格申请理由 ' + estimate.Discount_reason__c + '消费率改善方案 ' + estimate.Improve_ConsumptionRate_Idea__c);
            System.debug('验证规则条件验证2: ' + '申请报价金额 ' + estimate.Request_quotation_Amount__c);
            System.debug('验证规则条件验证3: ' + '最低价 ' + estimate.GuidePrice_Down__c + '最高价 ' + estimate.GuidePrice_Up__c);
            if (isDecide && getDecideBtnDisabled()) {
               ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '已经是Decide过的合同 或 不是批准的报价,不能Decide'));
               return false;
            }
            // 追加上期合同信息 start
            // List<lastMContract> lastMContractRes = getlastMContract(this.checkedAssets);
            // 2021-09-10 tcm 排序逻辑调整 start
            List<lastMContract> lastMContractRes;
      try {
         System.debug('checkValidate start----------------');
         // 保存限次系列最大次数 20210309
         Map<String, Integer> limitSerialMap = new Map<String, Integer>();
         if (!checkValidate()) {
            return false;
         }
         System.debug('checkValidate end----------------');
         if (checkChangedAfterPrint()) {
            if (isDecide) {
               system.debug('执行了tcm isDecide');
               lastMContractRes = getlastMContract(this.checkedAssets,this.estimate.Contract_Start_Date__c);
               // まず Approval
               isApproval = true;
               isDecide = false;
            }
         }
         // 验证 开始日期,最早允许制定日之前半年
         Date createdDate = this.estimate.CreatedDate == null ? System.today() : this.estimate.CreatedDate.date();
         createdDate = createdDate.addMonths(isNewAddMonth);
         // if (estimate.Contract_Start_Date__c < createdDate) {
         //     this.estimate.Contract_Start_Date__c.addError('合同开始日最早允许追溯制定日之前半年');
         //     return false;
         // }
         // 验证 用户类型,必填
         if (String.isBlank(estimate.EndUserType__c) ) {
            this.estimate.EndUserType__c.addError('请选择用户类型!');
            return false;
         }
         // 验证 申请报价金额,需要大于0
         if (estimate.Request_quotation_Amount__c <= 0 || estimate.Request_quotation_Amount__c == null) {
            this.estimate.Request_quotation_Amount__c.addError('申请报价金额必需大于0');
            return false;
         }
         // fxk 改报错位置 2021、9、9 Star
         if (estimate.Request_quotation_Amount__c > estimate.GuidePrice_Up__c || estimate.Request_quotation_Amount__c < estimate.GuidePrice_Down__c) {
            if (!(this.estimate.mainTalksTime__c > 0)) {
               this.estimate.mainTalksTime__c.addError('主要谈判次数必填');
               return false;
            }
            if (this.estimate.talksStartDate__c == null) {
               this.estimate.talksStartDate__c.addError('谈判的开始时间必填');
               return false;
            }
            if (String.isBlank(this.estimate.Discount_reason__c)) {
               this.estimate.Discount_reason__c.addError('价格申请理由必填');
               return false;
            }
            if (String.isBlank(this.estimate.Improve_ConsumptionRate_Idea__c)) {
               this.estimate.Improve_ConsumptionRate_Idea__c.addError('消费率改善方案必填');
               return false;
            }
         }
         // fxk 改报错位置 2021、9、9 End
         //>>>
         if (isApproval || isDecide) {
            Boolean hasError = false;
            if (this.estimate.Maintenance_Price__c <= 0) {
               this.estimate.Maintenance_Price__c.addError('合同价格必需大于0');
               hasError = true;
            }
            // for (AssetInfo input : this.checkedAssets) {
            //     if (!input.isManual || input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
            //         if (String.isBlank(input.mcae.Check_Result__c)) {
            //             input.mcae.Check_Result__c.addError('点检结果必填');
            //             hasError = true;
            //         }
            //     }
            // }
            // if (this.estimate.Discount_Price__c > 0 && String.isBlank(this.estimate.Discount_reason__c)) {
            //     this.estimate.Discount_reason__c.addError('减价申请理由必填');
            //     hasError = true;
            // }
            // if (this.estimate.Discount_Price__c > 0 && String.isBlank(this.estimate.Improve_ConsumptionRate_Idea__c)) {
            //     this.estimate.Improve_ConsumptionRate_Idea__c.addError('消费率改善方案必填');
            //     hasError = true;
            // }
            if (hasError) {
               return false;
            }
         }
         System.debug('验证规则条件验证1: ' + '主要谈判次数 ' + estimate.mainTalksTime__c + '谈判的开始时间 ' + estimate.talksStartDate__c + '价格申请理由 ' + estimate.Discount_reason__c + '消费率改善方案 ' + estimate.Improve_ConsumptionRate_Idea__c);
         System.debug('验证规则条件验证2: ' + '申请报价金额 ' + estimate.Request_quotation_Amount__c);
         System.debug('验证规则条件验证3: ' + '最低价 ' + estimate.GuidePrice_Down__c + '最高价 ' + estimate.GuidePrice_Up__c);
         if (isDecide && getDecideBtnDisabled()) {
            ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '已经是Decide过的合同 或 不是批准的报价,不能Decide'));
            return false;
         }
         // 追加上期合同信息 start
         // List<lastMContract> lastMContractRes = getlastMContract(this.checkedAssets);
         // 2021-09-10 tcm 排序逻辑调整 start
         List<lastMContract> lastMContractRes;
         if (isDecide) {
            system.debug('执行了tcm isDecide');
            lastMContractRes = getlastMContract(this.checkedAssets,this.estimate.Contract_Start_Date__c);
         } else{
            system.debug('执行了tcm NODecide');
            lastMContractRes = getlastMContract(this.checkedAssets,this.estimate.Contract_Esti_Start_Date__c);
         }
         // 2021-09-10 tcm 排序逻辑调整 end
         //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
         Integer Contract_year = 0;
         System.debug('this.estimate.Contract_Range__c1:' + this.estimate.Contract_Range__c);
         if(this.estimate.Contract_Range__c != null){
            if(this.estimate.Contract_Range__c <= 12){
               Contract_year = 1;
            } else{
               system.debug('执行了tcm NODecide');
               lastMContractRes = getlastMContract(this.checkedAssets,this.estimate.Contract_Esti_Start_Date__c);
            }
            // 2021-09-10 tcm 排序逻辑调整 end
               Decimal year = this.estimate.Contract_Range__c / 12;
               Contract_year = (Integer)year.round(System.RoundingMode.CEILING);
            }
         }
         System.debug('Contract_year1:' + Contract_year);
         // 限次汇总信息
         Map<String, Decimal> uFRSerialMap = getLimitSerialData(Contract_year);
         //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
         // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'lastMContractRes +++++!' + lastMContractRes));
         // if (true) {
         //     return false;
         // }
   
            // 限次汇总信息
            Map<String, Decimal> uFRSerialMap = getLimitSerialData();
            // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'lastMContractRes +++++!' + lastMContractRes));
            // if (true) {
            //     return false;
            // }
         this.estimate.LastMContract1__c = lastMContractRes[0].contractId;
         this.estimate.LastMContract1_NO__c = lastMContractRes[0].contractNo;
         this.estimate.LastMContract1_ConCount__c = lastMContractRes[0].count;
   
            this.estimate.LastMContract1__c = lastMContractRes[0].contractId;
            this.estimate.LastMContract1_NO__c = lastMContractRes[0].contractNo;
            this.estimate.LastMContract1_ConCount__c = lastMContractRes[0].count;
         this.estimate.LastMContract2__c = lastMContractRes[1].contractId;
         this.estimate.LastMContract2_NO__c = lastMContractRes[1].contractNo;
         this.estimate.LastMContract2_ConCount__c = lastMContractRes[1].count;
   
            this.estimate.LastMContract2__c = lastMContractRes[1].contractId;
            this.estimate.LastMContract2_NO__c = lastMContractRes[1].contractNo;
            this.estimate.LastMContract2_ConCount__c = lastMContractRes[1].count;
         this.estimate.LastMContract3__c = lastMContractRes[2].contractId;
         this.estimate.LastMContract3_NO__c = lastMContractRes[2].contractNo;
         this.estimate.LastMContract3_ConCount__c = lastMContractRes[2].count;
   
            this.estimate.LastMContract3__c = lastMContractRes[2].contractId;
            this.estimate.LastMContract3_NO__c = lastMContractRes[2].contractNo;
            this.estimate.LastMContract3_ConCount__c = lastMContractRes[2].count;
         this.estimate.LastMContract4__c = lastMContractRes[3].contractId;
         this.estimate.LastMContract4_NO__c = lastMContractRes[3].contractNo;
         this.estimate.LastMContract4_ConCount__c = lastMContractRes[3].count;
   
            this.estimate.LastMContract4__c = lastMContractRes[3].contractId;
            this.estimate.LastMContract4_NO__c = lastMContractRes[3].contractNo;
            this.estimate.LastMContract4_ConCount__c = lastMContractRes[3].count;
         this.estimate.LastMContract5__c = lastMContractRes[4].contractId;
         this.estimate.LastMContract5_NO__c = lastMContractRes[4].contractNo;
         this.estimate.LastMContract5_ConCount__c = lastMContractRes[4].count;
   
            this.estimate.LastMContract5__c = lastMContractRes[4].contractId;
            this.estimate.LastMContract5_NO__c = lastMContractRes[4].contractNo;
            this.estimate.LastMContract5_ConCount__c = lastMContractRes[4].count;
            // 追加上期合同信息 end
         // 追加上期合同信息 end
   
   
   
            // 同期処理
            // ①维修合同に既存の保有设备を削除
            // ②保存した维修合同报价の保有设备を维修合同にコピー(Asset__cが設定さているデータだけ)
            // ③他の维修合同报价の同期フラグを外す
            // ④维修合同の Estimate_Trial_Money__c、Contract_Amount__c, Service_contract_target_number__c を更新
            this.estimate.IsSyncing__c = true;
            if (isDecide) {
               // 20200923 Gzw bug 修改
               //清空报价批准时间
               this.estimate.Quotation_Determines_Time__c = Date.today();
               this.estimate.Estimation_Decision__c = true;
            }
            // TODO validate
         // 同期処理
         // ①维修合同に既存の保有设备を削除
         // ②保存した维修合同报价の保有设备を维修合同にコピー(Asset__cが設定さているデータだけ)
         // ③他の维修合同报价の同期フラグを外す
         // ④维修合同の Estimate_Trial_Money__c、Contract_Amount__c, Service_contract_target_number__c を更新
         this.estimate.IsSyncing__c = true;
         if (isDecide) {
            // 20200923 Gzw bug 修改
            //清空报价批准时间
            this.estimate.Quotation_Determines_Time__c = Date.today();
            this.estimate.Estimation_Decision__c = true;
         }
         // TODO validate
   
            // TODO validate check新品チェック(納品日で判断)
         // TODO validate check新品チェック(納品日で判断)
   
            // save
            // ③ start
            for (List<Maintenance_Contract_Estimate__c> otherEstimates : [select Id from Maintenance_Contract_Estimate__c where Id <> :this.estimate.Id
                                                           and Maintenance_Contract__c = :this.contract.Id
                                                                                 and IsSyncing__c = true]) {
               for (Maintenance_Contract_Estimate__c other : otherEstimates) {
                  other.IsSyncing__c = false;
                  if (isDecide) {
                     other.Estimation_Decision__c = false;
                  }
         // save
         // ③ start
         for (List<Maintenance_Contract_Estimate__c> otherEstimates : [select Id from Maintenance_Contract_Estimate__c where Id <> :this.estimate.Id
                                                        and Maintenance_Contract__c = :this.contract.Id
                                                                              and IsSyncing__c = true]) {
            for (Maintenance_Contract_Estimate__c other : otherEstimates) {
               other.IsSyncing__c = false;
               if (isDecide) {
                  other.Estimation_Decision__c = false;
               }
               ControllerUtil.updateMaintenance_Contract_Estimate(otherEstimates);
            }
            ControllerUtil.updateMaintenance_Contract_Estimate(otherEstimates);
         }
   
            // 合同结束预定日を算出
            Date t = this.estimate.Contract_Esti_Start_Date__c.addMonths(Integer.valueOf(this.estimate.Contract_Range__c));
            // 20151217 xudan 维修合同报价SH-RS-JS0046560-01 期间显示问题
            // うるう年特殊対応
            if (this.estimate.Contract_Esti_Start_Date__c.month() == 2 && this.estimate.Contract_Esti_Start_Date__c.day() == 29
               && t.month() == 2) {
               t = t;
            } else {
               t = t.addDays(-1);
            }
            this.estimate.Contract_Esti_End_Date__c = t;
            // decide 时,跳过赋值 JZHG-BRH5MU 20200715 start
            if (!isDecide) {
               this.estimate.New_Contract_Type_TxT__c = typeresult;
            }
            // decide 时,跳过赋值 JZHG-BRH5MU 20200715 end
            // 合同开始日を结束日
            if (this.estimate.Contract_Start_Date__c == null) {
               this.estimate.Contract_Start_Date__c = this.estimate.Contract_Esti_Start_Date__c;
            }
            t = this.estimate.Contract_Start_Date__c.addMonths(Integer.valueOf(this.estimate.Contract_Range__c));
         // 合同结束预定日を算出
         Date t = this.estimate.Contract_Esti_Start_Date__c.addMonths(Integer.valueOf(this.estimate.Contract_Range__c));
         // 20151217 xudan 维修合同报价SH-RS-JS0046560-01 期间显示问题
         // うるう年特殊対応
         if (this.estimate.Contract_Esti_Start_Date__c.month() == 2 && this.estimate.Contract_Esti_Start_Date__c.day() == 29
            && t.month() == 2) {
            t = t;
         } else {
            t = t.addDays(-1);
            this.estimate.Contract_End_Date__c = t;
            // 位置调整 在1951 line
            // Date createdDate = this.estimate.CreatedDate == null ? System.today() : this.estimate.CreatedDate.date();
            // 3ヶ月超過している場合には、Decideできない
            //if (createdDate.addMonths(3) <= System.today()) {
            //    this.estimate.addError('已超过3个月,请先更新报价。');
            //    return false;
            //}
            // 维修合同报价
            // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.Error, 'this.targetEstimateId ++++++ ' + this.targetEstimateId));
            // if (true) {
            //     return false;
            // }
            if (String.isBlank(this.targetEstimateId)) {
               newIns = true;
               this.estimate.Process_Status__c = '草案中';
               // nameに番号をセット
               List<Maintenance_Contract_Estimate__c> maxNameRecords = [select Name From Maintenance_Contract_Estimate__c Where Maintenance_Contract__c = : this.contract.Id order by Name desc limit 1];
               String oppNo;
               Integer l = 1;
               if (maxNameRecords.size() > 0) {
                  try {
                     oppNo = maxNameRecords[0].Name;
                     l = Integer.valueOf(oppNo.substring(oppNo.length() - 2)) + 1;
                  } catch (System.TypeException e) {
                     System.debug('maxNameRecords Error: Maintenance_Contract__c.id=' + maxNameRecords[0].id);
                  }
               } else {
                  System.debug('first Maintenance_Contract_Estimate__c');
         }
         this.estimate.Contract_Esti_End_Date__c = t;
         // decide 时,跳过赋值 JZHG-BRH5MU 20200715 start
         if (!isDecide) {
            this.estimate.New_Contract_Type_TxT__c = typeresult;
         }
         // decide 时,跳过赋值 JZHG-BRH5MU 20200715 end
         // 合同开始日を结束日
         if (this.estimate.Contract_Start_Date__c == null) {
            this.estimate.Contract_Start_Date__c = this.estimate.Contract_Esti_Start_Date__c;
         }
         t = this.estimate.Contract_Start_Date__c.addMonths(Integer.valueOf(this.estimate.Contract_Range__c));
         t = t.addDays(-1);
         this.estimate.Contract_End_Date__c = t;
         // 位置调整 在1951 line
         // Date createdDate = this.estimate.CreatedDate == null ? System.today() : this.estimate.CreatedDate.date();
         // 3ヶ月超過している場合には、Decideできない
         //if (createdDate.addMonths(3) <= System.today()) {
         //    this.estimate.addError('已超过3个月,请先更新报价。');
         //    return false;
         //}
         // 维修合同报价
         // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.Error, 'this.targetEstimateId ++++++ ' + this.targetEstimateId));
         // if (true) {
         //     return false;
         // }
         if (String.isBlank(this.targetEstimateId)) {
            newIns = true;
            this.estimate.Process_Status__c = '草案中';
            // nameに番号をセット
            List<Maintenance_Contract_Estimate__c> maxNameRecords = [select Name From Maintenance_Contract_Estimate__c Where Maintenance_Contract__c = :this.contract.Id order by Name desc limit 1];
            String oppNo;
            Integer l = 1;
            if (maxNameRecords.size() > 0) {
               try {
                  oppNo = maxNameRecords[0].Name;
                  l = Integer.valueOf(oppNo.substring(oppNo.length() - 2)) + 1;
               } catch (System.TypeException e) {
                  System.debug('maxNameRecords Error: Maintenance_Contract__c.id=' + maxNameRecords[0].id);
               }
               oppNo = '00' + String.valueof(l);
               oppNo = oppNo.substring(oppNo.length() - 2);
               this.estimate.Name = this.contract.Management_Code__c + '-' + oppNo;
               setApprovalManager();
               System.debug('Process_Status__c=' + this.estimate.Process_Status__c);
               insert this.estimate;
               this.targetEstimateId = this.estimate.Id;
               setThisEstimate();
            } else {
               if (isApproval) {
                  setApprovalManager();
               }
               ControllerUtil.updateMaintenance_Contract_Estimate(new Maintenance_Contract_Estimate__c[] {this.estimate});
               System.debug('first Maintenance_Contract_Estimate__c');
            }
            // 维修合同报价/保有设备
            // delete and insertする
            List<Maintenance_Contract_Asset_Estimate__c> insertTarget = new List<Maintenance_Contract_Asset_Estimate__c>();
            // 是否使用首次报价日更新
            // 需要注意对报价提交日+3个月与合同结束日进行比较
            // 1)报价提交日+3个月的日期,小于合同结束日时,以合同结束日作为报价有效期的结束日
            // 2)报价提交日+3个月的日期,大于合同结束日时,报价提交日+3个月的日期作为报价有效期的结束日
            //
            //
            //  因为月初计算消费率,所以结束日在上月或以前,可以取到完整消费率,否则保存首次报价日
            Date toDate = Date.today();
            Date mon1stDate = Date.newInstance(toDate.year(), toDate.month(), 1);
            // list 修改 map
            Map<id, Maintenance_Contract__c> mcList = new Map<id, Maintenance_Contract__c>();
            for (AssetInfo input : this.checkedAssets) {
               if (!input.isManual || input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
                  //Maintenance_Contract_Asset_Estimate__c mcae = new Maintenance_Contract_Asset_Estimate__c();
                  input.mcae.Id = null;               // insertのため
                  // 同じの場合設定しない
                  if (input.mcae.Maintenance_Contract_Estimate__c != this.targetEstimateId) {
                     // 親変更できない可能性があるため、設定するときエラーになるが、エラーにならないように他のロジックを工夫してください。
                     input.mcae.Maintenance_Contract_Estimate__c = this.targetEstimateId;
                  }
                  input.mcae.Maintenance_Price_Month__c = input.rec.Maintenance_Price_Month__c;
                  // 病院に所属する保有設備
            oppNo = '00' + String.valueof(l);
            oppNo = oppNo.substring(oppNo.length() - 2);
            this.estimate.Name = this.contract.Management_Code__c + '-' + oppNo;
            setApprovalManager();
            System.debug('Process_Status__c=' + this.estimate.Process_Status__c);
            insert this.estimate;
            this.targetEstimateId = this.estimate.Id;
            setThisEstimate();
         } else {
            if (isApproval) {
               setApprovalManager();
            }
            ControllerUtil.updateMaintenance_Contract_Estimate(new Maintenance_Contract_Estimate__c[] {this.estimate});
         }
         // 维修合同报价/保有设备
         // delete and insertする
         List<Maintenance_Contract_Asset_Estimate__c> insertTarget = new List<Maintenance_Contract_Asset_Estimate__c>();
         // 是否使用首次报价日更新
         // 需要注意对报价提交日+3个月与合同结束日进行比较
         // 1)报价提交日+3个月的日期,小于合同结束日时,以合同结束日作为报价有效期的结束日
         // 2)报价提交日+3个月的日期,大于合同结束日时,报价提交日+3个月的日期作为报价有效期的结束日
         //
         //
         //  因为月初计算消费率,所以结束日在上月或以前,可以取到完整消费率,否则保存首次报价日
         Date toDate = Date.today();
         Date mon1stDate = Date.newInstance(toDate.year(), toDate.month(), 1);
         // list 修改 map
         Map<id, Maintenance_Contract__c> mcList = new Map<id, Maintenance_Contract__c>();
         for (AssetInfo input : this.checkedAssets) {
            if (!input.isManual || input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
               //Maintenance_Contract_Asset_Estimate__c mcae = new Maintenance_Contract_Asset_Estimate__c();
               input.mcae.Id = null;                   // insertのため
               // 同じの場合設定しない
               if (input.mcae.Maintenance_Contract_Estimate__c != this.targetEstimateId) {
                  // 親変更できない可能性があるため、設定するときエラーになるが、エラーにならないように他のロジックを工夫してください。
                  input.mcae.Maintenance_Contract_Estimate__c = this.targetEstimateId;
               }
               input.mcae.Maintenance_Price_Month__c = input.rec.Maintenance_Price_Month__c;
               // 病院に所属する保有設備
   
                  if (!input.isManual) {
                     input.mcae.Asset__c = input.rec.Id;
                     input.mcae.Product_Manual__c = null;
                     input.mcae.Estimate_Cost__c = input.mcae.Estimate_Cost__c;
                     input.mcae.LastMContract_Price__c = input.rec.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c;
                     //input.mcae.Asset_Consumption_rate__c = input.mcae.Asset_Consumption_rate__c;
                  }
                  // 提交时,更新 是否使用上一期维修合同首次报价日
                  if (isApproval) {
                     Maintenance_Contract__c mctemp = new Maintenance_Contract__c();
                     //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , '+++++ ' + ass.rec.CurrentContract_F__r.Contract_End_Date__c + '   ' + mon1stDate));
                     // 因为月初计算消费率,所以结束日在上月或以前,可以取到完整消费率,否则保存首次报价日
                     if (input.rec.CurrentContract_F__r.Contract_End_Date__c >= mon1stDate) {
                        if (input.rec.CurrentContract_F__r.First_Estimate_Date__c == null) {
                           mctemp.Id = input.rec.CurrentContract_F__c;
                           mctemp.First_contract_usage_Rate__c = input.rec.CurrentContract_F__r.Contract_Consumption_rate__c;
                           mctemp.First_Estimate_Date__c = Date.today();
                           mcList.put(mctemp.Id, mctemp);
                           input.mcae.ifHaveleftInPrevious__c = true;
                        }
               if (!input.isManual) {
                  input.mcae.Asset__c = input.rec.Id;
                  input.mcae.Product_Manual__c = null;
                  input.mcae.Estimate_Cost__c = input.mcae.Estimate_Cost__c;
                  input.mcae.LastMContract_Price__c = input.rec.CurrentContract_F_asset__r.Estimate_Cost_Month_formula__c;
                  //input.mcae.Asset_Consumption_rate__c = input.mcae.Asset_Consumption_rate__c;
               }
               // 提交时,更新 是否使用上一期维修合同首次报价日
               if (isApproval) {
                  Maintenance_Contract__c mctemp = new Maintenance_Contract__c();
                  //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , '+++++ ' + ass.rec.CurrentContract_F__r.Contract_End_Date__c + '   ' + mon1stDate));
                  // 因为月初计算消费率,所以结束日在上月或以前,可以取到完整消费率,否则保存首次报价日
                  if (input.rec.CurrentContract_F__r.Contract_End_Date__c >= mon1stDate) {
                     if (input.rec.CurrentContract_F__r.First_Estimate_Date__c == null) {
                        mctemp.Id = input.rec.CurrentContract_F__c;
                        mctemp.First_contract_usage_Rate__c = input.rec.CurrentContract_F__r.Contract_Consumption_rate__c;
                        mctemp.First_Estimate_Date__c = Date.today();
                        mcList.put(mctemp.Id, mctemp);
                        input.mcae.ifHaveleftInPrevious__c = true;
                     }
                  }
                  if (!isDecide) {
                     // 限次信息保存
                     input.mcae.URF_Series__c = input.uFRSerial;
                     input.mcae.Series_RepairCount__c = 0;
                     input.mcae.Series_MaxRepairCount__c = uFRSerialMap.get(input.uFRSerial);
                     input.mcae.Asset_RepairCount__c = 0;
                     input.mcae.Asset_MaxRepairCount__c = input.uFRRepairCount;
                     // 限次信息保存
                  }
                  // Manual商品
                  if (input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
                     input.mcae.Asset__c = null;
                     //mcae.Product_Manual__c = input.mcae.Product_Manual__c;
                  }
                  //新规时,保存新合同备品保证提供 Decide 后
                  if (!isDecide) {
                     input.mcae.EquipmentGuaranteeFlgTxt__c = input.etGFlg;
                  }
                  // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 start
                  // 2020/10/30 songxiaoqi start
                  if (input.rec.CurrentContract_F__r.RecordType_DeveloperName__c != 'VM_Contract') {
                     input.mcae.Last_MContract__c = input.rec.CurrentContract_F__c;
                  }
                  //songxiaoqi end
                  // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 end
                  //mcae.Estimate_List_Price__c = input.mcae.Estimate_List_Price__c;
                  //mcae.IsNew__c = input.mcae.isNew__c;
                  //mcae.Check_Result__c = input.mcae.Check_Result__c;
                  //mcae.Repair_Price__c = input.mcae.Repair_Price__c;
                  //mcae.Comment__c = input.mcae.Comment__c;
                  insertTarget.add(input.mcae);
               }
            }
            // 本当に保存した納入機器があれば削除
            List<Maintenance_Contract_Asset_Estimate__c> selectedAsset = [SELECT Id, Name, Maintenance_Contract_Estimate__c, Asset__c, IsNew__c FROM Maintenance_Contract_Asset_Estimate__c WHERE Maintenance_Contract_Estimate__c = : this.targetEstimateId];
            if (selectedAsset.size() > 0) {
               ControllerUtil.deleteMaintenance_Contract_Asset_Estimate(selectedAsset);
            }
            if (insertTarget.size() > 0) {
               ControllerUtil.insertMaintenance_Contract_Asset_Estimate(insertTarget);
            }
               if (!isDecide) {
                  // 限次信息保存
                  input.mcae.URF_Series__c = input.uFRSerial;
                  input.mcae.Series_RepairCount__c = 0;
                  input.mcae.Series_MaxRepairCount__c = uFRSerialMap.get(input.uFRSerial);
                  input.mcae.Asset_RepairCount__c = 0;
                  //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
                  input.mcae.Asset_MaxRepairCount__c = input.uFRRepairCount * Contract_year;
                  //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
   
            // ① start
            for (List<Maintenance_Contract_Asset__c> oldList : [select Id from Maintenance_Contract_Asset__c
                                                   where Maintenance_Contract__c = :this.estimate.Maintenance_Contract__c]) {
               delete oldList;
            }
            // ② start
            {
               List<Maintenance_Contract_Asset__c> newValue = new List<Maintenance_Contract_Asset__c>();
               for (Maintenance_Contract_Asset_Estimate__c target : [select Id, Asset__c, Estimate_List_Price__c, Estimate_Cost__c,  IsNew__c, EquipmentGuaranteeFlgTxt__c,
                                                        //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk start
                                                        Check_Object__c,
                                                        //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk end
                                                        // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 start
                                                        Last_MContract__c
                                                        // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 eng
                                                        , Last_MContract__r.RecordType_DeveloperName__c
                                                        // LJPH-C9GD34 gzw fix start
                                                        ,Estimate_List_Price_Page__c
                                                        // LJPH-C9GD34 gzw fix end
                                                        from Maintenance_Contract_Asset_Estimate__c
                                                        where Maintenance_Contract_Estimate__c = :this.estimate.Id and Asset__c <> null]) {
   
                  Maintenance_Contract_Asset__c newVal = new Maintenance_Contract_Asset__c(
                     Maintenance_Contract__c = this.estimate.Maintenance_Contract__c,
                     Asset__c = target.Asset__c,
                     Maintenance_Contract_Asset_Estimate__c = target.Id,
                     Estimate_List_Price__c = target.Estimate_List_Price__c,
                     //Maintenance_Price_YearTXT__c = target.Maintenance_Price_YearTXT__c,
                     ////add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk start
                     Check_Object__c = target.Check_Object__c,
                     //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk end
                     Estimate_IsNew__c = target.IsNew__c,
                     //EquipmentGuaranteeFlgTxt__c = target.EquipmentGuaranteeFlgTxt__c,
                     // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 start
                     // LastMContract__c = target.Last_MContract__c
                     // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 end
                     //如果是多年保修合同,不更新上期维修合同信息 LJPH-BUU3E3 update by rentx  2020-11-03
                     LastMContract__c = target.Last_MContract__r.RecordType_DeveloperName__c == 'VM_Contract' ? null : target.Last_MContract__c
                     );
                  newValue.add(newVal);
                  // 限次信息保存
               }
               if (newValue.size() > 0) insert newValue;
            }
            // ④ start
            this.contract.Estimation_Id__c = this.targetEstimateId;
            this.contract.Contract_Esti_Start_Date__c = this.estimate.Contract_Esti_Start_Date__c;
            this.contract.Contract_Range__c = this.estimate.Contract_Range__c;
            this.contract.Contract_Esti_End_Date__c = this.estimate.Contract_Esti_End_Date__c;
            this.contract.Estimate_Target__c = this.estimate.Estimate_Target__c;
            this.contract.Dealer__c = this.estimate.Dealer__c;
            this.contract.NotUse_Oxygenated_Water__c = this.estimate.NotUse_Oxygenated_Water__c;
            this.contract.Estimate_Trial_Money__c = this.estimate.Estimate_Trial_Money__c;
            this.contract.Contract_Amount__c = this.estimate.Maintenance_Price__c;
            // 点检总次数自动赋值 gzw fix 20211122 start
            this.contract.Service_contract_target_number__c = this.estimate.Service_contract_target_number__c;
            // 点检总次数自动赋值 gzw fix 20211122 end
            this.contract.Contract_department_manual__c = this.estimate.Department__c;
   
            // 追加上期合同信息 start
            this.contract.LastMContract1__c = this.estimate.LastMContract1__c;
            this.contract.LastMContract1_NO__c = this.estimate.LastMContract1_NO__c;
            this.contract.LastMContract1_ConCount__c =  this.estimate.LastMContract1_ConCount__c;
   
            //add by rentx 2021-06-04 给合同1赋值的同时,给去年合同赋值 start
            this.contract.Last_year_service_contract__c = this.estimate.LastMContract1__c;
            //add by renrx 2021-06-04 给合同1赋值的同时, 给去年合同赋值 end
   
            this.contract.LastMContract2__c =  this.estimate.LastMContract2__c;
            this.contract.LastMContract2_NO__c = this.estimate.LastMContract2_NO__c;
            this.contract.LastMContract2_ConCount__c =  this.estimate.LastMContract2_ConCount__c;
   
            this.contract.LastMContract3__c =  this.estimate.LastMContract3__c;
            this.contract.LastMContract3_NO__c = this.estimate.LastMContract3_NO__c;
            this.contract.LastMContract3_ConCount__c =  this.estimate.LastMContract3_ConCount__c;
            this.contract.LastMContract4__c =  this.estimate.LastMContract4__c;
            this.contract.LastMContract4_NO__c = this.estimate.LastMContract4_NO__c;
            this.contract.LastMContract4_ConCount__c =  this.estimate.LastMContract4_ConCount__c;
            this.contract.LastMContract5__c =  this.estimate.LastMContract5__c;
            this.contract.LastMContract5_NO__c = this.estimate.LastMContract5_NO__c;
            this.contract.LastMContract5_ConCount__c =  this.estimate.LastMContract5_ConCount__c;
            // 追加上期合同信息 end
            system.debug('测算isDecide的结果_1::::::::' + isDecide);
            if (isDecide == true) {
               system.debug('测算isDecide的结果_2::::::::' + isDecide);
   //              this.contract.Contract_Start_Date__c = this.estimate.Contract_Esti_Start_Date__c;
               this.contract.Contract_Start_Date__c = this.estimate.Contract_Start_Date__c;
               this.contract.Contract_Range__c = this.estimate.Contract_Range__c;
   //              this.contract.Contract_End_Date__c = this.estimate.Contract_Esti_End_Date__c;
               this.contract.Contract_End_Date__c = this.estimate.Contract_End_Date__c;
               this.contract.JingliApprovalManager__c = this.estimate.JingliApprovalManager__c;
               this.contract.BuchangApprovalManager__c = this.estimate.BuchangApprovalManager__c;
               this.contract.ZongjianApprovalManager__c = this.estimate.ZongjianApprovalManager__c;
               this.contract.Finally_Approved_Staff__c = this.estimate.Finally_Approved_Staff__c;
               this.contract.TKZongjianApprovalManager__c = this.estimate.TKZongjianApprovalManager__c;
               // JZHG-BQV3P4 20200624 Gzw add
               this.contract.HospitalAmountText__c = this.estimate.AgencyHos_Price__c;
               // JZHG-BQV3P4 20200624 Gzw add
            }
            //添加的额外对应过程
            if (inDicideFlag == true && (this.contract.Contract_Start_Date__c == null || this.contract.Contract_End_Date__c == null)) {
               system.debug('测算inDicideFlag的结果_2::::::::' + isDecide);
   //              this.contract.Contract_Start_Date__c = this.estimate.Contract_Esti_Start_Date__c;
               this.contract.Contract_Start_Date__c = this.estimate.Contract_Start_Date__c;
               this.contract.Contract_Range__c = this.estimate.Contract_Range__c;
   //              this.contract.Contract_End_Date__c = this.estimate.Contract_Esti_End_Date__c;
               this.contract.Contract_End_Date__c = this.estimate.Contract_End_Date__c;
               this.contract.JingliApprovalManager__c = this.estimate.JingliApprovalManager__c;
               this.contract.BuchangApprovalManager__c = this.estimate.BuchangApprovalManager__c;
               this.contract.ZongjianApprovalManager__c = this.estimate.ZongjianApprovalManager__c;
               this.contract.Finally_Approved_Staff__c = this.estimate.Finally_Approved_Staff__c;
               this.contract.TKZongjianApprovalManager__c = this.estimate.TKZongjianApprovalManager__c;
               // JZHG-BQV3P4 20200624 Gzw add
               this.contract.HospitalAmountText__c = this.estimate.AgencyHos_Price__c;
               // JZHG-BQV3P4 20200624 Gzw add
            }
            String oldProcessStatus = this.estimate.Process_Status__c;
            try {
               if (mcList.size() > 0) {
                  ControllerUtil.updMcList(mcList.values());
               // Manual商品
               if (input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
                  input.mcae.Asset__c = null;
                  //mcae.Product_Manual__c = input.mcae.Product_Manual__c;
               }
               ControllerUtil.updateMaintenance_Contract_Estimate(new Maintenance_Contract_Estimate__c[] {this.estimate});
               update this.contract;
            } catch (Exception e) {
               // TODO 今後複数件の場合どうする?
               this.estimate.addError(e);
               // 一部の値を戻す
               this.estimate.Process_Status__c = oldProcessStatus;
               hasDatabaseError = true;
               Database.rollback(sp);
               ApexPages.addMessages(e);
               //新规时,保存新合同备品保证提供 Decide 后
               if (!isDecide) {
                  input.mcae.EquipmentGuaranteeFlgTxt__c = input.etGFlg;
               }
               // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 start
               // 2020/10/30 songxiaoqi start
               if (input.rec.CurrentContract_F__r.RecordType_DeveloperName__c != 'VM_Contract') {
                  input.mcae.Last_MContract__c = input.rec.CurrentContract_F__c;
               }
               //songxiaoqi end
               // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 end
               //mcae.Estimate_List_Price__c = input.mcae.Estimate_List_Price__c;
               //mcae.IsNew__c = input.mcae.isNew__c;
               //mcae.Check_Result__c = input.mcae.Check_Result__c;
               //mcae.Repair_Price__c = input.mcae.Repair_Price__c;
               //mcae.Comment__c = input.mcae.Comment__c;
               insertTarget.add(input.mcae);
            }
            if (hasDatabaseError) {
               System.debug('syncEstimate hasDatabaseError');
               return false;
            }
            if (isApproval) {
               SelectAssetEstimateURFController.ComputeLTYRepair(targetEstimateId);
            }
            // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'syncEstimates--end'));
            return true;
         } catch (DMLException ex) {
            // TODO Insert失敗のIDを消す必要?
            Database.rollback(sp);
            ApexPages.addMessages(ex);
         } catch (Exception ex) {
            Database.rollback(sp);
            ApexPages.addMessages(ex);
         }
         return false;
         // 本当に保存した納入機器があれば削除
         List<Maintenance_Contract_Asset_Estimate__c> selectedAsset = [SELECT Id, Name, Maintenance_Contract_Estimate__c, Asset__c, IsNew__c FROM Maintenance_Contract_Asset_Estimate__c WHERE Maintenance_Contract_Estimate__c = :this.targetEstimateId];
         if (selectedAsset.size() > 0) {
            ControllerUtil.deleteMaintenance_Contract_Asset_Estimate(selectedAsset);
         }
         if (insertTarget.size() > 0) {
            ControllerUtil.insertMaintenance_Contract_Asset_Estimate(insertTarget);
         }
         // ① start
         for (List<Maintenance_Contract_Asset__c> oldList : [select Id from Maintenance_Contract_Asset__c
                                                where Maintenance_Contract__c = :this.estimate.Maintenance_Contract__c]) {
            delete oldList;
         }
         // ② start
         {
            List<Maintenance_Contract_Asset__c> newValue = new List<Maintenance_Contract_Asset__c>();
            for (Maintenance_Contract_Asset_Estimate__c target : [select Id, Asset__c, Estimate_List_Price__c, Estimate_Cost__c,  IsNew__c, EquipmentGuaranteeFlgTxt__c,
                                                     //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk start
                                                     Check_Object__c,
                                                     //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk end
                                                     // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 start
                                                     Last_MContract__c
                                                     // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 eng
                                                     , Last_MContract__r.RecordType_DeveloperName__c
                                                     // LJPH-C9GD34 gzw fix start
                                                     ,Estimate_List_Price_Page__c
                                                     // LJPH-C9GD34 gzw fix end
                                                     from Maintenance_Contract_Asset_Estimate__c
                                                     where Maintenance_Contract_Estimate__c = :this.estimate.Id and Asset__c <> null]) {
               Maintenance_Contract_Asset__c newVal = new Maintenance_Contract_Asset__c(
                  Maintenance_Contract__c = this.estimate.Maintenance_Contract__c,
                  Asset__c = target.Asset__c,
                  Maintenance_Contract_Asset_Estimate__c = target.Id,
                  Estimate_List_Price__c = target.Estimate_List_Price__c,
                  //Maintenance_Price_YearTXT__c = target.Maintenance_Price_YearTXT__c,
                  ////add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk start
                  Check_Object__c = target.Check_Object__c,
                  //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk end
                  Estimate_IsNew__c = target.IsNew__c,
                  //EquipmentGuaranteeFlgTxt__c = target.EquipmentGuaranteeFlgTxt__c,
                  // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 start
                  // LastMContract__c = target.Last_MContract__c
                  // Gzw 20200807 五个去年合同相关,所以报价产品,获取上期合同 end
                  //如果是多年保修合同,不更新上期维修合同信息 LJPH-BUU3E3 update by rentx  2020-11-03
                  LastMContract__c = target.Last_MContract__r.RecordType_DeveloperName__c == 'VM_Contract' ? null : target.Last_MContract__c
                  );
               newValue.add(newVal);
            }
            if (newValue.size() > 0) insert newValue;
         }
         // ④ start
         this.contract.Estimation_Id__c = this.targetEstimateId;
         this.contract.Contract_Esti_Start_Date__c = this.estimate.Contract_Esti_Start_Date__c;
         this.contract.Contract_Range__c = this.estimate.Contract_Range__c;
         this.contract.Contract_Esti_End_Date__c = this.estimate.Contract_Esti_End_Date__c;
         this.contract.Estimate_Target__c = this.estimate.Estimate_Target__c;
         this.contract.Dealer__c = this.estimate.Dealer__c;
         this.contract.NotUse_Oxygenated_Water__c = this.estimate.NotUse_Oxygenated_Water__c;
         this.contract.Estimate_Trial_Money__c = this.estimate.Estimate_Trial_Money__c;
         this.contract.Contract_Amount__c = this.estimate.Maintenance_Price__c;
         // 点检总次数自动赋值 gzw fix 20211122 start
         this.contract.Service_contract_target_number__c = this.estimate.Service_contract_target_number__c;
         // 点检总次数自动赋值 gzw fix 20211122 end
         this.contract.Contract_department_manual__c = this.estimate.Department__c;
         // 追加上期合同信息 start
         this.contract.LastMContract1__c = this.estimate.LastMContract1__c;
         this.contract.LastMContract1_NO__c = this.estimate.LastMContract1_NO__c;
         this.contract.LastMContract1_ConCount__c =  this.estimate.LastMContract1_ConCount__c;
         //add by rentx 2021-06-04 给合同1赋值的同时,给去年合同赋值 start
         this.contract.Last_year_service_contract__c = this.estimate.LastMContract1__c;
         //add by renrx 2021-06-04 给合同1赋值的同时, 给去年合同赋值 end
         this.contract.LastMContract2__c =  this.estimate.LastMContract2__c;
         this.contract.LastMContract2_NO__c = this.estimate.LastMContract2_NO__c;
         this.contract.LastMContract2_ConCount__c =  this.estimate.LastMContract2_ConCount__c;
         this.contract.LastMContract3__c =  this.estimate.LastMContract3__c;
         this.contract.LastMContract3_NO__c = this.estimate.LastMContract3_NO__c;
         this.contract.LastMContract3_ConCount__c =  this.estimate.LastMContract3_ConCount__c;
         this.contract.LastMContract4__c =  this.estimate.LastMContract4__c;
         this.contract.LastMContract4_NO__c = this.estimate.LastMContract4_NO__c;
         this.contract.LastMContract4_ConCount__c =  this.estimate.LastMContract4_ConCount__c;
         this.contract.LastMContract5__c =  this.estimate.LastMContract5__c;
         this.contract.LastMContract5_NO__c = this.estimate.LastMContract5_NO__c;
         this.contract.LastMContract5_ConCount__c =  this.estimate.LastMContract5_ConCount__c;
         // 追加上期合同信息 end
         system.debug('测算isDecide的结果_1::::::::' + isDecide);
         if (isDecide == true) {
            system.debug('测算isDecide的结果_2::::::::' + isDecide);
   //              this.contract.Contract_Start_Date__c = this.estimate.Contract_Esti_Start_Date__c;
            this.contract.Contract_Start_Date__c = this.estimate.Contract_Start_Date__c;
            this.contract.Contract_Range__c = this.estimate.Contract_Range__c;
   //              this.contract.Contract_End_Date__c = this.estimate.Contract_Esti_End_Date__c;
            this.contract.Contract_End_Date__c = this.estimate.Contract_End_Date__c;
            this.contract.JingliApprovalManager__c = this.estimate.JingliApprovalManager__c;
            this.contract.BuchangApprovalManager__c = this.estimate.BuchangApprovalManager__c;
            this.contract.ZongjianApprovalManager__c = this.estimate.ZongjianApprovalManager__c;
            this.contract.Finally_Approved_Staff__c = this.estimate.Finally_Approved_Staff__c;
            this.contract.TKZongjianApprovalManager__c = this.estimate.TKZongjianApprovalManager__c;
            // JZHG-BQV3P4 20200624 Gzw add
            this.contract.HospitalAmountText__c = this.estimate.AgencyHos_Price__c;
            // JZHG-BQV3P4 20200624 Gzw add
         }
         //添加的额外对应过程
         if (inDicideFlag == true && (this.contract.Contract_Start_Date__c == null || this.contract.Contract_End_Date__c == null)) {
            system.debug('测算inDicideFlag的结果_2::::::::' + isDecide);
   //              this.contract.Contract_Start_Date__c = this.estimate.Contract_Esti_Start_Date__c;
            this.contract.Contract_Start_Date__c = this.estimate.Contract_Start_Date__c;
            this.contract.Contract_Range__c = this.estimate.Contract_Range__c;
   //              this.contract.Contract_End_Date__c = this.estimate.Contract_Esti_End_Date__c;
            this.contract.Contract_End_Date__c = this.estimate.Contract_End_Date__c;
            this.contract.JingliApprovalManager__c = this.estimate.JingliApprovalManager__c;
            this.contract.BuchangApprovalManager__c = this.estimate.BuchangApprovalManager__c;
            this.contract.ZongjianApprovalManager__c = this.estimate.ZongjianApprovalManager__c;
            this.contract.Finally_Approved_Staff__c = this.estimate.Finally_Approved_Staff__c;
            this.contract.TKZongjianApprovalManager__c = this.estimate.TKZongjianApprovalManager__c;
            // JZHG-BQV3P4 20200624 Gzw add
            this.contract.HospitalAmountText__c = this.estimate.AgencyHos_Price__c;
            // JZHG-BQV3P4 20200624 Gzw add
         }
         String oldProcessStatus = this.estimate.Process_Status__c;
         try {
            if (mcList.size() > 0) {
               ControllerUtil.updMcList(mcList.values());
            }
            ControllerUtil.updateMaintenance_Contract_Estimate(new Maintenance_Contract_Estimate__c[] {this.estimate});
            update this.contract;
         } catch (Exception e) {
            // TODO 今後複数件の場合どうする?
            this.estimate.addError(e);
            // 一部の値を戻す
            this.estimate.Process_Status__c = oldProcessStatus;
            hasDatabaseError = true;
            Database.rollback(sp);
            ApexPages.addMessages(e);
         }
         if (hasDatabaseError) {
            System.debug('syncEstimate hasDatabaseError');
            return false;
         }
         if (isApproval) {
            SelectAssetEstimateURFController.ComputeLTYRepair(targetEstimateId);
         }
         // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'syncEstimates--end'));
         return true;
      } catch (DMLException ex) {
         // TODO Insert失敗のIDを消す必要?
         Database.rollback(sp);
         ApexPages.addMessages(ex);
      } catch (Exception ex) {
         Database.rollback(sp);
         ApexPages.addMessages(ex);
      }
      return false;
   }
   
   /**
    * 印刷後変更がある場合、true
    */
      @TestVisible
      private Boolean checkChangedAfterPrint() {
         System.debug('checkChangedAfterPrint start');
         if (changedAfterPrint) {
            this.targetEstimateId = null;
            this.estimate = this.estimate.clone();
            this.estimate.IS_Clone_After_Decide__c = true;
            this.estimate.PrintDate__c = null;
            this.estimate.Quote_Date__c = null;
            this.estimate.Print_Contract__c = false;
            this.estimate.Print_RepairPrice__c = false;
            this.estimate.Print_DiscountPercentage__c = false;
            this.estimate.Print_DiscountPrice__c = false;
            this.estimate.Print_ListPrice__c = false;
            //打印报价(简化版) 2019/12/18 start
            this.estimate.Print_Simplify__c = false;
            //打印报价(简化版) 2019/12/18 end
            this.estimate.Print_MaintePrice__c = false;
            this.estimate.Print_SumPrice__c = false;
            this.estimate.NotUse_Oxygenated_Water__c = false;
            this.estimate.Contract_Esti_Start_Date__c = this.estimate.Contract_Start_Date__c;
            //this.estimate.Process_Status__c = '草案中';
         }
         return changedAfterPrint;
   @TestVisible
   private Boolean checkChangedAfterPrint() {
      System.debug('checkChangedAfterPrint start');
      if (changedAfterPrint) {
         this.targetEstimateId = null;
         this.estimate = this.estimate.clone();
         this.estimate.IS_Clone_After_Decide__c = true;
         this.estimate.PrintDate__c = null;
         this.estimate.Quote_Date__c = null;
         this.estimate.Print_Contract__c = false;
         this.estimate.Print_RepairPrice__c = false;
         this.estimate.Print_DiscountPercentage__c = false;
         this.estimate.Print_DiscountPrice__c = false;
         this.estimate.Print_ListPrice__c = false;
         //打印报价(简化版) 2019/12/18 start
         this.estimate.Print_Simplify__c = false;
         //打印报价(简化版) 2019/12/18 end
         this.estimate.Print_MaintePrice__c = false;
         this.estimate.Print_SumPrice__c = false;
         this.estimate.NotUse_Oxygenated_Water__c = false;
         this.estimate.Contract_Esti_Start_Date__c = this.estimate.Contract_Start_Date__c;
         //this.estimate.Process_Status__c = '草案中';
      }
      return changedAfterPrint;
   }
   
   /**
    * 行追加(10行ずつ)、前提必ず最後
    */
      public PageReference addNewRows() {
         for (Integer i = 0; i < 10; i++) {
            checkedAssets.add(new AssetInfo(checkedAssets.size()));
         }
         return null;
   public PageReference addNewRows() {
      for (Integer i = 0; i < 10; i++) {
         checkedAssets.add(new AssetInfo(checkedAssets.size()));
      }
      return null;
   }
   
   /** 保存返回 **/
      public PageReference saveAndCancel () {
         //add by rentx 2020-11-13 LJPH-BV93RZ start
         if (estimate.Contract_Range__c == null) {
            this.estimate.Contract_Range__c.addError('必须输入合同月数!');
            return null;
         }
         //add by rentx 2020-11-13 LJPH-BV93RZ end
         if (syncEstimate(false, false)) {
            PageReference ret = null;
            if (this.targetMaintenanceContractId != null) {
               ret = new PageReference('/' + this.targetMaintenanceContractId);
            }
            return ret;
         }
   public PageReference saveAndCancel () {
      //add by rentx 2020-11-13 LJPH-BV93RZ start
      if (estimate.Contract_Range__c == null) {
         this.estimate.Contract_Range__c.addError('必须输入合同月数!');
         return null;
      }
   /**
    * キャンセルメソッド
    */
      public PageReference cancel() {
      //add by rentx 2020-11-13 LJPH-BV93RZ end
      if (syncEstimate(false, false)) {
         PageReference ret = null;
         if (this.targetMaintenanceContractId != null) {
            ret = new PageReference('/' + this.targetMaintenanceContractId);
         }
         return ret;
      }
      return null;
   }
   /**
    * キャンセルメソッド
    */
   public PageReference cancel() {
      PageReference ret = null;
      if (this.targetMaintenanceContractId != null) {
         ret = new PageReference('/' + this.targetMaintenanceContractId);
      }
      return ret;
   }
   
   // 2021-02-07  gzw add  LJPH-BWY5QB start
      private void setEndUserType(String id) {
         this.contract = [SELECT Id, Name, Status__c, Decided_Estimation__c, Service_Contract_Staff__c,
                      Estimate_Num__c, Management_Code__c, Hospital__c,
                      Hospital__r.MaintenanceContractUserType__c,
                      Contract_Start_Date__c, Contract_End_Date__c
                      FROM Maintenance_Contract__c WHERE Id = : id];
         if (this.estimate.Process_Status__c == '草案中' || String.IsBlank(this.estimate.Process_Status__c)) {
   private void setEndUserType(String id) {
      this.contract = [SELECT Id, Name, Status__c, Decided_Estimation__c, Service_Contract_Staff__c,
                   Estimate_Num__c, Management_Code__c, Hospital__c,
                   Hospital__r.MaintenanceContractUserType__c,
                   Contract_Start_Date__c, Contract_End_Date__c
                   FROM Maintenance_Contract__c WHERE Id = :id];
      if (this.estimate.Process_Status__c == '草案中' || String.IsBlank(this.estimate.Process_Status__c)) {
   
            this.estimate.EndUserType__c = this.contract.Hospital__r.MaintenanceContractUserType__c == false ? '新用户' : '既有用户';
         }
         this.estimate.EndUserType__c = this.contract.Hospital__r.MaintenanceContractUserType__c == false ? '新用户' : '既有用户';
      }
   }
   // 2021-02-07  gzw add  LJPH-BWY5QB end
   
      private void setContractInfo(String id) {
         this.contract = [SELECT Id, Name, Status__c, Decided_Estimation__c, Service_Contract_Staff__c,
                      Estimate_Num__c, Management_Code__c, Hospital__c,
                      //2021-01-18  mzy add  LJPH-BWY5QB   客户上的 维修合同用户类型 为true /false,报价 用户类型为 既有用户 / 新用户
                      // Hospital__r.MaintenanceContractUserType__c,
                      //2021-01-18  mzy add  LJPH-BWY5QB   客户上的 维修合同用户类型 为true /false,报价 用户类型为 既有用户 / 新用户
                      Contract_Start_Date__c, Contract_End_Date__c
                      FROM Maintenance_Contract__c WHERE Id = : id];
         this.targetHospitalId = this.contract.Hospital__c;
         // 2021-01-18  mzy  add LJPH-BWY5QB   客户上的 维修合同用户类型 为true /false,报价 用户类型为 既有用户 / 新用户
         // if(this.estimate.Process_Status__c == '草案中' || String.IsBlank(this.estimate.Process_Status__c)){
   private void setContractInfo(String id) {
      this.contract = [SELECT Id, Name, Status__c, Decided_Estimation__c, Service_Contract_Staff__c,
                   Estimate_Num__c, Management_Code__c, Hospital__c,
                   //2021-01-18  mzy add  LJPH-BWY5QB   客户上的 维修合同用户类型 为true /false,报价 用户类型为 既有用户 / 新用户
                   // Hospital__r.MaintenanceContractUserType__c,
                   //2021-01-18  mzy add  LJPH-BWY5QB   客户上的 维修合同用户类型 为true /false,报价 用户类型为 既有用户 / 新用户
                   Contract_Start_Date__c, Contract_End_Date__c
                   FROM Maintenance_Contract__c WHERE Id = :id];
      this.targetHospitalId = this.contract.Hospital__c;
      // 2021-01-18  mzy  add LJPH-BWY5QB   客户上的 维修合同用户类型 为true /false,报价 用户类型为 既有用户 / 新用户
      // if(this.estimate.Process_Status__c == '草案中' || String.IsBlank(this.estimate.Process_Status__c)){
   
         //    this.estimate.EndUserType__c = this.contract.Hospital__r.MaintenanceContractUserType__c == false ? '新用户' : '既有用户';
         // }
         // 2021-01-18  mzy  add LJPH-BWY5QB   客户上的 维修合同用户类型 为true /false,报价 用户类型为 既有用户 / 新用户
      //    this.estimate.EndUserType__c = this.contract.Hospital__r.MaintenanceContractUserType__c == false ? '新用户' : '既有用户';
      // }
      // 2021-01-18  mzy  add LJPH-BWY5QB   客户上的 维修合同用户类型 为true /false,报价 用户类型为 既有用户 / 新用户
   }
   private Boolean checkValidate() {
      Boolean rtn = true;
      Date today = Date.today();
      if (getPageDisabled()) {
         today = estimate.Submit_quotation_day__c;
      }
      // 部品供給停止の製品はエラー
      for (AssetInfo input : this.checkedAssets) {
         //如果是手动产品
         // 20210121 gzw 服务合同也验证设备价格是否为空 start
         if (!input.isManual || input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
            // if (input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
            // 20210121 gzw 服务合同也验证设备价格是否为空 end
            if (input.mcae.Estimate_List_Price__c == null || input.mcae.Estimate_List_Price__c == 0) {
               //update by rentx 2020-11-12 LJPH-BV93RZ start
               // input.mcae.Product_Manual__c.addError(System.Label.Error_Message47);
               //add by rentx 2021-01-25 start
               //如果保有设备不为空的话在保有设备上报错
   
      private Boolean checkValidate() {
         Boolean rtn = true;
         Date today = Date.today();
         if (getPageDisabled()) {
            today = estimate.Submit_quotation_day__c;
               if (input.rec != null) {
                  input.rec.Name.addError(input.rec.Name + ' (机身编码为:' + input.rec.SerialNumber + ') 无合同金额,不建议参保');
               } else
               //add by rentx 2021-01-25 end
               if (String.isNotBlank(input.proName)) {
                  input.mcae.Product_Manual__c.addError(System.Label.Error_Message47 + '(' + input.proName + ')');
               }
               //update by rentx 2020-11-12 LJPH-BV93RZ end
               rtn = false;
            }
         }
         // 部品供給停止の製品はエラー
         for (AssetInfo input : this.checkedAssets) {
            //如果是手动产品
            // 20210121 gzw 服务合同也验证设备价格是否为空 start
            if (!input.isManual || input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
               // if (input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
               // 20210121 gzw 服务合同也验证设备价格是否为空 end
               if (input.mcae.Estimate_List_Price__c == null || input.mcae.Estimate_List_Price__c == 0) {
                  //update by rentx 2020-11-12 LJPH-BV93RZ start
                  // input.mcae.Product_Manual__c.addError(System.Label.Error_Message47);
                  //add by rentx 2021-01-25 start
                  //如果保有设备不为空的话在保有设备上报错
         if (!input.isManual) {
            //update by rentx 2020-11-13 start
            if (!Test.isRunningTest() && (input.mcae.Adjustment_Upper_price__c == null || input.mcae.Adjustment_Upper_price__c == 0) ) {
               // input.mcae.Adjustment_Upper_price__c.addError(input.rec.Name + '('+ input.rec.SerialNumber + ') 签约价格为0,-- 建议先与服务商品部咨询后再提交报价。');
               input.mcae.Adjustment_Upper_price__c.addError(input.proSerialName + '(' + input.proSerialNumber + ') 签约价格为0,-- 建议先与服务商品部咨询后再提交报价。');
               rtn = false;
            }
            if (!Test.isRunningTest() && (input.mcae.Adjustment_Lower_price__c == null || input.mcae.Adjustment_Lower_price__c == 0) ) {
               input.mcae.Adjustment_Lower_price__c.addError(input.proSerialName + '(' + input.proSerialNumber + ') 签约价格为0,-- 建议先与服务商品部咨询后再提交报价。');
               // input.mcae.Adjustment_Lower_price__c.addError(input.rec.Name + '('+ input.rec.SerialNumber + ') 签约价格为0,-- 建议先与服务商品部咨询后再提交报价。');
               rtn = false;
            }
            //update by rentx 2020-11-13 end
   
                  if (input.rec != null) {
                     input.rec.Name.addError(input.rec.Name + ' (机身编码为:' + input.rec.SerialNumber + ') 无合同金额,不建议参保');
            //1.合同期不满一年时,合同期超过一半才可开始续签报价。(eg:11个月的合同从6个月后才可报价。)
            //2.一年以上的合同,在结束前6个月开始可以开放续签报价。
            //3.管理员跳过,
            if (UserInfo.getProfileId() != System.Label.ProfileId_SystemAdmin && String.isNotBlank(input.rec.CurrentContract_F__c) && input.rec.CurrentContract_F__r.RecordType_DeveloperName__c != 'VM_Contract') {
   
                  } else
                  //add by rentx 2021-01-25 end
                  if (String.isNotBlank(input.proName)) {
                     input.mcae.Product_Manual__c.addError(System.Label.Error_Message47 + '(' + input.proName + ')');
                  }
                  //update by rentx 2020-11-12 LJPH-BV93RZ end
               Integer noOfDays = today.daysBetween(input.rec.CurrentContract_F__r.Contract_End_Date__c);
               Decimal monthCon = (Decimal)noOfDays / 365 * 12;
               // 可开始报价的月数限制
               if (input.rec.CurrentContract_F__r.Contract_Range__c >= 12 && monthCon > 6) {
                  input.rec.Name.addError(input.rec.Name + '(' + input.rec.SerialNumber + ') -- 合同结束前6个月开始可以制作报价。');
                  rtn = false;
               }
               if (input.rec.CurrentContract_F__r.Contract_Range__c < 12 && monthCon > Math.floor(input.rec.CurrentContract_F__r.Contract_Range__c / 2)) {
                  input.rec.Name.addError(input.rec.Name + '(' + input.rec.SerialNumber + ') -- 经历月数过半方可制作报价');
                  rtn = false;
               }
            }
            if (!input.isManual) {
               //update by rentx 2020-11-13 start
               if (!Test.isRunningTest() && (input.mcae.Adjustment_Upper_price__c == null || input.mcae.Adjustment_Upper_price__c == 0) ) {
                  // input.mcae.Adjustment_Upper_price__c.addError(input.rec.Name + '('+ input.rec.SerialNumber + ') 签约价格为0,-- 建议先与服务商品部咨询后再提交报价。');
                  input.mcae.Adjustment_Upper_price__c.addError(input.proSerialName + '(' + input.proSerialNumber + ') 签约价格为0,-- 建议先与服务商品部咨询后再提交报价。');
            // 多年保判断
            if ( String.isNotBlank(input.rec.CurrentContract_F__c) && input.rec.CurrentContract_F__r.RecordType_DeveloperName__c == 'VM_Contract') {
               //if (UserInfo.getProfileId() != System.Label.ProfileId_SystemAdmin && String.isNotBlank(input.rec.CurrentContract_F__c) && input.rec.CurrentContract_F__r.RecordType_DeveloperName__c == 'VM_Contract') {
               //Integer noOfDays = today.daysBetween(input.rec.CurrentContract_F_asset__r.endDateGurantee_Text__c);
               //Decimal monthCon = (Decimal)noOfDays/365*12;
               // 可开始报价的月数限制
               if (input.rec.CurrentContract_F__r.Gurantee_Estimate_startDate__c > Date.today()) {
                  input.rec.Name.addError(input.rec.Name + '(' + input.rec.SerialNumber + ') -- 合同结束前6个月开始可以制作报价。');
                  rtn = false;
               }
               if (!Test.isRunningTest() && (input.mcae.Adjustment_Lower_price__c == null || input.mcae.Adjustment_Lower_price__c == 0) ) {
                  input.mcae.Adjustment_Lower_price__c.addError(input.proSerialName + '(' + input.proSerialNumber + ') 签约价格为0,-- 建议先与服务商品部咨询后再提交报价。');
                  // input.mcae.Adjustment_Lower_price__c.addError(input.rec.Name + '('+ input.rec.SerialNumber + ') 签约价格为0,-- 建议先与服务商品部咨询后再提交报价。');
                  rtn = false;
               }
               //update by rentx 2020-11-13 end
               //1.合同期不满一年时,合同期超过一半才可开始续签报价。(eg:11个月的合同从6个月后才可报价。)
               //2.一年以上的合同,在结束前6个月开始可以开放续签报价。
               //3.管理员跳过,
               if (UserInfo.getProfileId() != System.Label.ProfileId_SystemAdmin && String.isNotBlank(input.rec.CurrentContract_F__c) && input.rec.CurrentContract_F__r.RecordType_DeveloperName__c != 'VM_Contract') {
                  Integer noOfDays = today.daysBetween(input.rec.CurrentContract_F__r.Contract_End_Date__c);
                  Decimal monthCon = (Decimal)noOfDays / 365 * 12;
                  // 可开始报价的月数限制
                  if (input.rec.CurrentContract_F__r.Contract_Range__c >= 12 && monthCon > 6) {
                     input.rec.Name.addError(input.rec.Name + '(' + input.rec.SerialNumber + ') -- 合同结束前6个月开始可以制作报价。');
                     rtn = false;
                  }
                  if (input.rec.CurrentContract_F__r.Contract_Range__c < 12 && monthCon > Math.floor(input.rec.CurrentContract_F__r.Contract_Range__c / 2)) {
                     input.rec.Name.addError(input.rec.Name + '(' + input.rec.SerialNumber + ') -- 经历月数过半方可制作报价');
                     rtn = false;
                  }
               }
               // 多年保判断
               if ( String.isNotBlank(input.rec.CurrentContract_F__c) && input.rec.CurrentContract_F__r.RecordType_DeveloperName__c == 'VM_Contract') {
                  //if (UserInfo.getProfileId() != System.Label.ProfileId_SystemAdmin && String.isNotBlank(input.rec.CurrentContract_F__c) && input.rec.CurrentContract_F__r.RecordType_DeveloperName__c == 'VM_Contract') {
                  //Integer noOfDays = today.daysBetween(input.rec.CurrentContract_F_asset__r.endDateGurantee_Text__c);
                  //Decimal monthCon = (Decimal)noOfDays/365*12;
                  // 可开始报价的月数限制
                  if (input.rec.CurrentContract_F__r.Gurantee_Estimate_startDate__c > Date.today()) {
                     input.rec.Name.addError(input.rec.Name + '(' + input.rec.SerialNumber + ') -- 合同结束前6个月开始可以制作报价。');
                     rtn = false;
                  }
               }
               //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '---' + input.rec.CurrentContract_F__r.Contract_End_Date__c));
               if (inDicideFlag && String.isNotBlank(input.rec.CurrentContract_F__c)) {
                  //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '+++' + input.rec.CurrentContract_F__r.Contract_End_Date__c));
                  // 合同开始日大于上期合同结束日加一个月,且没有点检日期或者最近一次点检日期是3个月前  报错
                  if (estimate.Contract_Start_Date__c > input.rec.CurrentContract_F__r.Contract_End_Date__c.addMonths(1)
                     && (input.rec.Final_Examination_Date__c == null
                        || input.rec.Final_Examination_Date__c < estimate.Contract_Start_Date__c.addMonths(-3))) {
                     input.rec.Name.addError(input.rec.Name + '(' + input.rec.SerialNumber + ') -- 没有最新的点检记录');
                     rtn = false;
                  }
               }
               if (isSaveOrApproval) {
                  if (input.rec.IF_Warranty__c == '否') {
                     input.rec.Name.addError(input.rec.Name + '(' + input.rec.SerialNumber + ') -- 不能选择不可参保设备');
                     rtn = false;
                  }
               }
               // 20200805 Gzw Bug修复
               // isSaveOrApproval = false;
            }
            //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '---' + input.rec.CurrentContract_F__r.Contract_End_Date__c));
            if (inDicideFlag && String.isNotBlank(input.rec.CurrentContract_F__c)) {
               //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '+++' + input.rec.CurrentContract_F__r.Contract_End_Date__c));
               // 合同开始日大于上期合同结束日加一个月,且没有点检日期或者最近一次点检日期是3个月前  报错
               if (estimate.Contract_Start_Date__c > input.rec.CurrentContract_F__r.Contract_End_Date__c.addMonths(1)
                  && (input.rec.Final_Examination_Date__c == null
                     || input.rec.Final_Examination_Date__c < estimate.Contract_Start_Date__c.addMonths(-3))) {
                  input.rec.Name.addError(input.rec.Name + '(' + input.rec.SerialNumber + ') -- 没有最新的点检记录');
                  rtn = false;
               }
            }
            if (isSaveOrApproval) {
               if (input.rec.IF_Warranty__c == '否') {
                  input.rec.Name.addError(input.rec.Name + '(' + input.rec.SerialNumber + ') -- 不能选择不可参保设备');
                  rtn = false;
               }
            }
            // 20200805 Gzw Bug修复
            // isSaveOrApproval = false;
         }
         return rtn;
      }
      return rtn;
   }
   
   // 价格变更后克隆报价前重新计算价格
      @TestVisible
      private void priceChangeReset() {
         // 取得master中最新价格
         List<Id> assIds = new List<Id>();
         List<Id> pdIds = new List<Id>();
         for (AssetInfo input : this.checkedAssets) {
            if (!input.isManual) {
               assIds.add(input.rec.Id);
            }
            if (input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
               pdIds.add(input.mcae.Product_Manual__c);
            }
   @TestVisible
   private void priceChangeReset() {
      // 取得master中最新价格
      List<Id> assIds = new List<Id>();
      List<Id> pdIds = new List<Id>();
      for (AssetInfo input : this.checkedAssets) {
         if (!input.isManual) {
            assIds.add(input.rec.Id);
         }
         Map<Id, Asset> assMap = new Map<Id, Asset>();
         Map<Id, Product2> pdMap = new Map<Id, Product2>();
         if (assIds.size() > 0) {
            assMap = new Map<Id, Asset>([select id, Maintenance_Price_Month__c from Asset where Id In: assIds]);
         if (input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
            pdIds.add(input.mcae.Product_Manual__c);
         }
         if (pdIds.size() > 0) {
            pdMap = new Map<Id, Product2>([select id, Maintenance_Price_Month__c, EquipmentGuaranteeFlg__c from Product2 where Id In: pdIds]);
         }
         if (assMap.size() > 0 || pdMap.size() > 0) {
            for (AssetInfo info : this.checkedAssets) {
               if (!info.isManual) {
                  info.orgPrice = assMap.get(info.rec.Id).Maintenance_Price_Month__c;
               }
               if (info.isManual && !String.isBlank(info.mcae.Product_Manual__c)) {
                  info.orgPrice = pdMap.get(info.mcae.Product_Manual__c).Maintenance_Price_Month__c;
               }
            }
         }
         //contractStartDateChange();
      }
      Map<Id, Asset> assMap = new Map<Id, Asset>();
      Map<Id, Product2> pdMap = new Map<Id, Product2>();
      if (assIds.size() > 0) {
         assMap = new Map<Id, Asset>([select id, Maintenance_Price_Month__c from Asset where Id In: assIds]);
      }
      if (pdIds.size() > 0) {
         pdMap = new Map<Id, Product2>([select id, Maintenance_Price_Month__c, EquipmentGuaranteeFlg__c from Product2 where Id In: pdIds]);
      }
      if (assMap.size() > 0 || pdMap.size() > 0) {
         for (AssetInfo info : this.checkedAssets) {
            if (!info.isManual) {
               info.orgPrice = assMap.get(info.rec.Id).Maintenance_Price_Month__c;
            }
            if (info.isManual && !String.isBlank(info.mcae.Product_Manual__c)) {
               info.orgPrice = pdMap.get(info.mcae.Product_Manual__c).Maintenance_Price_Month__c;
            }
         }
      }
      //contractStartDateChange();
   }
   
      public class AssetInfo {
   public class AssetInfo {
   // 新合同备品确保提供 当前标记
         public Boolean etGFlg {get; set;}
         public Integer lineNo {get; private set;}
         public Boolean rec_checkBox_c {get; set;}
         public Asset rec { get; set; }
         public Maintenance_Contract_Asset_Estimate__c mcae { get; set; }
         public Boolean isManual { get; set; }
         public Decimal orgPrice {get; private set;}
         public Decimal orgPrice12 {get; private set;}
   public Boolean etGFlg {get; set;}
   public Integer lineNo {get; private set;}
   public Boolean rec_checkBox_c {get; set;}
   public Asset rec { get; set; }
   public Maintenance_Contract_Asset_Estimate__c mcae { get; set; }
   public Boolean isManual { get; set; }
   public Decimal orgPrice {get; private set;}
   public Decimal orgPrice12 {get; private set;}
   //add by rentx 2020-11-12 LJPH-BV93RZ start
         public String proName;
         public String proSerialNumber;
         public String proSerialName;
   public String proName;
   public String proSerialNumber;
   public String proSerialName;
   //add by rentx 2020-11-12 LJPH-BV93RZ end
   // add by fxk 2021/9/9 控制点检对象是否可选 Star
         public Boolean CheckRows {get; private set;}
   public Boolean CheckRows {get; private set;}
   // add by fxk 2021/9/9 控制点检对象是否可选 End
   // 限次价格 add by gzw start
         public Decimal uFRPrice {get; private set;}
   public Decimal uFRPrice {get; private set;}
   // 限次系列
         public String uFRSerial {get; private set;}
   public String uFRSerial {get; private set;}
   // 最大大修次数
         public Decimal uFRRepairCount {get; private set;}
   public Decimal uFRRepairCount {get; private set;}
   
   // 限次价格 add by gzw end
   // XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
   public Decimal uFRMaxPrice {get; set;}
   public Decimal uFRMinPrice {get; set;}
   // XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
   
         public Id getRecId() {
            Id rtn = null;
            if (rec != null) {
               rtn = rec.Id;
            }
            return rtn;
         }
         public void setRecId(Id value) {
            // なにもしない
         }
   public Id getRecId() {
      Id rtn = null;
      if (rec != null) {
         rtn = rec.Id;
      }
      return rtn;
   }
   public void setRecId(Id value) {
      // なにもしない
   }
   
   // Manual専用
         public AssetInfo(Integer lineNo) {
            this.lineNo = lineNo;
            this.rec = null;
            this.mcae = new Maintenance_Contract_Asset_Estimate__c(
               isNew__c = true,
               // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
               Check_Object__c = true
                             // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk end
               );
            this.isManual = true;
            this.rec_checkBox_c = false;
            this.orgPrice = 0;
            this.orgPrice12 = 0;
            this.etGFlg = false;
            this.uFRPrice = 0;
            this.uFRRepairCount = 0;
            // add by fxk 2021/9/9 控制点检对象是否可选 Star
            this.CheckRows = true;
            // add by fxk 2021/9/9 控制点检对象是否可选 End
         }
   public AssetInfo(Integer lineNo) {
      this.lineNo = lineNo;
      this.rec = null;
      this.mcae = new Maintenance_Contract_Asset_Estimate__c(
         isNew__c = true,
         // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
         Check_Object__c = true
                       // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk end
         );
      this.isManual = true;
      this.rec_checkBox_c = false;
      this.orgPrice = 0;
      this.orgPrice12 = 0;
      this.etGFlg = false;
      this.uFRPrice = 0;
      this.uFRRepairCount = 0;
      // add by fxk 2021/9/9 控制点检对象是否可选 Star
      this.CheckRows = true;
      // add by fxk 2021/9/9 控制点检对象是否可选 End
      // XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
      this.uFRMaxPrice = mcae.Product_Manual__r.ProductURF__r.Maintenance_Price_Year_URF_Max__c;
      this.uFRMinPrice = mcae.Product_Manual__r.ProductURF__r.Maintenance_Price_Year_URF__c;
      // XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
   }
   // 選択された用(非Manual)
         public AssetInfo(Integer lineNo, Asset record, Boolean isNew, Decimal listPrice, Maintenance_Contract_Asset_Estimate__c mcae) {
            this.lineNo = lineNo;
            this.rec = record;
            this.mcae = new Maintenance_Contract_Asset_Estimate__c(
   public AssetInfo(Integer lineNo, Asset record, Boolean isNew, Decimal listPrice, Maintenance_Contract_Asset_Estimate__c mcae) {
      this.lineNo = lineNo;
      this.rec = record;
      this.mcae = new Maintenance_Contract_Asset_Estimate__c(
   //                id = mcae.Id,             // 本当にいらないの? セットしたら、新規権限がなくでも、更新できます。後藤さんに確認した、なくでもいいです。
               isNew__c = isNew,
               // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
               Check_Object__c = mcae.Check_Object__c,
               // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk end
               Estimate_List_Price__c = listPrice,
               //Maintenance_Price_YearTXT__c = mcae.Maintenance_Price_YearTXT__c,
               Check_Result__c = mcae.Check_Result__c,
               Repair_Price__c = mcae.Repair_Price__c,
               Comment__c = mcae.Comment__c,
               EquipmentGuaranteeFlgTxt__c = mcae.EquipmentGuaranteeFlgTxt__c,
               Estimate_Cost__c = mcae.Estimate_Cost__c,
               Adjustment_ratio_Upper__c = mcae.Adjustment_ratio_Upper__c,
               Adjustment_ratio_Lower__c = mcae.Adjustment_ratio_Lower__c,
               Adjustment_Upper_price__c = mcae.Adjustment_Upper_price__c,
               LastMContract_Price__c = mcae.LastMContract_Price__c,
               Adjustment_Lower_price__c = mcae.Adjustment_Lower_price__c,
               Asset_Consumption_rate__c = mcae.Asset_Consumption_rate__c
                                    // 追加限次信息
               , URF_Series__c = mcae.URF_Series__c,
               Series_RepairCount__c = mcae.Series_RepairCount__c,
               Series_MaxRepairCount__c = mcae.Series_MaxRepairCount__c,
               Asset_RepairCount__c = mcae.Asset_RepairCount__c,
               Asset_MaxRepairCount__c = mcae.Asset_MaxRepairCount__c
               // LJPH-C9GD34 gzw fix start
               ,Estimate_List_Price_Page__c = mcae.Estimate_List_Price_Page__c
               // LJPH-C9GD34 gzw fix end
         isNew__c = isNew,
         // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
         Check_Object__c = mcae.Check_Object__c,
         // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk end
         Estimate_List_Price__c = listPrice,
         //Maintenance_Price_YearTXT__c = mcae.Maintenance_Price_YearTXT__c,
         Check_Result__c = mcae.Check_Result__c,
         Repair_Price__c = mcae.Repair_Price__c,
         Comment__c = mcae.Comment__c,
         EquipmentGuaranteeFlgTxt__c = mcae.EquipmentGuaranteeFlgTxt__c,
         Estimate_Cost__c = mcae.Estimate_Cost__c,
         Adjustment_ratio_Upper__c = mcae.Adjustment_ratio_Upper__c,
         Adjustment_ratio_Lower__c = mcae.Adjustment_ratio_Lower__c,
         Adjustment_Upper_price__c = mcae.Adjustment_Upper_price__c,
         LastMContract_Price__c = mcae.LastMContract_Price__c,
         Adjustment_Lower_price__c = mcae.Adjustment_Lower_price__c,
         Asset_Consumption_rate__c = mcae.Asset_Consumption_rate__c
                              // 追加限次信息
         , URF_Series__c = mcae.URF_Series__c,
         Series_RepairCount__c = mcae.Series_RepairCount__c,
         Series_MaxRepairCount__c = mcae.Series_MaxRepairCount__c,
         Asset_RepairCount__c = mcae.Asset_RepairCount__c,
         Asset_MaxRepairCount__c = mcae.Asset_MaxRepairCount__c
         // LJPH-C9GD34 gzw fix start
         ,Estimate_List_Price_Page__c = mcae.Estimate_List_Price_Page__c
         // LJPH-C9GD34 gzw fix end
   
               );
            this.isManual = false;
            this.rec_checkBox_c = true;
            this.orgPrice = record.Maintenance_Price_Month__c;
            this.orgPrice12 = this.orgPrice * 12;
            this.etGFlg = record.EquipmentGuaranteeFlg__c;
            //add by rentx 2020-11-12 LJPH-BV93RZ start
            this.proName = '机身编码为:' + record.SerialNumber;
            this.proSerialNumber = record.SerialNumber;
            this.proSerialName = record.Name;
            //add by rentx 2020-11-12 LJPH-BV93RZ end
            this.uFRPrice = record.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
            this.uFRSerial = record.Product2.ProductURF__r.URFLimitSerial__c;
            this.uFRRepairCount = record.Product2.ProductURF__r.UFR_MaxRepairCount__c;
         }
         );
      this.isManual = false;
      this.rec_checkBox_c = true;
      this.orgPrice = record.Maintenance_Price_Month__c;
      this.orgPrice12 = this.orgPrice * 12;
      this.etGFlg = record.EquipmentGuaranteeFlg__c;
      //add by rentx 2020-11-12 LJPH-BV93RZ start
      this.proName = '机身编码为:' + record.SerialNumber;
      this.proSerialNumber = record.SerialNumber;
      this.proSerialName = record.Name;
      //add by rentx 2020-11-12 LJPH-BV93RZ end
      this.uFRPrice = record.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
      this.uFRSerial = record.Product2.ProductURF__r.URFLimitSerial__c;
      this.uFRRepairCount = record.Product2.ProductURF__r.UFR_MaxRepairCount__c;
      //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
      this.uFRMaxPrice = record.Product2.ProductURF__r.Maintenance_Price_Year_URF_Max__c;
      this.uFRMinPrice = record.Product2.ProductURF__r.Maintenance_Price_Year_URF__c;
      // XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
   }
   // 選択された用、未納品用(Manual)
         public AssetInfo(Integer lineNo, Maintenance_Contract_Asset_Estimate__c mcae) {
            this.lineNo = lineNo;
            this.rec = null;
            this.mcae = new Maintenance_Contract_Asset_Estimate__c(
   public AssetInfo(Integer lineNo, Maintenance_Contract_Asset_Estimate__c mcae) {
      this.lineNo = lineNo;
      this.rec = null;
      this.mcae = new Maintenance_Contract_Asset_Estimate__c(
   //                id = mcae.Id,             // 本当にいらないの? セットしたら、新規権限がなくでも、更新できます。後藤さんに確認した、なくでもいいです。
               isNew__c = mcae.IsNew__c,
               // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
               Check_Object__c = mcae.Check_Object__c,
               // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk end
               Product_Manual__c = mcae.Product_Manual__c,
               Estimate_List_Price__c = mcae.Estimate_List_Price__c,
               //Maintenance_Price_YearTXT__c = mcae.Maintenance_Price_YearTXT__c,
               Check_Result__c = mcae.Check_Result__c,
               Repair_Price__c = mcae.Repair_Price__c,
               Comment__c = mcae.Comment__c,
               EquipmentGuaranteeFlgTxt__c = mcae.EquipmentGuaranteeFlgTxt__c,
               Estimate_Cost__c = mcae.Estimate_Cost__c,
               Adjustment_ratio_Upper__c = mcae.Adjustment_ratio_Upper__c,
               Adjustment_ratio_Lower__c = mcae.Adjustment_ratio_Lower__c,
               Adjustment_Upper_price__c = mcae.Adjustment_Upper_price__c,
               LastMContract_Price__c = mcae.LastMContract_Price__c,
               Adjustment_Lower_price__c = mcae.Adjustment_Lower_price__c,
               Asset_Consumption_rate__c = mcae.Asset_Consumption_rate__c
                                    // 追加限次信息
               , URF_Series__c = mcae.URF_Series__c,
               Series_RepairCount__c = mcae.Series_RepairCount__c,
               Series_MaxRepairCount__c = mcae.Series_MaxRepairCount__c,
               Asset_RepairCount__c = mcae.Asset_RepairCount__c,
               Asset_MaxRepairCount__c = mcae.Asset_MaxRepairCount__c
               // LJPH-C9GD34 gzw fix start
               ,Estimate_List_Price_Page__c = mcae.Estimate_List_Price_Page__c
               // LJPH-C9GD34 gzw fix end
               );
            this.isManual = true;
            this.rec_checkBox_c = false;
            this.orgPrice = mcae.Product_Manual__r.Maintenance_Price_Month__c;
            this.orgPrice12 = this.orgPrice * 12;
            this.proName = mcae.Product_Manual__r.Name;
            this.etGFlg = mcae.Product_Manual__r.EquipmentGuaranteeFlg__c;
            this.uFRPrice = mcae.Product_Manual__r.ProductURF__r.UFR_Maintenance_Price_Month__c;
            this.uFRSerial = mcae.Product_Manual__r.ProductURF__r.URFLimitSerial__c;
            this.uFRRepairCount = mcae.Product_Manual__r.ProductURF__r.UFR_MaxRepairCount__c;
         }
         isNew__c = mcae.IsNew__c,
         // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk Star
         Check_Object__c = mcae.Check_Object__c,
         // add点检改善:新增一个点检对象复选框字段,默认为true 2021.6.8 fxk end
         Product_Manual__c = mcae.Product_Manual__c,
         Estimate_List_Price__c = mcae.Estimate_List_Price__c,
         //Maintenance_Price_YearTXT__c = mcae.Maintenance_Price_YearTXT__c,
         Check_Result__c = mcae.Check_Result__c,
         Repair_Price__c = mcae.Repair_Price__c,
         Comment__c = mcae.Comment__c,
         EquipmentGuaranteeFlgTxt__c = mcae.EquipmentGuaranteeFlgTxt__c,
         Estimate_Cost__c = mcae.Estimate_Cost__c,
         Adjustment_ratio_Upper__c = mcae.Adjustment_ratio_Upper__c,
         Adjustment_ratio_Lower__c = mcae.Adjustment_ratio_Lower__c,
         Adjustment_Upper_price__c = mcae.Adjustment_Upper_price__c,
         LastMContract_Price__c = mcae.LastMContract_Price__c,
         Adjustment_Lower_price__c = mcae.Adjustment_Lower_price__c,
         Asset_Consumption_rate__c = mcae.Asset_Consumption_rate__c
                              // 追加限次信息
         , URF_Series__c = mcae.URF_Series__c,
         Series_RepairCount__c = mcae.Series_RepairCount__c,
         Series_MaxRepairCount__c = mcae.Series_MaxRepairCount__c,
         Asset_RepairCount__c = mcae.Asset_RepairCount__c,
         Asset_MaxRepairCount__c = mcae.Asset_MaxRepairCount__c
         // LJPH-C9GD34 gzw fix start
         ,Estimate_List_Price_Page__c = mcae.Estimate_List_Price_Page__c
         // LJPH-C9GD34 gzw fix end
         );
      this.isManual = true;
      this.rec_checkBox_c = false;
      this.orgPrice = mcae.Product_Manual__r.Maintenance_Price_Month__c;
      this.orgPrice12 = this.orgPrice * 12;
      this.proName = mcae.Product_Manual__r.Name;
      this.etGFlg = mcae.Product_Manual__r.EquipmentGuaranteeFlg__c;
      this.uFRPrice = mcae.Product_Manual__r.ProductURF__r.UFR_Maintenance_Price_Month__c;
      this.uFRSerial = mcae.Product_Manual__r.ProductURF__r.URFLimitSerial__c;
      this.uFRRepairCount = mcae.Product_Manual__r.ProductURF__r.UFR_MaxRepairCount__c;
      // XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
      this.uFRMaxPrice = mcae.Product_Manual__r.ProductURF__r.Maintenance_Price_Year_URF_Max__c;
      this.uFRMinPrice = mcae.Product_Manual__r.ProductURF__r.Maintenance_Price_Year_URF__c;
      // XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
   }
   // 選択されなかった用
         public AssetInfo(Integer lineNo, Asset record) {
            this.lineNo = lineNo;
            this.rec = record;
            this.isManual = false;
            this.rec_checkBox_c = false;
            this.orgPrice = record.Maintenance_Price_Month__c;
            this.orgPrice12 = this.orgPrice * 12;
            this.etGFlg = record.EquipmentGuaranteeFlg__c;
            this.proSerialName = record.Name;
            this.proSerialNumber = record.SerialNumber;
            this.uFRPrice = record.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
            this.uFRSerial = record.Product2.ProductURF__r.URFLimitSerial__c;
            this.uFRRepairCount = record.Product2.ProductURF__r.UFR_MaxRepairCount__c;
         }
      }
   public AssetInfo(Integer lineNo, Asset record) {
      this.lineNo = lineNo;
      this.rec = record;
      this.isManual = false;
      this.rec_checkBox_c = false;
      this.orgPrice = record.Maintenance_Price_Month__c;
      this.orgPrice12 = this.orgPrice * 12;
      this.etGFlg = record.EquipmentGuaranteeFlg__c;
      this.proSerialName = record.Name;
      this.proSerialNumber = record.SerialNumber;
      this.uFRPrice = record.Product2.ProductURF__r.UFR_Maintenance_Price_Month__c;
      this.uFRSerial = record.Product2.ProductURF__r.URFLimitSerial__c;
      this.uFRRepairCount = record.Product2.ProductURF__r.UFR_MaxRepairCount__c;
      //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
      this.uFRMaxPrice = record.Product2.ProductURF__r.Maintenance_Price_Year_URF_Max__c;
      this.uFRMinPrice = record.Product2.ProductURF__r.Maintenance_Price_Year_URF__c;
      // XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
   }
   }
   
      WebService static String pageDecide(String strId) {
         String rs = '';
         SelectAssetEstimateURFController saec = new SelectAssetEstimateURFController();
         saec.targetEstimateId = strId;
         saec.isPageAction = true;
         saec.init();
         if (saec.getDecideBtnDisabled()) {
            rs = '已经是Decide过的合同 或 不是批准的报价,不能Decide';
            return rs;
         }
         if (saec.syncEstimate(false, true)) {
            rs = '0';
         } else {
            rs = 'Decide失败';
         }
   WebService static String pageDecide(String strId) {
      String rs = '';
      SelectAssetEstimateURFController saec = new SelectAssetEstimateURFController();
      saec.targetEstimateId = strId;
      saec.isPageAction = true;
      saec.init();
      if (saec.getDecideBtnDisabled()) {
         rs = '已经是Decide过的合同 或 不是批准的报价,不能Decide';
         return rs;
      }
      if (saec.syncEstimate(false, true)) {
         rs = '0';
      } else {
         rs = 'Decide失败';
      }
      return rs;
   }
   
      WebService static String pageUndecide(String strId) {
         String rs = '';
         SelectAssetEstimateURFController saec = new SelectAssetEstimateURFController();
         saec.targetEstimateId = strId;
         saec.isPageAction = true;
         saec.init();
         if (saec.getUnDecideBtnDisabled()) {
            rs = '不是Decide过的报价,不能Undecide';
            return rs;
         }
         if (saec.undecide() != null) {
            rs = '0';
         } else {
            rs = 'Undecide失败';
         }
   WebService static String pageUndecide(String strId) {
      String rs = '';
      SelectAssetEstimateURFController saec = new SelectAssetEstimateURFController();
      saec.targetEstimateId = strId;
      saec.isPageAction = true;
      saec.init();
      if (saec.getUnDecideBtnDisabled()) {
         rs = '不是Decide过的报价,不能Undecide';
         return rs;
      }
      if (saec.undecide() != null) {
         rs = '0';
      } else {
         rs = 'Undecide失败';
      }
      return rs;
   }
   
   // 2021-09-10 tcm 排序逻辑调整 start 传入 startDate ,添加 lastMContractMap1
      public static List<lastMContract> getlastMContract(List<AssetInfo> checkedAssets, Date startDate) {
         Map<String, lastMContract> lastMContractMap = new Map<String, lastMContract>();
         Map<String, lastMContract> lastMContractMap1 = new Map<String, lastMContract>();
         for (AssetInfo ai : checkedAssets) {
   public static List<lastMContract> getlastMContract(List<AssetInfo> checkedAssets, Date startDate) {
      Map<String, lastMContract> lastMContractMap = new Map<String, lastMContract>();
      Map<String, lastMContract> lastMContractMap1 = new Map<String, lastMContract>();
      for (AssetInfo ai : checkedAssets) {
            lastMContract lM = new lastMContract(ai.rec.CurrentContract_F__c, ai.rec.CurrentContract_F__r.Management_Code__c, ai.rec.CurrentContract_F__r.Contract_End_Date__c, 1);
            // 计算空白期
            if (startDate != null && lM.endDate != null) {
               if (startDate.daysbetween(lM.endDate) > -366 && startDate.daysbetween(lM.endDate) < 366) {
                  lm.ayearcontract = true;
               } else {
                  lm.ayearcontract = false;
               }
         // 计算空白期
         if (startDate != null && lM.endDate != null) {
            if (startDate.daysbetween(lM.endDate) > -366 && startDate.daysbetween(lM.endDate) < 366) {
               lm.ayearcontract = true;
            } else {
               lm.ayearcontract = false;
            }
            // 2021-09-10 tcm 排序逻辑调整 end
         } else {
            lm.ayearcontract = false;
         }
         // 2021-09-10 tcm 排序逻辑调整 end
   
            // if (String.isNotBlank(ai.rec.CurrentContract_F__c) ) {
            //判断 如果上一期维修合同为 多年保修合同 的话 则不放入map进行更新 LJPH-BUU3E3 update by rentx 2020-11-03 start
            if (String.isNotBlank(ai.rec.CurrentContract_F__c) && ai.rec.CurrentContract_F__r.RecordType_DeveloperName__c != 'VM_Contract') {
         // if (String.isNotBlank(ai.rec.CurrentContract_F__c) ) {
         //判断 如果上一期维修合同为 多年保修合同 的话 则不放入map进行更新 LJPH-BUU3E3 update by rentx 2020-11-03 start
         if (String.isNotBlank(ai.rec.CurrentContract_F__c) && ai.rec.CurrentContract_F__r.RecordType_DeveloperName__c != 'VM_Contract') {
   
               // 2021-09-10 tcm 排序逻辑调整 start
               if (lm.ayearcontract) {
                  // 2021-09-10 tcm 排序逻辑调整 end
            // 2021-09-10 tcm 排序逻辑调整 start
            if (lm.ayearcontract) {
               // 2021-09-10 tcm 排序逻辑调整 end
   
                  //判断 如果上一期维修合同为 多年保修合同 的话 则不放入map进行更新 LJPH-BUU3E3 update by rentx 2020-11-03 end
                  // 空白期
                  if (lastMContractMap.containsKey(ai.rec.CurrentContract_F__c)) {
                     lastMContractMap.get(ai.rec.CurrentContract_F__c).count++;
                  } else {
                     lastMContractMap.put(ai.rec.CurrentContract_F__c, lM);
                  }
                  // 非空白期
               //判断 如果上一期维修合同为 多年保修合同 的话 则不放入map进行更新 LJPH-BUU3E3 update by rentx 2020-11-03 end
               // 空白期
               if (lastMContractMap.containsKey(ai.rec.CurrentContract_F__c)) {
                  lastMContractMap.get(ai.rec.CurrentContract_F__c).count++;
               } else {
                  if (lastMContractMap1.containsKey(ai.rec.CurrentContract_F__c)) {
                     lastMContractMap1.get(ai.rec.CurrentContract_F__c).count++;
                  } else {
                     lastMContractMap1.put(ai.rec.CurrentContract_F__c, lM);
                  }
                  lastMContractMap.put(ai.rec.CurrentContract_F__c, lM);
               }
               // 非空白期
            } else {
               if (lastMContractMap1.containsKey(ai.rec.CurrentContract_F__c)) {
                  lastMContractMap1.get(ai.rec.CurrentContract_F__c).count++;
               } else {
                  lastMContractMap1.put(ai.rec.CurrentContract_F__c, lM);
               }
            }
         }
         List<lastMContract> listResulttemp = new List<lastMContract>();
         List<lastMContract> listResult = new List<lastMContract>();
         // 2021-09-10 tcm 排序逻辑调整 start
         List<lastMContract> listResulttemp1 = new List<lastMContract>();
         List<lastMContract> listResult1 = new List<lastMContract>();
         // 2021-09-10 tcm 排序逻辑调整 end
         // 空白期
         for ( lastMContract ll : lastMContractMap.values()) {
            listResulttemp.add(ll);
         }
         // 2021-09-10 tcm 排序逻辑调整 start
         // 非空白期
         for ( lastMContract ll : lastMContractMap1.values()) {
            listResulttemp1.add(ll);
         }
         // 2021-09-10 tcm 排序逻辑调整 end
         //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'listResult +++++!' + listResult));
         // 空白期
         listResulttemp.sort();
         // 2021-09-10 tcm 排序逻辑调整 start  (修改了循环次数 原5)
         for (Integer i = 0; i < listResulttemp.size(); i++) {
            // 2021-09-10 tcm 排序逻辑调整 end
            if (listResulttemp.size() >= i + 1) {
               listResult.add(listResulttemp[i]);
            }
         }
         // 2021-09-10 tcm 排序逻辑调整 start
         // 非空白期
         listResulttemp1.sort();
         for (Integer i = 0; i < 5 - listResulttemp.size(); i++) {
            if (listResulttemp1.size() >= i + 1) {
               listResult1.add(listResulttemp1[i]);
            } else {
               listResult1.add(new lastMContract(null, null, null, null));
            }
         }
         // 合并
         listResult.addAll(listResult1);
         // 2021-09-10 tcm 排序逻辑调整 end
         //List<lastMContract> listResult = new List<lastMContract>();
         return listResult;
      }
      List<lastMContract> listResulttemp = new List<lastMContract>();
      List<lastMContract> listResult = new List<lastMContract>();
      // 2021-09-10 tcm 排序逻辑调整 start
      List<lastMContract> listResulttemp1 = new List<lastMContract>();
      List<lastMContract> listResult1 = new List<lastMContract>();
      // 2021-09-10 tcm 排序逻辑调整 end
      // 空白期
      for ( lastMContract ll : lastMContractMap.values()) {
         listResulttemp.add(ll);
      }
      // 2021-09-10 tcm 排序逻辑调整 start
      // 非空白期
      for ( lastMContract ll : lastMContractMap1.values()) {
         listResulttemp1.add(ll);
      }
      // 2021-09-10 tcm 排序逻辑调整 end
      //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, 'listResult +++++!' + listResult));
      // 空白期
      listResulttemp.sort();
      // 2021-09-10 tcm 排序逻辑调整 start  (修改了循环次数 原5)
      for (Integer i = 0; i < listResulttemp.size(); i++) {
         // 2021-09-10 tcm 排序逻辑调整 end
         if (listResulttemp.size() >= i + 1) {
            listResult.add(listResulttemp[i]);
         }
      }
      // 2021-09-10 tcm 排序逻辑调整 start
      // 非空白期
      listResulttemp1.sort();
      for (Integer i = 0; i < 5 - listResulttemp.size(); i++) {
         if (listResulttemp1.size() >= i + 1) {
            listResult1.add(listResulttemp1[i]);
         } else {
            listResult1.add(new lastMContract(null, null, null, null));
         }
      }
      // 合并
      listResult.addAll(listResult1);
      // 2021-09-10 tcm 排序逻辑调整 end
      //List<lastMContract> listResult = new List<lastMContract>();
      return listResult;
   }
   
   
   // public static List<Data> getChartData() {
@@ -3300,23 +3371,25 @@
   //     return data;
   // }
   // 计算限次系列次数
      public Map<String, Decimal> getLimitSerialData() {
         Map<String, Decimal> limitSerial = new Map<String, Decimal>();
   public Map<String, Decimal> getLimitSerialData(Integer Contract_year) {
      Map<String, Decimal> limitSerial = new Map<String, Decimal>();
   
         for (AssetInfo input : this.checkedAssets) {
            if (String.isNotBlank(input.uFRSerial) && limitSerial.containsKey(input.uFRSerial)) {
               limitSerial.put(input.uFRSerial, limitSerial.get(input.uFRSerial) + input.uFRRepairCount);
            } else {
               limitSerial.put(input.uFRSerial, input.uFRRepairCount);
            }
            // if (!input.isManual || input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
            //     if (String.isBlank(input.mcae.Check_Result__c)) {
            //         input.mcae.Check_Result__c.addError('点检结果必填');
            //     }
            // }
      for (AssetInfo input : this.checkedAssets) {
         //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 start
         if (String.isNotBlank(input.uFRSerial) && limitSerial.containsKey(input.uFRSerial)) {
            limitSerial.put(input.uFRSerial, limitSerial.get(input.uFRSerial) + input.uFRRepairCount * Contract_year);
         } else {
            limitSerial.put(input.uFRSerial, input.uFRRepairCount * Contract_year);
         }
         return limitSerial;
         //XLIU-CE7AVC【委托】URF限次修理合同的最高价格修改 thh 20220509 end
         // if (!input.isManual || input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
         //     if (String.isBlank(input.mcae.Check_Result__c)) {
         //         input.mcae.Check_Result__c.addError('点检结果必填');
         //     }
         // }
      }
      return limitSerial;
   }
   
   // // 价格体系 class
   // public class Data {
@@ -3333,41 +3406,41 @@
   // }
   
   // 续签合同信息 class
      public class lastMContract implements Comparable {
         public Date endDate { get; set; }
         public Integer count { get; set; }
         public String contractId { get; set; }
         public String contractNo { get; set; }
   public class lastMContract implements Comparable {
   public Date endDate { get; set; }
   public Integer count { get; set; }
   public String contractId { get; set; }
   public String contractNo { get; set; }
   // 2021-09-10 tcm 排序逻辑调整 start
         public Boolean ayearcontract { get; set; }
   public Boolean ayearcontract { get; set; }
   // 2021-09-10 tcm 排序逻辑调整 end
         public lastMContract(String contractId, String contractNo, Date endDate, Integer count) {
            this.endDate = endDate;
            this.count = count;
            this.contractId = contractId;
            this.contractNo = contractNo;
         }
   public lastMContract(String contractId, String contractNo, Date endDate, Integer count) {
      this.endDate = endDate;
      this.count = count;
      this.contractId = contractId;
      this.contractNo = contractNo;
   }
   
   // 排序
         public Integer compareTo(Object compareTo) {
            lastMContract compareToesd = (lastMContract)compareTo;
            Integer returnValue = 0;
   public Integer compareTo(Object compareTo) {
      lastMContract compareToesd = (lastMContract)compareTo;
      Integer returnValue = 0;
   
            // 2021-09-10 tcm 排序逻辑调整 start
            // 判断在数量
            if (count  > compareToesd.count) {
               returnValue = -1;
            } else if (count  < compareToesd.count) {
               returnValue = 1;
            } else {
               if (endDate  > compareToesd.endDate ) {
                  returnValue = 1;
               } else {
                  returnValue = -1;
               }
            }
            return returnValue;
            // 2021-09-10 tcm 排序逻辑调整 end
      // 2021-09-10 tcm 排序逻辑调整 start
      // 判断在数量
      if (count  > compareToesd.count) {
         returnValue = -1;
      } else if (count  < compareToesd.count) {
         returnValue = 1;
      } else {
         if (endDate  > compareToesd.endDate ) {
            returnValue = 1;
         } else {
            returnValue = -1;
         }
      }
      return returnValue;
      // 2021-09-10 tcm 排序逻辑调整 end
   }
   }
   }