涂煌豪
2022-04-08 c40d6d0f9aba576bf9af5961db86cde85c8ca566
force-app/main/default/classes/SelectAssetEstimateVMController.cls
@@ -44,13 +44,14 @@
    //HWAG-B399Q8 2018/08/20  检验是否显示'请提交待审批' start
    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'));
        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
    
@@ -72,37 +73,39 @@
    public List<String> assetSerialNumberList = new List<String>();
    // 新规 或者 copy
    private Boolean newIns = false;
    //add   wangweipeng     2021/12/06     start
    public String checkDealerId{get;set;}
    //add   wangweipeng     2021/12/06     end
    
    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));
        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
        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; }                         // 条件
@@ -113,257 +116,257 @@
    
    // 检索按钮
    public PageReference searchBtn() {
      countorder = 1;
      //验证
      assetSerialNumberList.clear();
      getAssetSerialNumber();
      totalRecords = 0;
      List<Asset> assetconfimList = getAssetconfim(text1, cond1, val1);
      for (Asset ast : assetconfimList) {
        totalRecords++;
      }
        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);
        // 获取assets
        List<Asset> assetList = getAsset(text1, cond1, val1);
    
      // 作成明细行
      getSortedUnCheckedInfoList(assetList);
      // 排序用检索条件退避
      text1ForSort = text1;
      cond1ForSort = cond1;
      val1ForSort = val1;
      currPage = 1;
        // 作成明细行
        getSortedUnCheckedInfoList(assetList);
        // 排序用检索条件退避
        text1ForSort = text1;
        cond1ForSort = cond1;
        val1ForSort = val1;
        currPage = 1;
    
    
      totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
      return null;
        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);
        //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) {
        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);
            // 打勾,视为优先显示明细
            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));
        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 ');
      } else {
        soql += ' order by SerialNumber, Name, Department_Name__c, InstallDate';
      }
      system.debug('====getAssetconfim:' + soql);
      return Database.query(soql);
        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);
        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);
        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;
        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] + '\')';
        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 添加 Management_Code__c  20211201 start
      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.Maintenance_Contract_No_F__c,CurrentContract_F__r.Management_Code__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,'
              + 'CurrentContract_End_Date__c, Extend_Gurantee_DateTo__c,EquipmentGuaranteeFlg__c,AssetMark__c,NoPartRiskDate_F__c,NoPartRiskDate__c,SignableFlag__c FROM Asset WHERE 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;
        //tcm 添加 Management_Code__c  20211201 start
        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.Maintenance_Contract_No_F__c,CurrentContract_F__r.Management_Code__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,'
                      + 'CurrentContract_End_Date__c, Extend_Gurantee_DateTo__c,EquipmentGuaranteeFlg__c,AssetMark__c,NoPartRiskDate_F__c,NoPartRiskDate__c,SignableFlag__c FROM Asset WHERE 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;
    }
    
    // 拼接检索条件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(' ');
          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 ';
              } 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 {
            // notcontains
            if (!String.isBlank(cSql)) {
              cSql = cSql.substring(5);                 // ' and ' の5文字を外す
              soql += ' and (NOT ' + cSql + ') ';
            }
          }
        String soql = '';
        if (String.isBlank(con)) {
            con = 'equals';
        }
      }
      // //JZHG-BSDUT4 ---20200825---update By rentongxiao---Start
      // else{
      //     soql += 'And AssetMark__c = \'主机\'';
      // }
      // //JZHG-BSDUT4 ---20200825---update By rentongxiao---End
      return soql;
        // 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 ';
                        } 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 {
                    // 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は無視
          }
        } else {
          soql += ' and ' + txt;
          if (con == 'equals') {
            if (colType == 'S:') {
              soql += ' = \'' + tmpVal + '\'';
        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 += ' = ' + tmpVal + ' ';
                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 + ' ';
                    }
                }
            }
          } 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;
        return soql;
    }
    
    //----------HWAG-B4R3SS------------------------------------------------------------
