呼叫中心系统queues 怎样配置?

简介: 呼叫中心系统queues 怎样配置?

strategy


The strategy defines how calls are distributed in a queue. A table of different strategies can be found below.


  • ring-all: Rings all agents simultaneously.(全响)
    全部坐席响铃。
  • longest-idle-agent: Rings the agent who has been idle the longest taking into account tier level.(空闲时间)
    下面是longest-idle-agent模式派话使用的SQL,通过分析下面的SQL,可以看出是 根据 tiers.level, agents.last_bridge_end, tiers.position 这3个参数来排序的。last_bridge_end是坐席最后通话结束时间。
    | ``` SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position, tiers.level, agents.type, agents.uuid, external_calls_count FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY level, agents.last_bridge_end, position


| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
复制代码


  • round-robin: Rings the agent in position but remember last tried agent.(循环)
    下面是round-robin模式派话使用的SQL,通过分析下面的SQL,可以看出是按照 tiers_level 从小到大, tiers_position 从小到大,agents_last_offered_call 从小到大 循环分配坐席的。 。agents.last_offered_call 是最近一次呼叫坐席的时间。


| ``` SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position as tiers_position, tiers.level as tiers_level, agents.type, agents.uuid, external_calls_count, agents.last_offered_call as agents_last_offered_call, 1 as dyn_order FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') AND tiers.position > (SELECT tiers.position FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND agents.last_offered_call > 0 ORDER BY agents.last_offered_call DESC LIMIT 1) AND tiers.level = (SELECT tiers.level FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND agents.last_offered_call > 0 ORDER BY agents.last_offered_call DESC LIMIT 1) UNION SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position as tiers_position, tiers.level as tiers_level, agents.type, agents.uuid, external_calls_count, agents.last_offered_call as agents_last_offered_call, 2 as dyn_order FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY dyn_order asc, tiers_level, tiers_position, agents_last_offered_call


| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
复制代码


  • top-down: Rings the agent in order position starting from 1 for every member.(指定开始位置)
    通道变量 cc_last_agent_tier_levelcc_last_agent_tier_position 默认值为0.
    查找座席的排序算法为,先查找 level 等于 cc_last_agent_tier_level ,position 大于 cc_last_agent_tier_position 的坐席,然后按照 tiers_level , tiers_position , agents_last_offered_call 排序所有坐席。


| ``` SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position as tiers_position, tiers.level as tiers_level, agents.type, agents.uuid, external_calls_count, agents.last_offered_call as agents_last_offered_call, 1 as dyn_order FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') AND tiers.position > 0 AND tiers.level = 0 UNION SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position as tiers_position, tiers.level as tiers_level, agents.type, agents.uuid, external_calls_count, agents.last_offered_call as agents_last_offered_call, 2 as dyn_order FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY dyn_order asc, tiers_level, tiers_position, agents_last_offered_call


| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
复制代码


  • agent-with-least-talk-time: Rings the agent with least talk time.(通话时间)
    按照tiers.level, agents.talk_time, tiers.position排序坐席。agents.talk_time是坐席的通话时间。
    启动或者坐席签入时agents.talk_time会复位为0.
    | ``` SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position, tiers.level, agents.type, agents.uuid, external_calls_count FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY level, agents.talk_time, position


| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
复制代码


  • agent-with-fewest-calls: Rings the agent with fewest calls.(通话次数)
    按照tiers.level, agents.calls_answered, tiers.position排序坐席。agents.calls_answered是坐席的通话次数。
    启动或者坐席签入时agents.calls_answered会复位为0.
  • sequentially-by-agent-order: Rings agents sequentially by tier & order.(顺序)
    按照 tiers_level , tiers_position , agents_last_offered_call 排序所有坐席
    | ``` SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position, tiers.level, agents.type, agents.uuid, external_calls_count FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY level, position, agents.last_offered_call


| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
复制代码


  • random: Rings agents in random order.(随机)
    按照tiers.level顺序然后随机排序。
    如果连接mysql数据库,mod_callcenter.源代码需要修改一下。
    | ``` 2550 sql_order_by = switch_mprintf("level, random()"); 修改为 2550 sql_order_by = switch_mprintf("level, rand()");


