Skip to content

主管功能

概述

監督者 (Supervisor) 功能提供了對座席通話的全面管理和監控能力,包括監聽、強制登出、強制插話和耳語等功能。監督者須以 loginType=2 身份登錄才能使用這些功能。

monitorCall() - 監聽

監聽座席的通話,可以聽到座席和客戶的雙向對話,但客戶和座席都聽不到監督者的聲音。

語法

javascript
sdk.monitorCall(options);

參數

參數名類型必填說明
agentIdstring要監聽的座席 ID
callIdstring通話 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);

參數

參數名類型必填說明
monitorIdstring監聽 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);

參數

參數名類型必填說明
agentIdstring座席 ID
callIdstring通話 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);

參數

參數名類型必填說明
agentIdstring座席 ID
callIdstring通話 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);

參數

參數名類型必填說明
bargeIdstring強制插話 ID

回傳值

返回 Promise,成功時回傳:

javascript
{
  bargeId: "barge_20260323_001",
  state: "ENDED",
  duration: 120,
  timestamp: "2026-03-23T14:31:30Z"
}

stopWhisper() - 停止耳語

停止耳語。

語法

javascript
sdk.stopWhisper(whisperId);

參數

參數名類型必填說明
whisperIdstring耳語 ID

回傳值

返回 Promise,成功時回傳:

javascript
{
  whisperId: "whisper_20260323_001",
  state: "ENDED",
  duration: 45,
  timestamp: "2026-03-23T14:31:15Z"
}

forceLogout() - 強制登出

強制某個座席登出系統。座席的所有通話將被掛斷。

語法

javascript
sdk.forceLogout(agentId);

參數

參數名類型必填說明
agentIdstring要登出的座席 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);

參數

參數名類型必填說明
agentIdstring座席 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);

參數

參數名類型必填說明
teamNamestring團隊名稱

回傳值

返回團隊統計對象:

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 1loginType 2loginType 3
monitorCall
bargeCall
whisperCall
forceLogout
getAgentStatus
getTeamStats

常見錯誤

錯誤碼說明解決方案
PERMISSION_DENIED權限不足確認以監督者身份登錄 (loginType=2)
AGENT_NOT_FOUND座席不存在確認座席 ID 是否正確
NO_ACTIVE_CALL座席無活躍通話選擇正在通話的座席
MONITOR_FAILED監聽失敗檢查網絡連接
BARGE_FAILED插話失敗確認座席是否在通話中

注意事項

  1. 權限控制:監督者功能要求 loginType=2,普通座席無法使用
  2. 倫理考慮:使用強制插話和耳語功能應遵守當地法律和公司政策
  3. 隱私保護:錄音和監聽應獲得必要的同意和告知
  4. 性能考慮:同時監聽多個座席會消耗較多帶寬和資源
  5. 日誌記錄:所有監督者操作應被記錄用於審計和質量控制

操作畫面參考

Supervisor - 操作畫面 1

Supervisor - 操作畫面 2

Supervisor - 操作畫面 3

Supervisor - 操作畫面 4

承暉資訊資源中心