@@ -374,57 +377,57 @@
    
    
    public Boolean getEnablePrintContract() {
      if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
        return this.estimate.Estimation_Decision__c;
      } else {
        return false;
      }
        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;
        // 見積もりdecide取消しできない条件の判断
        if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
            if (this.estimate.Estimation_Decision__c) {
                return false;
            }
        }
      }
      // TODO 本当は特別資格があれば 決定可能にする
      return true;
        // TODO 本当は特別資格があれば 決定可能にする
        return true;
    }
    public Boolean getDecideBtnDisabled() {
      // 見積もりdecideできない条件の判断
      if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
        if (this.estimate.Estimation_Decision__c) {
          return true;
        // 見積もりdecideできない条件の判断
        if (String.isBlank(this.contract.Decided_Estimation__c) == false) {
            if (this.estimate.Estimation_Decision__c) {
                return true;
            }
            // TODO 特別資格があれば 決定可能にする
            return true;
        }
        // TODO 特別資格があれば 決定可能にする
        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;
        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;
        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() {
@@ -441,42 +444,42 @@
    //     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;
        // 見積もり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 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;
        // 印刷できない条件の判断
        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;
        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;
        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() {
@@ -490,25 +493,25 @@
    // }
    // 2021、8、26 合同报价页面的优化,无保有设备点检对象选择框变黑 fxk end
    public Integer productCount {
      get {
        return checkedAssets == null ? 0 : checkedAssets.size();
      }
        get {
            return checkedAssets == null ? 0 : checkedAssets.size();
        }
    }
    public Integer productCount2 {
      get {
        return unCheckedAssets == null ? 0 : unCheckedAssets.size();
      }
        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;
          }
        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 酸化水を使用しないように変更
@@ -535,1280 +538,1283 @@
     * コンストラクタ
     */
    public SelectAssetEstimateVMController() {
      currPage = 1;
      selRecordOption = '20';
      totalRecords = 0;
        currPage = 1;
        selRecordOption = '20';
        totalRecords = 0;
        checkDealerId = '';
    }
    /**
     * Visaulforceから呼ばれるコンストラクタ
     */
    public SelectAssetEstimateVMController(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
        //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
               //跳过点检标记 2021/07/28 gzw start
               , Skip_DJ__c
               //跳过点检标记 2021/07/28 gzw start
               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';
      }
        //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,Dealer__r.FirstParagraphEnd__c,Is_RecognitionModel__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
                         //跳过点检标记 2021/07/28 gzw start
                         , Skip_DJ__c
                         //跳过点检标记 2021/07/28 gzw start
                         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';
        }
    }
    
    public void init() {
      typeresult = null;
      changedAfterPrint = false;
      changedSubmitPrice = false;
      isSaveOrApproval = false;
      OldContractStartDate = null;
      OldMaintenancePrice = null;
        typeresult = null;
        changedAfterPrint = false;
        changedSubmitPrice = false;
        isSaveOrApproval = false;
        OldContractStartDate = null;
        OldMaintenancePrice = null;
    
      inDicideFlag = false;
        inDicideFlag = false;
    
      isSoft = false;
      activeOn = true;
      //LJPH-BSS6E2  ---20200911 ---update by rentongxiao start
      contr = '1';
      val1 = '主机';
      //LJPH-BSS6E2  ---20200911 ---update by rentongxiao end
        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') {
        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));
          }
        }
        //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;
          }
        } else {
          this.newIns = 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
      // 納入機器の情報を取得
      if (!String.isBlank(this.targetHospitalId) && (this.targetHospitalId.length() == 15 || this.targetHospitalId.length() == 18)) {
        //tcm 添加 Management_Code__c  20211201 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.Management_Code__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,
                // 2021-01-29 LJPH-BX9CVX mzy   add  合同报价时判断零件风险
                NoPartRiskDate_F__c, NoPartRiskDate__c, SignableFlag__c,
                Product2.PartSupplyFinishDate__c, Product2.PartSupplyFinishDateExp__c
                // 2021-01-29 LJPH-BX9CVX mzy   add  合同报价时判断零件风险
                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) {
        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
          from Maintenance_Contract_Asset__c
          where Maintenance_Contract__c = :this.targetMaintenanceContractId
        ];
        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
          Decimal listPrice = mca.Asset__r.Maintenance_Price_Month__c;
          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
            listPrice = mca.Asset__r.Maintenance_Price_Month__c * isNewPriceAdj;
          }
          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 {
        for (Maintenance_Contract_Asset_Estimate__c mcae : [SELECT Id,
                                  Name,
                                  Maintenance_Contract_Estimate__c,
                                  Maintenance_Contract_Estimate__r.Contract_Esti_Start_Date__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,
                                  //add 2021-02-07 mzy  start
                                  //Product_Manual__r.NoPartRiskDate_F__c,
                                  //Product_Manual__r.SignableFlag__c,
                                  //add 2021-02-07 mzy  end
                                  //add 2021.6.4 fxk  Start
                                  Check_Object__c,
                                  //add 2021.6.4 fxk  end
                                  IsNew__c,
                                  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;
                mcae.Estimate_List_Price__c = mcae.Asset__r.Maintenance_Price_Month__c * isNewPriceAdj;
              } else {
                mcae.IsNew__c = false;
                mcae.Estimate_List_Price__c = mcae.Asset__r.Maintenance_Price_Month__c;
              }
            } else if (mcae.Product_Manual__c <> null) {
              mcae.IsNew__c = true;
              mcae.Estimate_List_Price__c = mcae.Product_Manual__r.Maintenance_Price_Month__c * isNewPriceAdj;
            }
          }
          if (mcae.Asset__c <> null) {
            //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , mcae.Asset__c + 'IsNew  ' + mcae.IsNew__c));
            selectedAssetIds.put(mcae.Asset__c, selectedMcaes.size());
            selectedMcaes.add(mcae);
          } else {
            newMcaes.add(mcae);
          }
        }
      }
      // 選択済みのものにチェックを付ける
      // TODO xudan 一覧に出る明細件数が足りないケースがある
      // ①AssetA―明細Aで明細登録
      // ②Assetの検索条件変更により、AssetAは永遠に取得できない
      // ③Assetを元にデータをマッピングする時、明細マップからAssetAを取得できない?一覧に明細Aが出ない
      // 次回、Assetの検索条件が大きく変更する時、対応必要
      List<Data> datatemp = new List<Data>();
      datatemp = getChartData();
      for (Asset ast : this.assetRecords) {
        Boolean isNew = false;
        Decimal listPrice = ast.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();
          //System.debug(createdDate + '.addMonths(' + isNewAddMonth + ')' + createdDate.addMonths(isNewAddMonth) + ' < ast.InstallDate:' + ast.InstallDate);
          //                if (createdDate.addMonths(isNewAddMonth) < ast.InstallDate) {
          //                    isNew = true;
          //                    listPrice = ast.Maintenance_Price_Month__c * isNewPriceAdj;
          //                }
          //              // 计算上下线调整比例
          //              没有提交 或者在报价时从新计算
          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;
                } else if (ApexPages.currentPage().getParameters().get('completion') == '5') {
                    ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, System.Label.Message_002));
                }
                //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));
            }
          }
          //
          //
          //
          checkedAssets.add(new AssetInfo(checkedAssets.size(), ast, isNew, listPrice, selectedLocal));
        } else {
          //update by rentongxiao 2020-09-23 start
          if (ast.AssetMark__c == '主机') {
            totalRecords++;
            if (unCheckedAssets.size() < selctRecordNum) {
              unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), ast));
            //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;
                }
            } else {
                this.newIns = true;
            }
          }
          //update by rentongxiao 2020-09-23 end
            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;
    
        }
        listCut(unCheckedAssets);
        /*
           if (ast.CheckBox__c) {
            checkedAssets.add(new AssetInfo(checkedAssets.size(), ast, isNew, listPrice));
           } else {
            unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), ast));
           }
         */
      }
        //HWAG-B399Q8 2018/08/20  检验是否显示'请提交待审批' end
        // 納入機器の情報を取得
        if (!String.isBlank(this.targetHospitalId) && (this.targetHospitalId.length() == 15 || this.targetHospitalId.length() == 18)) {
            //tcm 添加 Management_Code__c  20211201 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.Management_Code__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,
                            // 2021-01-29 LJPH-BX9CVX mzy   add  合同报价时判断零件风险
                            NoPartRiskDate_F__c, NoPartRiskDate__c, SignableFlag__c,
                            Product2.PartSupplyFinishDate__c, Product2.PartSupplyFinishDateExp__c
                            // 2021-01-29 LJPH-BX9CVX mzy   add  合同报价时判断零件风险
                            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>();
    
      totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
        // 選択済みの納入機器情報を取得
        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) {
            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
                from Maintenance_Contract_Asset__c
                where Maintenance_Contract__c = :this.targetMaintenanceContractId
            ];
            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
                Decimal listPrice = mca.Asset__r.Maintenance_Price_Month__c;
                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
                    listPrice = mca.Asset__r.Maintenance_Price_Month__c * isNewPriceAdj;
                }
                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,
    
      system.debug('顺序检测' + checkedAssets);
      for (Maintenance_Contract_Asset_Estimate__c mcae : newMcaes) {
        checkedAssets.add(new AssetInfo(checkedAssets.size(), mcae));
      }
                              Asset_Consumption_rate__c = asset_Consumption_rate,
                              EquipmentGuaranteeFlgTxt__c = mca.Asset__r.EquipmentGuaranteeFlg__c
                              ));
            }
        } else {
            for (Maintenance_Contract_Asset_Estimate__c mcae : [SELECT Id,
                                                                Name,
                                                                Maintenance_Contract_Estimate__c,
                                                                Maintenance_Contract_Estimate__r.Contract_Esti_Start_Date__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,
                                                                //add 2021-02-07 mzy  start
                                                                //Product_Manual__r.NoPartRiskDate_F__c,
                                                                //Product_Manual__r.SignableFlag__c,
                                                                //add 2021-02-07 mzy  end
                                                                //add 2021.6.4 fxk  Start
                                                                Check_Object__c,
                                                                //add 2021.6.4 fxk  end
                                                                IsNew__c,
                                                                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;
                            mcae.Estimate_List_Price__c = mcae.Asset__r.Maintenance_Price_Month__c * isNewPriceAdj;
                        } else {
                            mcae.IsNew__c = false;
                            mcae.Estimate_List_Price__c = mcae.Asset__r.Maintenance_Price_Month__c;
                        }
                    } else if (mcae.Product_Manual__c <> null) {
                        mcae.IsNew__c = true;
                        mcae.Estimate_List_Price__c = mcae.Product_Manual__r.Maintenance_Price_Month__c * isNewPriceAdj;
                    }
                }
                if (mcae.Asset__c <> null) {
                    //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO , mcae.Asset__c + 'IsNew  ' + mcae.IsNew__c));
                    selectedAssetIds.put(mcae.Asset__c, selectedMcaes.size());
                    selectedMcaes.add(mcae);
                } else {
                    newMcaes.add(mcae);
                }
            }
        }
        // 選択済みのものにチェックを付ける
        // TODO xudan 一覧に出る明細件数が足りないケースがある
        // ①AssetA―明細Aで明細登録
        // ②Assetの検索条件変更により、AssetAは永遠に取得できない
        // ③Assetを元にデータをマッピングする時、明細マップからAssetAを取得できない?一覧に明細Aが出ない
        // 次回、Assetの検索条件が大きく変更する時、対応必要
        List<Data> datatemp = new List<Data>();
        datatemp = getChartData();
        for (Asset ast : this.assetRecords) {
            Boolean isNew = false;
            Decimal listPrice = ast.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();
                //System.debug(createdDate + '.addMonths(' + isNewAddMonth + ')' + createdDate.addMonths(isNewAddMonth) + ' < ast.InstallDate:' + ast.InstallDate);
                //                if (createdDate.addMonths(isNewAddMonth) < ast.InstallDate) {
                //                    isNew = true;
                //                    listPrice = ast.Maintenance_Price_Month__c * isNewPriceAdj;
                //                }
                //              // 计算上下线调整比例
                //              没有提交 或者在报价时从新计算
                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));
    
      // 最後10行追加
      if (Schema.getGlobalDescribe().get('Maintenance_Contract_Asset_Estimate__c').getDescribe().isCreateable()) {
        this.addNewRows();
      }
                    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;
    
      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();
                            }
                            //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));
                    }
                }
                //
                //
                //
                checkedAssets.add(new AssetInfo(checkedAssets.size(), ast, isNew, listPrice, selectedLocal));
            } else {
                //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);
            /*
               if (ast.CheckBox__c) {
                    checkedAssets.add(new AssetInfo(checkedAssets.size(), ast, isNew, listPrice));
               } else {
                    unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), ast));
               }
             */
        }
        totalPage = (totalRecords / selctRecordNum) + (Math.mod(totalRecords, selctRecordNum) > 0 ? 1 : 0);
        system.debug('顺序检测' + checkedAssets);
        for (Maintenance_Contract_Asset_Estimate__c mcae : newMcaes) {
            checkedAssets.add(new AssetInfo(checkedAssets.size(), mcae));
        }
        // 最後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);
        }
      }
      if ((currPage * selctRecordNum) <= 2000) {
        String notInId = '(\'';
        if (checkIdList.size() > 0) {
          for (String str : checkIdList) {
            notInId += str + '\', \'';
          }
        }
        notInId += '\')';
      //tcm 添加 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.Maintenance_Contract_No_F__c,CurrentContract_F__r.Management_Code__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,AssetMark__c,NoPartRiskDate__c,NoPartRiskDate_F__c,Product2.PartSupplyFinishDate__c,SignableFlag__c FROM Asset WHERE 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);
        checkIdList = new List<String> ();
        for (AssetInfo ass : this.checkedAssets) {
            if (!ass.isManual) {
                checkIdList.add(ass.rec.Id);
            }
        }
    
        //JZHG-BSDUT4 ---20200904---update By rentongxiao---Start
        // else{
        //     sqlStr += 'AND AssetMark__c = \'主机\'';
        // }
        if ((currPage * selctRecordNum) <= 2000) {
            String notInId = '(\'';
            if (checkIdList.size() > 0) {
                for (String str : checkIdList) {
                    notInId += str + '\', \'';
                }
            }
            notInId += '\')';
            //tcm 添加 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.Maintenance_Contract_No_F__c,CurrentContract_F__r.Management_Code__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,AssetMark__c,NoPartRiskDate__c,NoPartRiskDate_F__c,Product2.PartSupplyFinishDate__c,SignableFlag__c FROM Asset WHERE 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---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;
            //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 {
          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 添加 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.Maintenance_Contract_No_F__c,CurrentContract_F__r.Management_Code__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 += ' CurrentContract_F__r.Contract_Range__c,AssetMark__c,NoPartRiskDate__c,NoPartRiskDate_F__c,Product2.PartSupplyFinishDate__c,SignableFlag__c FROM Asset WHERE 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);
        }
            assetRecords.clear();
            Integer sqlLimit = currPage * selctRecordNum;
            List<Asset> temAsset = new List<Asset> ();
            //HWAG-BDJ43R ---XHL---20190729---
            String sqlStr = '';
            //tcm 添加 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.Maintenance_Contract_No_F__c,CurrentContract_F__r.Management_Code__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 += ' CurrentContract_F__r.Contract_Range__c,AssetMark__c,NoPartRiskDate__c,NoPartRiskDate_F__c,Product2.PartSupplyFinishDate__c,SignableFlag__c FROM Asset WHERE 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---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];
            //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));
                }
            }
        }
        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));
        }
      }
      this.unCheckedAssets = new List<AssetInfo>();
      for (Asset ast : assetRecords) {
        this.unCheckedAssets.add(new AssetInfo(unCheckedAssets.size(), ast));
      }
      listCut(unCheckedAssets);
      // 根据合同开始日重新计算维修合同价格
      //contractStartDateChange();
        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();
        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();
        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
        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
        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();
        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);
        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;
        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);
      }
        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);
        system.debug('去年' + LastYearDate + '前年' + LastSecondYearDate + '大前年' + LastThirdYearDate);
    
      LastYearDate = LastYearDate.addYears(-1);
      // LastYearDate = LastYearDate.addDays(1);
        LastYearDate = LastYearDate.addYears(-1);
        // LastYearDate = LastYearDate.addDays(1);
    
      //LastSecondYearDate = LastSecondYearDate.addDays(1);
      LastSecondYearDate = LastSecondYearDate.addYears(-2);
        //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
      ];
        // 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));
        // 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;
        }
        try {
            system.debug('McaeList:::::' + McaeList);
            update McaeList;
    
        //return '';
      } catch (Exception e) {
        //return 'McaeList Update Failed : '+e;
      }
            //return '';
        } catch (Exception e) {
            //return 'McaeList Update Failed : '+e;
        }
    
    }
    
    
    
    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;
        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);
      }
        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);
        LastYearDate = LastYearDate.addYears(-1);
        // LastYearDate = LastYearDate.addDays(1);
    
      // LastSecondYearDate = LastSecondYearDate.addDays(1);
      LastSecondYearDate = LastSecondYearDate.addYears(-2);
        // 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);
        // 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;
      }
        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;
        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;
        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 = '没有有效的维修合同报价';
      }
        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];
          System.debug('--------:' + ai);
          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 {
            //2021-02-04 mzy select语句查询结果中加了 NoPartRiskDate_F__c
            List<Product2> prd = [select Id, Maintenance_Price_Month__c, EquipmentGuaranteeFlg__c, Name from Product2 where Id = :ai.mcae.Product_Manual__c];
            ai.mcae.Estimate_List_Price__c = prd[0].Maintenance_Price_Month__c * isNewPriceAdj;
            //ai.mcae.Maintenance_Price_YearTXT__c = ai.mcae.Estimate_List_Price__c * 12;
            ai.orgPrice = prd[0].Maintenance_Price_Month__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
            //add by mzy 2021-02-04 LJPH-BX9CVX start
            //ai.NoPartRiskDate = prd[0].NoPartRiskDate_F__c;
            //ai.proName2 = prd[0].Name;
            //ai.SignableFlag = prd[0].SignableFlag__c;
            //add by mzy 2021-02-04 LJPH-BX9CVX end
          }
        System.debug('1535.......................进入refreshProductData方法');
        System.debug('1536.......................进入refreshProductData方法');
        for (Integer i = 0; i < checkedAssets.size(); i++) {
            if (i == productIdx) {
                AssetInfo ai = checkedAssets[i];
                System.debug('--------:' + ai);
                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 {
                    //2021-02-04 mzy select语句查询结果中加了 NoPartRiskDate_F__c
                    List<Product2> prd = [select Id, Maintenance_Price_Month__c, EquipmentGuaranteeFlg__c, Name from Product2 where Id = :ai.mcae.Product_Manual__c];
                    ai.mcae.Estimate_List_Price__c = prd[0].Maintenance_Price_Month__c * isNewPriceAdj;
                    //ai.mcae.Maintenance_Price_YearTXT__c = ai.mcae.Estimate_List_Price__c * 12;
                    ai.orgPrice = prd[0].Maintenance_Price_Month__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
                    //add by mzy 2021-02-04 LJPH-BX9CVX start
                    //ai.NoPartRiskDate = prd[0].NoPartRiskDate_F__c;
                    //ai.proName2 = prd[0].Name;
                    //ai.SignableFlag = prd[0].SignableFlag__c;
                    //add by mzy 2021-02-04 LJPH-BX9CVX 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>();
      List<Data> datatemp = new List<Data>();
      datatemp = getChartData();
      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;
        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();
          //                if (createdDate.addMonths(isNewAddMonth) < ass.rec.InstallDate) {
          //                    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;
          // 计算上下线调整比例
          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;
        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>();
        List<Data> datatemp = new List<Data>();
        datatemp = getChartData();
        for (AssetInfo ass : this.checkedAssets) {
            if (ass.isManual) {
                tmpNewRows.add(ass);
            } else if (ass.rec_checkBox_c) {
                tmpChecked.add(ass);
            } 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;
                ass.mcae = null;
                tmpUnChecked.add(ass);
                totalRecords++;
            }
            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;
                }
              }
            }
          }
          tmpChecked.add(ass);
          totalRecords--;
        } else {
          ass.mcae = null;
          tmpUnChecked.add(ass);
        }
      }
        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;
            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();
                //                if (createdDate.addMonths(isNewAddMonth) < ass.rec.InstallDate) {
                //                    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;
                // 计算上下线调整比例
                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;
                            }
                        }
                    }
                }
    
      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;
    }
    
    // 合同开始日变更,重新计算新品
