ViciDial「活動沒有可撥打的潛在客戶」— 清單與 Hopper 疑難排解

掌握沒有可撥打潛在客戶錯誤的根本原因,並透過系統化的清單驗證、hopper 設定與資料庫排解,恢復活動的完整生產力。

先決條件

在進行疑難排解之前,請確認您已具備:

  • 具備 sudo 權限的 ViciDial 伺服器 SSH 存取權限
  • 存取 ViciDial 網頁管理面板(位於 /vicidial/admin.php
  • asterisk 資料庫的 MySQL/MariaDB 指令列存取權限
  • 了解基本的 ViciDial 活動結構(清單、撥號器、坐席)
  • 具備檢查 Asterisk 程序的 root 或 asterisk 使用者權限
  • 已備份 ViciDial 資料庫與設定檔的近期備份
  • 用於驗證的測試活動,其潛在客戶數量已知

「活動沒有可撥打的潛在客戶」錯誤通常發生於下列情況:

  • 撥號器嘗試發起通話,但 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 安裝

# 檢查 ViciDial 服務狀態
systemctl status vicidial

# 驗證 Asterisk 是否正在執行
asterisk -rx "core show version"

# 檢查 MySQL/MariaDB 連線
mysql -u cron -p -h localhost asterisk -e "SELECT VERSION();"

進入全螢幕模式 退出全螢幕模式

確認資料庫連線

# 測試 asterisk 資料庫存取
mysql -u root -p -e "SELECT * FROM asterisk.vicidial LIMIT 1;"

# 驗證 vicidial_list 資料表是否存在
mysql -u root -p asterisk -e "DESCRIBE vicidial_list;"

進入全螢幕模式 退出全螢幕模式

檢查 ViciDial 核心檔案

# 確認 ViciDial 管理路徑
ls -la /var/www/html/vicidial/admin.php

# 檢查 CLI 工具
ls -la /usr/share/astguiclient/

進入全螢幕模式 退出全螢幕模式

若上述任何指令失敗,請先解決安裝問題,再繼續進行疑難排解。

系統化疑難排解流程

步驟 1:確認潛在客戶清單存在且含有記錄

從最基本的檢查開始——您的清單是否真的包含潛在客戶?

# 登入 MySQL
mysql -u root -p asterisk

# 檢查清單摘要
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;

進入全螢幕模式 退出全螢幕模式

預期輸出: record_count 應大於 0,且與 list_size 相符。

record_count 為 0,表示您的清單從未匯入。請檢查:

# 在 ViciDial 網頁管理介面查看匯入記錄:Admin > Import Lists
# 或檢查指令列匯入工具:
/usr/share/astguiclient/VICIDIAL_IN_GROUP.pl --list-id YOUR_LIST_ID

# 檢查 ViciDial 載入佇列
SELECT * FROM vicidial_list_queue LIMIT 5;

進入全螢幕模式 退出全螢幕模式

步驟 2:檢查潛在客戶狀態分佈

造成「沒有可撥打的潛在客戶」最常見的原因,是所有潛在客戶都已被聯絡過,且其狀態不允許重新撥打。

-- 檢查清單的狀態明細
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;

進入全螢幕模式 退出全螢幕模式

預期輸出範例:

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

進入全螢幕模式 退出全螢幕模式

若 NEW 數量極低或為零: 表示您的潛在客戶已用盡,或匯入時的狀態不正確。您需要重設或重新匯入。

將所有潛在客戶重設為 NEW 狀態:

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

-- 驗證更新結果
SELECT COUNT(*) FROM vicidial_list 
WHERE list_id = 'YOUR_LIST_ID' AND status = 'NEW';

進入全螢幕模式 退出全螢幕模式

步驟 3:驗證活動設定

活動設定直接控制哪些潛在客戶被視為可撥打。

# 存取 ViciDial 網頁介面
# 導覽:Admin > Campaigns > [您的活動]
# 或直接查詢:

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

進入全螢幕模式 退出全螢幕模式

需檢查的關鍵欄位:

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';

進入全螢幕模式 退出全螢幕模式

關鍵欄位:

欄位 預期值 問題說明
active Y 若為 N,活動即已停用
dial_method ADAPTMANUAL 錯誤的方法會阻擋撥打
list_id 您的清單 ID 空白或錯誤的清單 ID 會阻擋撥打
max_dial_count 通常為 3-5 數值過低會快速耗盡潛在客戶
auto_dial_level 1-9 0 會停用自動撥號
lead_filter_id 通常為空 過濾器可能會排除所有潛在客戶

步驟 4:檢查清單設定

# 透過網頁管理:Admin > Lead Lists > [您的清單]
# 或透過 MySQL:

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

進入全螢幕模式 退出全螢幕模式

關鍵欄位:

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';

進入全螢幕模式 退出全螢幕模式

檢查清單是否標記為啟用:

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

進入全螢幕模式 退出全螢幕模式

步驟 5:即時檢查 Hopper 佇列

Hopper 是潛在客戶在撥打前即將被分派的階段。請檢查其是否已填入資料:

-- 檢查作用中的 hopper 項目
SELECT campaign_id, count(*) as hopper_count 
FROM vicidial_hopper 
WHERE campaign_id = 'YOUR_CAMPAIGN' 
GROUP BY campaign_id;

-- 查看 hopper 記錄範例
SELECT hopper_id, campaign_id, status, priority, dialable_status 
FROM vicidial_hopper 
WHERE campaign_id = 'YOUR_CAMPAIGN' 
LIMIT 10;

進入全螢幕模式 退出全螢幕模式

若 hopper 為空: 表示撥號器找不到符合活動條件的潛在客戶。

手動填入 hopper(用於測試):

# 使用 ViciDial CLI 工具載入 hopper
/usr/share/astguiclient/VICIDIAL_hopper_loader.pl --campaign-id YOUR_CAMPAIGN --queue-size 100

進入全螢幕模式 退出全螢幕模式

請檢查 Asterisk 日誌中 hopper 載入的輸出:

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

進入全螢幕模式 退出全螢幕模式

步驟 6:驗證撥號器群組設定

撥號器會被指派至群組。請檢查您的活動撥號器群組是否能存取該清單。

-- 找出活動對應的撥號器群組
SELECT campaign_id, dialer_group_id 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- 檢查撥號器群組成員
SELECT dialier_id, dialer_group, active, server_ip, count_attempt_leads 
FROM vicidial_dialiers 
WHERE dialer_group = 'YOUR_DIALER_GROUP' 
AND active = 'Y';

進入全螢幕模式 退出全螢幕模式

請針對每一台撥號器,確認其可連線:

# 測試撥號器連線
asterisk -rx "sip show peers" | grep "YOUR_DIALER"

# 檢查 ViciDial 日誌中的撥號器狀態
tail -100 /var/log/asterisk/messages | grep -i "dialier"

進入全螢幕模式 退出全螢幕模式

步驟 7:檢查潛在客戶過濾規則

潛在客戶過濾器可能會悄無聲息地排除所有記錄,使其無法撥打。

-- 識別指派給活動的過濾器
SELECT lead_filter_id FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- 查看過濾器規則
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'
);

