ViciDial "Campaign Has No Dialable Leads" — List & Hopper Troubleshooting

掌握无拨打线索错误的根本原因,并通过系统化的列表验证、hopper 配置和数据库故障排除恢复完整的活动生产力。

前置要求

在进行故障排除前,请确保您已具备:

  • 对 ViciDial 服务器的 SSH 访问权限(具备 sudo 权限)
  • 通过 /vicidial/admin.php 访问 ViciDial Web 管理面板的权限
  • asterisk 数据库的 MySQL/MariaDB 命令行访问权限
  • 对 ViciDial 活动结构(列表、拨号程序、坐席)的基本理解
  • 检查 Asterisk 进程的 root 或 asterisk 用户权限
  • 最近的 ViciDial 数据库和配置文件备份
  • 一个已知线索数量的测试活动,用于验证

出现 "Campaign Has No Dialable Leads" 错误通常是因为:

  • 拨号程序尝试发起呼叫,但 hopper 队列为空
  • 线索列表中的所有记录已耗尽或被标记为不可拨打
  • 列表设置与活动配置冲突
  • ViciDial 与拨号程序之间的数据库连接中断
  • 线索过滤规则将所有记录从可拨打池中移除

理解 ViciDial 列表架构

ViciDial 中的线索生命周期

ViciDial 中的每条线索都会经历决定其可拨打性的状态。一个线索如果符合基于活动和列表配置的特定标准,则被视为“可拨打”。

线索状态:

  • NEW — 新线索,尚未联系
  • QUEUE — 已安排拨打
  • CALL — 正在拨打中
  • LEFT MESSAGE — 已留言
  • CALLED — 已联系但未完成
  • XFER — 已转接至其他部门
  • XFER SEND — 待转接
  • INCALL — 进行中的通话
  • CBHOLD — 回拨暂挂状态
  • CBSCHED — 已安排回拨
  • DNCC — 已编译的禁止来电
  • DNCL — 禁止来电列表

vicidial_list 表中的 status 字段控制线索是否可以再次拨打。大多数活动会设置最大拨打次数限制,以防止无限次重复拨打已耗尽的线索。

Hopper 机制

ViciDial hopper 是一个实时队列,用于将线索提供给可用的拨号程序。其运行方式如下:

  1. 查询:拨号程序请求符合活动标准的下一个可用线索
  2. 获取:系统根据过滤器从 vicidial_list 中提取记录
  3. 锁定:将线索标记为 QUEUE 以防止重复拨打
  4. 交付:将线索推送至拨号程序进行呼叫尝试
  5. 释放:根据结果更新线索的新状态和拨打次数

如果 hopper 返回零结果,则活动没有可拨打的线索。

前置要求验证清单

验证 ViciDial 安装

# Check ViciDial daemon status
systemctl status vicidial

# Verify Asterisk is running
asterisk -rx "core show version"

# Check MySQL/MariaDB connectivity
mysql -u cron -p -h localhost asterisk -e "SELECT VERSION();"

Enter fullscreen mode Exit fullscreen mode

确认数据库连接

# Test asterisk database access
mysql -u root -p -e "SELECT * FROM asterisk.vicidial LIMIT 1;"

# Verify vicidial_list table exists
mysql -u root -p asterisk -e "DESCRIBE vicidial_list;"

Enter fullscreen mode Exit fullscreen mode

检查 ViciDial 核心文件

# Confirm ViciDial admin path
ls -la /var/www/html/vicidial/admin.php

# Check CLI tools
ls -la /usr/share/astguiclient/

Enter fullscreen mode Exit fullscreen mode

如果任何命令失败,请先解决安装问题,再继续进行故障排除。

系统化故障排除流程

步骤 1:验证线索列表存在且包含记录

从最基本的检查开始——您的列表是否真的包含线索?

# Log into MySQL
mysql -u root -p asterisk

# Check list summary
SELECT list_id, list_name, active, list_size, 
       COUNT(*) as record_count 
FROM vicidial_lists 
LEFT JOIN vicidial_list ON vicidial_lists.list_id = vicidial_list.list_id
WHERE list_id = 'YOUR_LIST_ID'
GROUP BY list_id;

Enter fullscreen mode Exit fullscreen mode

预期输出: record_count 应大于 0 且与 list_size 一致。

如果 record_count 为 0,则您的列表从未被导入。请检查:

# Look for import logs in ViciDial web admin: Admin > Import Lists
# Or check the command line import tool:
/usr/share/astguiclient/VICIDIAL_IN_GROUP.pl --list-id YOUR_LIST_ID

