暂时停泊通话并确保未接听时自动返回。
此脚本将通话置于保持状态以释放您的分机。然后通过在设定时间后返回通话来确保通话不会被遗忘。
“自动返回个人停泊”脚本使用户能够暂时停泊通话并释放分机用于其他任务。如果停泊的通话在指定时间内(例如15秒)未被接听,系统会自动将通话返回到您的分机。等待时,来电者会听到等候音乐。
如何设置您的脚本
- 转到管理控制台 > 集成 > 通话脚本。
- 从商店中选择添加并选择自动返回个人停泊。
- 指定一个便于识别的名称。
- 将其配置为在用户拨打拨号代码时运行。
- 设置您选择的拨号代码 – 例如55
- 将设置应用为系统范围。
您的座席如何使用此脚本
- 在分机上接听来电。
- 使用IP电话或软电话的盲转选项将通话转接到上面设置的指定拨号代码。
- 来电者将在设定的时间内听到等候音乐 – 例如15秒。
- 如果未接听,通话将自动返回到原始分机。
为什么使用此脚本?
- 释放您的分机:在通话等待时处理其他任务。
- 故障保护:确保不会遗漏任何停泊的通话。
- 可定制:根据不同的停泊场景或持续时间调整脚本。
需要了解的事项
- 系统使用自动取消停泊遗忘通话选项提供类似功能。
- 此脚本展示了通话处理脚本的灵活性,可以针对其他用例进行修改。
示例脚本
免责声明!此脚本仅供参考。要获取最新版本,请从商店下载。
脚本:自动返回个人停泊
#nullable disable
using CallFlow;
using System;
using System.Threading;
using System.Threading.Tasks;
using TCX.Configuration;
using TCX.PBXAPI;
namespace dummy
{
public class ParkingRoutePointSample : ScriptBase
{
async Task ProcessAutoPickup(RoutePoint sp, DestinationStruct returnTo, CancellationToken token)
{
while (true)
try
{
return await Task.Delay(TimeSpan.FromSeconds(15), token).ContinueWith(x =>
{
MyCall.Trace("{0} - automatic redirection of the call from {1}.{2} to '{3}'", MyCall.DN, MyCall.Caller?.CallerID, MyCall.Caller?.DN, returnTo);
return MyCall.RouteToAsync(new RouteRequest
{
RouteTarget = returnTo,
TimeOut = TimeSpan.FromSeconds(15) //will ring until failure
}
);
}
, TaskContinuationOptions.NotOnCanceled).Unwrap();
}
catch (OperationFailed ex)
{
MyCall.Trace("Automatic redirection failed: {0}", ex.TheResult);
MyCall.Trace("Continue hold call from {0}({1}) on {2}", MyCall.Caller?.CallerID, MyCall.Caller?.DN, MyCall.DN);
continue;
}
}
PhoneSystem ps = null; public override async Task StartAsync()
{
ps = MyCall.PS as PhoneSystem;
CallControlResult lastresult = null;
DN referredBy = null;
RoutePoint thisPark = null;
string callerID = "";
DN callerDN = null;
try
{
referredBy = MyCall.ReferredByDN?.GetFullSnapshot() as Extension;
thisPark = MyCall.DN?.Clone() as RoutePoint;
callerID = MyCall.Caller?.CallerID;
callerDN = MyCall.Caller?.DN?.Clone() as DN;
MyCall.Trace(
"Parked call from {0}({1}) on {2}", callerID, callerDN, thisPark
);
if (referredBy == null)
{
MyCall.Trace("{0} rejects call from {1}. Reason: No referrer specified", thisPark, callerDN);
return false;
}
var cancelationToken = new CancellationTokenSource();
MyCall.OnTerminated += () =>
{
cancelationToken.Cancel();
};
lastresult = await MyCall.AssureMedia().ContinueWith(
x =>
{
if(!string.IsNullOrWhiteSpace(ps.GetParameterValue("PARK_MOH_SOURCE")))
MyCall.SetBackgroundAudio(true, new string[] { ps.GetParameterValue("PARK_MOH_SOURCE") });
else
MyCall.SetBackgroundAudio(true, new string[] { ps.GetParameterValue("MUSICONHOLDFILE") });
return ProcessAutoPickup(thisPark, new DestinationStruct(referredBy), cancelationToken.Token);
}, TaskContinuationOptions.OnlyOnRanToCompletion).Unwrap();
return true;
}
catch (PBXIsNotConnected ex)
{
MyCall.Error($"Call control API is not available:\n{ex}");
}
catch (TaskCanceledException)
{
MyCall.Trace($"Call was disconnected from parking place");
}
catch (Exception ex)
{
MyCall.Error($"Parking failure:\n{ex}");
}
return false;
}
}
}