-- 檢查過濾條件
SELECT * FROM vicidial_lead_filter_rules 
WHERE lead_filter_id = 'YOUR_FILTER_ID';

進入全螢幕模式 退出全螢幕模式

暫時停用過濾器以進行測試:

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

-- 在網頁管理介面重新啟動活動

進入全螢幕模式 退出全螢幕模式

若移除過濾器後潛在客戶變為可撥打,則問題出在過濾規則。請檢視並修正過濾條件。

步驟 8:檢視撥打次數與最大撥打次數

每一筆潛在客戶都有一個 dial_count 欄位。若其達到或超過 max_dial_count,即變為不可撥打。

-- 檢查撥打次數分佈
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;

-- 檢查活動的 max_dial_count
SELECT campaign_id, max_dial_count 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

進入全螢幕模式 退出全螢幕模式

若所有潛在客戶的 dial_count >= max_dial_count

-- 重設撥打次數
UPDATE vicidial_list 
SET dial_count = 0 
WHERE list_id = 'YOUR_LIST_ID';

-- 或增加活動的 max_dial_count
UPDATE vicidial_campaigns 
SET max_dial_count = 10 
WHERE campaign_id = 'YOUR_CAMPAIGN';

進入全螢幕模式 退出全螢幕模式

常見原因與對應解決方案