# Check ViciDial load queue
SELECT * FROM vicidial_list_queue LIMIT 5;

Enter fullscreen mode Exit fullscreen mode

步骤 2:检查线索状态分布

导致“无拨打线索”最常见的原因是,所有线索都已被联系,且其状态阻止了重新拨打。

-- Check status breakdown for your list
SELECT list_id, status, COUNT(*) as count 
FROM vicidial_list 
WHERE list_id = 'YOUR_LIST_ID' 
GROUP BY list_id, status 
ORDER BY count DESC;

Enter fullscreen mode Exit fullscreen mode

预期输出示例:

+----------+--------+-------+
| list_id  | status | count |
+----------+--------+-------+
| LIST-001 | CALLED |  4850 |
| LIST-001 | NEW    |   150 |
| LIST-001 | QUEUE  |    12 |
+----------+--------+-------+

Enter fullscreen mode Exit fullscreen mode

如果 NEW 数量非常低或为零: 您的线索已耗尽或导入时的状态不正确。您需要重置或重新导入。

将所有线索重置为 NEW 状态:

UPDATE vicidial_list 
SET status = 'NEW', 
    dial_count = 0, 
    last_call_time = NULL 
WHERE list_id = 'YOUR_LIST_ID' 
LIMIT 10000;

-- Verify the update
SELECT COUNT(*) FROM vicidial_list 
WHERE list_id = 'YOUR_LIST_ID' AND status = 'NEW';

Enter fullscreen mode Exit fullscreen mode

步骤 3:验证活动配置

活动设置直接控制哪些线索被视为可拨打。

# Access the ViciDial web interface
# Navigate: Admin > Campaigns > [Your Campaign]
# OR query directly:

mysql -u root -p asterisk -e "SELECT * FROM vicidial_campaigns WHERE campaign_id = 'YOUR_CAMPAIGN' \G"

Enter fullscreen mode Exit fullscreen mode

需要检查的关键字段:

SELECT campaign_id, 
       active, 
       dial_method, 
       list_id, 
       max_dial_count,
       auto_dial_level,
       lead_filter_id,
       campaign_script_id,
       calls_in_queue_limit
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

Enter fullscreen mode Exit fullscreen mode

关键字段:

字段 预期值 问题
active Y 如果为 N,则活动已禁用
dial_method ADAPTMANUAL 错误的方法会阻止拨打
list_id 您的列表 ID 为空或错误的列表会阻止拨打
max_dial_count 通常为 3-5 过低会快速耗尽线索
auto_dial_level 1-9 0 会禁用自动拨打
lead_filter_id 通常为空 过滤器可能会排除所有线索

步骤 4:检查列表配置

# Via web admin: Admin > Lead Lists > [Your List]
# Or via MySQL:

mysql -u root -p asterisk -e "SELECT * FROM vicidial_lists WHERE list_id = 'YOUR_LIST_ID' \G"

Enter fullscreen mode Exit fullscreen mode

关键字段:

SELECT list_id, list_name, active, list_size, 
       project_area, script_id, lead_filter_id, 
       campaign_id_string 
FROM vicidial_lists 
WHERE list_id = 'YOUR_LIST_ID';

Enter fullscreen mode Exit fullscreen mode

检查列表是否标记为激活:

UPDATE vicidial_lists 
SET active = 'Y' 
WHERE list_id = 'YOUR_LIST_ID';

Enter fullscreen mode Exit fullscreen mode

步骤 5:实时检查 Hopper 队列

Hopper 是线索在拨打前立即暂存的地方。检查它是否已填充:

-- Check active hopper entries
SELECT campaign_id, count(*) as hopper_count 
FROM vicidial_hopper 
WHERE campaign_id = 'YOUR_CAMPAIGN' 
GROUP BY campaign_id;

-- View sample hopper records
SELECT hopper_id, campaign_id, status, priority, dialable_status 
FROM vicidial_hopper 
WHERE campaign_id = 'YOUR_CAMPAIGN' 
LIMIT 10;

Enter fullscreen mode Exit fullscreen mode

如果 hopper 为空: 拨号程序找不到符合活动标准的线索。

手动填充 hopper(用于测试):

# Use the ViciDial CLI tool to load hopper
/usr/share/astguiclient/VICIDIAL_hopper_loader.pl --campaign-id YOUR_CAMPAIGN --queue-size 100

Enter fullscreen mode Exit fullscreen mode