@@ -1906,122 +1912,122 @@
     * 保存メソッド
     */
    public PageReference save() {
      System.debug('save start');
      //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
        System.debug('save start');
        //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
    
    
      Id vmMaintenance_Contract = Schema.SObjectType.Maintenance_Contract_Estimate__c.getRecordTypeInfosByDeveloperName().get('NewMaintenance_Quote').getRecordTypeId();
      estimate.recordtypeid = vmMaintenance_Contract;
      if (changedSubmitPrice) {
        priceChangeReset();
        Id vmMaintenance_Contract = Schema.SObjectType.Maintenance_Contract_Estimate__c.getRecordTypeInfosByDeveloperName().get('NewMaintenance_Quote').getRecordTypeId();
        estimate.recordtypeid = vmMaintenance_Contract;
        if (changedSubmitPrice) {
            priceChangeReset();
            return null;
        }
        if (syncEstimate(false, false)) {
            ComputeLTYRepair();
            //return null;
            return new PageReference('/' + this.targetEstimateId + '/e?completion=5');
        }
        return null;
      }
      if (syncEstimate(false, false)) {
        ComputeLTYRepair();
        //return null;
        return new PageReference('/' + this.targetEstimateId + '/e?completion=5');
      }
      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();
      //SelectAssetEstimateVMController.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
        System.debug('print start');
        this.printAsset = false;
        this.printContract = false;
        this.printTripartite = false;
        this.printAgent = false;
        this.estimate.PrintDate__c = Date.today();
        //SelectAssetEstimateVMController.ComputeLTYRepair(targetEstimateId);
        if (this.estimate.Quote_Date__c == null) {
            this.estimate.Quote_Date__c = Date.today();
        }
      }
      // 保存ボタンできる場合、印刷ボタンは全部保存
      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
        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
            }
        }
      }
      //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '合同'+this.printContract +'三方'+this.printTripartite+'保有'+this.printAsset+'经销商合同'+this.printAgent));
        // 保存ボタンできる場合、印刷ボタンは全部保存
        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));
    }
    
    /**
@@ -2030,64 +2036,64 @@
    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;
        }
      }
      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;
    }
    
    /**
@@ -2096,51 +2102,51 @@
    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();
      // gzw cputimeout 报错添加 20210729 start
      Oly_TriggerHandler.bypass('AssetHandler');
      StaticParameter.EscapeVMCTrigger = true;
      // gzw cputimeout 报错添加 20210729 end
      if (syncEstimate(false, true)) {
        //提交 报价决定日期
        this.estimate.Quotation_Determines_Time__c = date.today();
        System.debug('decide start');
        inDicideFlag = true;
        // TODO check decide 资格
        Savepoint sp = Database.setSavepoint();
        // gzw cputimeout 报错添加 20210729 start
        Oly_TriggerHandler.bypass('AssetHandler');
        StaticParameter.EscapeVMCTrigger = true;
        // gzw cputimeout 报错添加 20210729 end
        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;
        return null;
    }
    
    public PageReference decideCancle() {
    
      return new PageReference('/' + this.targetEstimateId + '/e?completion=4');
        return new PageReference('/' + this.targetEstimateId + '/e?completion=4');
    
    }
    
@@ -2149,13 +2155,13 @@
     */
    
    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;
        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;
    }
    
    /**
@@ -2163,26 +2169,26 @@
     */
    @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;
        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;
    }
    
    /**
@@ -2191,495 +2197,507 @@
    // TODO xudan チェック追加、clsにも合計金額を計算、clsの合計金額と画面からjsの合計金額を比較
    // 異なる場合、保存完了したらwarningを出す
    public Boolean syncEstimate(boolean isApproval, boolean isDecide) {
      System.debug('syncEstimate start');
      Boolean hasDatabaseError = false;
      Savepoint sp = Database.setSavepoint();
        System.debug('syncEstimate start');
        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 {
        if (!checkValidate()) {
          return false;
        }
        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
        // 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);
        }
        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.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.LastMContract5__c = lastMContractRes[4].contractId;
        this.estimate.LastMContract5_NO__c = lastMContractRes[4].contractNo;
        this.estimate.LastMContract5_ConCount__c = lastMContractRes[4].count;
        // 原方法
        // List<lastMContract> lastMContractRes = getlastMContract(this.checkedAssets, this.estimate.Contract_Start_Date__c);
        // // 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.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.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;
        // 2021-09-10 tcm 排序逻辑调整 start
        // 追加上期合同信息 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
        // 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;
            }
          }
          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));
        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');
          }
          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;
                }
              }
            }
            // 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);
        }
        // ① 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,
                                      //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk start
                                      Check_Object__c,
                                      //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk end
                                      IsNew__c, EquipmentGuaranteeFlgTxt__c,
                                      // 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,
              Estimate_IsNew__c = target.IsNew__c,
              //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk start
              Check_Object__c = target.Check_Object__c,
              //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk end
              //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-04-22 给合同1赋值的同时,给去年合同赋值 start
        this.contract.Last_year_service_contract__c = this.estimate.LastMContract1__c;
        //add by renrx 2021-04-22 给合同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 (!checkValidate()) {
                return false;
            }
            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
            // 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);
            }
            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.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.LastMContract5__c = lastMContractRes[4].contractId;
            this.estimate.LastMContract5_NO__c = lastMContractRes[4].contractNo;
            this.estimate.LastMContract5_ConCount__c = lastMContractRes[4].count;
            // 原方法
            // List<lastMContract> lastMContractRes = getlastMContract(this.checkedAssets, this.estimate.Contract_Start_Date__c);
            // // 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.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.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;
            // 2021-09-10 tcm 排序逻辑调整 start
            // 追加上期合同信息 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
            // 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;
                    }
                }
                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));
            t = t.addDays(-1);
            this.estimate.Contract_End_Date__c = t;
            //以提交报价的时点,锁定经销商的先款状态,decide时不再更新经销商的性质 thh 20220407 start
            //add      wangweipeng                   2021/12/26                     start
            // if(String.isNotBlank(this.estimate.Dealer__c)){
            //     checkDealerId = this.estimate.Dealer__c;
            //     onChDealerUpdate();
            // }else{
            //     this.estimate.Is_RecognitionModel__c = false;
            // }
            //add      wangweipeng                   2021/12/26                     end
            //以提交报价的时点,锁定经销商的先款状态,decide时不再更新经销商的性质 thh 20220407 end
            System.debug('---------345----'+this.estimate.Dealer__c+'-------'+this.estimate.Dealer__r.FirstParagraphEnd__c);
            // 位置调整 在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');
                }
                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;
                            }
                        }
                    }
                    // 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);
            }
            // ① 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,
                                                                      //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk start
                                                                      Check_Object__c,
                                                                      //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk end
                                                                      IsNew__c, EquipmentGuaranteeFlgTxt__c,
                                                                      // 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,
                        Estimate_IsNew__c = target.IsNew__c,
                        //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk start
                        Check_Object__c = target.Check_Object__c,
                        //add 点检改善:合同保有设备下的点检对象与报价保有设备下的点检对象同步 2021.6.9 fxk end
                        //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.old_Is_RecognitionModel__c = this.estimate.Is_RecognitionModel__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-04-22 给合同1赋值的同时,给去年合同赋值 start
            this.contract.Last_year_service_contract__c = this.estimate.LastMContract1__c;
            //add by renrx 2021-04-22 给合同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) {
                SelectAssetEstimateVMController.ComputeLTYRepair(targetEstimateId);
            }
            return true;
        } catch (DMLException ex) {
            // TODO Insert失敗のIDを消す必要?
            Database.rollback(sp);
            ApexPages.addMessages(ex);
        } catch (Exception ex) {
            Database.rollback(sp);
            ApexPages.addMessages(ex);
        }
        if (hasDatabaseError) {
          System.debug('syncEstimate hasDatabaseError');
          return false;
        }
        if (isApproval) {
          SelectAssetEstimateVMController.ComputeLTYRepair(targetEstimateId);
        }
        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;
        return false;
    }
    
    /**
@@ -2687,307 +2705,335 @@
     */
    @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;
        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()));
      }
      // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '保有设备' + checkedAssets.size()));
      return null;
        for (Integer i = 0; i < 10; i++) {
            checkedAssets.add(new AssetInfo(checkedAssets.size()));
        }
        // ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '保有设备' + 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);
        //add by rentx 2020-11-13 LJPH-BV93RZ start
        if (estimate.Contract_Range__c == null) {
            this.estimate.Contract_Range__c.addError('必须输入合同月数!');
            return null;
        }
        return ret;
      }
      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;
        }
        return null;
    }
    
    /**
     * キャンセルメソッド
     */
    public PageReference cancel() {
      PageReference ret = null;
      if (this.targetMaintenanceContractId != null) {
        ret = new PageReference('/' + this.targetMaintenanceContractId);
      }
      return ret;
        PageReference ret = null;
        if (this.targetMaintenanceContractId != null) {
            ret = new PageReference('/' + this.targetMaintenanceContractId);
        }
        return ret;
    }
    //add     wangweipeng                     2021/12/26                 start
    //获取当前选中的经销商是否为先款标识
    public PageReference onChDealerUpdate(){
        //checkDealerId  此变量可能会存 经销商id或经销商中文名
        if(String.isNotBlank(checkDealerId)){
            try {
                List<Account> accListC = [select id,name,FirstParagraphEnd__c from Account where id = :checkDealerId OR name = :checkDealerId];
                if(accListC != null && accListC.size() == 1){
                    if(accListC[0].FirstParagraphEnd__c){
                        this.estimate.Is_RecognitionModel__c = true;
                    }else{
                        this.estimate.Is_RecognitionModel__c = false;
                    }
                }else{
                    this.estimate.Is_RecognitionModel__c = false;
                }
            } catch (Exception e) {
                //return 'McaeList Update Failed : '+e;
            }
        }else{
            this.estimate.Is_RecognitionModel__c = false;
        }
        System.debug('----------------23--'+this.estimate.Is_RecognitionModel__c);
        return null;
    }
    //add     wangweipeng                     2021/12/26                 end
    
    // 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)) {
        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)){
        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;
      }
      // 2021-02-26  mzy  LJPH-BX9CVX  add 获取合同结束日和合同月数 start
      //合同月数
      Decimal ContractRange = this.estimate.Contract_Range__c;
      //合同预定结束日期
      Date t = this.estimate.Contract_Esti_Start_Date__c.addMonths(Integer.valueOf(this.estimate.Contract_Range__c));
      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 {
        Boolean rtn = true;
        Date today = Date.today();
        if (getPageDisabled()) {
            today = estimate.Submit_quotation_day__c;
        }
        // 2021-02-26  mzy  LJPH-BX9CVX  add 获取合同结束日和合同月数 start
        //合同月数
        Decimal ContractRange = this.estimate.Contract_Range__c;
        //合同预定结束日期
        Date t = this.estimate.Contract_Esti_Start_Date__c.addMonths(Integer.valueOf(this.estimate.Contract_Range__c));
        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;
        // 合同开始日を结束日
        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_Esti_End_Date__c  = t;
      // 合同开始日を结束日
      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;
      Date ContractEndDate = this.estimate.Contract_End_Date__c;
      System.debug('合同结束日期 :' + ContractEndDate);
      // 2021-02-26  mzy  LJPH-BX9CVX  add 获取合同结束日和合同月数 end
      // 部品供給停止の製品はエラー
      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.rec != null) {
              input.rec.Name.addError(input.rec.Name + ' (机身编码为:' + input.rec.SerialNumber + ') 无合同金额,不建议参保');
        this.estimate.Contract_End_Date__c = t;
        Date ContractEndDate = this.estimate.Contract_End_Date__c;
        System.debug('合同结束日期 :' + ContractEndDate);
        // 2021-02-26  mzy  LJPH-BX9CVX  add 获取合同结束日和合同月数 end
        // 部品供給停止の製品はエラー
        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.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 + ')');
                    } 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;
                }
            }
            //update by rentx 2020-11-12 LJPH-BV93RZ end
            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,-- 建议先与服务商品部咨询后再提交报价。');
                    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;
                    }
                    //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '---' + monthCon  + ' +++ ' + Math.floor(input.rec.CurrentContract_F__r.Contract_Range__c/2)));
                    //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) && estimate.Skip_DJ__c == false ) {
                    //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;
            }
            // 2021-03-01 LJPH-BX9CVX mzy  update  如果合同结束日>无零件风险日期  start
            if (input != null) {
                //校验无零件风险
                if ( input.rec != null && input.rec.NoPartRiskDate_F__c != null ) {
                    // 传入参数 : 无零件风险日期 , 可签约标识 , 合同结束日期 , 合同月数
                    String msg = checkAssetInfo(input.rec.NoPartRiskDate_F__c, input.rec.SignableFlag__c, ContractEndDate, ContractRange);
                    // 有错误信息则显示错误信息
                    if (msg != '') {
                        input.rec.Name.addError('[' + input.rec.Name + '] (机身编码为:' + input.rec.SerialNumber + ') ' + msg);
                        rtn = false;
                    }
                }
                /*else if(input.mcae!=null&&input.mcae.Product_Manual__c !=null&&input.NoPartRiskDate!=null ){
                        // 传入参数 : 无零件风险日期 , 可签约标识 , 合同结束日期 , 合同月数
                        String msg = checkAssetInfo(input.NoPartRiskDate,input.SignableFlag,ContractEstiEndDate,ContractRange);
                        // 有错误信息则显示错误信息
                        if(msg != ''){
                           input.mcae.Product_Manual__c.addError('['+input.proName2+'] '+msg);
                           rtn = false;
                        }
                   }*/
            }
            // 2021-03-01 LJPH-BX9CVX mzy  update  如果合同结束日>无零件风险日期  end
        }
        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
          //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;
            }
            //ApexPages.addMessage(new ApexPages.message(ApexPages.severity.INFO, '---' + monthCon  + ' +++ ' + Math.floor(input.rec.CurrentContract_F__r.Contract_Range__c/2)));
            //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) && estimate.Skip_DJ__c == false ) {
            //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;
        }
        // 2021-03-01 LJPH-BX9CVX mzy  update  如果合同结束日>无零件风险日期  start
        if (input != null) {
          //校验无零件风险
          if ( input.rec != null && input.rec.NoPartRiskDate_F__c != null ) {
            // 传入参数 : 无零件风险日期 , 可签约标识 , 合同结束日期 , 合同月数
            String msg = checkAssetInfo(input.rec.NoPartRiskDate_F__c, input.rec.SignableFlag__c, ContractEndDate, ContractRange);
            // 有错误信息则显示错误信息
            if (msg != '') {
              input.rec.Name.addError('[' + input.rec.Name + '] (机身编码为:' + input.rec.SerialNumber + ') ' + msg);
              rtn = false;
            }
          }
          /*else if(input.mcae!=null&&input.mcae.Product_Manual__c !=null&&input.NoPartRiskDate!=null ){
              // 传入参数 : 无零件风险日期 , 可签约标识 , 合同结束日期 , 合同月数
              String msg = checkAssetInfo(input.NoPartRiskDate,input.SignableFlag,ContractEstiEndDate,ContractRange);
              // 有错误信息则显示错误信息
              if(msg != ''){
                 input.mcae.Product_Manual__c.addError('['+input.proName2+'] '+msg);
                 rtn = false;
              }
             }*/
        }
        // 2021-03-01 LJPH-BX9CVX mzy  update  如果合同结束日>无零件风险日期  end
      }
      return rtn;
        return rtn;
    }
    // 2021-03-01 LJPH-BX9CVX mzy  update  如果合同结束日>无零件风险日期  start
    //校验无零件风险日期
    public static String checkAssetInfo(Date NoPartRiskDate, Boolean SignableFlag, Date ContractEndDate, Decimal ContractRange) {
      String rtnStr = '';
      //1.判断
      //合同结束日期 > 无零件风险日期
      if (ContractEndDate > NoPartRiskDate) {
        //可签约标识 未勾选
        if (SignableFlag == false) {
          //到合同结束日期时,存在零件停止供应风险,建议不参保,或调整合同日期。
          rtnStr = '到合同结束日期时,存在零件停止供应风险,建议不参保,或调整合同日期。';
        } else {
          //勾选
          //可以签1年合同
          if (ContractRange > 12) {
            rtnStr = '到合同结束日期时,存在零件停止供应风险,建议签一年期合同。';
          }
        String rtnStr = '';
        //1.判断
        //合同结束日期 > 无零件风险日期
        if (ContractEndDate > NoPartRiskDate) {
            //可签约标识 未勾选
            if (SignableFlag == false) {
                //到合同结束日期时,存在零件停止供应风险,建议不参保,或调整合同日期。
                rtnStr = '到合同结束日期时,存在零件停止供应风险,建议不参保,或调整合同日期。';
            } else {
                //勾选
                //可以签1年合同
                if (ContractRange > 12) {
                    rtnStr = '到合同结束日期时,存在零件停止供应风险,建议签一年期合同。';
                }
            }
        }
      }
    
      return rtnStr;
        return rtnStr;
    }
    // 2021-03-01 LJPH-BX9CVX mzy  update  如果合同结束日>无零件风险日期  end
    // 价格变更后克隆报价前重新计算价格
    @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);
        // 取得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);
            }
        }
        if (input.isManual && !String.isBlank(input.mcae.Product_Manual__c)) {
          pdIds.add(input.mcae.Product_Manual__c);
        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]);
        }
      }
      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;
          }
        if (pdIds.size() > 0) {
            pdMap = new Map<Id, Product2>([select id, Maintenance_Price_Month__c, EquipmentGuaranteeFlg__c from Product2 where Id In: pdIds]);
        }
      }
      //contractStartDateChange();
        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();
    }
    
    