原因 1:清單未連結至活動

-- 驗證活動是否指向正確的清單
SELECT campaign_id, list_id, list_id_string, dial_method 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- 修正:更新活動以使用正確的清單
UPDATE vicidial_campaigns 
SET list_id = 'YOUR_LIST_ID', 
    list_id_string = 'YOUR_LIST_ID' 
WHERE campaign_id = 'YOUR_CAMPAIGN';

進入全螢幕模式 退出全螢幕模式

原因 2:活動已暫停或自動撥號已停用

-- 檢查活動啟用狀態與自動撥號等級
SELECT campaign_id, active, auto_dial_level, campaign_status 
FROM vicidial_campaigns 
WHERE campaign_id = 'YOUR_CAMPAIGN';

-- 重新啟動活動
UPDATE vicidial_campaigns 
SET active = 'Y', 
    auto_dial_level = 4,
    campaign_status = 'ACTIVE' 
WHERE campaign_id = 'YOUR_CAMPAIGN';

進入全螢幕模式 退出全螢幕模式

然後重新啟動 ViciDial:

systemctl restart vicidial

進入全螢幕模式 退出全螢幕模式

原因 3:所有潛在客戶皆被標記為勿打

-- 檢查 DNCC(已列入勿打清單編譯)狀態
SELECT list_id, status, COUNT(*) as count 
FROM vicidial_list 
WHERE list_id = 'YOUR_LIST_ID' 
AND status IN ('DNCC', 'DNCL') 
GROUP BY status;

-- 清除 DNCC 標記(若清單被錯誤標記)
UPDATE vicidial_list 
SET status = 'NEW' 
WHERE list_id = 'YOUR_LIST_ID' 
AND status = 'DNCC';

進入全螢幕模式 退出全螢幕模式

原因 4:Asterisk 與 ViciDial 通訊中斷

請檢查 Asterisk 是否回應 ViciDial 的請求:

# 檢查 Asterisk 程序
ps aux | grep asterisk | grep -v grep

# 重新啟動 Asterisk
systemctl restart asterisk

# 檢查 SIP 連線
asterisk -rx "sip show peers"

# 追蹤 Asterisk 日誌
tail -100 /var/log/asterisk/messages

進入全螢幕模式 退出全螢幕模式

原因 5:資料庫損毀或鎖定

# 檢查是否有被鎖定的資料表
mysql -u root -p asterisk -e "SHOW OPEN TABLES WHERE In_use > 0;"

# 若鎖定則重新啟動 MySQL
systemctl restart mariadb

# 驗證 vicidial_list 資料表完整性
mysql -u root -p asterisk -e "CHECK TABLE vicidial_list;"

# 若損毀則修復
mysql -u root -p asterisk -e "REPAIR TABLE vicidial_list;"

進入全螢幕模式 退出全螢幕模式

進階設定範例

完整的 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

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

# 驗證 hopper 已載入
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"

# 記錄事件
echo "$(date): Hopper loaded for $CAMPAIGN_ID with $HOPPER_COUNT records" \
    >> /var/log/vicidial_hopper.log

進入全螢幕模式 退出全螢幕模式

使用方式:

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

進入全螢幕模式 退出全螢幕模式

含狀態驗證的清單匯入

匯入新清單時,請確保正確的狀態指派:

#!/bin/bash
# 指令稿:import_list_with_validation.sh

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

# 使用 ViciDial 匯入器匯入清單
/usr/share/astguiclient/VICIDIAL_IN_GROUP.pl \
    --list-id "$LIST_ID" \
    --list-file "$LIST_FILE" \
    --delete-duplicates YES \
    --ignore-blank-phone YES

# 驗證匯入
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"

# 驗證活動已連結
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"

進入全螢幕模式 退出全螢幕模式

活動診斷指令稿

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

#!/bin/bash
# 完整的活動診斷

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

echo "=== ViciDial 活動診斷 ==="
echo "Campaign: $CAMPAIGN_ID"
echo "Time: $(date)"
echo ""

