主管功能
概述
監督者 (Supervisor) 功能提供了對座席通話的全面管理和監控能力,包括監聽、強制登出、強制插話和耳語等功能。監督者須以 loginType=2 身份登錄才能使用這些功能。
monitorCall() - 監聽
監聽座席的通話,可以聽到座席和客戶的雙向對話,但客戶和座席都聽不到監督者的聲音。
語法
javascript
sdk.monitorCall(options);參數
| 參數名 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | string | 是 | 要監聽的座席 ID |
callId | string | 否 | 通話 ID;若省略則監聽座席當前的通話 |
回傳值
返回 Promise,成功時回傳:
javascript
{
monitorId: "monitor_20260323_001",
agentId: "agent_001",
callId: "call_20260323_001",
state: "MONITORING",
timestamp: "2026-03-23T14:30:00Z"
}範例
javascript
// 監聽特定座席
supervisorButton.onclick = async () => {
const agentId = document.getElementById('agentId').value;
try {
const monitor = await sdk.monitorCall({
agentId: agentId
});
console.log('已開始監聽:', agentId);
showMonitorUI(monitor);
} catch (error) {
console.error('監聽失敗:', error.message);
}
};unmonitorCall() - 取消監聽
停止監聽座席的通話。
語法
javascript
sdk.unmonitorCall(monitorId);參數
| 參數名 | 類型 | 必填 | 說明 |
|---|---|---|---|
monitorId | string | 是 | 監聽 ID |
回傳值
返回 Promise,成功時回傳:
javascript
{
monitorId: "monitor_20260323_001",
state: "ENDED",
duration: 180,
timestamp: "2026-03-23T14:33:00Z"
}範例
javascript
// 停止監聽
stopMonitorButton.onclick = async () => {
try {
await sdk.unmonitorCall(currentMonitorId);
console.log('已停止監聽');
hideMonitorUI();
} catch (error) {
console.error('取消監聽失敗:', error);
}
};bargeCall() - 強制插話
監督者加入座席的通話,客戶和座席都能聽到監督者的聲音。
語法
javascript
sdk.bargeCall(options);參數
| 參數名 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | string | 是 | 座席 ID |
callId | string | 否 | 通話 ID;若省略則插話座席當前的通話 |
回傳值
返回 Promise,成功時回傳:
javascript
{
bargeId: "barge_20260323_001",
agentId: "agent_001",
callId: "call_20260323_001",
state: "BARGING",
timestamp: "2026-03-23T14:30:30Z"
}範例
javascript
// 強制插話
bargeButton.onclick = async () => {
const agentId = document.getElementById('agentId').value;
try {
const barge = await sdk.bargeCall({
agentId: agentId
});
console.log('已插話到通話中');
showBargeUI(barge);
} catch (error) {
console.error('插話失敗:', error.message);
}
};whisperCall() - 耳語
監督者對座席進行耳語 (私密指導),只有座席能聽到監督者的聲音,客戶聽不到。
語法
javascript
sdk.whisperCall(options);參數
| 參數名 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | string | 是 | 座席 ID |
callId | string | 否 | 通話 ID;若省略則對座席當前的通話進行耳語 |
回傳值
返回 Promise,成功時回傳:
javascript
{
whisperId: "whisper_20260323_001",
agentId: "agent_001",
callId: "call_20260323_001",
state: "WHISPERING",
timestamp: "2026-03-23T14:30:45Z"
}範例
javascript
// 開始耳語
whisperButton.onclick = async () => {
const agentId = document.getElementById('agentId').value;
try {
const whisper = await sdk.whisperCall({
agentId: agentId
});
console.log('已開始對座席耳語');
document.getElementById('whisperStatus').textContent = '耳語中';
// 自動在 10 秒後停止耳語
setTimeout(() => {
sdk.stopWhisper(whisper.whisperId);
}, 10000);
} catch (error) {
console.error('耳語失敗:', error);
}
};stopBarge() - 停止強制插話
停止強制插話。
語法
javascript
sdk.stopBarge(bargeId);參數
| 參數名 | 類型 | 必填 | 說明 |
|---|---|---|---|
bargeId | string | 是 | 強制插話 ID |
回傳值
返回 Promise,成功時回傳:
javascript
{
bargeId: "barge_20260323_001",
state: "ENDED",
duration: 120,
timestamp: "2026-03-23T14:31:30Z"
}stopWhisper() - 停止耳語
停止耳語。
語法
javascript
sdk.stopWhisper(whisperId);參數
| 參數名 | 類型 | 必填 | 說明 |
|---|---|---|---|
whisperId | string | 是 | 耳語 ID |
回傳值
返回 Promise,成功時回傳:
javascript
{
whisperId: "whisper_20260323_001",
state: "ENDED",
duration: 45,
timestamp: "2026-03-23T14:31:15Z"
}forceLogout() - 強制登出
強制某個座席登出系統。座席的所有通話將被掛斷。
語法
javascript
sdk.forceLogout(agentId);參數
| 參數名 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | string | 是 | 要登出的座席 ID |
回傳值
返回 Promise,成功時回傳:
javascript
{
agentId: "agent_001",
status: "OFFLINE",
reason: "Forced logout by supervisor",
timestamp: "2026-03-23T14:32:00Z"
}範例
javascript
// 強制座席登出
forceLogoutButton.onclick = async () => {
const agentId = document.getElementById('agentId').value;
if (confirm('確定要強制登出此座席嗎?')) {
try {
await sdk.forceLogout(agentId);
console.log('已強制登出座席:', agentId);
} catch (error) {
console.error('強制登出失敗:', error);
}
}
};getAgentStatus() - 獲取座席狀態
獲取其他座席的實時狀態信息。
語法
javascript
const agentStatus = sdk.getAgentStatus(agentId);參數
| 參數名 | 類型 | 必填 | 說明 |
|---|---|---|---|
agentId | string | 是 | 座席 ID |
回傳值
返回座席狀態對象:
javascript
{
agentId: "agent_001",
agentName: "王小明",
agentTeam: "業務部",
status: "TALKING",
loginTime: "2026-03-23T09:00:00Z",
callStartTime: "2026-03-23T14:30:00Z",
callDuration: 300,
currentCallerId: "0912345678",
onHoldCount: 0,
readyTime: "2026-03-23T09:00:00Z"
}範例
javascript
// 監督面板顯示座席狀態
function updateAgentStatus(agentId) {
const status = sdk.getAgentStatus(agentId);
if (status) {
document.getElementById('agentName').textContent = status.agentName;
document.getElementById('agentStatus').textContent = status.status;
document.getElementById('callDuration').textContent =
formatTime(status.callDuration);
}
}
// 定期更新
setInterval(() => {
updateAgentStatus('agent_001');
}, 1000);getTeamStats() - 獲取團隊統計
獲取團隊的實時統計信息。
語法
javascript
const teamStats = sdk.getTeamStats(teamName);參數
| 參數名 | 類型 | 必填 | 說明 |
|---|---|---|---|
teamName | string | 是 | 團隊名稱 |
回傳值
返回團隊統計對象:
javascript
{
teamName: "業務部",
totalAgents: 10,
readyAgents: 7,
notReadyAgents: 2,
talkingAgents: 1,
holdingAgents: 0,
totalCalls: 25,
averageCallDuration: 180,
averageWaitTime: 45,
callsPerHour: 150
}範例
javascript
// 團隊監控儀表板
function updateTeamDashboard() {
const stats = sdk.getTeamStats('業務部');
document.getElementById('readyAgents').textContent =
stats.readyAgents + '/' + stats.totalAgents;
document.getElementById('totalCalls').textContent = stats.totalCalls;
document.getElementById('avgDuration').textContent =
formatTime(stats.averageCallDuration);
}
// 定期更新
setInterval(updateTeamDashboard, 5000);監督者事件
監督者操作時觸發的事件:
| 事件名 | 回調參數 | 說明 |
|---|---|---|
monitorStarted | { monitorId, agentId, callId } | 開始監聽 |
monitorEnded | { monitorId, duration } | 停止監聽 |
bargeStarted | { bargeId, agentId, callId } | 開始強制插話 |
bargeEnded | { bargeId, duration } | 停止強制插話 |
whisperStarted | { whisperId, agentId, callId } | 開始耳語 |
whisperEnded | { whisperId, duration } | 停止耳語 |
agentStatusChanged | { agentId, newStatus, previousStatus } | 座席狀態變更 |
agentLoggedOut | { agentId, reason } | 座席登出 |
範例
javascript
// 監聽座席狀態變更
sdk.on('agentStatusChanged', (event) => {
console.log(event.agentId, '狀態變更為', event.newStatus);
updateAgentStatusUI(event.agentId, event.newStatus);
});
// 監聽監聽開始
sdk.on('monitorStarted', (event) => {
console.log('開始監聽:', event.agentId);
showMonitoringIndicator(event.agentId);
});
// 監聽強制插話
sdk.on('bargeStarted', (event) => {
console.log('已強制插話:', event.agentId);
playAlert('強制插話開始');
});監督者工作流程示例
場景:團隊監控和座席指導
javascript
// 1. 監督者以 loginType=2 身份登錄
const sdk = uni4cc.init({...});
await sdk.login('supervisor_password', 2);
// 2. 顯示團隊監控儀表板
function showTeamDashboard() {
const stats = sdk.getTeamStats('業務部');
console.log('在線座席數:', stats.readyAgents + stats.talkingAgents);
console.log('通話中座席數:', stats.talkingAgents);
}
// 3. 監聽座席狀態變更
sdk.on('agentStatusChanged', (event) => {
if (event.newStatus === 'TALKING') {
console.log(event.agentId, '有新通話');
// 自動開始監聽
monitorAgentCall(event.agentId);
}
});
// 4. 監聽座席通話
async function monitorAgentCall(agentId) {
try {
const monitor = await sdk.monitorCall({ agentId });
console.log('已開始監聽:', agentId);
// 如果發現問題,進行耳語指導
setTimeout(() => {
sdk.whisperCall({ agentId });
// 發送指導
console.log('耳語: 客戶詢問使用方法...');
}, 30000);
} catch (error) {
console.error('監聽失敗:', error);
}
}
// 5. 應對異常情況
window.addEventListener('error', async (event) => {
if (event.message.includes('agent')) {
// 如果座席出現問題,進行強制登出
const agentId = extractAgentId(event.message);
await sdk.forceLogout(agentId);
console.log('已強制登出有問題的座席');
}
});權限要求
只有以以下 loginType 身份登錄的監督者才能使用相應功能:
| 功能 | loginType 1 | loginType 2 | loginType 3 |
|---|---|---|---|
| monitorCall | ❌ | ✅ | ✅ |
| bargeCall | ❌ | ✅ | ✅ |
| whisperCall | ❌ | ✅ | ✅ |
| forceLogout | ❌ | ✅ | ✅ |
| getAgentStatus | ❌ | ✅ | ✅ |
| getTeamStats | ❌ | ✅ | ✅ |
常見錯誤
| 錯誤碼 | 說明 | 解決方案 |
|---|---|---|
| PERMISSION_DENIED | 權限不足 | 確認以監督者身份登錄 (loginType=2) |
| AGENT_NOT_FOUND | 座席不存在 | 確認座席 ID 是否正確 |
| NO_ACTIVE_CALL | 座席無活躍通話 | 選擇正在通話的座席 |
| MONITOR_FAILED | 監聽失敗 | 檢查網絡連接 |
| BARGE_FAILED | 插話失敗 | 確認座席是否在通話中 |
注意事項
- 權限控制:監督者功能要求 loginType=2,普通座席無法使用
- 倫理考慮:使用強制插話和耳語功能應遵守當地法律和公司政策
- 隱私保護:錄音和監聽應獲得必要的同意和告知
- 性能考慮:同時監聽多個座席會消耗較多帶寬和資源
- 日誌記錄:所有監督者操作應被記錄用於審計和質量控制
操作畫面參考



