loading

暂时停泊通话并确保未接听时自动返回。

此脚本将通话置于保持状态以释放您的分机。然后通过在设定时间后返回通话来确保通话不会被遗忘。

“自动返回个人停泊”脚本使用户能够暂时停泊通话并释放分机用于其他任务。如果停泊的通话在指定时间内(例如15秒)未被接听,系统会自动将通话返回到您的分机。等待时,来电者会听到等候音乐。

如何设置您的脚本

  1. 转到管理控制台 > 集成 > 通话脚本。
  2. 从商店中选择添加并选择自动返回个人停泊。
  3. 指定一个便于识别的名称。
  4. 将其配置为在用户拨打拨号代码时运行。
  5. 设置您选择的拨号代码 – 例如55
  6. 将设置应用为系统范围。

您的座席如何使用此脚本

  1. 在分机上接听来电。
  2. 使用IP电话或软电话的盲转选项将通话转接到上面设置的指定拨号代码。
  3. 来电者将在设定的时间内听到等候音乐 – 例如15秒。
  4. 如果未接听,通话将自动返回到原始分机。

为什么使用此脚本?

  1. 释放您的分机:在通话等待时处理其他任务。
  2. 故障保护:确保不会遗漏任何停泊的通话。
  3. 可定制:根据不同的停泊场景或持续时间调整脚本。

需要了解的事项

  • 系统使用自动取消停泊遗忘通话选项提供类似功能。
  • 此脚本展示了通话处理脚本的灵活性,可以针对其他用例进行修改。

示例脚本

免责声明!此脚本仅供参考。要获取最新版本,请从商店下载。

脚本:自动返回个人停泊

  
#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;  
}  
}  
}