# 1. 活動狀態
echo "--- 活動狀態 ---"
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. 清單統計
echo ""
echo "--- 潛在客戶清單狀態 ---"
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 狀態
echo ""
echo "--- HOPPER 狀態 ---"
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. 撥號器狀態
echo ""
echo "--- 撥號器狀態 ---"
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. 進行中的通話
echo ""
echo "--- 進行中的通話 ---"
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 對等端
echo ""
echo "--- ASTERISK SIP 對等端 ---"
asterisk -rx "sip show peers" | head -5

echo ""
echo "=== 診斷結束 ==="

進入全螢幕模式 退出全螢幕模式

使用方式:

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

進入全螢幕模式 退出全螢幕模式

疑難排解清單

問題 診斷指令 解決方式
清單中沒有潛在客戶 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 是否能正常通訊:

# 檢查 Asterisk 是否正在執行
asterisk -rx "core show version"

# 監控 SIP 註冊
asterisk -rx "sip show peers"

# 監看進行中的通話
asterisk -rx "core show calls"

# 監控頻道活動
asterisk -rx "core show channels"

# 檢查 ViciDial 佇列
asterisk -rx "queue show"

# 查看通話統計
asterisk -rx "core show stats"

# 即時監控(連線至主控台)
asterisk -r
# 然後輸入:dialplan show vicidial-set-agent-status(或相關的 context)

進入全螢幕模式 退出全螢幕模式

ViciDial 重新啟動程序

完成設定變更後,請正確重新啟動 ViciDial 與 Asterisk:

# 停止 ViciDial 服務
systemctl stop vicidial
systemctl stop asterisk

# 選用:檢查是否有殘留程序
ps aux | grep -E "(asterisk|vicidial)" | grep -v grep

# 終止任何殘留程序
killall -9 asterisk
killall -9 perl

# 依正確順序啟動服務
systemctl start mariadb
sleep 5
systemctl start asterisk
sleep 10
systemctl start vicidial

# 驗證所有服務已啟動
systemctl status vicidial asterisk mariadb

# 檢查日誌是否有錯誤
tail -50 /var/log/asterisk/messages
tail -50 /var/log/vicidial.log

進入全螢幕模式 退出全螢幕模式

監控與預防

設定即時活動監控

-- 建立定期執行的監控查詢
-- 檢查 hopper 為空的活動

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;

進入全螢幕模式 退出全螢幕模式

啟用 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})

進入全螢幕模式 退出全螢幕模式

然後在 Asterisk CLI 中執行:

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

進入全螢幕模式 退出全螢幕模式

對 Hopper 過低發出警示

建立 cron job,以便在 hopper 耗盡時發出警示:

#!/bin/bash
# 檔案:/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

進入全螢幕模式 退出全螢幕模式

加入 crontab:

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

進入全螢幕模式 退出全螢幕模式

摘要

ViciDial 中的「活動沒有可撥打的潛在客戶」錯誤,源於清單管理、活動設定與資料庫狀態等系統性問題。請遵循以下疑難排解路徑:

  1. 確認潛在客戶存在 — 計算 vicidial_list 資料表中的記錄數
  2. 檢查潛在客戶狀態 — 確保有可用的 NEW 潛在客戶,而非 CALLED/DNCC
  3. 驗證活動設定 — 確認清單已連結、活動已啟用、自動撥號已開啟
  4. 檢查 hopper — 確認 hopper 中有供撥號器使用的項目
  5. 檢視過濾器 — 檢查潛在客戶過濾器是否未排除所有記錄
  6. 確認撥號器 — 確保撥號器群組已啟用且已連線
  7. 測試 Asterisk — 驗證 SIP 註冊與頻道可用性
  8. 重新啟動服務 — 依序正確重新啟動 ViciDial、Asterisk 與 MySQL

請使用提供的診斷指令稿與 SQL 查詢,在您的特定環境中找出根本原因。大多數問題可透過將潛在客戶狀態重設為 NEW、將活動正確連結至清單,或清除有問題的過濾器來解決。對於生產系統,請實作監控指令稿以預防問題再次發生。