buli
2023-07-07 90fac0710272079084730d97f6467ce87cd82448
force-app/main/default/classes/DealerInquiryModifyStateController.cls
@@ -1,644 +1,717 @@
public with sharing class DealerInquiryModifyStateController {
    public List<OpportunityInfo> oppRecords { get; set; }
    // ページレイアウトの情報を取得
    private Map<String, Map<String, String>> editLayoutItemRWMap = New Map<String, Map<String, String>>();
    // private Map<String, Map<String, String>> editLayoutItemRWMapRt = null;
    public List<OpportunityInfo> OPPORTList { get; set; }
    /*****************検索用******************/
  public List<OpportunityInfo> oppRecords { get; set; }
  // ページレイアウトの情報を取得
  private Map<String, Map<String, String>> editLayoutItemRWMap = new Map<String, Map<String, String>>();
  // private Map<String, Map<String, String>> editLayoutItemRWMapRt = null;
  public List<OpportunityInfo> OPPORTList { get; set; }
  /*****************検索用******************/
    /*******************检索属性值*******************/
  /*******************检索属性值*******************/
    public String accSearch { get; set; }//经销商医院
    public String aooSearch { get; set; }//担当人
    public String numtext1 { get; set; } //数据字段01
    public String numtext { get; set; }//数据字段03
    public String numtext2 { get; set; } //数据字段02
    public String timetext1 { get; set; } //日期01
    public String timetext2 { get; set; } //日期02
    public Agency_Opportunity__c tmpAO { get; set; } //检索日期用
    public Agency_Opportunity__c tmpBO { get; set; } //检索日期用
    public String limits { get; set; }//日期03
  public String accSearch { get; set; } //经销商医院
  public String aooSearch { get; set; } //担当人
  public String numtext1 { get; set; } //数据字段01
  public String numtext { get; set; } //数据字段03
  public String numtext2 { get; set; } //数据字段02
  public String timetext1 { get; set; } //日期01
  public String timetext2 { get; set; } //日期02
  public Agency_Opportunity__c tmpAO { get; set; } //检索日期用
  public Agency_Opportunity__c tmpBO { get; set; } //检索日期用
  public String limits { get; set; } //日期03
    public List<SelectOption> dateOpts { get; private set; }
    public List<SelectOption> textOpts { get; private set; }
    public List<SelectOption> timeOpts { get; private set; }
    public List<SelectOption> equalOpts { get; private set; }
    public List<SelectOption> timeequalOpts { get; private set; }
    public List<SelectOption> limitOpts { get; private set; }
  public List<SelectOption> dateOpts { get; private set; }
  public List<SelectOption> textOpts { get; private set; }
  public List<SelectOption> timeOpts { get; private set; }
  public List<SelectOption> equalOpts { get; private set; }
  public List<SelectOption> timeequalOpts { get; private set; }
  public List<SelectOption> limitOpts { get; private set; }
    /*****************画面表示Bean******************/
    public Integer oppCount { get; set; }
    public String saveType { get; set; }
  /*****************画面表示Bean******************/
  public Integer oppCount { get; set; }
  public String saveType { get; set; }
    public String sortKey { get; set; }
    public String preSortKey { get; set; }
    public Boolean sortOrderAsc { get; set; }
    public String[] sortOrder { get; set; }
    public String[] columus = new String[] {'Id'};
    public String[] selColumus = null;
    public Set<String> columusSet = new Set<String> {'Id'};
  public String sortKey { get; set; }
  public String preSortKey { get; set; }
  public Boolean sortOrderAsc { get; set; }
  public String[] sortOrder { get; set; }
  public String[] columus = new List<String>{ 'Id' };
  public String[] selColumus = null;
  public Set<String> columusSet = new Set<String>{ 'Id' };
    // 项目set 字段标签
    public List<String> titleLeft { get; private set; }
    public List<String> titleRight { get; private set; }
    // 项目set 字段名
    public List<List<String>> columnsLeftApi { get; private set; }         // 参照項目用
    public List<List<String>> columnsRightApi { get; private set; }        // 参照項目用
    public List<String> columnLeftCss { get; private set; }               // css 用
    public List<String> columnRightCss { get; private set; }              // css 用
    public Map<String, String> columnLeftRW { get; private set; }              // r,w,wm用
    public Map<String, String> columnRightRW { get; private set; }             // r,w,wm用
    private String strColumus;
    private String strRtColumus;
  // 项目set 字段标签
  public List<String> titleLeft { get; private set; }
  public List<String> titleRight { get; private set; }
  // 项目set 字段名
  public List<List<String>> columnsLeftApi { get; private set; } // 参照項目用
  public List<List<String>> columnsRightApi { get; private set; } // 参照項目用
  public List<String> columnLeftCss { get; private set; } // css 用
  public List<String> columnRightCss { get; private set; } // css 用
  public Map<String, String> columnLeftRW { get; private set; } // r,w,wm用
  public Map<String, String> columnRightRW { get; private set; } // r,w,wm用
  private String strColumus;
  private String strRtColumus;
    //add by Link 2023-6-2
    public String remindMsg{get;set;}
  @TestVisible
  private String accTypeForSort = null;
  private static Integer oppLimit = 500;
    @TestVisible private String accTypeForSort = null;
    private static Integer oppLimit = 500;
  public DealerInquiryModifyStateController() {
    oppRecords = new List<OpportunityInfo>();
    public DealerInquiryModifyStateController() {
        oppRecords = new List<OpportunityInfo>();
    //dateOpts = new List<SelectOption>();
    //dateOpts.add(new SelectOption('', '--无--'));
    //dateOpts.add(new SelectOption('Registration_Day__c', '登录日'));
    //dateOpts.add(new SelectOption('Ban_On_Use_Date__c', '禁用日期'));
        //dateOpts = new List<SelectOption>();
        //dateOpts.add(new SelectOption('', '--无--'));
        //dateOpts.add(new SelectOption('Registration_Day__c', '登录日'));
        //dateOpts.add(new SelectOption('Ban_On_Use_Date__c', '禁用日期'));
    //数据字段下拉列表
    textOpts = new List<SelectOption>();
    textOpts.add(new SelectOption('', '--无--'));
    textOpts.add(
      new SelectOption('Agency_Opportunity_No__c', '经销商询价编码')
    );
    textOpts.add(new SelectOption('Agency__r.Name', '经销商'));
    textOpts.add(new SelectOption('Agency_Hospital__r.Name', '经销商医院'));
    textOpts.add(new SelectOption('Department_Cateogy__c', '科室分类'));
    textOpts.add(new SelectOption('Change_To_Opportunity_T__c', '询价名称'));
    // textOpts.add(new SelectOption('Name', '询价名称'));
        //数据字段下拉列表
        textOpts = new List<SelectOption>();
        textOpts.add(new SelectOption('', '--无--'));
        textOpts.add(new SelectOption('Agency_Opportunity_No__c', '经销商询价编码'));
        textOpts.add(new SelectOption('Agency__r.Name', '经销商'));
        textOpts.add(new SelectOption('Agency_Hospital__r.Name', '经销商医院'));
        textOpts.add(new SelectOption('Department_Cateogy__c', '科室分类'));
        textOpts.add(new SelectOption('Change_To_Opportunity_T__c', '询价名称'));
        // textOpts.add(new SelectOption('Name', '询价名称'));
    textOpts.add(new SelectOption('StageName__c', '询价阶段'));
    textOpts.add(new SelectOption('Oly_Inquiry_Status1__c', '状态1'));
    //精琢科技   zxk    2021-08-25   start
    // textOpts.add(new SelectOption('Oly_Inquiry_Status2__c', '状态2'));
    textOpts.add(new SelectOption('Oly_Inquiry_Stage__c', 'Oly询价阶段'));
    //精琢科技   zxk    2021-08-25   end
    textOpts.add(new SelectOption('Hospital_City_Master__c', '市'));
        textOpts.add(new SelectOption('StageName__c', '询价阶段'));
        textOpts.add(new SelectOption('Oly_Inquiry_Status1__c', '状态1'));
        //精琢科技   zxk    2021-08-25   start
        // textOpts.add(new SelectOption('Oly_Inquiry_Status2__c', '状态2'));
        textOpts.add(new SelectOption('Oly_Inquiry_Stage__c', 'Oly询价阶段'));
    // textOpts.add(new SelectOption('Agency_Hospital__r.Hospital__r.Salesdepartment_HP__c', '销售本部'));
    // textOpts.add(new SelectOption('Agency_Hospital__r.Hospital__r.State_Master__r.Name', '省'));
    // textOpts.add(new SelectOption('Agency_Hospital__r.Hospital__r.City_Master__r.Name', '市'));
    //日期字段下拉列表
    timeOpts = new List<SelectOption>();
    timeOpts.add(new SelectOption('', '--无--'));
    timeOpts.add(new SelectOption('Created_Day__c', '创建日'));
    timeOpts.add(new SelectOption('Bid_Planned_Date__c', '预测招标日'));
    timeOpts.add(new SelectOption('Forecasted_Bid_Date__c', '预测中标日'));
    timeOpts.add(
      new SelectOption('Close_Forecasted_Date__c', '预测与OLY签约日')
    );
    timeOpts.add(new SelectOption('Lost_Opportunity_Date__c', '失单日期'));
    timeOpts.add(new SelectOption('Deleted_Reason_Date__c', '取消日期'));
    //数据字段中间连接符号
    equalOpts = new List<SelectOption>();
    equalOpts.add(new SelectOption('=', '等于'));
    equalOpts.add(new SelectOption('<>', '不等于'));
    equalOpts.add(new SelectOption('<', '<'));
    equalOpts.add(new SelectOption('>', '>'));
    equalOpts.add(new SelectOption('<=', '<='));
    equalOpts.add(new SelectOption('>=', '>='));
    equalOpts.add(new SelectOption('contains', '包含'));
    equalOpts.add(new SelectOption('notcontains', '不包含'));
    equalOpts.add(new SelectOption('starts with', '起始字符'));
    //日期字段连接符号
    //timeequalOpts = new List<SelectOption>();
    //timeequalOpts.add(new SelectOption('=', '等于'));
    //timeequalOpts.add(new SelectOption('<>', '不等于'));
    //timeequalOpts.add(new SelectOption('<', '<'));
    //timeequalOpts.add(new SelectOption('>', '>'));
    //timeequalOpts.add(new SelectOption('<=', '<='));
    //timeequalOpts.add(new SelectOption('>=', '>='));
    //数据显示条数
    limitOpts = new List<SelectOption>();
    limitOpts.add(new SelectOption('10', '10'));
    limitOpts.add(new SelectOption('20', '20'));
    limitOpts.add(new SelectOption('50', '50'));
    limitOpts.add(new SelectOption('100', '100'));
    limitOpts.add(new SelectOption('200', '200'));
    limitOpts.add(new SelectOption('1000', '全部'));
    //数据显示默认条数
    limits = '20';
  }
  public PageReference init() {
    PartnerSoapSforceCom.Soap soap = new PartnerSoapSforceCom.Soap();
    soap.SessionHeader = new PartnerSoapSforceCom.SessionHeader_element();
    soap.SessionHeader.sessionId = UserInfo.getSessionId();
    soap.endpoint_x =
      URL.getSalesforceBaseUrl().toExternalForm() +
      '/partner/services/Soap/u/33.0';
    // soap.endpoint_x = URL.getSalesforceBaseUrl().toExternalForm() + '/services/Soap/u/33.0';
    PartnerSoapSforceCom.DescribeLayoutResult dlr = new PartnerSoapSforceCom.DescribeLayoutResult();
    if (System.Test.isRunningTest()) {
      // UnitTest 用
      // PartnerSoapSforceCom.DescribeLayoutResult dlr = new PartnerSoapSforceCom.DescribeLayoutResult();
      PartnerSoapSforceCom.RecordTypeMapping rtMap = new PartnerSoapSforceCom.RecordTypeMapping();
      PartnerSoapSforceCom.DescribeLayout editLayout = new PartnerSoapSforceCom.DescribeLayout();
      PartnerSoapSforceCom.DescribeLayoutSection editLayoutSection = new PartnerSoapSforceCom.DescribeLayoutSection();
      PartnerSoapSforceCom.DescribeLayoutRow layoutRow = new PartnerSoapSforceCom.DescribeLayoutRow();
      PartnerSoapSforceCom.DescribeLayoutItem layoutItem = new PartnerSoapSforceCom.DescribeLayoutItem();
      PartnerSoapSforceCom.DescribeLayoutComponent layoutComponent = new PartnerSoapSforceCom.DescribeLayoutComponent();
      dlr.recordTypeMappings = new List<PartnerSoapSforceCom.RecordTypeMapping>();
      dlr.recordTypeMappings.add(rtMap);
      rtMap.recordTypeId = 'recordTypeId';
      dlr.layouts = new List<PartnerSoapSforceCom.DescribeLayout>();
      dlr.layouts.add(editLayout);
      editLayout.editLayoutSections = new List<PartnerSoapSforceCom.DescribeLayoutSection>();
      editLayout.editLayoutSections.add(editLayoutSection);
      editLayoutSection.layoutRows = new List<PartnerSoapSforceCom.DescribeLayoutRow>();
      editLayoutSection.layoutRows.add(layoutRow);
      layoutRow.layoutItems = new List<PartnerSoapSforceCom.DescribeLayoutItem>();
      layoutRow.layoutItems.add(layoutItem);
      layoutItem.layoutComponents = new List<PartnerSoapSforceCom.DescribeLayoutComponent>();
      layoutItem.layoutComponents.add(layoutComponent);
      // return dlr;
    } else {
      dlr = soap.describeLayout('Agency_Opportunity__c', null, null);
      // dlr  = soap.describeLayout('asdas', null, null);
    }
    // PartnerSoapSforceCom.DescribeLayoutResult dlr  = soap.describeLayout('Agency_Opportunity__c', null, null);
    Map<String, PartnerSoapSforceCom.DescribeLayout> layputMap = new Map<String, PartnerSoapSforceCom.DescribeLayout>();
    for (PartnerSoapSforceCom.DescribeLayout layout : dlr.layouts) {
      layputMap.put(layout.id, layout);
    }
    for (Integer lidx = 0; lidx < dlr.recordTypeMappings.size(); lidx++) {
      String recordTypeId = dlr.recordTypeMappings[lidx].recordTypeId;
      Map<String, String> rtnInner = new Map<String, String>();
      editLayoutItemRWMap.put(recordTypeId, rtnInner);
      System.debug('recordTypeId=' + recordTypeId);
      PartnerSoapSforceCom.DescribeLayout layout = layputMap.get(
        dlr.recordTypeMappings[lidx].layoutId
      );
      for (
        PartnerSoapSforceCom.DescribeLayoutSection section : layout.editLayoutSections
      ) {
        for (PartnerSoapSforceCom.DescribeLayoutRow row : section.layoutRows) {
          for (PartnerSoapSforceCom.DescribeLayoutItem item : row.layoutItems) {
            if (
              item.layoutComponents != null &&
              item.layoutComponents.size() > 0 &&
              String.isBlank(item.layoutComponents[0].value) == false
            ) {
              rtnInner.put(item.layoutComponents[0].value, 'r');
              if (item.editableForUpdate) {
                rtnInner.put(item.layoutComponents[0].value, 'w');
              }
              if (item.required) {
                rtnInner.put(item.layoutComponents[0].value, 'wm');
              }
            }
          }
        }
      }
    }
    // editLayoutItemRWMap = SoapApi.getEditRWByRecordType('Agency_Opportunity__c', null);
    tmpAO = new Agency_Opportunity__c();
    tmpBO = new Agency_Opportunity__c();
    setLayoutRWInfo();
    searchOppInner();
    return null;
  }
  //用于获取经销商询价字段集和询价字段集以及相应的读写权限
  @TestVisible
  private void setLayoutRWInfo() {
    if (this.sortOrder == null) {
      selColumus = new List<String>{};
      strColumus = '';
      ID accRecordTypeId = accTypeForSort;
      Map<String, String> DESC_RW = editLayoutItemRWMap.get(
        '012100000006KW7AAM'
      );
      Map<String, Schema.FieldSet> fsMap = Schema.getGlobalDescribe()
        .get('Agency_Opportunity__c')
        .getDescribe()
        .fieldSets.getMap();
      Schema.FieldSet fs = fsMap.get('DealerInquiryModifyState');
      List<FieldSetMember> fsmList = fs.getFields();
      titleLeft = new List<String>();
      List<String> columnLeft = new List<String>();
      columnLeftCss = new List<String>();
      columnsLeftApi = new List<List<String>>();
      columnLeftRW = new Map<String, String>();
      for (FieldSetMember fsm : fsmList) {
        titleLeft.add(fsm.getLabel());
        columnLeft.add(fsm.getFieldPath());
        List<String> splitFieldPath = fsm.getFieldPath().split('\\.');
        columnsLeftApi.add(splitFieldPath);
        if (DESC_RW == null) {
          columnLeftRW.put(fsm.getFieldPath(), 'r');
        } else if (splitFieldPath.size() == 1) {
          String rw = DESC_RW.get(fsm.getFieldPath());
          if (rw != null) {
            columnLeftRW.put(fsm.getFieldPath(), rw);
          } else {
            columnLeftRW.put(fsm.getFieldPath(), 'r');
          }
        } else {
          columnLeftRW.put(fsm.getFieldPath(), 'r');
        }
      }
      for (String str : columnLeftRW.keySet()) {
        System.debug(str + '=+=+=+=+=' + columnLeftRW.get(str));
      }
      for (String s : columnLeft) {
        if (columusSet.contains(s) == false) {
          columus.add(s);
          columusSet.add(s);
        }
        if (selColumus.contains(s) == false) {
          selColumus.add(s);
        }
        columnLeftCss.add(s.replace('.', '_'));
      }
      strRtColumus = '';
      Schema.FieldSet fsRt = fsMap.get('DealerOpportunity');
      List<FieldSetMember> fsmListRt = fsRt.getFields();
      titleRight = new List<String>();
      List<String> columnRight = new List<String>();
      columnRightCss = new List<String>();
      columnsRightApi = new List<List<String>>();
      columnRightRW = new Map<String, String>();
      for (FieldSetMember fsm : fsmListRt) {
        titleRight.add(fsm.getLabel());
        columnRight.add(fsm.getFieldPath());
        List<String> splitFieldPath = fsm.getFieldPath().split('\\.');
        columnsRightApi.add(splitFieldPath);
        if (DESC_RW == null) {
          columnRightRW.put(fsm.getFieldPath(), 'r');
        } else if (splitFieldPath.size() == 1) {
          String rw = DESC_RW.get(fsm.getFieldPath());
          if (rw != null) {
            columnRightRW.put(fsm.getFieldPath(), rw);
          } else {
            columnRightRW.put(fsm.getFieldPath(), 'r');
          }
        } else {
          columnRightRW.put(fsm.getFieldPath(), 'r');
        }
      }
      for (String s : columnRight) {
        selColumus.add(s);
        if (strRtColumus == '') {
          strRtColumus = s;
        } else {
          strRtColumus = strRtColumus + ',' + s;
        }
        columnRightCss.add(s.replace('.', '_'));
      }
      strColumus = String.join(columus, ',');
      System.debug('======-======-======strColumus' + strColumus);
      System.debug('======-======-======strRtColumus' + strRtColumus);
      this.sortOrderAsc = true;
      this.sortOrder = new List<String>(selColumus.size());
      for (Integer i = 0; i < selColumus.size(); i++)
        this.sortOrder[i] = ' ';
    }
  }
  //用于拼接SOQL语句 根据不同检索条件拼接不同SOQL语句。
  public void searchOppInner() {
    //SOQL:拼接检索条件以及经销商询价的SOQL语句
    // List<User> userlist2 = [select id,name from user where Contactid in (select id from Contact)];
    // String querySoql = '';
    // Integer queryint = 0;
    // for(User user : userlist2){
    //     if(queryint == 0){
    //         querySoql += '\''+user.Id+'\'';
    //         queryint++;
    //     }else{
    //         querySoql += ',\''+user.Id+'\'';
    //     }
    // }
    // System.debug('pppqqq222'+userlist2);
    // System.debug('pppqqq333'+querySoql);
    // AND Ownerid in ( '+querySoql+')'
    String soql =
      'SELECT Change_To_Opportunity__r.Id , Agency_Hospital__r.Name , Product_Category1__r.Name , Product_Category2__r.Name , Product_Category3__r.Name , Agency_Person__r.Name , Agency__r.Name , Change_To_Opportunity__r.Name ,' +
      strColumus +
      ',' +
      strRtColumus +
      ' FROM Agency_Opportunity__c WHERE recordType.DeveloperName = \'Opportunity\' ';
    //数据字段:经销商医院  +SOQL
    if (!String.isBlank(accSearch)) {
      accSearch = accSearch.trim();
      // soql += 'AND Agency__r.Name  '   + '  LIKE  \'%' + accSearch + '%\' ';
      soql +=
        'AND Agency_Hospital__r.Name  ' +
        '  LIKE  \'%' +
        accSearch +
        '%\' ';
    }
    //数据字段:担当人  +SOQL
    if (!String.isBlank(aooSearch)) {
      String newAooSearch = aooSearch.trim();
      // soql += 'AND Change_To_Opportunity__r.Owner.Alias = ' + '\'' + newAooSearch + '\'';//Name
      soql +=
        'AND Agency_PersonName__c ' +
        '  LIKE  \'%' +
        newAooSearch +
        '%\' ';
    }
    //数据字段:03 手动填写项 准备调用makeTextSql;
    if (!String.isBlank(numtext)) {
      String newNumtext = numtext.trim();
      String str = makeTextSql(numtext1, numtext2, newNumtext);
      soql += str;
      System.debug('+++++++++++++=============++++++++++++++++++' + soql);
    }
    //点击排序
    // System.debug('==-=-=-=-=-=this.sortKey'+Integer.valueOf(this.sortKey)+'===titleLeft.size'+titleLeft.size()+7);
    if (String.isBlank(this.sortKey)) {
      soql +=
        ' order by LastModifiedDate desc limit ' + Integer.valueOf(limits);
    } else {
      if (Integer.valueOf(this.sortKey) <= titleLeft.size() + 7) {
        soql +=
          ' order by ' +
          this.selColumus[Integer.valueOf(this.sortKey)] +
          ' ' +
          (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last') +
          ' limit ' +
          Integer.valueOf(limits);
      } else {
        soql +=
          ' order by Change_To_Opportunity__r.' +
          this.selColumus[Integer.valueOf(this.sortKey)] +
          ' ' +
          (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last') +
          ' limit ' +
          Integer.valueOf(limits);
      }
    }
    system.debug(soql);
    // List<User> userlist1 = [select id,name from user ];
    // System.debug('pppqqq111'+userlist1);
    List<Agency_Opportunity__c> InfoList = Database.query(soql);
    System.debug('+++++++-------------------' + InfoList);
    // List<Agency_Opportunity__c> InfoList = ControllerUtil.DatabaseQuery(soql);
    // System.debug('InfoList[0].Change_To_Opportunity_T__c'+InfoList[0].Change_To_Opportunity_T__c);
    for (Agency_Opportunity__c apt : InfoList) {
      System.debug('pppqqq' + apt.Agency_PersonName__c + '====' + apt.Name);
    }
    List<OpportunityInfo> oppinfoList = new List<OpportunityInfo>();
    if (InfoList != null && InfoList.size() > 0) {
      String str = '';
      for (Agency_Opportunity__c agc : InfoList) {
        if (str == '' && agc.Change_To_Opportunity__r.Id != null) {
          str = '\'' + agc.Change_To_Opportunity__r.Id + '\'';
        } else if (agc.Change_To_Opportunity__r.Id != null) {
          str += ',\'' + agc.Change_To_Opportunity__r.Id + '\'';
        }
      }
      for (Agency_Opportunity__c info : InfoList) {
        oppinfoList.add(new OpportunityInfo(info, info));
        oppinfoList[oppinfoList.size() - 1].lineNo = oppinfoList.size() - 1;
      }
    }
    oppRecords = oppinfoList.clone();
    oppCount = oppRecords.size();
    //显示提示操作信息
    if (String.isBlank(this.saveType) && String.isBlank(this.sortKey)) {
      ApexPages.addmessage(
        new ApexPages.message(
          ApexPages.severity.INFO,
          '取得最近的 ' + oppCount + ' 条数据'
        )
      );
    } else if (!String.isBlank(this.sortKey)) {
      if (oppCount > oppLimit) {
        ApexPages.addmessage(
          new ApexPages.message(
            ApexPages.severity.INFO,
            '数据超过' + oppLimit + '件,只显示前' + oppLimit + '件'
          )
        );
      } else {
        ApexPages.addmessage(
          new ApexPages.message(
            ApexPages.severity.INFO,
            '共有 ' + oppCount + ' 条数据'
          )
        );
      }
    } else {
      ApexPages.addmessage(
        new ApexPages.message(
          ApexPages.severity.INFO,
          '共有 ' + oppCount + ' 条数据'
        )
      );
    }
  }
  //检索条件:数据字段1,数据字段2,数据字段3均满足进入此方法 判断多种情况
  private String makeTextSql(
    String textOpts,
    String equalOpts,
    String numtext
  ) {
    String soql = '';
    if (!String.isBlank(textOpts)) {
      //寻找检索条件包含‘ ’ 空格的多重检索条件
      //system.debug('314-textOpts:'+textOpts);
      if (
        (equalOpts == 'contains' || equalOpts == 'notcontains') &&
        numtext.contains(',')
      ) {
        //system.debug('316-equalOpts:'+equalOpts);
        //system.debug('316-numtext:'+numtext);
        String[] vals = numtext.split(',');
        String cSql = '';
        soql += ' AND (';
        for (Integer icount = 0; icount < vals.size(); icount++) {
          //精琢科技   zxk    2021-08-25   start
          String val = vals[icount];
          if (equalOpts == 'contains') {
            cSql = this.makeTextSqlStr(textOpts, equalOpts, val);
            soql += cSql;
            if (icount < vals.size() - 1) {
              soql += ' OR ';
            }
          } else if (equalOpts == 'notcontains') {
            cSql = this.makeTextSqlStr(textOpts, equalOpts, val);
            soql += cSql;
            if (icount < vals.size() - 1) {
              soql += ' AND ';
            }
          }
        }
        //精琢科技   zxk    2021-08-25   end
        textOpts.add(new SelectOption('Hospital_City_Master__c', '市'));
        // textOpts.add(new SelectOption('Agency_Hospital__r.Hospital__r.Salesdepartment_HP__c', '销售本部'));
        // textOpts.add(new SelectOption('Agency_Hospital__r.Hospital__r.State_Master__r.Name', '省'));
        // textOpts.add(new SelectOption('Agency_Hospital__r.Hospital__r.City_Master__r.Name', '市'));
        //日期字段下拉列表
        timeOpts = new List<SelectOption>();
        timeOpts.add(new SelectOption('', '--无--'));
        timeOpts.add(new SelectOption('Created_Day__c', '创建日'));
        timeOpts.add(new SelectOption('Bid_Planned_Date__c', '预测招标日'));
        timeOpts.add(new SelectOption('Forecasted_Bid_Date__c', '预测中标日'));
        timeOpts.add(new SelectOption('Close_Forecasted_Date__c', '预测与OLY签约日'));
        timeOpts.add(new SelectOption('Lost_Opportunity_Date__c', '失单日期'));
        timeOpts.add(new SelectOption('Deleted_Reason_Date__c', '取消日期'));
        //数据字段中间连接符号
        equalOpts = new List<SelectOption>();
        equalOpts.add(new SelectOption('=', '等于'));
        equalOpts.add(new SelectOption('<>', '不等于'));
        equalOpts.add(new SelectOption('<', '<'));
        equalOpts.add(new SelectOption('>', '>'));
        equalOpts.add(new SelectOption('<=', '<='));
        equalOpts.add(new SelectOption('>=', '>='));
        equalOpts.add(new SelectOption('contains', '包含'));
        equalOpts.add(new SelectOption('notcontains', '不包含'));
        equalOpts.add(new SelectOption('starts with', '起始字符'));
        //日期字段连接符号
        //timeequalOpts = new List<SelectOption>();
        //timeequalOpts.add(new SelectOption('=', '等于'));
        //timeequalOpts.add(new SelectOption('<>', '不等于'));
        //timeequalOpts.add(new SelectOption('<', '<'));
        //timeequalOpts.add(new SelectOption('>', '>'));
        //timeequalOpts.add(new SelectOption('<=', '<='));
        //timeequalOpts.add(new SelectOption('>=', '>='));
        //数据显示条数
        limitOpts = new List<SelectOption>();
        limitOpts.add(new SelectOption('10', '10'));
        limitOpts.add(new SelectOption('20', '20'));
        limitOpts.add(new SelectOption('50', '50'));
        limitOpts.add(new SelectOption('100', '100'));
        limitOpts.add(new SelectOption('200', '200'));
        limitOpts.add(new SelectOption('1000', '全部'));
        //数据显示默认条数
        limits = '20';
    }
    public PageReference init() {
        remindMsg = '';
        PartnerSoapSforceCom.Soap soap = new PartnerSoapSforceCom.Soap();
        soap.SessionHeader = new PartnerSoapSforceCom.SessionHeader_element();
        soap.SessionHeader.sessionId = UserInfo.getSessionId();
        soap.endpoint_x = URL.getSalesforceBaseUrl().toExternalForm() + '/partner/services/Soap/u/33.0';
        // soap.endpoint_x = URL.getSalesforceBaseUrl().toExternalForm() + '/services/Soap/u/33.0';
        PartnerSoapSforceCom.DescribeLayoutResult dlr = new PartnerSoapSforceCom.DescribeLayoutResult();
        if (System.Test.isRunningTest()) {
            // UnitTest 用
            // PartnerSoapSforceCom.DescribeLayoutResult dlr = new PartnerSoapSforceCom.DescribeLayoutResult();
            PartnerSoapSforceCom.RecordTypeMapping rtMap = new PartnerSoapSforceCom.RecordTypeMapping();
            PartnerSoapSforceCom.DescribeLayout editLayout = new PartnerSoapSforceCom.DescribeLayout();
            PartnerSoapSforceCom.DescribeLayoutSection editLayoutSection = new PartnerSoapSforceCom.DescribeLayoutSection();
            PartnerSoapSforceCom.DescribeLayoutRow layoutRow = new PartnerSoapSforceCom.DescribeLayoutRow();
            PartnerSoapSforceCom.DescribeLayoutItem layoutItem = new PartnerSoapSforceCom.DescribeLayoutItem();
            PartnerSoapSforceCom.DescribeLayoutComponent layoutComponent = new PartnerSoapSforceCom.DescribeLayoutComponent();
            dlr.recordTypeMappings = new List<PartnerSoapSforceCom.RecordTypeMapping>();
            dlr.recordTypeMappings.add(rtMap);
            rtMap.recordTypeId = 'recordTypeId';
            dlr.layouts = new List<PartnerSoapSforceCom.DescribeLayout>();
            dlr.layouts.add(editLayout);
            editLayout.editLayoutSections = new List<PartnerSoapSforceCom.DescribeLayoutSection>();
            editLayout.editLayoutSections.add(editLayoutSection);
            editLayoutSection.layoutRows = new List<PartnerSoapSforceCom.DescribeLayoutRow>();
            editLayoutSection.layoutRows.add(layoutRow);
            layoutRow.layoutItems = new List<PartnerSoapSforceCom.DescribeLayoutItem>();
            layoutRow.layoutItems.add(layoutItem);
            layoutItem.layoutComponents = new List<PartnerSoapSforceCom.DescribeLayoutComponent>();
            layoutItem.layoutComponents.add(layoutComponent);
            // return dlr;
        } else {
            dlr  = soap.describeLayout('Agency_Opportunity__c', null, null);
            // dlr  = soap.describeLayout('asdas', null, null);
        }
        // PartnerSoapSforceCom.DescribeLayoutResult dlr  = soap.describeLayout('Agency_Opportunity__c', null, null);
        Map<String, PartnerSoapSforceCom.DescribeLayout> layputMap = new Map<String, PartnerSoapSforceCom.DescribeLayout>();
        for (PartnerSoapSforceCom.DescribeLayout layout : dlr.layouts) {
            layputMap.put(layout.id, layout);
        }
        for (Integer lidx = 0; lidx < dlr.recordTypeMappings.size(); lidx++) {
            String recordTypeId = dlr.recordTypeMappings[lidx].recordTypeId;
            Map<String, String> rtnInner = new Map<String, String>();
            editLayoutItemRWMap.put(recordTypeId, rtnInner);
            System.debug('recordTypeId=' + recordTypeId);
            PartnerSoapSforceCom.DescribeLayout layout = layputMap.get(dlr.recordTypeMappings[lidx].layoutId);
            for (PartnerSoapSforceCom.DescribeLayoutSection section : layout.editLayoutSections) {
                for (PartnerSoapSforceCom.DescribeLayoutRow row : section.layoutRows) {
                    for (PartnerSoapSforceCom.DescribeLayoutItem item : row.layoutItems) {
                        if (item.layoutComponents != null && item.layoutComponents.size() > 0
                                && String.isBlank(item.layoutComponents[0].value) == false) {
                            rtnInner.put(item.layoutComponents[0].value, 'r');
                            if (item.editableForUpdate) {
                                rtnInner.put(item.layoutComponents[0].value, 'w');
                            }
                            if (item.required) {
                                rtnInner.put(item.layoutComponents[0].value, 'wm');
                            }
                        }
                    }
                }
            }
        }
        // editLayoutItemRWMap = SoapApi.getEditRWByRecordType('Agency_Opportunity__c', null);
        tmpAO = new Agency_Opportunity__c();
        tmpBO = new Agency_Opportunity__c();
        setLayoutRWInfo();
        searchOppInner();
        return null;
    }
    //用于获取经销商询价字段集和询价字段集以及相应的读写权限
    @TestVisible private void setLayoutRWInfo() {
        if (this.sortOrder == null) {
            selColumus = new String[] {};
            strColumus = '';
            ID accRecordTypeId = accTypeForSort;
            Map<String, String> DESC_RW = editLayoutItemRWMap.get('012100000006KW7AAM');
            Map<String, Schema.FieldSet> fsMap = Schema.getGlobalDescribe().get('Agency_Opportunity__c').getDescribe().fieldSets.getMap();
            Schema.FieldSet fs = fsMap.get('DealerInquiryModifyState');
            List<FieldSetMember> fsmList = fs.getFields();
            titleLeft = new List<String>();
            List<String> columnLeft = new List<String>();
            columnLeftCss = new List<String>();
            columnsLeftApi = new List<List<String>>();
            columnLeftRW = new Map<String, String>();
            for (FieldSetMember fsm : fsmList) {
                titleLeft.add(fsm.getLabel());
                columnLeft.add(fsm.getFieldPath());
                List<String> splitFieldPath = fsm.getFieldPath().split('\\.');
                columnsLeftApi.add(splitFieldPath);
                if (DESC_RW == null) {
                    columnLeftRW.put(fsm.getFieldPath(), 'r');
                } else if (splitFieldPath.size() == 1) {
                    String rw = DESC_RW.get(fsm.getFieldPath());
                    if (rw != null) {
                        columnLeftRW.put(fsm.getFieldPath(), rw);
                    } else {
                        columnLeftRW.put(fsm.getFieldPath(), 'r');
                    }
                } else {
                    columnLeftRW.put(fsm.getFieldPath(), 'r');
                }
            }
            for (String str : columnLeftRW.keySet()) {
                System.debug(str + '=+=+=+=+=' + columnLeftRW.get(str));
            }
            for (String s : columnLeft) {
                if (columusSet.contains(s) == false) {
                    columus.add(s);
                    columusSet.add(s);
                }
                if (selColumus.contains(s) == false) {
                    selColumus.add(s);
                }
                columnLeftCss.add(s.replace('.', '_'));
            }
            strRtColumus = '';
            Schema.FieldSet fsRt = fsMap.get('DealerOpportunity');
            List<FieldSetMember> fsmListRt = fsRt.getFields();
            titleRight = new List<String>();
            List<String> columnRight = new List<String>();
            columnRightCss = new List<String>();
            columnsRightApi = new List<List<String>>();
            columnRightRW = new Map<String, String>();
            for (FieldSetMember fsm : fsmListRt) {
                titleRight.add(fsm.getLabel());
                columnRight.add(fsm.getFieldPath());
                List<String> splitFieldPath = fsm.getFieldPath().split('\\.');
                columnsRightApi.add(splitFieldPath);
                if (DESC_RW == null) {
                    columnRightRW.put(fsm.getFieldPath(), 'r');
                } else if (splitFieldPath.size() == 1) {
                    String rw = DESC_RW.get(fsm.getFieldPath());
                    if (rw != null) {
                        columnRightRW.put(fsm.getFieldPath(), rw);
                    } else {
                        columnRightRW.put(fsm.getFieldPath(), 'r');
                    }
                } else {
                    columnRightRW.put(fsm.getFieldPath(), 'r');
                }
            }
            for (String s : columnRight) {
                selColumus.add(s);
                if (strRtColumus == '') {
                    strRtColumus = s;
                } else {
                    strRtColumus = strRtColumus + ',' + s;
                }
                columnRightCss.add(s.replace('.', '_'));
            }
            strColumus = String.join(columus, ',');
            System.debug('======-======-======strColumus' + strColumus);
            System.debug('======-======-======strRtColumus' + strRtColumus);
            this.sortOrderAsc = true;
            this.sortOrder = new String[selColumus.size()];
            for (Integer i = 0; i < selColumus.size(); i++) this.sortOrder[i] = ' ';
        }
    }
    //用于拼接SOQL语句 根据不同检索条件拼接不同SOQL语句。
    public void searchOppInner() {
        //SOQL:拼接检索条件以及经销商询价的SOQL语句
        // List<User> userlist2 = [select id,name from user where Contactid in (select id from Contact)];
        // String querySoql = '';
        // Integer queryint = 0;
        // for(User user : userlist2){
        //     if(queryint == 0){
        //         querySoql += '\''+user.Id+'\'';
        //         queryint++;
        //     }else{
        //         querySoql += ',\''+user.Id+'\'';
        //     String val = vals[icount];
        //     cSql = this.makeTextSqlStr(textOpts, equalOpts, val);
        //     system.debug(cSql);
        //     soql += cSql;
        //     if (icount < vals.size() - 1) {
        //         soql += ' OR ';
        //     }
        // }
        // System.debug('pppqqq222'+userlist2);
        // System.debug('pppqqq333'+querySoql);
        // AND Ownerid in ( '+querySoql+')'
        soql += ')';
      }
      //寻找检索条件包含‘,’ 逗号的多重检索条件
      else if (
        (equalOpts == '=' || equalOpts == '<>') && numtext.contains(',')
      ) {
        String[] vals = numtext.split(',');
        soql += ' AND ( ';
        for (Integer icount = 0; icount < vals.size(); icount++) {
          String val = vals[icount];
          if (equalOpts == '=') {
            soql += textOpts + ' = \'' + val + '\'';
            if (icount < vals.size() - 1) {
              soql += ' OR ';
            }
          } else if (equalOpts == '<>') {
            soql += textOpts + ' <> \'' + val + '\'';
            if (icount < vals.size() - 1) {
              soql += ' AND ';
            }
          }
        }
        soql += ')';
      }
      //检索连接符为包含以及不包含
      else if (
        equalOpts.equals('contains') || equalOpts.equals('notcontains')
      ) {
        if (equalOpts.equals('contains')) {
          soql += ' AND ' + textOpts + ' LIKE \'%' + numtext + '%\'';
        } else if (equalOpts.equals('notcontains')) {
          soql += ' AND ( NOT ' + textOpts + ' LIKE \'%' + numtext + '%\' ) ';
        }
      }
      //检索连接符为等于以及不等于
      else if (equalOpts == '=' || equalOpts == '<>') {
        soql += 'AND ' + textOpts + equalOpts + '\'' + numtext + '\'';
      }
      //精琢科技   zxk    2021-08-25   start
      //起始字符
      else if (equalOpts == 'starts with' && numtext.contains(' ')) {
        String[] vals = numtext.split(' ');
        soql += ' AND ( ';
        for (Integer icount = 0; icount < vals.size(); icount++) {
          String val = vals[icount];
          if (equalOpts == 'starts with') {
            soql += ' ' + textOpts + '  LIKE  \'%' + val + '%\'';
            if (icount < vals.size() - 1) {
              soql += ' OR ';
            }
          }
        }
        soql += ')';
      }
      //精琢科技   zxk    2021-08-25   end
        String soql = 'SELECT Change_To_Opportunity__r.Id , Agency_Hospital__r.Name , Product_Category1__r.Name , Product_Category2__r.Name , Product_Category3__r.Name , Agency_Person__r.Name , Agency__r.Name , Change_To_Opportunity__r.Name ,' +
                      strColumus + ',' + strRtColumus +
                      ' FROM Agency_Opportunity__c WHERE recordType.DeveloperName = \'Opportunity\' ';
        //数据字段:经销商医院  +SOQL
        if (!String.isBlank(accSearch)) {
            accSearch = accSearch.trim();
            // soql += 'AND Agency__r.Name  '   + '  LIKE  \'%' + accSearch + '%\' ';
            soql += 'AND Agency_Hospital__r.Name  '   + '  LIKE  \'%' + accSearch + '%\' ';
        }
        //数据字段:担当人  +SOQL
        if (!String.isBlank(aooSearch)) {
            String newAooSearch = aooSearch.trim();
            // soql += 'AND Change_To_Opportunity__r.Owner.Alias = ' + '\'' + newAooSearch + '\'';//Name
            soql += 'AND Agency_PersonName__c ' + '  LIKE  \'%' + newAooSearch + '%\' ';
        }
        //数据字段:03 手动填写项 准备调用makeTextSql;
        if (!String.isBlank(numtext)) {
            String newNumtext = numtext.trim();
            String str = makeTextSql(numtext1,  numtext2,  newNumtext);
            soql += str;
            System.debug('+++++++++++++=============++++++++++++++++++' + soql);
        }
        //点击排序
        // System.debug('==-=-=-=-=-=this.sortKey'+Integer.valueOf(this.sortKey)+'===titleLeft.size'+titleLeft.size()+7);
        if (String.isBlank(this.sortKey)) {
            soql += ' order by LastModifiedDate desc limit ' + Integer.valueOf(limits);
      // //起始字符
      // else if (equalOpts == 'starts with'){
      //     soql += 'AND ' + textOpts + ' LIKE \'' + numtext + '%\'';
      // }
      //检索连接符的其他情况
      else {
        String cSql = this.makeTextSqlStr(textOpts, equalOpts, numtext);
        if (equalOpts != '<>') {
          soql += cSql;
        } else {
            if (Integer.valueOf(this.sortKey) <= titleLeft.size() + 7) {
                soql += ' order by ' + this.selColumus[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last') + ' limit ' + Integer.valueOf(limits);
            } else {
                soql += ' order by Change_To_Opportunity__r.' + this.selColumus[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last') + ' limit ' + Integer.valueOf(limits);
            }
          soql += ' and (NOT ' + cSql + ') ';
        }
        system.debug(soql);
        // List<User> userlist1 = [select id,name from user ];
        // System.debug('pppqqq111'+userlist1);
        List<Agency_Opportunity__c> InfoList = Database.query(soql);
        System.debug('+++++++-------------------'+InfoList);
        // List<Agency_Opportunity__c> InfoList = ControllerUtil.DatabaseQuery(soql);
        // System.debug('InfoList[0].Change_To_Opportunity_T__c'+InfoList[0].Change_To_Opportunity_T__c);
        for (Agency_Opportunity__c apt : InfoList) {
            System.debug('pppqqq' + apt.Agency_PersonName__c + '====' + apt.Name);
      }
    }
    return soql;
  }
  //检索条件:数据字段1,数据字段2,数据字段3均满足,并且进入makeTextSql()之后,内含数据字段包含多种时进入此方法。
  @TestVisible
  private String makeTextSqlStr(String textOpts, String equalOpts, String val) {
    String soql = '';
    if (!String.isBlank(textOpts)) {
      String tmpVal = val;
      if (!String.isBlank(tmpVal)) {
        if (equalOpts == 'contains' || equalOpts == 'notcontains') {
          if (equalOpts == 'contains') {
            soql += ' ' + textOpts + '  LIKE  \'%' + val + '%\'';
          } else if (equalOpts == 'notcontains') {
            soql += ' ( NOT ' + textOpts + '  LIKE  \'%' + val + '%\' ) ';
          }
        } else if (equalOpts == '=' || equalOpts == '<>') {
          if (equalOpts == '=') {
            soql += ' AND ' + textOpts + ' = ' + val;
          } else if (equalOpts == '<>') {
            soql += ' AND ' + textOpts + ' <> ' + val;
          }
        }
        List<OpportunityInfo> oppinfoList = new List<OpportunityInfo>();
        if (InfoList != null && InfoList.size() > 0) {
            String str = '';
            for (Agency_Opportunity__c agc : InfoList) {
                if (str == '' && agc.Change_To_Opportunity__r.Id != null) {
                    str = '\'' + agc.Change_To_Opportunity__r.Id + '\'';
                } else if (agc.Change_To_Opportunity__r.Id != null) {
                    str += ',\'' + agc.Change_To_Opportunity__r.Id + '\'';
                }
            }
            for (Agency_Opportunity__c info : InfoList) {
                oppinfoList.add(new OpportunityInfo(info, info));
                oppinfoList[oppinfoList.size() - 1].lineNo = oppinfoList.size() - 1;
            }
        }
        oppRecords = oppinfoList.clone();
        oppCount = oppRecords.size();
        //显示提示操作信息
        if (String.isBlank(this.saveType) && String.isBlank(this.sortKey)) {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '取得最近的 ' + oppCount + ' 条数据'));
            //add by Link 2023-6-2
            remindMsg = '取得最近的 ' + oppCount + ' 条数据';
        } else if (!String.isBlank(this.sortKey)) {
            if (oppCount > oppLimit) {
                ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '数据超过' + oppLimit + '件,只显示前' + oppLimit + '件'));
                //add by Link 2023-6-2
                remindMsg = '数据超过' + oppLimit + '件,只显示前' + oppLimit + '件';
            } else {
                ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '共有 ' + oppCount + ' 条数据'));
                //add by Link 2023-6-2
                remindMsg = '共有 ' + oppCount + ' 条数据';
            }
      } else {
        soql = ' AND ' + textOpts;
        if (equalOpts == '=') {
          soql += ' = ' + tmpVal;
        } else if (equalOpts == '<>') {
          soql += ' <> ' + tmpVal;
        } else if (equalOpts == 'contains') {
          soql +=
            ' like \'%' +
            String.escapeSingleQuotes(tmpVal.replaceAll('%', '\\%')) +
            '%\'';
        } else if (equalOpts == 'notcontains') {
          soql +=
            ' like \'%' +
            String.escapeSingleQuotes(tmpVal.replaceAll('%', '\\%')) +
            '%\'';
        } else if (equalOpts == 'starts with') {
          soql +=
            ' like \'%' +
            String.escapeSingleQuotes(tmpVal.replaceAll('%', '\\%')) +
            '%\'';
        } else {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '共有 ' + oppCount + ' 条数据'));
            //add by Link 2023-6-2
            remindMsg = '共有 ' + oppCount + ' 条数据';
          soql += ' ' + equalOpts + ' ' + tmpVal;
        }
      }
    }
    //检索条件:数据字段1,数据字段2,数据字段3均满足进入此方法 判断多种情况
    private String makeTextSql(String textOpts, String equalOpts, String numtext) {
        String soql = '';
        if (!String.isBlank(textOpts)) {
            //寻找检索条件包含‘ ’ 空格的多重检索条件
            //system.debug('314-textOpts:'+textOpts);
            if ((equalOpts == 'contains' || equalOpts == 'notcontains') && numtext.contains(',')) {
                //system.debug('316-equalOpts:'+equalOpts);
                //system.debug('316-numtext:'+numtext);
                String[] vals = numtext.split(',');
                String cSql = '';
                soql += ' AND (';
                for (Integer icount = 0; icount < vals.size(); icount++) {
    return soql;
  }
                    //精琢科技   zxk    2021-08-25   start
                    String val = vals[icount];
                    if (equalOpts == 'contains') {
                        cSql = this.makeTextSqlStr(textOpts, equalOpts, val);
                        soql += cSql;
                        if (icount < vals.size() - 1) {
                            soql += ' OR ';
                        }
                    } else if (equalOpts == 'notcontains') {
                        cSql = this.makeTextSqlStr(textOpts, equalOpts, val);
                        soql += cSql;
                        if (icount < vals.size() - 1) {
                            soql += ' AND ';
                        }
                    }
                }
                //精琢科技   zxk    2021-08-25   end
                //     String val = vals[icount];
                //     cSql = this.makeTextSqlStr(textOpts, equalOpts, val);
                //     system.debug(cSql);
                //     soql += cSql;
                //     if (icount < vals.size() - 1) {
                //         soql += ' OR ';
                //     }
                // }
                soql += ')';
            }
            //寻找检索条件包含‘,’ 逗号的多重检索条件
            else if ((equalOpts == '=' || equalOpts == '<>') && numtext.contains(',')) {
                String[] vals = numtext.split(',');
                soql += ' AND ( ';
                for (Integer icount = 0; icount < vals.size(); icount++) {
                    String val = vals[icount];
                    if (equalOpts == '=') {
                        soql += textOpts + ' = \'' + val + '\'';
                        if (icount < vals.size() - 1) {
                            soql += ' OR ';
                        }
                    } else if (equalOpts == '<>') {
                        soql += textOpts + ' <> \'' + val + '\'';
                        if (icount < vals.size() - 1) {
                            soql += ' AND ';
                        }
                    }
                }
                soql += ')';
            }
            //检索连接符为包含以及不包含
            else if (equalOpts.equals('contains') || equalOpts.equals('notcontains')) {
                if (equalOpts.equals('contains')) {
                    soql += ' AND ' + textOpts + ' LIKE \'%' + numtext + '%\'';
                } else if (equalOpts.equals('notcontains')) {
                    soql += ' AND ( NOT ' + textOpts + ' LIKE \'%' + numtext + '%\' ) ';
                }
            }
            //检索连接符为等于以及不等于
            else if (equalOpts == '=' || equalOpts == '<>') {
                soql += 'AND ' + textOpts + equalOpts + '\'' + numtext + '\'';
            }
            //精琢科技   zxk    2021-08-25   start
            //起始字符
            else if (equalOpts == 'starts with' && numtext.contains(' ')) {
                String[] vals = numtext.split(' ');
                soql += ' AND ( ';
                for (Integer icount = 0; icount < vals.size(); icount++) {
                    String val = vals[icount];
                    if (equalOpts == 'starts with') {
                        soql += ' ' + textOpts + '  LIKE  \'%' + val + '%\'' ;
                        if (icount < vals.size() - 1) {
                            soql += ' OR ';
                        }
                    }
                }
                soql += ')';
            }
            //精琢科技   zxk    2021-08-25   end
            // //起始字符
            // else if (equalOpts == 'starts with'){
            //     soql += 'AND ' + textOpts + ' LIKE \'' + numtext + '%\'';
            // }
            //检索连接符的其他情况
            else {
                String cSql = this.makeTextSqlStr(textOpts, equalOpts, numtext);
                if (equalOpts != '<>') {
                    soql += cSql;
                } else {
                    soql += ' and (NOT ' + cSql + ') ';
                }
            }
  //检索按钮:点击检索按钮触发此方法;
  public PageReference chick() {
    setLayoutRWInfo();
    searchOppInner();
    return null;
  }
  //页面内容有修改时,页面判断后传值给changeFlg以及changeFlgRt属性,点击保存时调用此方法,进行保存。
  public PageReference save() {
    //system.debug('oppRecords[1].opp:' + oppRecords[1].opp +' oppRecords[1].AgcOpp:' + oppRecords[1].AgcOpp );
    try {
      List<Agency_Opportunity__c> updTarget = new List<Agency_Opportunity__c>();
      // List<Opportunity> updOpps = new List<Opportunity>();
      for (OpportunityInfo oi : oppRecords) {
        if (oi.changeFlg == '1') {
          oi.changeFlg = '0';
          updTarget.add(oi.AgcOpp);
        }
        return soql;
        // if (oi.changeFlgRt == '1' && oi.opp.id != null) {
        //     oi.changeFlgRt = '0';
        //     updOpps.add(oi.opp);
        // }
      }
      if (updTarget.size() > 0) {
        system.debug('updTarget.size:' + updTarget.size());
        update updTarget;
      }
      // if (updOpps.size() > 0) {
      //     update updOpps;
      // }
      ApexPages.addmessage(
        new ApexPages.message(ApexPages.severity.INFO, '保存完了')
      );
    } catch (Exception e) {
      //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '请确定科室分类和产品区分的关系'));
    }
    //检索条件:数据字段1,数据字段2,数据字段3均满足,并且进入makeTextSql()之后,内含数据字段包含多种时进入此方法。
    @TestVisible private String makeTextSqlStr(String textOpts, String equalOpts, String val) {
        String soql = '';
        if (!String.isBlank(textOpts)) {
            String tmpVal = val;
            if (!String.isBlank(tmpVal)) {
                if (equalOpts == 'contains' || equalOpts == 'notcontains') {
                    if (equalOpts == 'contains') {
                        soql += ' ' + textOpts + '  LIKE  \'%' + val + '%\'' ;
                    } else if (equalOpts == 'notcontains') {
                        soql += ' ( NOT ' + textOpts + '  LIKE  \'%' + val + '%\' ) ' ;
                    }
                } else if (equalOpts == '=' || equalOpts == '<>') {
                    if (equalOpts == '=') {
                        soql += ' AND ' + textOpts + ' = ' + val ;
                    } else if (equalOpts == '<>') {
                        soql += ' AND ' + textOpts + ' <> ' + val ;
                    }
                }
            } else {
                soql = ' AND ' + textOpts;
                if (equalOpts == '=') {
                    soql += ' = ' + tmpVal;
                } else if (equalOpts == '<>') {
                    soql += ' <> ' + tmpVal;
                } else if (equalOpts == 'contains') {
                    soql += ' like \'%' + String.escapeSingleQuotes(tmpVal.replaceAll('%', '\\%')) + '%\'';
                } else if (equalOpts == 'notcontains') {
                    soql += ' like \'%' + String.escapeSingleQuotes(tmpVal.replaceAll('%', '\\%')) + '%\'';
                } else if (equalOpts == 'starts with') {
                    soql += ' like \'%' + String.escapeSingleQuotes(tmpVal.replaceAll('%', '\\%')) + '%\'';
                } else {
                    soql += ' ' + equalOpts + ' ' + tmpVal;
                }
            }
        }
        return soql;
    if (saveType == '1') {
      searchOppInner();
      saveType = '';
    } else if (saveType == '2') {
      sortTable();
      saveType = '';
    } else {
    }
    return null;
  }
  //全部展开调用此方法
  public PageReference sortTable() {
    oppRecords = new List<OpportunityInfo>();
    if (this.sortKey == this.preSortKey) {
      if (String.isBlank(this.sortKey) == false) {
        // 方向が変わるのみ
        this.sortOrderAsc = !this.sortOrderAsc;
        this.sortOrder[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc ==
          true
          ? '↑'
          : '↓');
      }
    } else {
      this.sortOrderAsc = true;
      if (String.isBlank(this.preSortKey) == false) {
        this.sortOrder[Integer.valueOf(this.preSortKey)] = ' ';
      }
      this.sortOrder[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc == true
        ? '↑'
        : '↓');
    }
    this.preSortKey = this.sortKey;
    //检索按钮:点击检索按钮触发此方法;
    public PageReference chick() {
        setLayoutRWInfo();
        searchOppInner();
        return null;
    }
    //页面内容有修改时,页面判断后传值给changeFlg以及changeFlgRt属性,点击保存时调用此方法,进行保存。
    public PageReference save() {
        //system.debug('oppRecords[1].opp:' + oppRecords[1].opp +' oppRecords[1].AgcOpp:' + oppRecords[1].AgcOpp );
        try {
            List<Agency_Opportunity__c> updTarget = new List<Agency_Opportunity__c>();
            // List<Opportunity> updOpps = new List<Opportunity>();
            for (OpportunityInfo oi : oppRecords) {
                if (oi.changeFlg == '1') {
                    oi.changeFlg = '0';
                    updTarget.add(oi.AgcOpp);
    setLayoutRWInfo();
    searchOppInner();
    return null;
  }
                }
                // if (oi.changeFlgRt == '1' && oi.opp.id != null) {
                //     oi.changeFlgRt = '0';
                //     updOpps.add(oi.opp);
                // }
            }
            if (updTarget.size() > 0) {
                system.debug('updTarget.size:' + updTarget.size() );
                update updTarget;
            }
            // if (updOpps.size() > 0) {
            //     update updOpps;
            // }
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '保存完了'));
            //add by Link 2023-6-2
            remindMsg = '保存完了';
        } catch (Exception e) {
            //ApexPages.addmessage(new ApexPages.message(ApexPages.severity.Error, '请确定科室分类和产品区分的关系'));
        }
        if (saveType == '1') {
            searchOppInner();
            saveType = '';
        } else if (saveType == '2') {
            sortTable();
            saveType = '';
        } else {
        }
        return null;
  //自定义类OpportunityInfo,用于创建虚拟字段,合并输出。
  class OpportunityInfo {
    // public Opportunity opp { get; set; }
    public Agency_Opportunity__c opp { get; set; }
    public Boolean canEdit { get; private set; }
    public Boolean hasError { get; private set; }
    public Boolean hasFieldError { get; private set; }
    public Integer lineNo { get; private set; }
    public String changeFlg { get; set; }
    public String changeFlgRt { get; set; }
    public Boolean ifLock { get; set; }
    //public String accType { get; private set; }
    public Agency_Opportunity__c AgcOpp { get; set; }
    public OpportunityInfo(
      Agency_Opportunity__c record,
      Agency_Opportunity__c oppo
    ) {
      opp = oppo;
      canEdit = true;
      hasError = false;
      hasFieldError = false;
      lineNo = 0;
      changeFlg = '0';
      changeFlgRt = '0';
      ifLock = Approval.isLocked(record);
      AgcOpp = record;
    }
    //全部展开调用此方法
    public PageReference sortTable() {
        oppRecords = new List<OpportunityInfo>();
        if (this.sortKey == this.preSortKey) {
            if (String.isBlank(this.sortKey) == false) {
                // 方向が変わるのみ
                this.sortOrderAsc = !this.sortOrderAsc;
                this.sortOrder[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc == true ? '↑' : '↓');
            }
        } else {
            this.sortOrderAsc = true;
            if (String.isBlank(this.preSortKey) == false) {
                this.sortOrder[Integer.valueOf(this.preSortKey)] = ' ';
            }
            this.sortOrder[Integer.valueOf(this.sortKey)] = (this.sortOrderAsc == true ? '↑' : '↓');
        }
        this.preSortKey = this.sortKey;
        setLayoutRWInfo();
        searchOppInner();
        return null;
    }
    //自定义类OpportunityInfo,用于创建虚拟字段,合并输出。
    class OpportunityInfo {
        // public Opportunity opp { get; set; }
        public Agency_Opportunity__c opp { get; set; }
        public Boolean canEdit { get; private set; }
        public Boolean hasError { get; private set; }
        public Boolean hasFieldError { get; private set; }
        public Integer lineNo { get; private set; }
        public String changeFlg { get; set; }
        public String changeFlgRt { get; set; }
        public Boolean ifLock { get; set; }
        //public String accType { get; private set; }
        public Agency_Opportunity__c AgcOpp { get; set; }
        public OpportunityInfo(Agency_Opportunity__c record, Agency_Opportunity__c oppo) {
            opp = oppo;
            canEdit = true;
            hasError = false;
            hasFieldError = false;
            lineNo = 0;
            changeFlg = '0';
            changeFlgRt = '0';
            ifLock = Approval.isLocked(record);
            AgcOpp = record;
        }
    }
}
  }
}