检查 Asterisk 日志中的 hopper 加载输出:

tail -50 /var/log/asterisk/messages | grep -i hopper

Enter fullscreen mode Exit fullscreen mode

步骤 6:验证拨号程序组配置

拨号程序被分配到组中。检查您的活动拨号程序组是否可以访问列表。

-- Find dialer group for your campaign
SELECT campaign_id, dialer_group_id 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- Check dialer group members
SELECT dialier_id, dialer_group, active, server_ip, count_attempt_leads 
FROM vicidial_dialiers 
WHERE dialer_group = 'YOUR_DIALER_GROUP' 
AND active = 'Y';

Enter fullscreen mode Exit fullscreen mode

对于每个拨号程序,验证其是否可达:

# Test dialer connectivity
asterisk -rx "sip show peers" | grep "YOUR_DIALER"

# Check dialer status in ViciDial logs
tail -100 /var/log/asterisk/messages | grep -i "dialier"

Enter fullscreen mode Exit fullscreen mode

步骤 7:检查线索过滤规则

线索过滤器可能会悄无声息地将所有记录从可拨打性中排除。

-- Identify filters assigned to your campaign
SELECT lead_filter_id FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- View filter rules
SELECT lead_filter_id, filter_name, filter_type, filter_label 
FROM vicidial_lead_filters 
WHERE lead_filter_id IN (
  SELECT lead_filter_id FROM vicidial_campaigns 
  WHERE campaign_id = 'YOUR_CAMPAIGN'
);

-- Check filter criteria
SELECT * FROM vicidial_lead_filter_rules 
WHERE lead_filter_id = 'YOUR_FILTER_ID';

Enter fullscreen mode Exit fullscreen mode

临时禁用过滤器进行测试:

UPDATE vicidial_campaigns 
SET lead_filter_id = '' 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- Restart campaign in web admin

Enter fullscreen mode Exit fullscreen mode

如果移除过滤器后线索变为可拨打,则过滤器规则是罪魁祸首。请审查并修复过滤条件。

步骤 8:审查拨打次数与最大拨打次数

每个线索都有一个 dial_count 字段。如果它达到或超过 max_dial_count,它就会变得不可拨打。

-- Check dial count distribution
SELECT list_id, dial_count, COUNT(*) as count 
FROM vicidial_list 
WHERE list_id = 'YOUR_LIST_ID' 
GROUP BY dial_count 
ORDER BY dial_count DESC;

-- Check max_dial_count for campaign
SELECT campaign_id, max_dial_count 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

Enter fullscreen mode Exit fullscreen mode

如果所有线索的 dial_count >= max_dial_count

-- Reset dial count
UPDATE vicidial_list 
SET dial_count = 0 
WHERE list_id = 'YOUR_LIST_ID';

-- Or increase max_dial_count for campaign
UPDATE vicidial_campaigns 
SET max_dial_count = 10 
WHERE campaign_id = 'YOUR_CAMPAIGN';

Enter fullscreen mode Exit fullscreen mode

常见原因和具体解决方案

原因 1:列表未关联到活动

-- Verify campaign points to correct list
SELECT campaign_id, list_id, list_id_string, dial_method 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- Fix: Update campaign to use correct list
UPDATE vicidial_campaigns 
SET list_id = 'YOUR_LIST_ID', 
    list_id_string = 'YOUR_LIST_ID' 
WHERE campaign_id = 'YOUR_CAMPAIGN';

Enter fullscreen mode Exit fullscreen mode

原因 2:活动已暂停或自动拨打已禁用

-- Check campaign active status and auto-dial level
SELECT campaign_id, active, auto_dial_level, campaign_status 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- Restart campaign
UPDATE vicidial_campaigns 
SET active = 'Y', 
    auto_dial_level = 4,
    campaign_status = 'ACTIVE' 
WHERE campaign_id = 'YOUR_CAMPAIGN';

Enter fullscreen mode Exit fullscreen mode

然后重启 ViciDial:

systemctl restart vicidial

Enter fullscreen mode Exit fullscreen mode

原因 3:所有线索均被标记为禁止来电

-- Check for DNCC (Do Not Call Compiled) status
SELECT list_id, status, COUNT(*) as count 
FROM vicidial_list 
WHERE list_id = 'YOUR_LIST_ID' 
AND status IN ('DNCC', 'DNCL') 
GROUP BY status;

