用CFD创建一个外呼拨号器

介绍

本文描述如何使用3CX CFD创建一个自动拨号应用程序。使用自动拨号器,您可以自动外呼,并且将呼叫连接到内部分机(例如队列或是坐席分机),因此您不需要花时间来拨号,这样提高了工作效率。

需要注意的是,当CFD收到第一个呼叫时,拨号器将开始工作,并且无限期地继续工作直到3CX CFD服务停止。因此,您需要使用“Create a Condition”组件来决定是否可以打电话。例如,您可以查看一天中的时间,如果今天是假期或是周末,您可以根据这一情况来决定是否可以打电话。如果没有这个逻辑,拨号器一旦启动就开始打电话,并且直到您停止3CX CFD服务才会停止。

要呼叫的号码列表可以在任何地方,例如在一个txt文件中,在一个数据库等等。本文中,我们将使用txt文件中的号码。我们也将演示如何将外呼限制在周一到周五的特定时间范围内,以及最后如何仅在坐席有空的时候才能呼出。

步骤一:创建项目

首先,我们需要创建一个新项目:
1.打开CFD进入File->New->Callflow Project,选择保存项目的文件夹,且输入此项目的名称,例如:OutboundDialerDemo。
2.项目默认包含了一个Main.flow的呼叫流。我们不用这个呼叫流,因此可以删除它。
3.添加一个新的Dialer到项目,在Project Explorer面板,右击项目名称选择New Dialer。
4.给新建的New Dialer命名为MainDialer,之后选中它并在Properties面板查看其属性。

您可以使用这些属性自定义Power Dialers的行为:
ParallerDialers:启动的同时拨号器实例的数目
PauseBetweenDialerExecution:每个实例流执行之间的延迟以秒计算。

为了更好的解释这一点,我们用一个简单的例子,如果我们设置ParallerDialers为3,PauseBetweenDialerExecution为30秒,结果是:

  1. 第一个拨号器实例被创建,获取号码拨打第一个电话。然后它等待30秒。
  2. 在10秒后,第二个拨号器实例被创建,获取号码后并拨打第二个电话。然后这个实例等待30秒;
  3. 在10秒后,第三个拨号器实例被创建,获取号码并拨打第三个呼叫。然后这个实例等待30秒;
  4. 在另一个10秒后,第一个实例从等待了30秒的状态中醒来,并拨打另一个电话;
  5. 在另一个10秒后,第二个实例从等待了30秒的状态中醒来,并拨打另一个电话;
  6. 以此类推

此迭代将继续进行下去直到3CX CFD服务停止,尽管此应用程序被删除或是新版本替换。因此,当您删除一个拨号器或是此应用程序更新到新版本的时候,您需要重启3CX CFD服务。

因此,我们使用这2个属性来控制呼叫通过率。将ParallerDialer设置为3,将PauseBetweenDialerExecution设置为30秒,此应用程序每分钟将拨打6个电话。如果我们需要更多或是更少,我们可以增加或是减少这些值。

步骤2:查看拨打电话的时间

本文中,我们希望拨号器仅在周一到周五的09:00到17:00之间拨打电话。为了实现这个,我们需要首先使用“Execute C#Code”组件确定当前时间是否在该时间范围内,然后使用“Create a Condition”组件根据结果来决定要执行的操作:

1.首先,将Execute C# Code 组件拖到设计器中,并修改名称为timeChecker,代码为:

return ((int)DateTime.Now.DayOfWeek) > 0 && ((int)DateTime.Now.DayOfWeek) < 6 && DateTime.Now.Hour >= 9 && DateTime.Now.Hour < 17;

设置如下:

2.接下来,将Create a Condition组件拖到设计器中,并设置名称为checkTimeToCall。配置分支分别为:

a.timeToCall:当时间匹配时的操作,设置此分支的Condition为Execute C# Code组件返回的结果。

b.nothingToDo:当不匹配时间时的操作;

步骤3:查看打电话的可用坐席

