队列与 ACD

ACD(Automatic Call Distribution)是呼叫中心的核心引擎,负责将排队中的呼叫智能分配给合适的坐席。

1. ACD 架构

入局呼叫
    │
    ▼
队列 (Queue)
    │
    ├── 优先级排序
    ├── 时段检查
    ├── 溢出判断
    │
    ▼
坐席选择 (Strategy)
    │
    ├── 技能过滤
    ├── 策略算法
    │
    ▼
分配给坐席 ──► 坐席振铃 ──► 接听/未接

2. ACD 策略配置

2.1 策略结构

# 在 ACD 配置中定义策略
[acd]
enabled = true
default_policy = "support"

[acd.policies.support]
name = "Support Policy"

[acd.policies.support.priority]
wait_time_weight = 1.0
base_priority = 0
fifo_within_same_priority = true

[acd.policies.support.strategy]
strategy_type = "longest_idle"     # 核心算法
max_concurrent_calls = 1

[acd.policies.support.overflow]
triggers = [
  { type = "timeout", value = 120, action = "overflow" }
]
chain = ["voicemail"]
retry_per_target = 1

2.2 坐席分配算法

算法说明适用场景
longest_idle最长空闲优先(默认)均匀分配工作量
least_answered最少接听数优先新坐席保护
round_robin轮询均匀分配
skill_based技能综合评分多技能坐席
random随机特殊场景

2.3 技能评分算法

skill_based 策略使用加权评分:

得分 = 技能匹配度 × 0.6 + 空闲时长 × 0.3 + 优先级 × 0.1

权重可在策略配置中自定义:

[acd.policies.support.strategy]
strategy_type = "skill_based"
max_concurrent_calls = 2
require_exact_skill = false

[acd.policies.support.strategy.skill_weights]
skill_match = 0.6
idle_time = 0.3
priority = 0.1

3. 优先级排队

3.1 优先级计算

优先级分 = base_priority + vip_bonus + wait_time × wait_time_weight
参数说明默认值
base_priority基础分0
vip_bonusVIP 等级加分(按等级映射)无
wait_time_weight等待时间每秒加分1.0

3.2 VIP 配置

[acd.policies.support.priority]
base_priority = 0
wait_time_weight = 1.5

[acd.policies.support.priority.vip_bonus]
gold = 100
silver = 50
bronze = 20

3.3 排队规则

  • 同优先级内 FIFO(先到先服务)
  • 高优先级呼叫始终优先分配
  • 等待时间越长,优先级越高(防止饥饿)

4. 溢出处理

4.1 溢出模式(0.5+)

技能组的 overflow_mode 决定溢出链的推进方式:

模式行为
replace(默认)溢出后呼叫转移到链中下一个技能组
cumulative累积式升级——追加更多技能组,原组与溢出组同时振铃
sequential顺序式溢出——呼叫在当前队列停留 threshold_secs 后出队,按链顺序重新排入下一个溢出技能组;链尾保持等待至全局 max_wait

顺序式模式避免了一次性惊扰所有溢出组——只有真正在上游耗尽时间的呼叫,才会打断下游坐席。

4.2 溢出触发条件

触发类型说明示例
timeout等待超时(秒)120 秒未分配
queue_length队列长度超限排队 ≥ 50 人
no_agents无可用坐席所有坐席离线

4.3 溢出目标链

按顺序尝试,每个目标最多重试 N 次:

[[acd.policies.support.overflow.chain]]
skill_group = { id = "senior" }    # 先溢出到高级组

[[acd.policies.support.overflow.chain]]
"voicemail" = {}                   # 再到语音信箱
目标类型说明
skill_group溢出到其他技能组
voicemail转语音信箱
callback创建回呼任务
back_to_ivr返回 IVR
hangup挂断

4.4 溢出事件与等待深度(0.5+)

  • 链上每一次移交都会发出 overflow_joined 事件,主管可以准确看到呼叫处于升级路径的哪一环。
  • 等待深度按队列统计——多队列坐席在控制台看到的是每个队列的准确计数,而不是混在一起的单一数字。

