public with sharing class BmeWorkController { public List oppRecords { get; set; } //public List OPPORTList { get; set; } /*****************検索用******************/ public List limitOpts { get; private set; } public String numtextA1 { get; set; } //数据字段01 public String numtextA2 { get; set; } //数据字段02 public String numtextA { get; set; }//数据字段03 public String numtextB1 { get; set; } //数据字段01 public String numtextB2 { get; set; } //数据字段02 public String numtextB { get; set; }//数据字段03 public String numtextC1 { get; set; } //数据字段01 public String numtextC2 { get; set; } //数据字段02 public String numtextC { get; set; }//数据字段03 public String numtextD1 { get; set; } //数据字段01 public String numtextD2 { get; set; } //数据字段02 public String numtextD { get; set; }//数据字段03 public String limits { get; set; }//日期03 public String AwsDataIds { get; set; }//PI 改造 public String[] AwsDataIdArr{ get{ if(String.isBlank(AwsDataIds)){ return new string[]{}; } return AwsDataIds.split(';'); } } //public List dateOpts { get; private set; } public List textOpts { get; private set; } public List textOpts01 { get; private set; } public List textOpts02 { get; private set; } public List textOpts03 { get; private set; } //public List timeOpts { get; private set; } public List equalOpts { get; private set; } public List firstOpts { get; private set; } //public List timeequalOpts { get; private 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 columusSet = new Set {'Id'}; // 项目set 字段标签 public List titleLeft { get; private set; } public List titleRight { get; private set; } // 项目set 字段名 public List> columnsLeftApi { get; private set; } public List> columnsRightApi { get; private set; } public List columnLeftCss { get; private set; } public List columnRightCss { get; private set; } public Map columnLeftRW { get; private set; } public Map columnRightRW { get; private set; } private String strColumus; private String strRtColumus; @TestVisible private String accTypeForSort = null; private static Integer oppLimit = 500; // 20220222 PI改造 by Bright--start public List equalOpts2 { get; private set; } public string staticResource { get; private set; } // 20220222 PI改造 by Bright--end public BmeWorkController() { oppRecords = new List(); //数据字段下拉列表 textOpts = new List(); textOpts.add(new SelectOption('Account.Name', '医院科室')); textOpts.add(new SelectOption('CampaignName__c', '学会培训名称')); // textOpts.add(new SelectOption('MedicalStaff_Full_name__c', '拜访人姓名')); textOpts.add(new SelectOption('CampaignOwnerName__c', '学会培训主担当')); textOpts.add(new SelectOption('', '--无--')); textOpts01 = new List(); textOpts01.add(new SelectOption('CampaignName__c', '学会培训名称')); // textOpts01.add(new SelectOption('MedicalStaff_Full_name__c', '拜访人姓名')); textOpts01.add(new SelectOption('CampaignOwnerName__c', '学会培训主担当')); textOpts01.add(new SelectOption('Account.Name', '医院科室')); textOpts01.add(new SelectOption('', '--无--')); textOpts02 = new List(); textOpts02.add(new SelectOption('MedicalStaff_Full_name__c', '拜访人姓名')); // textOpts02.add(new SelectOption('Account.Name', '医院科室')); // textOpts02.add(new SelectOption('CampaignName__c', '学会培训名称')); // textOpts02.add(new SelectOption('CampaignOwnerName__c', '学会培训主担当')); textOpts02.add(new SelectOption('', '--无--')); textOpts03 = new List(); textOpts03.add(new SelectOption('CampaignOwnerName__c', '学会培训主担当')); // textOpts03.add(new SelectOption('MedicalStaff_Full_name__c', '拜访人姓名')); textOpts03.add(new SelectOption('Account.Name', '医院科室')); textOpts03.add(new SelectOption('CampaignName__c', '学会培训名称')); textOpts03.add(new SelectOption('', '--无--')); //数据字段中间连接符号 equalOpts = new List(); equalOpts.add(new SelectOption('=', '等于')); equalOpts.add(new SelectOption('<>', '不等于')); equalOpts.add(new SelectOption('contains', '包含')); equalOpts.add(new SelectOption('notcontains', '不包含')); equalOpts.add(new SelectOption('starts with', '起始字符')); equalOpts2 = new List(); equalOpts2.add(new SelectOption('contains', '包含')); //首要显示包含 firstOpts = new List(); firstOpts.add(new SelectOption('contains', '包含')); firstOpts.add(new SelectOption('notcontains', '不包含')); firstOpts.add(new SelectOption('=', '等于')); firstOpts.add(new SelectOption('<>', '不等于')); firstOpts.add(new SelectOption('starts with', '起始字符')); //数据显示条数 limitOpts = new List(); 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('500', '500')); limitOpts.add(new SelectOption('1000', '全部')); //数据显示默认条数 limits = '50'; staticResource = JSON.serialize(PIHelper.getPIIntegrationInfo('Contact')); } //--------------------------------------init()-------------------------------------------------------------------------------- public PageReference init() { setLayoutRWInfo(); //searchOppInner(); system.debug(oppRecords); return null; } //--------------------------------------------------字段集、字段集和等信息------------------------------------------------------- @TestVisible private void setLayoutRWInfo() { selColumus = new String[] {}; strColumus = ''; List three = new List(); three = new List(); three.add('Campaign__c'); three.add('Campaign__r.Ownerid'); three.add('MedicalStaff_Full_name__c'); three.add('Accountid'); for (String s : three) { selColumus.add(s); } ID accRecordTypeId = accTypeForSort; // 获得项目set Map fsMap = Schema.getGlobalDescribe().get('Contact').getDescribe().fieldSets.getMap(); // 左 固定 Schema.FieldSet fs = fsMap.get('BMEWorkloadFollowUpYear'); // 获得项目set中的所有项目 List fsmList = fs.getFields(); // 获得字段标签和字段名 titleLeft = new List(); List columnLeft = new List(); columnLeftCss = new List(); columnsLeftApi = new List>(); columnLeftRW = new Map(); for (FieldSetMember fsm : fsmList) { titleLeft.add(fsm.getLabel()); columnLeft.add(fsm.getFieldPath()); List splitFieldPath = fsm.getFieldPath().split('\\.'); columnsLeftApi.add(splitFieldPath); } 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 = ''; // 获得项目set Map fsMapRt = Schema.getGlobalDescribe().get('MeetingManagement__c').getDescribe().fieldSets.getMap(); Schema.FieldSet fsRt = fsMapRt.get('BMEWorkloadFollowUpMonth'); // 获得项目set中的所有项目 List fsmListRt = fsRt.getFields(); // 获得字段标签和字段名 titleRight = new List(); List columnRight = new List(); columnRightCss = new List(); columnsRightApi = new List>(); columnRightRW = new Map(); for (FieldSetMember fsm : fsmListRt) { titleRight.add(fsm.getLabel()); columnRight.add(fsm.getFieldPath()); List splitFieldPath = fsm.getFieldPath().split('\\.'); columnsRightApi.add(splitFieldPath); } 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); //this.sortOrderAsc = true; this.sortOrder = new String[selColumus.size()]; for (Integer i = 0; i < selColumus.size(); i++) this.sortOrder[i] = ' '; system.debug('selColumus:' + selColumus); } //----------------------------------SOQL(拼接)--------------------------------------------- public void searchOppInner() { //try { //SOQL:拼接检索条件以及经销商询价的SOQL语句 String soql = ' SELECT AWS_Data_Id__c,Campaign__c, CampaignOwnerID__c, Campaign__r.Ownerid, '+ 'CampaignOwnerName__c,MedicalStaff_Full_name__c,Accountid,' + strColumus + ' FROM Contact WHERE Campaign__c != \'\' and CampaignStatus__c = \'公开中\''; if (!String.isBlank(numtextA)) { String newNumtext = numtextA.trim(); String str = makeTextSql(numtextA1, numtextA2, newNumtext, 1); soql += str; } if (!String.isBlank(numtextB)) { String newNumtext = numtextB.trim(); String str = makeTextSql(numtextB1, numtextB2, newNumtext, 1); soql += str; } // if (!String.isBlank(numtextC)) { // String newNumtext = numtextC.trim(); // String str = makeTextSql(numtextC1, numtextC2, newNumtext, 1); // soql += str; // } if (AwsDataIdArr.size() > 0) { List lo = new List(new Set(AwsDataIdArr)); soql += ' and AWS_Data_Id__c in (\''+ string.join(lo, '\',\'')+'\') '; } if (!String.isBlank(numtextD)) { String newNumtext = numtextD.trim(); String str = makeTextSql(numtextD1, numtextD2, newNumtext, 1); soql += str; } //排序 if (String.isBlank(this.sortKey)) { soql += ' order by LastModifiedDate desc limit ' + Integer.valueOf(limits); } else { if (Integer.valueOf(this.sortKey) != null) { 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 ' + this.selColumus[Integer.valueOf(this.sortKey)] + ' ' + (this.sortOrderAsc == true ? 'asc nulls first' : 'desc nulls last') + ' limit ' + Integer.valueOf(limits); } } system.debug('联系人:' + soql); List InfoList = new List(); if(!Test.isRunningTest()){ InfoList = Database.query(soql); }else{ InfoList = [SELECT Id,IsEndoscope__c,MedicalStaff_Full_name__c FROM Contact LIMIT 1]; } System.debug('soql完了'); List conmeetList = new List(); if (InfoList != null && InfoList.size() > 0) { String str = ''; for (Contact agc : InfoList) { if (str == '' && agc.Id != null) { str = '\'' + agc.Id + '\''; } else if (agc.Id != null) { str += ',\'' + agc.Id + '\''; } } System.debug('-----Str-----:' + str ); //SOQL1:拼接询价SOQL语句; Date dateToday = Date.toDay(); Integer year = dateToday.year(); Integer month = dateToday.month(); Integer day = dateToday.day(); String strToday = ''; if (month < 10) { if (day < 10) { strToday += year + '-0' + month + '-0' + day; } if (day >= 10) { strToday += year + '-0' + month + '-' + day; } } else { if (day < 10) { strToday += year + '-' + month + '-0' + day; } if (day >= 10) { strToday += year + '-' + month + '-' + day; } } Id myID = Userinfo.getUserId(); String soql1 = 'SELECT ' + strRtColumus + ' , Contact__c, Contact__r.Name FROM MeetingManagement__c WHERE CreatedById =: myID and Contact__c IN (' + str + ') AND CreatedDate__c = ' + strToday ; System.debug('-----服务技师管理表-----:' + soql1); List OpportList = new List(); //对应匹配; if(!Test.isRunningTest()){ OpportList = Database.query(soql1); }else{ OpportList = [SELECT Id,Name,Contact__c FROM MeetingManagement__c LIMIT 1]; } Map OpportMap = new Map(); for (MeetingManagement__c mmc : OpportList) { OpportMap.put(mmc.Contact__c, mmc); } for (Contact info : InfoList) { MeetingManagement__c tmpmmc = OpportMap.get(info.Id); if (info.IsEndoscope__c == null) { info.IsEndoscope__c = '是'; } if (tmpmmc == null) { tmpmmc = new MeetingManagement__c(); tmpmmc.Contact__c = info.Id; tmpmmc.Contact__r = info; tmpmmc.Name = info.MedicalStaff_Full_name__c + ':' + Date.today().format(); tmpmmc.CreatedDate__c = Date.today(); //tmpmmc.Campaign__c = info.Campaign__c; } conmeetList.add(new ConMeetInfo(info, tmpmmc)); conmeetList[conmeetList.size() - 1].lineNo = conmeetList.size() - 1; } } oppRecords = conmeetList.clone(); oppCount = oppRecords.size(); System.debug('searchOppInner完了'+oppRecords); //显示提示操作信息 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 + ' 条数据')); } //} catch (Exception e) { // system.debug(e); //} } //--------------------- NumText != null->makeTextSql ----------------------------------------- // 第一层SQL加上 and, 其他的更深入的SQL循环不加and // 第一层为and ( sql 内容) // 第二层 为( SQL内容)两个第二层直接靠拼接 private String makeTextSql(String textOpts, String equalOpts, String numtext , integer loopTime) { system.debug('textOpts:' + textOpts); if (textOpts != null && (textOpts.equals('MedicalStaff_Full_name__c') || textOpts.equals('Campaign__r.Owner.Alias__c'))) { numtext = numtext.replaceAll('\\s+', ''); } system.debug('numtext' + numtext); String soql = ''; if (!String.isBlank(textOpts)) { //寻找检索条件包含‘,,’ 逗号的包含与不包含的检索条件 if ((equalOpts == 'contains' || equalOpts == 'notcontains') && ( numtext.contains(',') || numtext.contains(',') )) { String[] vals = numtext.split('[,\\,]'); String cSql = ''; if (loopTime == 1) { soql += ' AND ('; } else { soql += ' ('; } for (Integer icount = 0; icount < vals.size(); icount++) { String val = vals[icount]; val = val.trim(); cSql = this.makeTextSql(textOpts, equalOpts, val, 2); system.debug('cSql:' + cSql); soql += cSql; if (icount < vals.size() - 1) { if (equalOpts == 'contains') { soql += ' OR '; } else { soql += ' and '; } } } soql += ')'; } //寻找检索条件包含‘ ’ 空格的包含与不包含的检索条件 else if ((equalOpts == 'contains' || equalOpts == 'notcontains') && numtext.contains(' ')) { String[] vals = numtext.split('\\s+'); String cSql = ''; if (loopTime == 1) { soql += ' AND ('; } else { soql += ' ('; } for (Integer icount = 0; icount < vals.size(); icount++) { String val = vals[icount]; cSql = this.makeTextSqlStr(textOpts, equalOpts, val); system.debug('cSql:' + cSql); soql += cSql; if (icount < vals.size() - 1) { if (equalOpts == 'contains') { soql += ' and '; } else { soql += ' or '; } } } soql += ')'; } //寻找检索条件包含‘,’ 逗号的多重检索条件 else if ((equalOpts == '=' || equalOpts == '<>') && ( numtext.contains(',') || numtext.contains(',') )) { String[] vals = numtext.split('[,\\,]'); soql += ' AND ( '; for (Integer icount = 0; icount < vals.size(); icount++) { String val = vals[icount]; val = val.trim(); 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')) { if (loopTime == 1) { soql += ' AND '; } else { soql += ' '; } soql += textOpts + ' LIKE \'%' + numtext + '%\''; } else if (equalOpts.equals('notcontains')) { if (loopTime == 1) { soql += ' AND '; } else { soql += ' '; } soql += ' ( NOT ' + textOpts + ' LIKE \'%' + numtext + '%\' ) '; } } //检索连接符为等于以及不等于 else if (equalOpts == '=' || equalOpts == '<>') { String str = numtext; soql += 'AND ' + textOpts + equalOpts + '\'' + str + '\''; } //起始字符 else if (equalOpts == 'starts with') { String str = numtext; soql += 'AND ' + textOpts + ' LIKE \'' + str + '%\''; } //检索连接符的其他情况 else { String cSql = this.makeTextSqlStr(textOpts, equalOpts, numtext); if (equalOpts != '<>') { soql += cSql; } else { soql += ' and (NOT ' + cSql + ') '; } } } return soql; } //-------------------------makeTextSql(NumText包含空格进入这里分开处理)-------------------------- 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; } //------------------------BmeWorkPage(chick)->js->BemWorkPage->chick--------------------------- public PageReference chick() { setLayoutRWInfo(); searchOppInner(); return null; } //------------------------BmeWorkPage->js->BemWorkPage->save---------------------------------- public PageReference save() { try { List updTarget = new List(); List updOpps = new List(); for (ConMeetInfo oi : oppRecords) { if (oi.changeFlg == '1') { system.debug('oi.changeFlg:' + oi.changeFlg); oi.changeFlg = '0'; updTarget.add(oi.Agcmmc); system.debug('oi.Agcmmc:' + oi.Agcmmc); } if (oi.changeFlgRt == '1' && oi.con.id != null) { oi.changeFlgRt = '0'; updOpps.add(oi.con); } } if (updTarget.size() > 0) { system.debug('updTarget.size:' + updTarget.size() ); upsert updTarget; } if (updOpps.size() > 0) { update updOpps; } ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO, '保存完了')); } catch (Exception e) { system.debug(e); } if (saveType == '1') { searchOppInner(); saveType = ''; } else if (saveType == '2') { sortTable(); saveType = ''; } else {} return null; } //----------------------- 升降序 ---------------------------------------------------------------- public PageReference sortTable() { oppRecords = new List(); system.debug('sortKey' + sortKey); //10 system.debug('preSortKey' + preSortKey); //null 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; } //-------------------------自定义 ConMeetInfo 数据结构---------------------------------------------------------- class ConMeetInfo { public Contact con { 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 MeetingManagement__c Agcmmc { get; set; } public ConMeetInfo (Contact record, MeetingManagement__c mmc) { con = record; canEdit = true; hasError = false; hasFieldError = false; lineNo = 0; changeFlg = '0'; changeFlgRt = '0'; Agcmmc = mmc; } } //------------------------------------------------------------------------------------------------------------ }