我们正在创建的拨号器对txt文件里的号码进行外呼,然后将这些呼叫连接到一个内部分机。内部分机是包含一些坐席的3CX队列,例如包含这些坐席分机201,202以及203的队列号码800。我们使用Execute C#组件里的3CX呼叫控制API查看这些分机是否有空来接受呼叫。

1.使用下面的C#代码作为我们需要调用的脚本,用来检查是否有空闲的分机来处理呼叫。代码是相当简单的,因为它为每个分机获取DN对象并查看他们是否有任何活跃的连接。将此代码保存在名称为CheckExtensionsState.cs的文件里,并放在项目的Libraries文件夹中。

using System;
using TCX.Configuration;
public class ExtensionStateHelper
{
public bool IsThereAnyFreeExtension()
{
return PhoneSystem.Root.GetDNByNumber(“201”).GetActiveConnections().Length == 0 ||
PhoneSystem.Root.GetDNByNumber(“202”).GetActiveConnections().Length == 0 ||
PhoneSystem.Root.GetDNByNumber(“203”).GetActiveConnections().Length == 0;
}
}

将工具箱里的Execute C# File组件拖放到设计器的timeToCall分支里,并命名为checkFreeExtensions,此组件的配置如下:

2.现在,我们需要查看此脚本的结果,checkFreeExtensions组件的下面使用另一个Create a Condition组件。将此组件命名为isThereAnyFreeExtension,并将两个分支命名为yesMakeCall和noFreeExtensions。设置分支yesMakeCall的condition为之前脚本返回的值:

步骤4:从txt文件获取号码并拨打

在这个例子中,我们从txt文件中获取号码来拨打,例如,NumbersToCall.txt,每行一个号码:

1.为了获取要拨打的号码,我们需要一个index变量,从txt文件中选择要读取的行,此行我们需要在所有并行拨号器之间共享。这样,当我们增加index时,下面的拨号器实例使用递增的index,以此类推。为此,我们需要添加一个新的组件Execute C# File,并在文件CallIndexHolder.cs的代码中添加一个静态变量,也将此cs文件放在项目Libraries文件夹中,代码为:

using System;
public class CallIndexHolder
{
private static int callIndex = 0;
public int GetCallIndex()
{
return callIndex;
}
public void SetCallIndex(int index)
{
callIndex = index;
}
}

注意:变量callIndex被声明为静态的,在整个3CX呼叫流服务器服务进程中只存在该变量的一个实例,在所有拨号器实例之间共享。
将Execute C# File组件拖放到分支yesMakeCall的下面,命名为getCallIndex,设置为:

2.我们需要从txt文件中读取号码来拨打:添加一个新的组件Read/Write to File,放在getCallIndex组件的下面,命名为readNumberToCall,配置为:

这里文件的路径根据实际情况来设置。

3.Index可能超过了txt文件的行数,意思是组件readNumberToCall读取了一个空字符串。为了在打电话之前查看是否存在这种情况,我们需要添加另一个组件Create a Condition来验证这种情况,并将此组件命名为checkNumberAvailable,使用单个分支查看是否有可用的号码,将单个分支命名为numberAvailable,设置单个分支的condition为GREAT_THAN(LEN(readNumberToCall.Result),0)

4.当条件匹配时,我们会有一个号码拨打。接着我们使用另一个组件Execute C# File来递增CallIndex,将此组件命名为incrementCallIndex,设置为:

Input parameters:
Name: index
Type: Int32
Value: SUM(1,getCallIndex.ReturnValue)

5.最后我们用组件Make Call来拨打电话,设置为:

使用这个配置,我们可以从txt文件拨打号码给队列800。外部号码被设置为呼叫源,因此3CX首先呼叫外部号码,仅当呼叫被连接的时候,3CX呼叫队列并将两者绑定在一起。

步骤5:将CFD部署到3CX服务器。

项目已准备好构建并上传到我们的3CX电话系统服务器,步骤如下:

  1. 选择Build->Build All,CFD将产生文件OutboundDialerDemo.zip;
  2. 登录3CX管理控制台,高级-》呼叫流程app-》添加更新,上传上一步生成的文件;
  3. 一旦呼叫流程app接受到呼叫,拨号程序就可以开始呼叫。