4.5 跨节点严格 FIFO

集群部署下,派单门控强制跨节点严格 FIFO:在节点 A 等待更久的呼叫,会先于节点 B 上的新呼叫被派给 B 上注册的坐席,消除朴素的节点内排队带来的“插队“问题。

4.6 队列等待音(0.5+)

设置 PBX 级的队列默认等待音:

[proxy]
queue_hold_music = "sounds/hold-music.wav"

队列自身的等待音([proxy.queues.<name>.hold].audio_file)优先于默认值;呼叫者等待时听到循环音乐,而不是静默。

5. 时段规则

5.1 工作时间

[acd.policies.support.schedule]
[acd.policies.support.schedule.business_hours]
start = "09:00"
end = "18:00"
timezone = "Asia/Shanghai"

5.2 节假日

[acd.policies.support.schedule.holidays]
"2026-01-01" = { name = "元旦", overflow_chain = ["voicemail"] }
"2026-02-17" = { name = "春节", overflow_chain = ["back_to_ivr"] }

5.3 夜间模式

[acd.policies.support.schedule.night_mode]
enabled = true
start = "18:00"
end = "09:00"
action = "voicemail"

6. 队列管理 API

操作端点说明
查看队列状态GET /cc/queue-detail排队数、等待时长
实时统计GET /cc/realtime所有队列实时数据
ACD 配置GET /cc/acd/policies策略列表
导出配置POST /cc/acd/export导出为 TOML
重载配置POST /cc/acd/reload重新加载
ACD 诊断GET /cc/acd/diagnostics检查配置问题

7. 通话事件

ACD 分配过程中产生事件(通过 Queue Event 系统):

  • Enqueued:呼叫入队
  • AgentAssigned:分配坐席
  • AgentRinging:坐席振铃
  • AgentAnswered:坐席接听
  • AgentNoAnswer:坐席未接
  • Dequeued:出队(超时/取消)
  • OverflowJoined(0.5+):呼叫进入溢出技能组

事件以队列信号类型承载,并携带解析后的坐席与入队追踪信息,每次派单决策事后均可审计。

8. 弹屏头字段(0.5+)

派单给坐席时,RustPBX 会在坐席 INVITE 上携带 Call-Info 与 User-to-User(RFC 7433) 头——并在动态拨号列表重拨时重新解析这些头,弹屏数据在重振与转接后依然保留,而不只是第一次振铃。话务台客户端利用这些头在振铃时刻弹出客户资料。

9. 配置参考

选项作用域取值 / 默认效果
enabled[acd]bool总开关
default_policy[acd]策略名未单独配置的队列使用的策略
priority.wait_time_weightpolicy浮点,1.0每秒等待时长加权
priority.base_prioritypolicy整数,0起始分值
priority.vip_bonus.<tier>policy整数映射等级加分(gold/silver/…)
priority.fifo_within_same_prioritypolicybool,true同优先级内 FIFO
strategy.strategy_typepolicylongest_idle | least_answered | round_robin | skill_based | random派单算法
strategy.max_concurrent_callspolicy整数,1坐席同时通话数
strategy.require_exact_skillpolicybool,false全技能匹配 vs 任一技能
strategy.skill_weights.*policy浮点skill_match / idle_time / priority 权重
overflow.mode技能组replace | cumulative | sequential溢出链推进方式
overflow.chainpolicy数组有序目标(skill_group/voicemail/callback/back_to_ivr/hangup)
overflow.retry_per_targetpolicy整数,1每个目标重试次数
schedule.business_hourspolicystart/end/timezone工作时间
schedule.night_modepolicyenabled/start/end/action非工作时段动作
schedule.holidays.<date>policyname + overflow_chain分节假日行为
max_wait_secs技能组整数,0 = 无限硬性等待上限
sla_target_secs技能组整数,30报表用 SLA 目标
queue_hold_music[proxy]路径/URL队列默认等待音

队列管理接口:GET /cc/queue-detail、GET /cc/realtime、GET /cc/acd/policies、POST /cc/acd/export、POST /cc/acd/reload、GET /cc/acd/diagnostics。