@@ -3017,269 +3063,269 @@
    //add by mzy 2020-11-12 LJPH-BX9CVX start
    
    public Id getRecId() {
      Id rtn = null;
      if (rec != null) {
        rtn = rec.Id;
      }
      return rtn;
        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;
      // add by fxk 2021/9/9 控制点检对象是否可选 Star
      this.CheckRows = true;
      // add by fxk 2021/9/9 控制点检对象是否可选 End
        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;
        // add by fxk 2021/9/9 控制点检对象是否可选 Star
        this.CheckRows = true;
        // add by fxk 2021/9/9 控制点检对象是否可选 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(
        //                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
        // 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
      //add by mzy 2021-02-07 start
      //this.NoPartRiskDate = mcae.Product_Manual__r.NoPartRiskDate_F__c;
      //this.proName2 = mcae.Product_Manual__r.Name;
      //this.SignableFlag = mcae.Product_Manual__r.SignableFlag__c;
      //add by mzy 2021-02-07 end
        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
            // 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
        //add by mzy 2021-02-07 start
        //this.NoPartRiskDate = mcae.Product_Manual__r.NoPartRiskDate_F__c;
        //this.proName2 = mcae.Product_Manual__r.Name;
        //this.SignableFlag = mcae.Product_Manual__r.SignableFlag__c;
        //add by mzy 2021-02-07 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(
        //                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,
        Contract_Esti_Start_Date__c = mcae.Maintenance_Contract_Estimate__r.Contract_Esti_Start_Date__c
                        // Contract_Esti_Start_Date__c=mcae.Contract_Esti_Start_Date__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.etGFlg = mcae.Product_Manual__r.EquipmentGuaranteeFlg__c;
      //add by mzy 2021-02-07 start
      //this.NoPartRiskDate = mcae.Product_Manual__r.NoPartRiskDate_F__c;
      //this.proName2 = mcae.Product_Manual__r.Name;
      //this.SignableFlag = mcae.Product_Manual__r.SignableFlag__c;
      //add by mzy 2021-02-07 end
        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,
            Contract_Esti_Start_Date__c = mcae.Maintenance_Contract_Estimate__r.Contract_Esti_Start_Date__c
                                          // Contract_Esti_Start_Date__c=mcae.Contract_Esti_Start_Date__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.etGFlg = mcae.Product_Manual__r.EquipmentGuaranteeFlg__c;
        //add by mzy 2021-02-07 start
        //this.NoPartRiskDate = mcae.Product_Manual__r.NoPartRiskDate_F__c;
        //this.proName2 = mcae.Product_Manual__r.Name;
        //this.SignableFlag = mcae.Product_Manual__r.SignableFlag__c;
        //add by mzy 2021-02-07 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.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;
    }
    }
    
    WebService static String pageDecide(String strId) {
      String rs = '';
      SelectAssetEstimateVMController saec = new SelectAssetEstimateVMController();
      saec.targetEstimateId = strId;
      saec.isPageAction = true;
      saec.init();
      if (saec.getDecideBtnDisabled()) {
        rs = '已经是Decide过的合同 或 不是批准的报价,不能Decide';
        String rs = '';
        SelectAssetEstimateVMController saec = new SelectAssetEstimateVMController();
        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;
      }
      if (saec.syncEstimate(false, true)) {
        rs = '0';
      } else {
        rs = 'Decide失败';
      }
      return rs;
    }
    
    WebService static String pageUndecide(String strId) {
      String rs = '';
      SelectAssetEstimateVMController saec = new SelectAssetEstimateVMController();
      saec.targetEstimateId = strId;
      saec.isPageAction = true;
      saec.init();
      if (saec.getUnDecideBtnDisabled()) {
        rs = '不是Decide过的报价,不能Undecide';
        String rs = '';
        SelectAssetEstimateVMController saec = new SelectAssetEstimateVMController();
        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;
      }
      if (saec.undecide() != null) {
        rs = '0';
      } else {
        rs = 'Undecide失败';
      }
      return rs;
    }
    
    
    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);
        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);
    
        // 2021-09-10 tcm 排序逻辑调整 start
        // 计算空白期
        if (startDate != null && lM.endDate != null) {
          if (startDate.daysbetween(lM.endDate) > -366 && startDate.daysbetween(lM.endDate) < 366) {
            lm.ayearcontract = true;
          } else {
            lm.ayearcontract = false;
          }
        } 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') {
          // 2021-09-10 tcm 排序逻辑调整 start
          if (lm.ayearcontract) {
            // 2021-09-10 tcm 排序逻辑调整 start
            // 计算空白期
            if (startDate != null && lM.endDate != null) {
                if (startDate.daysbetween(lM.endDate) > -366 && startDate.daysbetween(lM.endDate) < 366) {
                    lm.ayearcontract = true;
                } else {
                    lm.ayearcontract = false;
                }
            } else {
                lm.ayearcontract = false;
            }
            // 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);
            // 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
                    //判断 如果上一期维修合同为 多年保修合同 的话 则不放入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);
                    }
                    // 非空白期
                } 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);
                    }
                }
            }
            // 非空白期
          } 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++) {
        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
        if (listResulttemp.size() >= i + 1) {
          listResult.add(listResulttemp[i]);
        // 空白期
        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));
    
      // 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));
        // 空白期
        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]);
            }
        }
      }
      // 合并
      listResult.addAll(listResult1);
      // 2021-09-10 tcm 排序逻辑调整 end
      //List<lastMContract> listResult = new List<lastMContract>();
      return listResult;
        // 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() {
      List<Data> data = new List<Data>();
      List<Achievement_linkage__c> achlist = [select id, Consumption_rate_Lower__c, Consumption_rate_Upper__c,
                          PriceCount_Lower__c, PriceCount_Upper__c from Achievement_linkage__c];
      for (Achievement_linkage__c al : achlist ) {
        data.add(new Data(al.Consumption_rate_Lower__c, al.Consumption_rate_Upper__c, al.PriceCount_Lower__c, al.PriceCount_Upper__c));
      }
      return data;
        List<Data> data = new List<Data>();
        List<Achievement_linkage__c> achlist = [select id, Consumption_rate_Lower__c, Consumption_rate_Upper__c,
                                                PriceCount_Lower__c, PriceCount_Upper__c from Achievement_linkage__c];
        for (Achievement_linkage__c al : achlist ) {
            data.add(new Data(al.Consumption_rate_Lower__c, al.Consumption_rate_Upper__c, al.PriceCount_Lower__c, al.PriceCount_Upper__c));
        }
        return data;
    }
    
    // 价格体系 class
