← Назад к справке

Открытые линии

Операторы и передача диалога

Рабочая справка по операторам открытых линий: как смотреть оператора сессии, присоединяться, перехватывать и передавать диалог.

Таблицы удобно использовать для чтения состояния диалога. Управляющие действия — взять, присоединиться, перехватить или передать — лучше выполнять штатными методами открытых линий, а не прямым изменением таблиц.

Операторы

Оператор сессии хранится в данных открытой линии, а участники чата — в IM-связях.

Где смотреть оператора

В сессиях открытых линий обычно полезны поля OPERATOR_ID, CHAT_ID, STATUS, CONFIG_ID и даты сессии.

Получить диалоги оператора

<?php

use Bitrix\Main\Loader;
use Bitrix\ImOpenLines\Model\SessionTable;

Loader::includeModule('imopenlines');

/**
 * Получает последние сессии оператора.
 */
function fetchOperatorOpenLineSessions(int $operator_id, int $limit): array
{
    $sessions = [];

    $session_result = SessionTable::getList([
        'select' => [
            'ID',
            'CHAT_ID',
            'USER_CODE',
            'CONFIG_ID',
            'STATUS',
            'OPERATOR_ID',
            'DATE_CREATE',
            'CLOSE_DATE',
        ],
        'filter' => [
            '=OPERATOR_ID' => $operator_id,
        ],
        'order' => [
            'ID' => 'DESC',
        ],
        'limit' => $limit,
    ]);

    while ($session = $session_result->fetch()) {
        $sessions[] = $session;
    }

    return $sessions;
}

$sessions = fetchOperatorOpenLineSessions($operator_id, 50);

print_r($sessions);

Действия с диалогом

Для действий с диалогом нужен CHAT_ID открытой линии. В REST он обычно передаётся числом, без префикса chat.

Присоединиться к диалогу

Присоединение добавляет оператора к диалогу. В REST для этого используется imopenlines.session.join.

/**
 * Пример параметров REST-запроса для присоединения к диалогу.
 */
function buildJoinDialogPayload(int $chat_id): array
{
    return [
        'CHAT_ID' => $chat_id,
    ];
}

$payload = buildJoinDialogPayload($chat_id);

print_r($payload);

Перехватить диалог

Перехват переводит текущий диалог на оператора, который вызывает действие. В REST для этого используется imopenlines.session.intercept.

/**
 * Пример параметров REST-запроса для перехвата диалога.
 */
function buildInterceptDialogPayload(int $chat_id): array
{
    return [
        'CHAT_ID' => $chat_id,
    ];
}

$payload = buildInterceptDialogPayload($chat_id);

print_r($payload);

Передать диалог

Передача отправляет диалог другому оператору или в очередь. В REST для этого используется imopenlines.operator.transfer.

/**
 * Готовит параметры передачи диалога оператору.
 */
function buildTransferToUserPayload(int $chat_id, int $user_id): array
{
    return [
        'CHAT_ID' => $chat_id,
        'USER_ID' => $user_id,
    ];
}

/**
 * Готовит параметры передачи диалога в очередь.
 */
function buildTransferToQueuePayload(int $chat_id, int $queue_id): array
{
    return [
        'CHAT_ID' => $chat_id,
        'QUEUE_ID' => $queue_id,
    ];
}

$user_payload = buildTransferToUserPayload($chat_id, $user_id);
$queue_payload = buildTransferToQueuePayload($chat_id, $queue_id);

print_r($user_payload);
print_r($queue_payload);

В новых REST-методах также встречается универсальный параметр TRANSFER_ID: ID пользователя или строка вида queue123.

Разница действий

Названия похожи, но смысл действий разный.

Взять, присоединиться, перехватить, передать

Действие Как понимать
Взять Оператор берёт новый или ожидающий диалог в работу.
Присоединиться Оператор добавляется к текущему диалогу.
Перехватить Диалог переходит к оператору, который выполняет перехват.
Передать Диалог отправляется другому оператору или в очередь.

Перед автоматизацией этих действий лучше проверить права пользователя, состояние сессии и текущего оператора. Прямое изменение таблиц для передачи диалога использовать не стоит.

Источники