Инструменты пользователя

Инструменты сайта


faq:queue_dynamic_agents

Динамические агенты для очередей

Обратно, к основному разделу...

Периодически возникает необходимость добавлять и удалять сотрудников из очереди. До сих пор это было возможно сделать только через web интерфейс телефонной станции.

В текущей статье я расскажу как реализовать возможность подключиться и отключиться из очереди средствами набора служебного внутреннего номера.

  1. Создайте новую очередь с четырехзначным внутренним номером. К примеру 2001. (см. документацию «Очереди вызовов»)
  2. Опишите новое «Приложение диалплан»
  3. Назначьте «Номер для вызова приложения» - 999[0-1]XXXX первые три цифры можете переопределись своей комбинацией
  4. Тип кода - «PHP AGI скрипт»
  5. На вкладке «Программный код» вставьте следующее содержимое:
    <?php
    require_once 'globals.php';
    require_once 'phpagi.php';
    
    $agi = new AGI();
    $agi->answer();
    
    $extension = $agi->get_variable("CHANNEL(peername)", true);
    if(empty($extension)){
        $extension = $agi->get_variable("CALLERID(num)", true);
    }
    $q_exten   = substr($agi->request['agi_extension'], 4);
    $add_agent = substr($agi->request['agi_extension'], 3, 1);
    
    $agi->noop("$extension $q_exten $add_agent");
    
    $res = Models\Extensions::findFirst("number='{$extension}'");
    if(!$res){
        // Ошибка, такого внутреннего номера не существует.
        $agi->hangup();
    }
    /** @var Models\CallQueues $res */
    $res = Models\CallQueues::findFirst("extension='{$q_exten}'");
    if(!$res){
        // Ошибка, такой очереди не существует.
        $agi->hangup();
    }
    /** @var Models\CallQueueMembers $res */
    $a_count = Models\CallQueueMembers::maximum([ "queue='{$res->uniqid}'", 'column' => 'priority'] ) + 1;
    $member  = Models\CallQueueMembers::findFirst("queue='{$res->uniqid}' AND extension='{$extension}'");
    
    if($add_agent == true && !$member){
        $member = new Models\CallQueueMembers();
        $member->extension  = $extension;
        $member->queue      = $res->uniqid;
        $member->priority   = $a_count;
        $member->save();
        $result = p_Queue::queue_reload();
    }
    
    if($add_agent == false && $member){
        $member->delete();
        $result = p_Queue::queue_reload();
    }
    
    $linkedid = $agi->get_variable("CDR(linkedid)", true);
    $res = Models\CallDetailRecordsTmp::find("linkedid='{$linkedid}'");
    foreach ($res as $data){
        $data->delete();
    }
    sleep(2);
    $agi->hangup();
  6. Сохраните приложение
  7. Наберите комбинацию 99912001 чтобы присоединиться к очереди 2001
  8. Наберите комбинацию 99902001 чтобы отключиться от очереди 2001

Обратно, к основному разделу...

faq/queue_dynamic_agents.txt · Последние изменения: 2020/03/11 11:31 — Алексей Портнов