@@ -3289,10 +3335,10 @@
    public Decimal price_Upper { get; set; }
    public Decimal price_Lower { get; set; }
    public Data(Decimal rate_Lower, Decimal rate_Upper, Decimal price_Lower, Decimal price_Upper) {
      this.rate_Upper = rate_Upper;
      this.rate_Lower = rate_Lower;
      this.price_Upper = price_Upper;
      this.price_Lower = price_Lower;
        this.rate_Upper = rate_Upper;
        this.rate_Lower = rate_Lower;
        this.price_Upper = price_Upper;
        this.price_Lower = price_Lower;
    }
    }
    
@@ -3306,46 +3352,46 @@
    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;
        this.endDate = endDate;
        this.count = count;
        this.contractId = contractId;
        this.contractNo = contractNo;
    }
    
    // 排序
    public Integer compareTo(Object compareTo) {
      lastMContract compareToesd = (lastMContract)compareTo;
      Integer returnValue = 0;
        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;
        // 2021-09-10 tcm 排序逻辑调整 start
        // 判断在数量
        if (count  > compareToesd.count) {
            returnValue = -1;
        } else if (count  < compareToesd.count) {
            returnValue = 1;
        } else {
          returnValue = -1;
            if (endDate  > compareToesd.endDate ) {
                returnValue = 1;
            } else {
                returnValue = -1;
            }
        }
      }
      return returnValue;
        return returnValue;
    }
    
    // 原方案
    // if (endDate  > compareToesd.endDate ) {
    //   returnValue = -1;
    //  returnValue = -1;
    // } else if (endDate  < compareToesd.endDate ) {
    //   returnValue = 1;
    //  returnValue = 1;
    // }else{
    // if (count  > compareToesd.count ) {
    //   returnValue = -1;
    //  returnValue = -1;
    // } else if (count  < compareToesd.count ) {
    //   returnValue = 1;
    //   }
    //  returnValue = 1;
    //  }
    // }
    // return returnValue;
    // 2021-09-10 tcm 排序逻辑调整 end
    }
    }
}