Открытые линии
Операторы и передача диалога
Рабочая справка по операторам открытых линий: как смотреть оператора сессии, присоединяться, перехватывать и передавать диалог.
Таблицы удобно использовать для чтения состояния диалога. Управляющие действия — взять, присоединиться, перехватить или передать — лучше выполнять штатными методами открытых линий, а не прямым изменением таблиц.
Операторы
Оператор сессии хранится в данных открытой линии, а участники чата — в 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.
Разница действий
Названия похожи, но смысл действий разный.
Взять, присоединиться, перехватить, передать
| Действие | Как понимать |
|---|---|
| Взять | Оператор берёт новый или ожидающий диалог в работу. |
| Присоединиться | Оператор добавляется к текущему диалогу. |
| Перехватить | Диалог переходит к оператору, который выполняет перехват. |
| Передать | Диалог отправляется другому оператору или в очередь. |
Перед автоматизацией этих действий лучше проверить права пользователя, состояние сессии и текущего оператора. Прямое изменение таблиц для передачи диалога использовать не стоит.