上一期7101、7102已经能注册和互拨。这一期把它们接进一个测试队列,拨打7190后进入排队,空闲座席振铃,接听后和来电方通话。需要第三个已注册的测试分机作为来电方;7101、7102专门接队列电话。
本期在内网、单台FreeSWITCH上操作,参照v1.10.12官方模板与当前手册。配置经过文档和语法核对,完整派单还需在自己的环境测试。CONF代表eval {conf_dir}查出的配置目录;实际域通过eval {domain}确认。示例中的$${domain}会在XML预处理时展开。
分机、座席、队列要分别配置
SIP分机是登录电话的账号,agent是队列系统管理的座席,queue是来电等待和分配的队列,tier把agent关联到queue。座席名字可以自行约定,contact才是模块拨打的目标。本例为了好记,把座席叫agent7101、agent7102。
来电方拨7190,路由把它送进training@default队列;模块根据策略选择一个agent,拨它的contact。队列名里的@default只是名字的一部分,不会自动把它绑定到用户域或dialplan context。把几个名字分别对上,排错就容易许多。
先确认模块与测试账号
在fs_cli执行以下查询,确认7101、7102都在internal的注册列表中,也能互拨。Profile不是internal时用自己的名称。
version
module_exists mod_callcenter
sofia status profile internal reg
module_exists返回false表示模块尚未加载。先在CONF/autoload_configs/modules.conf.xml的modules元素中加入或启用下面这行;已有同样配置时保留一份即可。还要确认安装包确实提供mod_callcenter,只有XML没有模块文件,load仍会失败。我的docker镜像中已包含了该模块.
<!-- 启动时加载呼叫中心模块 -->
<load module="mod_callcenter"/>
在callcenter.conf.xml加入测试队列
打开CONF/autoload_configs/callcenter.conf.xml,先备份。下面是本例完整的最小文件,适合独立测试实例。如果文件里已有正在使用的队列,把新queue、agent、tier分别合并到原来的queues、agents、tiers里,保留原settings及其他业务配置。
<configuration name="callcenter.conf" description="Training queue">
<settings/>
<queues>
<!-- 名字在dialplan和tier中保持一致 -->
<queue name="training@default">
<!-- 优先选择空闲时间较长的座席 -->
<param name="strategy" value="longest-idle-agent"/>
<!-- 使用已有的全局等待音乐源 -->
<param name="moh-sound" value="$${hold_music}"/>
<!-- 按进入本系统的时间累计基础分数 -->
<param name="time-base-score" value="system"/>
<!-- 本例最多等待60秒,按实际流程调整 -->
<param name="max-wait-time" value="60"/>
<!-- 本例暂不启用分层等待规则 -->
<param name="tier-rules-apply" value="false"/>
</queue>
</queues>
<agents>
<!-- callback表示需要派单时主动呼叫contact -->
<agent name="agent7101" type="callback"
contact="[leg_timeout=15]user/7101@$${domain}"
status="Available" max-no-answer="3" wrap-up-time="10"
reject-delay-time="10" busy-delay-time="30"/>
<!-- 7102使用独立agent名称和分机目标 -->
<agent name="agent7102" type="callback"
contact="[leg_timeout=15]user/7102@$${domain}"
status="Available" max-no-answer="3" wrap-up-time="10"
reject-delay-time="10" busy-delay-time="30"/>
</agents>
<tiers>
<!-- 同一层的两个座席都属于测试队列 -->
<tier agent="agent7101" queue="training@default" level="1" position="1"/>
<tier agent="agent7102" queue="training@default" level="1" position="2"/>
</tiers>
</configuration>
strategy决定分配方式,本例选longest-idle-agent,position并不保证每次都先拨7101。换成其他策略会改变选择逻辑,下一期再比较顺序、轮询和同时振铃。
moh-sound是排队期间的声音,$${hold_music}需要在现有实例能正常播放;没安装音乐文件时先补齐声音资源。max-wait-time的60是本例秒数,超时后callcenter应用会返回,后面还要接离队处理。time-base-score的system与queue取不同计分起点,涉及转队或之前已在系统等待时,排序结果可能不同。
contact中的user/7101@域会查找目标用户,leg_timeout=15是这条座席呼叫等待接听的秒数。agent的status用Available表示可以接队列;电话注册状态与这个状态各自独立。座席休息用On Break,签出用Logged Out。state则记录Waiting、Receiving等派单过程,平时由模块维护。
max-no-answer=3用于累计未接听处理,不表示一次来电一定连拨三次。wrap-up-time=10给座席通话后留10秒整理;reject-delay-time和busy-delay-time分别影响拒接、忙线后多久再尝试派单,本例为10秒与30秒。号码填错却反复呼叫时,先核对contact,而不是把这些时间全部改成0。
level、position用于描述队列中的层级和位置;本例两个agent同一层,且tier-rules-apply=false,没有演示逐层等待。tier引用的agent不存在,或队列名拼错,就算agent是Available也无法按预期派单。
配置7190进入队列
在CONF/dialplan/default/下新建02_training_queue.xml。父default.xml需要在default上下文中包含default/*.xml,测试来电分机也要进入这个context;7190先确认没有占用。
<include>
<extension name="training-queue-7190">
<!-- 只匹配测试号码7190 -->
<condition field="destination_number" expression="^7190$">
<!-- 先应答来电,再播放排队音乐 -->
<action application="answer"/>
<!-- 名称与上面的queue完全相同 -->
<action application="callcenter" data="training@default"/>
<!-- 没有在队列完成通话而返回时,结束本例流程 -->
<action application="hangup"/>
</condition>
</extension>
</include>
answer会先应答来电,接运营商线路时可能由此开始计费;本期用内部分机验证。这里离队后直接hangup,后面可以改成播放提示、转另一队列或语音信箱,提示音和目标路由要先准备好。将来要按离队原因分别处理,再结合cc_cause等实际通道信息设计流程。
加载后,看运行中的对象
第一次安装且模块未加载时,保存以上文件,在fs_cli执行reloadxml,再执行load mod_callcenter。加载失败就看相邻日志,确认模块依赖、XML及数据库可用。本例不设置odbc-dsn,使用模块默认的本地状态数据库,不需要新建PostgreSQL库。
模块已经运行时,reloadxml只重新读取XML,还要按对象同步运行状态:
reloadxml
callcenter_config queue load training@default
callcenter_config agent reload agent7101
callcenter_config agent reload agent7102
callcenter_config tier reload training@default agent7101
callcenter_config tier reload training@default agent7102
callcenter_config queue list
callcenter_config queue list agents training@default
callcenter_config queue list tiers training@default
queue load用于新队列,已有队列改参数时先在测试窗口核对queue reload的影响。本例的agent reload和tier reload按名字读取XML。检查每条返回;只要有对象没加载成功,先处理这一项,再继续下一项。
XML中的座席、层级会同步进模块数据库。官方模板特别提醒,重启时XML配置可能覆盖运行时改过的座席配置或层级位置。业务系统用API动态管理座席时,要约定XML与数据库谁负责哪些字段。多台FS共享状态也不属于本例单机方案。
实际打电话验收
用第三个测试分机拨7190,确认听到等待音乐、其中一个座席振铃,接听后能双向说话,挂断后座席经过整理时间再次可接。等待期间用queue list members training@default查看来电是否在队列;需要完整命令时在前面加callcenter_config。
让7101暂时休息,可以执行callcenter_config agent set status agent7101 On Break;恢复用callcenter_config agent set status agent7101 Available。在fs_cli中输入完整状态文本,再用callcenter_config agent get status agent7101回查。再打一通,观察7102接听。
如果队列有人却不派单,按注册记录、agent状态、tier关联、整理和忙线等待时间依次看。接听超时后座席状态可能变化,修改前先用callcenter_config agent list查看实际状态。要隔离contact问题,先从另一分机直接拨7101,确认最基础的电话能通。
测试结束后让两个agent签出,确认队列没有等待来电和测试通话,再移除7190路由并reloadxml。删除本例tier、agent和卸载测试queue前核对名字,只处理这组测试对象。恢复备份文件也要同步运行状态;已有业务队列继续保留。
下一期在这套测试队列上调整派单策略、未接听处理和话后整理,看看参数怎样影响座席实际接电话。