-- Clear DNCC marks (if list was incorrectly flagged)
UPDATE vicidial_list 
SET status = 'NEW' 
WHERE list_id = 'YOUR_LIST_ID' 
AND status = 'DNCC';

Enter fullscreen mode Exit fullscreen mode

原因 4:Asterisk-ViciDial 通信中断

检查 Asterisk 是否正在响应 ViciDial 的请求:

# Check Asterisk process
ps aux | grep asterisk | grep -v grep

# Restart Asterisk
systemctl restart asterisk

# Check SIP connectivity
asterisk -rx "sip show peers"

# Tail Asterisk logs
tail -100 /var/log/asterisk/messages

Enter fullscreen mode Exit fullscreen mode

原因 5:数据库损坏或锁定

# Check for locked tables
mysql -u root -p asterisk -e "SHOW OPEN TABLES WHERE In_use > 0;"

# Restart MySQL if locked
systemctl restart mariadb

# Verify vicidial_list table integrity
mysql -u root -p asterisk -e "CHECK TABLE vicidial_list;"

# Repair if corrupted
mysql -u root -p asterisk -e "REPAIR TABLE vicidial_list;"

Enter fullscreen mode Exit fullscreen mode

高级配置示例

完整的 Hopper 加载脚本

创建 /usr/local/bin/load_hopper.sh

#!/bin/bash

CAMPAIGN_ID="$1"
QUEUE_SIZE="$2"

if [ -z "$CAMPAIGN_ID" ] || [ -z "$QUEUE_SIZE" ]; then
    echo "Usage: $0 <CAMPAIGN_ID> <QUEUE_SIZE>"
    exit 1
fi

# Load hopper using Perl CLI
/usr/share/astguiclient/VICIDIAL_hopper_loader.pl \
    --campaign-id "$CAMPAIGN_ID" \
    --queue-size "$QUEUE_SIZE" \
    --priority 5 \
    --dialable-status READY

# Verify hopper loaded
HOPPER_COUNT=$(mysql -u root -p'PASSWORD' asterisk -N -e \
    "SELECT COUNT(*) FROM vicidial_hopper WHERE campaign_id='$CAMPAIGN_ID';")

echo "Hopper loaded: $HOPPER_COUNT records"

# Log event
echo "$(date): Hopper loaded for $CAMPAIGN_ID with $HOPPER_COUNT records" \
    >> /var/log/vicidial_hopper.log

Enter fullscreen mode Exit fullscreen mode

用法:

chmod +x /usr/local/bin/load_hopper.sh
/usr/local/bin/load_hopper.sh YOUR_CAMPAIGN 500

Enter fullscreen mode Exit fullscreen mode

带状态验证的列表导入

导入新列表时,请确保正确的状态分配:

#!/bin/bash
# Script: import_list_with_validation.sh

LIST_FILE="$1"
LIST_ID="$2"
CAMPAIGN_ID="$3"

# Import list using ViciDial importer
/usr/share/astguiclient/VICIDIAL_IN_GROUP.pl \
    --list-id "$LIST_ID" \
    --list-file "$LIST_FILE" \
    --delete-duplicates YES \
    --ignore-blank-phone YES

# Validate import
TOTAL=$(mysql -u root -p'PASSWORD' asterisk -N -e \
    "SELECT COUNT(*) FROM vicidial_list WHERE list_id='$LIST_ID';")

NEW_COUNT=$(mysql -u root -p'PASSWORD' asterisk -N -e \
    "SELECT COUNT(*) FROM vicidial_list WHERE list_id='$LIST_ID' AND status='NEW';")

echo "List $LIST_ID imported with $TOTAL total records, $NEW_COUNT in NEW status"

# Verify campaign is linked
mysql -u root -p'PASSWORD' asterisk -e \
    "UPDATE vicidial_campaigns SET list_id='$LIST_ID' WHERE campaign_id='$CAMPAIGN_ID';"

echo "Campaign $CAMPAIGN_ID linked to list $LIST_ID"

Enter fullscreen mode Exit fullscreen mode

活动诊断脚本

创建 /usr/local/bin/diagnose_campaign.sh

#!/bin/bash
# Complete campaign diagnostics

CAMPAIGN_ID="$1"
DB_USER="root"
DB_PASS="your_password"
DB_NAME="asterisk"

echo "=== ViciDial Campaign Diagnostics ==="
echo "Campaign: $CAMPAIGN_ID"
echo "Time: $(date)"
echo ""