| -------------------------------------------------------------------------------------------------------------------------- |
派话SQL
| ```
SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position, tiers.level, agents.type, agents.uuid, external_calls_count FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY level, random() 
``` |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
复制代码


  • ring-progressively: Rings agents in the same way as top-down, but keeping the previous members ringing (it basically leads to ring-all in the end).(渐进)
    按照tiers.leveltiers.position排序坐席。每 ring_progressively_delay 秒,增加分配一个坐席。


派话SQL
| ``` SELECT system, name, status, contact, no_answer_count, max_no_answer, reject_delay_time, busy_delay_time, no_answer_delay_time, tiers.state, agents.last_bridge_end, agents.wrap_up_time, agents.state, agents.ready_time, tiers.position, tiers.level, agents.type, agents.uuid, external_calls_count FROM agents LEFT JOIN tiers ON (agents.name = tiers.agent) WHERE tiers.queue = 'support@default' AND (agents.status = 'Available' OR agents.status = 'On Break' OR agents.status = 'Available (On Demand)') ORDER BY level, position


| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
默认值*longest-idle-agent*.
复制代码


moh-sound


The system will playback whatever you specify to incoming callers. You can use any type of input here that is supported by the FreeSWITCH playback system:

  1. A direct path to a .wav file will play in a loop indefinitely.
  2. The local stream, e.g. (local_stream://moh) or use $${hold_music} as defined in the default configuration.
  3. The FreeSWITCH phrase system, e.g., (phrase:my-special-phrase). (I use this to play multiple prompts after each other.)
  4. A tone stream as with ringing, e.g., (tone_stream://${us-ring};loops=-1).


等待音乐,通道变量cc_moh_override可以覆盖这个设置。


announce-sound


坐席没接听之前周期性播放的通知声音,比如(现在是电话高峰期,请你耐心等待。)


announce-frequency


announce-sound 的播放周期,单位秒。注意播放声音文件的时间也包含在内。


record-template


Use the record-template to save your recording wherever you would like on the filesystem. It’s not uncommon for this setting to start with “$${base_dir}/recordings/“. Whatever directory you choose, make sure it already exists and that FreeSWITCH has the required permissions to write to it.


time-base-score


When a caller goes into a queue, we can add to their base score the total number of seconds they have been in the system. This enables the caller to get in front of other callers by the amount of time they have already spent waiting elsewhere.


The time-base-score param in a queue can be set as ‘queue’ (base score counts only the time the caller is in this queue) or ‘system’ (base score accounts for the total time of the call).


This can be either ‘queue’ or ‘system’ (queue is the default). If set to system, it will add the number of seconds since the call was originally answered (or entered the system) to the caller’s base score. Raising the caller’s score allows them to receive priority over other calls that might have been in the queue longer but not in the system as long. If set to queue, you get the default behavior, i.e., nobody’s score gets increased upon entering the queue (regardless of the total length of their call).


默认值 queue 。为 queue 时,数据库members.base_score值是 进入队列的时间+cc_base_score。为 systemmembers.base_score值是 应答时间+cc_base_score。\


| ``` /* Add manually imported score / if (cc_base_score) { cc_base_score_int += atoi(cc_base_score); }  / If system, will add the total time the session is up to the base score */ if (!switch_strlen_zero(start_epoch) && !strcasecmp("system", queue->time_base_score)) { cc_base_score_int += ((long) local_epoch_time_now(NULL) - atol(start_epoch)); }


| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#ring-progressively-delay "ring-progressively-delay")ring-progressively-delay
Default to 10. The value is in seconds, and it will define the delay to wait before starting call to the next agent when using the ‘ring-progressively’ queue strategy.
strategy等于[ring-progressively](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/ring-progressively)时,增加坐席间隔。默认10秒。
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#tier-rules-apply "tier-rules-apply")tier-rules-apply
Can be True or False. This defines if we should apply the following tier rules when a caller advances through a queue’s tiers. If False, they will use all tiers with no wait.
是否启动tier规则,默认值False。启动等级规则后,需要等待一定时间后,才会分配高等级的坐席。下面是mod_callcenter.c的实现代码。\
| ```
/* Check if we switch to a different tier, if so, check if we should continue further for that member */  if (cbt->tier_rules_apply == SWITCH_TRUE && atoi(agent_tier_level) > cbt->tier) {   /* Continue if no agent was logged in in the previous tier and noagent = true */  if (cbt->tier_rule_no_agent_no_wait == SWITCH_TRUE && cbt->tier_agent_available == 0) {     cbt->tier = atoi(agent_tier_level);     /* Multiple the tier level by the tier wait time */   } else if (cbt->tier_rule_wait_multiply_level == SWITCH_TRUE && (long) local_epoch_time_now(NULL) - atol(cbt->member_joined_epoch) >= atoi(agent_tier_level) * (int)cbt->tier_rule_wait_second) {     cbt->tier = atoi(agent_tier_level);     cbt->tier_agent_available = 0;    /* Just check if joined is bigger than next tier wait time */   } else if (cbt->tier_rule_wait_multiply_level == SWITCH_FALSE && (long) local_epoch_time_now(NULL) - atol(cbt->member_joined_epoch) >= (int)cbt->tier_rule_wait_second) {     cbt->tier = atoi(agent_tier_level);     cbt->tier_agent_available = 0;  } else {    /* We are not allowed to continue to the next tier of agent */    return 1;   } } cbt->tier_agent_available++; 
``` |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#tier-rule-wait-second "tier-rule-wait-second")tier-rule-wait-second
The time in seconds that a caller is required to wait before advancing to the next tier. This will be multiplied by the tier level if tier-rule-wait-multiply-level is set to True. If tier-rule-wait-multiply-level is set to false, then after tier-rule-wait-second’s have passed, all tiers are open for calls in the tier-order and no advancement (in terms of waiting) to another tier is made.
等待时间。
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#tier-rule-wait-multiply-level "tier-rule-wait-multiply-level")tier-rule-wait-multiply-level
Can be True or False. If False, then once tier-rule-wait-second is passed, the caller is offered to all tiers in order (level/position). If True, the tier-rule-wait-second will be multiplied by the tier level and the caller will have to wait on every tier tier-rule-wait-second’s before advancing to the next tier.
为True时,等待时间大于 `tier-rule-wait-second` * `tier.level` 才会分配下一个等级的坐席。为False时,等待时间大于 `tier-rule-wait-second` 才会分配下一个等级的坐席。默认值False。
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#tier-rule-no-agent-no-wait "tier-rule-no-agent-no-wait")tier-rule-no-agent-no-wait
Can be True or False. If True, callers will skip tiers that don’t have agents available. Otherwise, they are be required to wait before advancing. Agents must be logged off to be considered not available.
最低level等级没有坐席是不用等待。默认值:False。
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#discard-abandoned-after "discard-abandoned-after")discard-abandoned-after
The number of seconds before we completely remove an abandoned member from the queue. When used in conjunction with abandoned-resume-allowed, callers can come back into a queue and resume their previous position.
未被坐席接通的排队信息保存时间,默认值60秒。
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#abandoned-resume-allowed "abandoned-resume-allowed")abandoned-resume-allowed
Can be True or False. If True, a caller who has abandoned the queue can re-enter and resume their previous position in that queue. In order to maintain their position in the queue, they must not abandoned it for longer than the number of seconds defined in ‘discard-abandoned-after’.
根据caller_id_number恢复之前的排队信息,默认False。
详解:如果上一次加入对列,未被坐席接听就挂断了,再次呼叫时可以恢复上次的排队信息,被更优先的分配到坐席。*discard-abandoned-after* 之前的信息是不能恢复的。
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#max-wait-time "max-wait-time")max-wait-time
Default to 0 to be disabled. Any value are in seconds, and will define the delay before we quit the callcenter application IF the member haven’t been answered by an agent. Can be used for sending call in voicemail if wait time is too long.
最大等待时间,单位秒。默认值0,就是禁用这个设置。例如,超过3分钟没坐席接听可以转到IVR或者语音信箱。
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#max-wait-time-with-no-agent "max-wait-time-with-no-agent")max-wait-time-with-no-agent
Default to 0 to be disabled. The value is in seconds, and it will define the amount of time the queue has to be empty (without logged agents, on a call or not) before we disconnect all members. This principle protects kicking all members waiting if all agents are logged off by accident.
队列为空时的最大等待时间。单位秒,默认值0,就是禁用这个设置。
什么是队列为空:队列没有坐席状态([Agent Status](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#Agent-Status))是 *Available* 、 *Available (On Demand)*  、 *On Break* 的坐席。
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#max-wait-time-with-no-agent-time-reached "max-wait-time-with-no-agent-time-reached")max-wait-time-with-no-agent-time-reached
Default to 5. Any value are in seconds, and will define the length of time after the max-wait-time-with-no-agent is reached to reject new caller. This allow for kicking caller if no agent are logged in for over 5 seconds, but new caller after that 5 seconds is reached can have a lower limit.
`max-wait-time-with-no-agent`不为0时这个值才有效,最小的等待时间为`max-wait-time-with-no-agent+max-wait-time-with-no-agent-time-reached`,默认值5。设置0就是禁用这个设置。
参数作用:为了解决加入队列时,队列就为空时`queue->last_agent_exist`为0,`queue->last_agent_exist_check - queue->last_agent_exist`无法计算队列空闲时间,进行第二次判段, `queue->last_agent_exist_check - m->t_member_called` 的结果是加入队列总共时间,当加入队列总时间大于`max-wait-time-with-no-agent+max-wait-time-with-no-agent-time-reached`,就离开队列。\
| ```
/* Make the Caller Leave if he went over his max wait time */ if (queue->max_wait_time > 0 && queue->max_wait_time <=  time_now - m->t_member_called) {   switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member_session), SWITCH_LOG_DEBUG, "Member %s <%s> in queue '%s' reached max wait time\n", m->member_cid_name, m->member_cid_number, m->queue_name);   m->member_cancel_reason = CC_MEMBER_CANCEL_REASON_TIMEOUT;  switch_channel_set_flag_value(member_channel, CF_BREAK, 2); }  /* Check if max wait time no agent is Active AND if there is no Agent AND if the last agent check was after the member join */ if (queue->max_wait_time_with_no_agent > 0 && queue->last_agent_exist_check > queue->last_agent_exist && m->t_member_called <= queue->last_agent_exist_check) {   /* Check if the time without agent is bigger or equal than out threshold */   if (queue->last_agent_exist_check - queue->last_agent_exist >= queue->max_wait_time_with_no_agent) {    /* Check for grace period with no agent when member join */     if (queue->max_wait_time_with_no_agent_time_reached > 0) {      /* Check if the last agent check was after the member join, and we waited atless the extra time  */       if (queue->last_agent_exist_check - m->t_member_called >= queue->max_wait_time_with_no_agent_time_reached + queue->max_wait_time_with_no_agent) {         switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member_session), SWITCH_LOG_DEBUG, "Member %s <%s> in queue '%s' reached max wait of %d sec. with no agent plus join grace period of %d sec.\n", m->member_cid_name, m->member_cid_number, m->queue_name, queue->max_wait_time_with_no_agent, queue->max_wait_time_with_no_agent_time_reached);        m->member_cancel_reason = CC_MEMBER_CANCEL_REASON_NO_AGENT_TIMEOUT;         switch_channel_set_flag_value(member_channel, CF_BREAK, 2);       }     } else {      switch_log_printf(SWITCH_CHANNEL_SESSION_LOG(member_session), SWITCH_LOG_DEBUG, "Member %s <%s> in queue '%s' reached max wait of %d sec. with no agent\n", m->member_cid_name, m->member_cid_number, m->queue_name, queue->max_wait_time_with_no_agent);       m->member_cancel_reason = CC_MEMBER_CANCEL_REASON_NO_AGENT_TIMEOUT;       switch_channel_set_flag_value(member_channel, CF_BREAK, 2);     }   } } 
``` |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#agent-no-answer-status "agent-no-answer-status")[agent-no-answer-status]()
如果坐席不应答次数超过[max-no-answer](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#max-no-answer)(Agent中设置),则设置坐席的状态为 *agent-no-answer-status* 的值。默认值 *On Break* 。其他值请参考[Agent Status](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/Agent-Status)。
#### [](http://www.ddrj.com/blogs/2021/11/20/mod-callcenter/index.html#skip-agents-with-external-calls "skip-agents-with-external-calls")skip-agents-with-external-calls
跳过有外部呼叫的座席,默认值true。意思就是如果一个坐席在呼出电话,或者接听不是mod_callcenter分配的电话时,是否跳过它,不分配话务给这个坐席。
仅仅设置这个参数,还是实现不了上面说的功能的,还需要`callcenter_track`这个app配合才可以。比如 1001坐席呼出时先执行一下`callcenter_track`。\
| ```
<action application="callcenter_track" data="1001@default"/> <action application="bridge" data="sofia/external/138XXXXXXXXX@sipserver"/> 
``` |
| -------------------------------------------------------------------------------------------------------------------------------------------------
复制代码


相关文章
|
12月前
使用OKCC呼叫中心系统的客户体验分析
案例1.某教培公司 招生旺季到来,很多教育机构都是以电话形式进行招生,回访学生家长,作为电销人员,每天的工作量特别特别大,号码需要一个一个手动输入再拨打,而且绝大部分都还是无效的,如空号、黑名单、没接通、没意向等等。 用我们OKCC人工坐席外呼系统就可以为电销人员一键呼叫,只需批量导入客户资料,无需手动输入号码,还可根据自身业务需求,灵活选取合适的呼叫方式。支持智能二次检测号码质量,过滤空号、错号、接通意向低等无效号码,提升外呼效率及员工积极性。
|
11月前
|
人工智能 中间件 Java
呼叫中心系统如果对接阿里灵积大模型
自chatgpt3.5发布以来,各种大模型飞速发展,各行各业都有接入大模型的需求,呼叫中心行业非常适合通过接入大模型用AI来回答用户的各种咨询,降低人力资源,使用顶顶通呼叫中心中间件,只需要100行不到的代码,就可以非常简单容易的让电话机器人系统,呼叫中心系统快速接入各种大模型
400 2
|
5月前
|
Web App开发 前端开发 JavaScript
如何快速与呼叫中心系统CTI/API/SDK接口集成
由于呼叫中心系统涉及通信、CTI、终端设备、中继线路等技术与概念,从事信息管理系统、ERP、CRM、工单系统等的研发人员一般不是非常熟悉这部分技术,当需要提供具备呼叫中心能力的解决方案时,往往要用较多的时间来研究这些相对复杂的技术,对接过程比较长,开发调试有一定的阻力,基于此,我们提出一种更加简便高效的集成方法,可以零代码集成呼叫中心平台,实现项目快速上线。
如何快速与呼叫中心系统CTI/API/SDK接口集成
|
5月前
|
存储 安全 网络安全
okcc呼叫中心系统如何实现客户号码脱敏?
OKCC系统实现号码脱敏的关键步骤包括: 数据加密:使用加密算法对客户号码进行存储加密。 数据脱敏展示:在系统界面上用星号或其他字符替换号码的部分或全部数字。 权限控制:限制对敏感号码数据的访问权限,仅授权人员可查看。 审计日志:记录所有敏感信息的访问和操作日志,以便追踪。 安全审核:定期进行安全检查和渗透测试,确保脱敏措施有效。
|
5月前
|
缓存
okcc呼叫中心系统坐席账户显示离线状态要怎么设置
如果 OKCC 坐席账户显示离线状态,可以尝试以下解决方案: 1. 检查网络连接:确保你的设备已连接到稳定的互联网网络。检查网络连接并重试登录,确保网络连接正常,并且没有任何限制或故障。 2. 重新登录:尝试退出 OKCC 坐席账户并重新登录。有时候重新登录可以解决账户离线状态的问题。 3. 清除缓存和数据:进入设备的设置,找到 OKCC 坐席应用,清除其缓存和数据。然后重新启动应用并尝试登录。 4.查看当前坐席创建的数量是否已超出坐席授权数量。 5. 登陆客户管理员账户,设置->业务中是否勾选“不允许通过web修改坐席状态”的选项。 6. 更新应用版本:确保你的 OKCC 坐席应
|
5月前
|
人工智能 安全 Ubuntu
vos3000网络电话系统怎样搭建?外呼系统ai智能呼叫中心搭建
要搭建VOS3000网络电话系统,可以按照以下步骤进行操作: 获取VOS3000软件:首先,你需要从正规渠道获取VOS3000软件安装包。VOS3000是商业软件,需要购买授权。 准备服务器:你需要准备一台专用服务器,操作系统通常建议选择Linux,如CentOS或Ubuntu等版本。确保服务器具备足够的硬件资源,如CPU、内存和存储空间。 安装操作系统:在服务器上安装所选的Linux操作系统,并进行基本的系统配置和安全设置。 安装VOS3000软件:运行VOS3000软件安装包,按照安装向导进行安装。需要提供购买软件时获得的授权密钥。 配置网络和端口:在服务器上配置网络设置和端口,
|
存储 数据采集 监控
okcc呼叫中心系统有什么优势
在随着企业的管理水平也在不断提高。企业经营管理中所涉及到的各种复杂问题都有逐渐凸显出来。传统的呼叫中心已无法满足企业服务需求和客户满意度变化的要求。因此通过呼叫中心系统将企业业务流程和数据整合起来进行管理和运营已经成为目前企业管理领域中较为流行和成熟之选。有关系统问题欢迎和博主交流。   优势一:提高工作效率 呼叫中心系统通过集成网络呼叫系统、电话、手机等各种通讯方式,实现客户的即时通讯和业务处理。并将多种业务流程集成到一起,提高了企业运作效率。同时各系统的通讯方式,为企业提供快速、灵活、可靠的信息沟通渠道,从而帮助企业实现了在用户需求发生时,能够及时、准确、有效地满足客户的需求。
|
机器人 数据中心
okcc呼叫中心系统搭建的方案方式
传统企业呼叫中心多采用 PC和手机软件,很难与客户保持良好的沟通。因此,需要建设一套呼叫中心系统来实现与客户实时有效沟通。那么,呼叫中心搭建的方案方式有哪些呢?有关系统问题欢迎和博主技术交流,下面详细介绍一下。   一:建设呼叫中心服务器   通过安装系统专用软件,实现呼叫中心系统的搭建,这种方式成本低,但不能实时运行,稳定性差,一旦出现故障,不能保障客服人员的正常工作。还有一种方式,是建设呼叫中心服务器,利用服务器来实现与客户及时沟通。这种方式成本高,但可根据需要灵活选择,其灵活性强。   二:搭建多机电话平台   传统的电话平台采用的是“分机”的方式,即一个呼叫中心有两个以上不同的
|
编解码
OKCC呼叫中心系统都有哪些功能
OKCC呼叫中心是一套完整的电话呼叫中心解决方案,它能够兼容市场上绝大多数的支持标准SIP协议的终端网关以及众方系传统的MGCP协议终端网关,并且经受住了市场的考验并获得了一致好评,业内有关其它厂商录音业务的痛点,在呼叫中心给出了很好的解决方案。下面我们来详细介绍相关内容。
|
数据库
外呼系统和呼叫中心系统的优势和特点
在金融投资、教育培训、保险、互联网、旅游、房地产、广告等行业服务或产品电话营销中;在节日促销、招商加盟、活动通知等项目中;作为企业的管理者的您,是否还在因为销售人员效率低,人员成本高等问题头疼? 其实,您只是需要一套功能强大的电话外呼系统,这些问题便可以迎刃而解,电话外呼系统,帮助企业轻松外呼,有序管理,节省成本,提升业绩。电话外呼系统的主要操作步骤就是一、将客户信息导入系统,二、利用系统的自动外呼功能将电话统一拨打出去,并把空号,关机,无人接听等电话自动过滤。当电话接通后,马上转接到坐席人员进行实时通话。这些功能都大大减少了人工手动操作的时间,这就是优势之一。有关系统问题欢迎和博主交流