CRM企业配置管理员手册.docx
《CRM企业配置管理员手册.docx》由会员分享,可在线阅读,更多相关《CRM企业配置管理员手册.docx(64页珍藏版)》请在冰豆网上搜索。
![CRM企业配置管理员手册.docx](https://file1.bdocx.com/fileroot1/2023-2/2/37aa41cb-9106-4d1e-ad2b-5a6638ca70e5/37aa41cb-9106-4d1e-ad2b-5a6638ca70e51.gif)
CRM企业配置管理员手册
第一章:
CRM配置管理简述
配置管理员登录信息:
登录页面:
serverip:
8080/cc-crm/conf.do
企业标识:
企业的标识
用户名:
conf
密码:
默认cinteam123,新版crm建立的企业默认cinconf123
企业配置管理员登陆后首页:
CRM系统管理角色共分三个:
运营级管理员、企业配置管理员、企业管理员,crm平台的设计模式是基于呼叫中心的架构,多企业独立运行的模式,整个平台只有一个运营级管理员,由运营级管理员来建立若干个企业,每个企业分别有其配置管理员和企业管理员2个管理角色;
企业配置管理员级主要配置和管理下面2块的工作:
1、数据管理
注册和管理当前企业的数据对象,一条数据对象对应生成crm数据库中的一张表,数据对象类型包括:
工单数据、基础数据、客户数据、质检数据、操作日志;
无论做呼入还是呼出业务,一般一个企业至少需要配置一个工单数据对象和一个客户资料数据对象,供坐席界面在弹屏界面时调用;
质检数据对象是指在企业需要质检功能时配置,配置后,质检员可以对坐席保存的工单进行质检评分;
操作日志类型的数据对象是用于配合工单使用的,即工单页面可以调用操作日志的数据对象;
基础数据类型的数据对象一般是存放一些基本数据,配合业务需求使用的情况下配置。
具体的配置请参见第二章内容:
数据管理部分介绍。
2、查询管理
注册和管理当前企业所有的查询器,查询器即是对数据库中的信息进行查询展现到页面,可以对话单、工单等相关数据进行查询和统计;
一般分2块,一是导入一些做好的标准查询器模版,例如:
呼叫历史、坐席统计等;二是具体业务需求定制的,如工单明细、相关统计等;
具体的配置请参见第三章内容:
查询管理部分介绍。
第二章:
数据管理
数据对象:
一条数据对象对应生成crm数据库中的一张表,常用数据对象类型包括客户资料和工单2种,一般一个企业至少要创建客户资料和工单数据对象,供弹屏页面调用。
1、数据对象注册
--基本信息--选项卡:
1.1、对象标识
数据对象的唯一标识,4位数字;
1.2、关键字标识
数据对象的key,唯一标识;
1.3、数据类型
目前类型有:
工单数据、基础数据、客户数据、质检数据、操作日志;
工单数据对应数据库中的表名:
crm_agt_rpt_企业标识_数据对象key
基础数据对应数据库中的表名:
crm_data_企业标识_数据对象key
客户数据对应数据库中的表名:
crm_数据对象key_企业标识
质检数据对应数据库中的表名:
crm_checker_企业标识_数据对象key
操作日志对应数据库中的表名:
crm_opt_log_企业标识_数据对象key
1.4、字段空间
表示生成的表默认带的预留字段的数量;
数字串含义:
1.5、名称
数据对象的名称,可以用中文;
1.6、企业默认
是和否两种值,在没有关联数据对象的情况下,会默认使用设置为是的数据对象;
1.7、操作日志
关联操作日志后,在弹屏和编辑页面可以显示编辑操作日志数据对象的字段,一同保存;
1.8、查询页默认参数初始化JSON模板
是key—value赋值形式;
{"rptTimeFrom":
"#cinDateFmt('yyyyMMdd')000000","rptTimeTo":
"#cinDateFmt('yyyyMMdd')235959"}
效果:
rptTime:
对应查询条件字段的字段名;
1.9、编辑页JS脚本模板
在此添加JS脚本,可控制数据对象的编辑页面中所有的控件元素;
模版1:
弹屏工单部分字段内容从客户资料中根据弹屏页面坐席点击的客户资料自动获取;
#if(${pageKey}=='callPage')
//客户资料属性,工单属性
_globalCustomerNotifyCtrCtx.addCtr('data21','${dataObjInfo.objId}','data25');
_globalCustomerNotifyCtrCtx.addCtr('linkTel1','${dataObjInfo.objId}','data31');
#end
说明:
前面的参数data21为客户资料中的字段名,后面的参数为工单中对应的字段名;
模版2:
控制页面2个编码类型字段的逻辑关系;
_baseCodeCtrManager.regCodeCtrTwin('${dataObjInfo.objId}_data29','${dataObjInfo.objId}_data30','--全部--');
模版3:
弹屏工单部分字段内容是否可编辑及显示隐藏;
varordersCtrIdArr=newArray("command0.data35","command0.data36");//需要是控件的name
MyHtmlCtr.disableCtrArr(ordersCtrIdArr);//不可编辑
MyHtmlCtr.enableCtrArr(ordersCtrIdArr);//可编辑
MyHtmlCtr.hideCtrArr(ordersCtrIdArr);//隐藏不显示
MyHtmlCtr.showCtrArr(newArray("th_${dataObjInfo.objId}_data38","…"));//显示
MyHtmlCtr.confCtrValue('${dataObjInfo.objId}_data38',nowDtStr);//给字段赋值
vardata37Value=MyHtmlCtr.loadCtrValue('${dataObjInfo.objId}_data37');//取当前页面的值赋给变量
模版4:
弹屏工单必填项未填工单保存时弹出窗口提示;
$("${dataObjInfo.objId}Form").setAttribute("altInValidMsg","true");
模版5:
控制弹屏工单保存后是否自动示闲和关闭窗口;
#if(${pageKey}=='callPage')
if(_rptSaveHandlerActionKeyArr){
_rptSaveHandlerActionKeyArr['${dataObjInfo.objId}']={autoConf2Idle:
true,closeComingCallPage:
true};
}
#end
(注意:
自动示闲和关闭窗口一般二选一,因为可能刚示闲就有电话进来而没有关闭窗口,所以这种情况下会发生错误)
模版6:
弹屏时客户资料存在则触发此方法,可以再其中增加处理逻辑;
functionCorpOnCustomerSelFunc(customerDataRow){
…
}
1.10、查询页的操作列模板
数据对象对应的查询页面中操作列的链接,更多模版参见查询器中操作列的模版;
${row.linkTel1},弹屏至新工单">外拨
说明:
${row.linkTel1}:
取的是当前页面电话的字段名为linkTel1的值;
其它常用操作列项,参见查询器操作列模版。
1.11、日志选项卡设置(一般配置了也很难看出操作的记录)
坐席保存工单模式:
设置坐席弹屏工单页面是否可以多次保存工单;
记录模式:
文件、DB动作、DB轨迹三种;
记录模版:
数据对象更新时记录字段修改的值,记录模式选择DB轨迹时下面的代码会往业务日志表中记录修改的值,可以通过日志管理中业务日志查询记录;
#if($action=='Update')
#cinDiffDataRow($dataRow,$oldDataRow,$dataObjInfo)
#end
1.12、高级选项卡设置
编辑页列数:
数据页面页面每行显示的字段列数,最多支持一行3个字段;
按月建表:
详见第3节所述;
列表页JS脚本模版:
示例
_baseCodeCtrManager.regCodeCtrTwin('data23','data24','--全部--');//控制数据对象查询页条件中编码下拉框类型字段的逻辑关系;
2、数据对象列表
添加对应数据对象的如下设置:
2.1、字段
表示数据对象包含的数据字段,一般没种类型有其固定的字段,其他的字段都是在注册数据对象的时候选择预料的字段;
--基本信息--
数据类型:
对应数据对象注册时的字段空间中所指的类型,常用有3个:
字符串、数字、文本(指大文本);
数据类型:
当前字段的控件类型,常用有:
文本框、键值下拉框、日期&时间范围;
自定义属性集:
onchange="onChangeSellResult1(this.value);"//键值下拉框改变调用js中的方法
localOptLabels="--请选择--"localOptValues=""//键值下拉框
--显示信息--
注意:
如果弹屏列表页条件选是,查询条件也必须选是;
--编辑信息--
数据来源:
页面输入、客户资料、来电信息;
客户资料:
可以通过数据来源来设置该字段值从其它表中某个字段获取,弹屏页面中工单中客户资料字段常用此设置来自动同步客户资料的内容,如果同步的字段为日期类型,则来源字段名后加Fmt,例如:
原始字段名为createdTime,则来源字段名:
createdTimeFmt;
注意:
来源字段名是字段的字段名,不是DB字段名;
来电信息:
数据来源可以获取来电信息的内容,包括:
dataObjId:
"",
enableMultiDataObj:
"",
agentId:
"${agentId}",
agentName:
"${agentName}",
departmentId:
"${departmentId}",
departmentName:
"${emptydepartmentName?
departmentId:
departmentName}",
callId:
"",
callSid:
"",
callSeq:
"0",
callType:
"",
callTypeTitle:
"",
userDn:
"",
agentDn:
"",
areaCode:
"",
callingNumber:
"",
transferAgentId:
"",
projectId:
"",
projectName:
"",
serviceId:
"",
shortServiceId:
"",
isHumanCallIn:
false,
serviceName:
"",
areaCode:
"",
areaName:
"",
callData:
"",
transPara:
"",//随路数据
customerStreamNum:
"",
wordsKey:
"",
isTaskCall:
false,
areaId:
"",
areaProvince:
"",//电话所属省份
areaProCode:
"",
areaCity:
"",//电话所属城市
encryptTel:
"",//电话加密显示
recordFileName:
"",//呼叫结束后录音文件信息
ringRecordFile:
"",//振铃时上报的录音文件路径
accessGwId:
""
languageType:
""
例如:
页面效果:
常用字段模版:
见2.5节内容;
2.2、字段分组
可以将部分字段设置成一组,在逻辑上进行划分,在弹屏工单页面会按组分开显示;
2.3、触发器
表示操作数据对象时,触发执行的语句;
触发器模版:
见2.6节内容;
2.4、角色
设置可以查看此数据对象权限的角色,系统中内置的角色,添加即可,在首页中会显示有权限的列表;
2.5、常见字段设置模版相关
rootCode:
K200;codeLevel:
2;(前面一个是根编码,后面是子编码)
说明:
rootCode表示调用根编码的编码标识;codeLevel表示所属根编码下级的对应级别;
S#cinDateFmt('yyMMddHHmmssSSS')
--项目编号--:
数据加载URL地址:
/cc-crm/outCallProjectInfo.do?
method=getJsonOption
--任务编号--:
数据加载URL地址:
/cc-crm/outCallTaskInfo.do?
method=getGsonOption
outCallTaskInfo.do?
method=getGsonOption&needEmpty=1
--人工服务--:
数据加载URL地址:
/cc-crm/ctiServiceInfo.do?
method=getGsonOption&needEmpty=1&command.corpVccId=958888
--IVR服务--:
数据加载URL地址:
/cc-crm/ivrServInfo.do?
method=getGsonOption&needEmpty=1&command.corpVccId=958888
cols="60"rows="3"
#if(${userCtx.roleId}!
='ROLE_CC_CHECKER')
readonly
#end
//判断角色是否为质检员,不是则增加只读的属性
cols="60"rows="3":
表示控件页面显示的行列大小;
//注意:
数据量大的情况下要改成值等,效率要高一些。
#cinIfNotEmpty($parameterMap,${fieldInfo.fieldName},'fieldValue')
and(link_tel1like'%$fieldValue%'orlink_tel2like'%$fieldValue%')
#end
#cinIfNotEmpty($parameterMap,${fieldInfo.fieldName},'fieldValue')
and(link_tel1='$fieldValue'orlink_tel2='$fieldValue')
#end
注意:
数据对象中类似用坐席工号这种字段作为条件时,因为默认使用的是模糊查询,所以有可能一些特定的工号查询时结果就不准确了,这时需要将此字段的查询条件模版中加入自定义查询,示例如下:
#cinIfNotEmpty($parameterMap,${fieldInfo.fieldName},'fieldValue')
and(agent_id='000010100002$fieldValue')
#end
弹屏单选控件是指点击后弹出窗口(调用某个查询器),在窗口中选择对应记录,返回对应的值(选中的列即是返回值的列);
数据加载URL地址:
queryManager.do?
method=pageSearch&command.isFirstQuery=1&queryKey=corpPage
注意:
corpPage为调调用的查询器的关键字;
查询器对应的选择列设置:
页面显示模版:
hand"
#if(${row.selId}==${command.currentSelectedValue})checked#end
onclick='_doSelectInSelWin2("${row.selId}","${row.selId}","${command.valueCtrId}","${command.textCtrId}",#cinObj2Json(${row}));'value="${row.selId}"/>
注意:
selId为要调用的字段名;
设置日期字段的默认值模版为:
#cinDateFmt('yyyyMMdd')
2.6、常见触发器模版相关
#set($rptTabelName="crm_agt_rpt_${userCtx.corpId}_workorder_#cinDateFmt('yyyyMMddHHmmss',${dataRow.rptCreatedTime},'yyyyMM')")
//设置要操作的数据表的名称赋值给变量$rptTabelName,根据页面时间的字段获取到表名中的时间
#cinSqlRun("update${rptTabelName}setdata_46='${dataRow.data2}'wherestream_number='${dataRow.rptId}'")
//执行括号中的sql语句
#if(${dataRow.data3}=='2')
#set($cntSql="selectcount(rpt_id)asoptCntfromcrm_opt_log_${userCtx.corpId}_wolog_#cinDateFmt('yyyyMM')whererpt_id='${dataRow.rptId}'")
#cinSqlLoad('${cntSql}','1','sqlRtnMapObj')
${sqlRtnMapObj.optCnt}
#if(${sqlRtnMapObj.optCnt}!
='4')
#cinSqlRun("insertintocrm_appoint_info(stream_number,corp_id,call_id,call_sid,agent_id,calling_number,task_id,appoint_tel,appoint_time,last_call_time,remark,status,created_time,update_time,rpt_stream_number,rpt_obj_id)values('#cinRandom()','${userCtx.corpId}','${dataRow.callId}','${dataRow.callSid}','${userCtx.userId}','${dataRow.callingNumber}','${dataRow.serviceId}','${dataRow.callingNumber}','${dataRow.data30}','','','0','#cinDateFmt('yyyyMMddHHmmss')','#cinDateFmt('yyyyMMddHHmmss')','${dataRow.rptId}','${userCtx.defaultAgtRptObjId}')")
#end
#end
#cinSqlRun("updatecrm_agt_rpt_${userCtx.corpId}_workordersetdata_39=date_format(now(),'%Y%m%d%H%i%s'),data_43=timediff(data_39,data_38)where(stream_number='${dataRow.streamNumber}'or(call_sid='${dataRow.callSid}'andcall_id='${dataRow.callId}'));")
#else
#cinSqlRun("updatecrm_agt_rpt_${userCtx.corpId}_workordersetdata_38=date_format(now(),'%Y%m%d%H%i%s')where(stream_number='${dataRow.streamNumber}'or(call_sid='${dataRow.callSid}'andcall_id='${dataRow.callId}'))and(data_38isnullordata_38='')and(data_37isnotnullanddata_37>0);")
#end
…语句
#set($cntSql="selectdata_6asoptCntfromcrm_agt_rpt_${userCtx.corpId}_workorderwherestream_number='${dataRow.streamNumber}'")
#cinSqlLoad('${cntSql}','1','sqlRtnMapObj')
${sqlRtnMapObj.optCnt}
#if(${sqlRtnMapObj.optCnt}=='0')
...
#end
3、数据对象建表方式
3.1、按月建表
配置按月建表主要是数据量大后,按月分开数据可提高查询速度,但查询器按时间查询时不能跨月查询;
当前月的表名为原始表名,其它月份为‘表名_201208’的形式;
都已‘表名_201208’的形式生成每个月份的表;
注意:
设置完成后,都需要建立一个数据表维护的定时任务,并运行一下才会生成,如果当前数据对象已有数据,先将原表备份一下,生成的方式为:
例如当前是8月份,会将原来带数据的表改名为表名_201207,同时生成空数据的3张表(原始表名一个、表名_201209、表名_201210),需要做的工作有将7月表中的8月数据导入到原始表名中,如果存在7月以前的数据,需要手动建立各个月份的表,并将相应月份的数据导入到表中。
配置管理级中添加数据表维护的定时任务:
查询器中from中的表名对应修改的方式:
crm_agt_rpt_${userCtx.corpId}_workorder_#cinDateFmt('yyyyMMdd',${parameterMap.call_dateFrom},'yyyyMM')
说明:
适用于数据对象按月建表模式为所有月,call_date为条件中的日期字段;
#cinMonthTbl('cti_callstat',$parameterMap,'rptTimeFrom','yyyyMMddHHmmss')
说明:
适用于数据对象按月建表模式为非当前月,rptTime为条件中的日期字段;
3.2、配置缓存表
可以对数据对象按1-7天的周期建立对应的缓存表,也需要添加数据表维护的定时任务,查询器中from中的表名更改成缓存表的表名即可;
第三章:
查询管理
查询器:
就相当于一条select语句,实现对已存在的数据进行查询、统计,支持标准的mysql语法;
1、查询器注册
--基本信息--选项卡:
1.1、标识
查询器的唯一标识,一般是数字,可以加字符;
1.2、关键字
查询器对应的唯一key,标识查询器;
1.3、数据源
对应数据库:
话单库(smp)、工单库(crm);
1.4、名称
查询器显示的名称;
1.5、From
组成查询语句的from,可以嵌套select语句;
常用模版示例:
crm_agt_rpt_${userCtx.corpId}_workord