# 1. Campaign status
echo "--- CAMPAIGN STATUS ---"
mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
    "SELECT campaign_id, campaign_name, active, auto_dial_level, 
            dial_method, list_id, max_dial_count, dialer_group_id 
     FROM vicidial_campaigns WHERE campaign_id='$CAMPAIGN_ID';"

# 2. List statistics
echo ""
echo "--- LEAD LIST STATUS ---"
LIST_ID=$(mysql -u $DB_USER -p$DB_PASS $DB_NAME -N -e \
    "SELECT list_id FROM vicidial_campaigns WHERE campaign_id='$CAMPAIGN_ID';")

mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
    "SELECT list_id, status, COUNT(*) as count FROM vicidial_list 
     WHERE list_id='$LIST_ID' GROUP BY status ORDER BY count DESC;"

# 3. Hopper status
echo ""
echo "--- HOPPER STATUS ---"
mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
    "SELECT campaign_id, COUNT(*) as hopper_count FROM vicidial_hopper 
     WHERE campaign_id='$CAMPAIGN_ID' GROUP BY campaign_id;"

# 4. Dialer status
echo ""
echo "--- DIALER STATUS ---"
DIALER_GROUP=$(mysql -u $DB_USER -p$DB_PASS $DB_NAME -N -e \
    "SELECT dialer_group_id FROM vicidial_campaigns WHERE campaign_id='$CAMPAIGN_ID';")

mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
    "SELECT dialier_id, dialer_group, active, server_ip FROM vicidial_dialiers 
     WHERE dialer_group='$DIALER_GROUP';"

# 5. Active calls
echo ""
echo "--- ACTIVE CALLS ---"
mysql -u $DB_USER -p$DB_PASS $DB_NAME -e \
    "SELECT COUNT(*) as active_calls FROM vicidial_log 
     WHERE campaign_id='$CAMPAIGN_ID' AND call_date >= DATE_SUB(NOW(), INTERVAL 5 MINUTE) 
     AND end_epoch = 0;"

# 6. Asterisk SIP peers
echo ""
echo "--- ASTERISK SIP PEERS ---"
asterisk -rx "sip show peers" | head -5

echo ""
echo "=== END DIAGNOSTICS ==="

Enter fullscreen mode Exit fullscreen mode

用法:

chmod +x /usr/local/bin/diagnose_campaign.sh
/usr/local/bin/diagnose_campaign.sh YOUR_CAMPAIGN

Enter fullscreen mode Exit fullscreen mode

故障排除清单

问题 诊断命令 修复方法
列表中没有线索 SELECT COUNT(*) FROM vicidial_list WHERE list_id='LIST_ID'; 重新导入列表
所有线索已耗尽 SELECT status, COUNT(*) FROM vicidial_list WHERE list_id='LIST_ID' GROUP BY status; 将状态重置为 NEW
活动未关联到列表 SELECT list_id FROM vicidial_campaigns WHERE campaign_id='CAMP_ID'; 更新活动的 list_id
Hopper 为空 SELECT COUNT(*) FROM vicidial_hopper WHERE campaign_id='CAMP_ID'; 运行 hopper 加载脚本
活动已暂停 SELECT active FROM vicidial_campaigns WHERE campaign_id='CAMP_ID'; 设置 active='Y'
拨打次数已超限 SELECT dial_count FROM vicidial_list WHERE list_id='LIST_ID' GROUP BY dial_count; 重置 dial_count 或增加 max_dial_count
过滤器阻止线索 SELECT lead_filter_id FROM vicidial_campaigns WHERE campaign_id='CAMP_ID'; 移除或修复过滤器
Asterisk 已关闭 systemctl status asterisk systemctl restart asterisk
数据库已锁定 SHOW OPEN TABLES WHERE In_use > 0; systemctl restart mariadb
拨号程序组离线 SELECT active FROM vicidial_dialiers WHERE dialer_group='GROUP'; 检查拨号程序连接

Asterisk CLI 验证

修复数据库问题后,验证 Asterisk 是否可以通信:

# Check Asterisk is running
asterisk -rx "core show version"

# Monitor SIP registrations
asterisk -rx "sip show peers"

# Watch active calls
asterisk -rx "core show calls"

# Monitor channel activity
asterisk -rx "core show channels"

# Check ViciDial queues
asterisk -rx "queue show"

# View call statistics
asterisk -rx "core show stats"

# Monitor in real-time (attach to console)
asterisk -r
# Then type: dialplan show vicidial-set-agent-status (or relevant context)

Enter fullscreen mode Exit fullscreen mode

