使用 Mod_callcenter 配置 FreeSWITCH 队列
在 FreeSWITCH 中使用 mod_callcenter 配置呼叫队列并不困难,但可能会有一点令人困惑。这里我将设置三个队列:support、sales 和 reception。用户 101、102 和 103 将作为这些队列的成员。
首先,你需要在 conf/autoload_configs/callcenter.conf.xml 中定义队列:
xml
<configuration name="callcenter.conf" description="CallCenter">
<settings>
</settings>
<queues>
<queue name="onemetricsupport@default">
<param name="strategy" value="top-down"/>
<param name="moh-sound" value="$${hold_music}"/>
<param name="time-base-score" value="system"/>
<param name="max-wait-time" value="0"/>
<param name="max-wait-time-with-no-agent" value="0"/>
<param name="max-wait-time-with-no-agent-time-reached" value="20"/>
<param name="tier-rules-apply" value="false"/>
<param name="tier-rule-wait-second" value="300"/>
<param name="tier-rule-wait-multiply-level" value="true"/>
<param name="tier-rule-no-agent-no-wait" value="false"/>
<param name="discard-abandoned-after" value="60"/>
<param name="abandoned-resume-allowed" value="false"/>
</queue>
<queue name="onemetricreception@default">
<param name="strategy" value="top-down"/>
<param name="moh-sound" value="$${hold_music}"/>
<param name="time-base-score" value="system"/>
<param name="max-wait-time" value="0"/>
<param name="max-wait-time-with-no-agent" value="0"/>
<param name="max-wait-time-with-no-agent-time-reached" value="20"/>
<param name="tier-rules-apply" value="false"/>
<param name="tier-rule-wait-second" value="300"/>
<param name="tier-rule-wait-multiply-level" value="true"/>
<param name="tier-rule-no-agent-no-wait" value="false"/>
<param name="discard-abandoned-after" value="60"/>
<param name="abandoned-resume-allowed" value="false"/>
</queue>
<queue name="onemetricaccounts@default">
<param name="strategy" value="top-down"/>
<param name="moh-sound" value="$${hold_music}"/>
<param name="time-base-score" value="system"/>
<param name="max-wait-time" value="0"/>
<param name="max-wait-time-with-no-agent" value="0"/>
<param name="max-wait-time-with-no-agent-time-reached" value="20"/>
<param name="tier-rules-apply" value="false"/>
<param name="tier-rule-wait-second" value="300"/>
<param name="tier-rule-wait-multiply-level" value="true"/>
<param name="tier-rule-no-agent-no-wait" value="false"/>
<param name="discard-abandoned-after" value="60"/>
<param name="abandoned-resume-allowed" value="false"/>
</queue>
</queues>
</configuration>
如你所见,我们使用的是默认上下文 default,队列名称分别是:
onemetricsupportonemetricreceptiononemetricaccounts
关键配置项如下:
text
name - 队列名称
strategy - 队列用于决定下一个要呼叫哪个坐席的方法。
可用策略列表及其工作方式可以在以下页面查看:
http://wiki.freeswitch.org/wiki/Mod_callcenter#Distribution_Strategy
moh-sound - 播放给队列中等待呼叫者的保持音乐。
在本例中,我们使用的是 conf/vars.xml 中定义的 hold_music 变量。
其余选项可参考:
text
http://wiki.freeswitch.org/wiki/Mod_callcenter#Queue_options
接下来,需要定义坐席配置:
xml
<agents>
<agent name="101" type="callback" contact="[call_timeout=60]user/101" status="Logged Out" max-no-answer="3" wrap-up-time="10" reject-delay-time="30" busy-delay-time="60" no-answer-delay-time="10" />
<agent name="102" type="callback" contact="[call_timeout=60]user/102" status="Logged Out" max-no-answer="3" wrap-up-time="10" reject-delay-time="30" busy-delay-time="60" no-answer-delay-time="10" />
<agent name="103" type="callback" contact="[call_timeout=60]user/103" status="Logged Out" max-no-answer="3" wrap-up-time="10" reject-delay-time="30" busy-delay-time="60" no-answer-delay-time="10"/>
</agents>
坐席的关键配置项如下:
text
name - 坐席名称。它可以是任意值,但为了方便在 SPA 电话上设置坐席登录/登出按钮,
我们将其保持为与分机号相同。
contact - 用于联系坐席的拨号字符串。
注意,call_timeout 的值定义了每次向该坐席分配来电时等待其接听的时长。
在本例中,坐席有 60 秒时间接听电话。
status - 坐席创建时的初始状态。
我建议将坐席添加为 Logged Out,然后让他们自己切换为可接听队列来电的状态。
max-no-answer - 坐席未接听达到该次数后,将被认为处于休息状态。
wrap-up-time - 坐席在接完一个电话后,多久之后才会被分配新的来电。
在本例中,坐席结束一次通话后,有 10 秒时间,然后才会收到下一通来电。
reject-delay-time - 如果坐席手动拒接来电,则等待该时间后才会再次向其分配来电。
更多选项可参考:
text
wiki.freeswitch.org/wiki/Mod_callcenter#Agent_options
接下来,我们需要配置哪些坐席属于哪些队列:
xml
<tiers>
<tier agent="101" queue="onemetricsupport@default" level="1" position="1"/>
<tier agent="101" queue="onemetricaccounts@default" level="1" position="2"/>
<tier agent="101" queue="onemetricreception@default" level="1" position="1"/>
<tier agent="102" queue="onemetricsupport@default" level="1" position="3"/>
<tier agent="102" queue="onemetricaccounts@default" level="1" position="3"/>
<tier agent="102" queue="onemetricreception@default" level="1" position="3"/>
<tier agent="103" queue="onemetricsupport@default" level="1" position="2"/>
<tier agent="103" queue="onemetricaccounts@default" level="1" position="1"/>
<tier agent="103" queue="onemetricreception@default" level="1" position="2"/>
</tiers>
关键配置项如下:
text
agent - 坐席名称
queue - 坐席所在队列的名称
position - 我们使用的是 top-down 策略,因此呼叫会优先分配给 position 值最小的坐席,
然后再依次往后分配。
最终配置如下:
xml
<configuration name="callcenter.conf" description="CallCenter">
<settings>
</settings>
<queues>
<queue name="onemetricsupport@default">
<param name="strategy" value="top-down"/>
<param name="moh-sound" value="$${hold_music}"/>
<param name="time-base-score" value="system"/>
<param name="max-wait-time" value="0"/>
<param name="max-wait-time-with-no-agent" value="0"/>
<param name="max-wait-time-with-no-agent-time-reached" value="20"/>
<param name="tier-rules-apply" value="false"/>
<param name="tier-rule-wait-second" value="300"/>
<param name="tier-rule-wait-multiply-level" value="true"/>
<param name="tier-rule-no-agent-no-wait" value="false"/>
<param name="discard-abandoned-after" value="60"/>
<param name="abandoned-resume-allowed" value="false"/>
</queue>
<queue name="onemetricreception@default">
<param name="strategy" value="top-down"/>
<param name="moh-sound" value="$${hold_music}"/>
<param name="time-base-score" value="system"/>
<param name="max-wait-time" value="0"/>
<param name="max-wait-time-with-no-agent" value="0"/>
<param name="max-wait-time-with-no-agent-time-reached" value="20"/>
<param name="tier-rules-apply" value="false"/>
<param name="tier-rule-wait-second" value="300"/>
<param name="tier-rule-wait-multiply-level" value="true"/>
<param name="tier-rule-no-agent-no-wait" value="false"/>
<param name="discard-abandoned-after" value="60"/>
<param name="abandoned-resume-allowed" value="false"/>
</queue>
<queue name="onemetricaccounts@default">
<param name="strategy" value="top-down"/>
<param name="moh-sound" value="$${hold_music}"/>
<param name="time-base-score" value="system"/>
<param name="max-wait-time" value="0"/>
<param name="max-wait-time-with-no-agent" value="0"/>
<param name="max-wait-time-with-no-agent-time-reached" value="20"/>
<param name="tier-rules-apply" value="false"/>
<param name="tier-rule-wait-second" value="300"/>
<param name="tier-rule-wait-multiply-level" value="true"/>
<param name="tier-rule-no-agent-no-wait" value="false"/>
<param name="discard-abandoned-after" value="60"/>
<param name="abandoned-resume-allowed" value="false"/>
</queue>
</queues>
<agents>
<agent name="101" type="callback" contact="[call_timeout=60]user/101" status="Logged Out" max-no-answer="3" wrap-up-time="10" reject-delay-time="30" busy-delay-time="60" no-answer-delay-time="10" />
<agent name="102" type="callback" contact="[call_timeout=60]user/102" status="Logged Out" max-no-answer="3" wrap-up-time="10" reject-delay-time="30" busy-delay-time="60" no-answer-delay-time="10" />
<agent name="103" type="callback" contact="[call_timeout=60]user/103" status="Logged Out" max-no-answer="3" wrap-up-time="10" reject-delay-time="30" busy-delay-time="60" no-answer-delay-time="10"/>
</agents>
<tiers>
<tier agent="101" queue="onemetricsupport@default" level="1" position="1"/>
<tier agent="101" queue="onemetricaccounts@default" level="1" position="2"/>
<tier agent="101" queue="onemetricreception@default" level="1" position="1"/>
<tier agent="102" queue="onemetricsupport@default" level="1" position="3"/>
<tier agent="102" queue="onemetricaccounts@default" level="1" position="3"/>
<tier agent="102" queue="onemetricreception@default" level="1" position="3"/>
<tier agent="103" queue="onemetricsupport@default" level="1" position="2"/>
<tier agent="103" queue="onemetricaccounts@default" level="1" position="1"/>
<tier agent="103" queue="onemetricreception@default" level="1" position="2"/>
</tiers>
</configuration>
接下来,我们需要让呼叫进入这些队列。我们有一个 IVR,它会将呼叫分发到调用 mod_callcenter 应用的分机。
在 conf/ivr_menus/Level1OneMetric.xml 中,我们有如下配置:
xml
<include>
<menu name="Level1OneMetric"
greet-long="say:Welcome to One Metric. Press 1 for support, 2 for accounts, 3 for reception or 4 to join a confrence call"
greet-short="say:Welcome to One Metric. Press 1 for support, 2 for accounts, 3 for reception or 4 to join a confrence call"
invalid-sound="ivr/ivr-that_was_an_invalid_entry.wav"
exit-sound="voicemail/vm-goodbye.wav"
confirm-macro=""
confirm-key=""
tts-engine="flite"
tts-voice="slt"
confirm-attempts="3"
timeout="3000"
inter-digit-timeout="2000"
max-failures="3"
max-timeouts="3"
digit-len="4">
<entry action="menu-exec-app" digits="1" param="transfer 450 XML default"/> <!-- Support -->
<entry action="menu-exec-app" digits="2" param="transfer 451 XML default"/> <!-- Accounts -->
<entry action="menu-exec-app" digits="3" param="transfer 452 XML default"/> <!-- Reception -->
</menu>
</include>
如你所见,根据用户选择的选项,呼叫会被发送到分机:
450451452
在 conf/dialplan/default.xml 中,我们配置了这些分机:
xml
<!-- One Metric Support -->
<extension>
<ondition field="destination_number" expression="^(450)$">
<action application="set" data="caller_id_name=One Metric Support" />
<action application="set" data="call_timeout=60" />
<action application="set" data="originate_timeout=60" />
<action application="callcenter" data="onemetricsupport@default"/>
</condition>
</extension>
<!-- One Metric Accounts -->
<extension>
<ondition field="destination_number" expression="^(451)$">
<action application="set" data="caller_id_name=One Metric Accounts" />
<action application="callcenter" data="onemetricaccounts@default"/>
</condition>
</extension>
<!-- One Metric Reception -->
<extension>
<ondition field="destination_number" expression="^(452)$">
<action application="set" data="caller_id_name=One Metric Reception" />
<action application="callcenter" data="onemetricreception@default"/>
</condition>
</extension>
我们修改了 caller_id_name 变量。这个变量会显示在电话上,这样坐席就能知道当前来电来自哪个队列。
接下来,我们需要一种方式让坐席登录到队列中。我们配置分机 300 用于坐席登录,分机 301 用于坐席登出:
xml
<!-- Log Out of the Call Queues -->
<extension name="agent_login">
<ondition field="destination_number" expression="^300$">
<action application="set" data="res=${callcenter_config(agent set status ${caller_id_number} 'Available')}" />
<action application="answer" data=""/>
<action application="sleep" data="500"/>
<action application="playback" data="ivr/ivr-you_are_now_logged_in.wav"/>
<action application="hangup" data="NORMAL_CLEARING"/>
</condition>
</extension>
<!-- Log Into the Call Queues -->
<extension name="agent_logoff">
<ondition field="destination_number" expression="^301$">
<action application="set" data="res=${callcenter_config(agent set status ${caller_id_number} 'Logged Out')}" />
<action application="answer" data=""/>
<action application="sleep" data="500"/>
<action application="playback" data="ivr/ivr-you_are_now_logged_out.wav"/>
<action application="hangup" data=""/>
</condition>
</extension>
现在,我们可以在电话上配置线路按键,用于登录和登出呼叫队列。可以通过添加以下扩展功能实现:
text
Login - fnc=blf+sd+cp;sub=300@$PROXY;ext=300@$PROXY
Logout - fnc=blf+sd+cp;sub=301@$PROXY;ext=301@$PROXY
完成修改后,需要在 CLI 中执行 reload mod_callcenter:
text
freeswitch@internal> reload mod_callcenter
需要了解的命令
显示呼叫队列:
text
freeswitch@internal> callcenter_config queue list
显示某个队列中的呼叫:
text
freeswitch@internal> callcenter_config queue list members onemetricsupport@default
显示所有坐席:
text
freeswitch@internal> callcenter_config agent list
显示队列中的所有坐席:
text
freeswitch@internal> callcenter_config tier list agents
延伸阅读和参考资料
text
wiki.freeswitch.org/wiki/Main_Page
wiki.freeswitch.org/wiki/Mod_callcenter