ViciDial 重启流程

进行配置更改后,请正确重启 ViciDial 和 Asterisk:

# Stop ViciDial services
systemctl stop vicidial
systemctl stop asterisk

# Optional: Check for hanging processes
ps aux | grep -E "(asterisk|vicidial)" | grep -v grep

# Kill any remaining processes
killall -9 asterisk
killall -9 perl

# Start services in correct order
systemctl start mariadb
sleep 5
systemctl start asterisk
sleep 10
systemctl start vicidial

# Verify all services started
systemctl status vicidial asterisk mariadb

# Check logs for errors
tail -50 /var/log/asterisk/messages
tail -50 /var/log/vicidial.log

Enter fullscreen mode Exit fullscreen mode

监控与预防

设置实时活动监控

-- Create monitoring query to run periodically
-- Check for campaigns with empty hoppers

SELECT c.campaign_id, c.campaign_name, 
       COALESCE(COUNT(h.hopper_id), 0) as hopper_count,
       (SELECT COUNT(*) FROM vicidial_list 
        WHERE list_id = c.list_id AND status = 'NEW') as new_leads
FROM vicidial_campaigns c
LEFT JOIN vicidial_hopper h ON c.campaign_id = h.campaign_id
WHERE c.active = 'Y'
GROUP BY c.campaign_id
HAVING hopper_count < 50 OR new_leads = 0;

Enter fullscreen mode Exit fullscreen mode

启用 ViciDial 调试日志记录

编辑 /etc/asterisk/extensions-vicidial.conf

[vicidial-set-agent-status]
exten => _X.,1,Set(VERBOSE_PREFIX_3=***VICIDIAL_DEBUG***)
exten => _X.,n,NoOp(Campaign: ${CAMPAIGN_ID} | List: ${LIST_ID} | Lead: ${LEAD_ID})
exten => _X.,n,NoOp(Dialable: ${DIALABLE_STATUS} | Status: ${LEAD_STATUS})

Enter fullscreen mode Exit fullscreen mode

然后在 Asterisk CLI 中:

asterisk -rx "core set debug 9"
asterisk -rx "core set verbose 9"
asterisk -rx "sip set debug on"

Enter fullscreen mode Exit fullscreen mode

低 Hopper 条件警报

创建一个 cron 作业,在 hopper 耗尽时发出警报:

#!/bin/bash
# File: /usr/local/bin/check_hopper_alert.sh

THRESHOLD=100
MAIL="[email protected]"

for CAMPAIGN in $(mysql -u root -p'PASSWORD' asterisk -N -e \
    "SELECT campaign_id FROM vicidial_campaigns WHERE active='Y';"); do

    HOPPER=$(mysql -u root -p'PASSWORD' asterisk -N -e \
        "SELECT COUNT(*) FROM vicidial_hopper WHERE campaign_id='$CAMPAIGN';")

    if [ "$HOPPER" -lt "$THRESHOLD" ]; then
        echo "WARNING: Campaign $CAMPAIGN hopper count: $HOPPER" | \
            mail -s "ViciDial Hopper Alert: $CAMPAIGN" "$MAIL"
    fi
done

Enter fullscreen mode Exit fullscreen mode

添加到 crontab:

*/5 * * * * /usr/local/bin/check_hopper_alert.sh

Enter fullscreen mode Exit fullscreen mode

摘要

ViciDial 中的 "Campaign Has No Dialable Leads" 错误是由列表管理、活动配置和数据库状态中的系统性问题造成的。请遵循以下故障排除路径:

  1. 验证线索是否存在 — 统计 vicidial_list 表中的记录数
  2. 检查线索状态 — 确保有可用的 NEW 线索,而不是 CALLED/DNCC
  3. 验证活动配置 — 确认列表关联、激活状态、自动拨打已启用
  4. 检查 hopper — 验证 hopper 是否有准备好供拨号程序使用的条目
  5. 审查过滤器 — 检查线索过滤器是否没有排除所有记录
  6. 确认拨号程序 — 确保拨号程序组处于激活状态且已连接
  7. 测试 Asterisk — 验证 SIP 注册和通道可用性
  8. 重启服务 — 按顺序正确重启 ViciDial、Asterisk 和 MySQL

使用提供的诊断脚本和 SQL 查询来隔离您特定环境中的根本原因。大多数问题可以通过将线索状态重置为 NEW、正确地将活动关联到列表或清除有问题的过滤器来解决。对于生产系统,请实施监控脚本来防止再次发生。