Открытые линии
Сессии и диалоги
Рабочая справка по сессиям и диалогам открытых линий Bitrix24: SessionTable, CHAT_ID, USER_CODE, история и связь с IM-чатом.
В открытых линиях диалог — это общение с клиентом в чате, а сессия — конкретный цикл обработки этого обращения: подключение оператора, сообщения, закрытие и оценка.
Общее понимание
Один чат открытой линии может иметь несколько сессий.
Диалог и сессия
| Понятие | Что означает |
|---|---|
| Чат | IM-чат, в котором хранятся сообщения. |
| Диалог | Общение с клиентом в открытой линии. |
| Сессия | Один цикл обработки обращения в этом диалоге. |
| USER_CODE | Код внешнего клиента/канала, по которому можно открыть диалог. |
Основные ID
Чаще всего используются CHAT_ID, SESSION_ID,
USER_CODE, CONFIG_ID, а также CRM-поля, если линия связана с
CRM.
Сессии
Для коробочного анализа сессий используется таблица сессий модуля imopenlines.
SessionTable
Для чтения сессий используется Bitrix\ImOpenLines\Model\SessionTable.
| Поле | Что означает |
|---|---|
ID | ID сессии. |
CHAT_ID | ID IM-чата открытой линии. |
USER_CODE | Код внешнего клиента и канала. |
CONFIG_ID | ID настройки открытой линии. |
STATUS | Статус сессии. |
OPERATOR_ID | Текущий или последний оператор, если поле заполнено. |
DATE_CREATE | Дата создания сессии. |
CLOSE_DATE | Дата закрытия сессии, если она закрыта. |
Получить сессии чата
<?php
use Bitrix\Main\Loader;
use Bitrix\ImOpenLines\Model\SessionTable;
Loader::includeModule('imopenlines');
/**
* Получает сессии открытой линии по ID чата.
*/
function fetchOpenLineSessionsByChatId(int $chat_id): array
{
$sessions = [];
$session_result = SessionTable::getList([
'select' => [
'ID',
'CHAT_ID',
'USER_CODE',
'CONFIG_ID',
'STATUS',
'OPERATOR_ID',
'DATE_CREATE',
'CLOSE_DATE',
],
'filter' => [
'=CHAT_ID' => $chat_id,
],
'order' => [
'ID' => 'ASC',
],
]);
while ($session = $session_result->fetch()) {
$sessions[] = $session;
}
return $sessions;
}
$sessions = fetchOpenLineSessionsByChatId($chat_id);
print_r($sessions); Получить последнюю сессию
<?php
use Bitrix\Main\Loader;
use Bitrix\ImOpenLines\Model\SessionTable;
Loader::includeModule('imopenlines');
/**
* Получает последнюю сессию открытой линии по ID чата.
*/
function fetchLastOpenLineSessionByChatId(int $chat_id): ?array
{
$session = SessionTable::getList([
'select' => [
'ID',
'CHAT_ID',
'USER_CODE',
'CONFIG_ID',
'STATUS',
'OPERATOR_ID',
'DATE_CREATE',
'CLOSE_DATE',
],
'filter' => [
'=CHAT_ID' => $chat_id,
],
'order' => [
'ID' => 'DESC',
],
'limit' => 1,
])->fetch();
return is_array($session) ? $session : null;
}
$session = fetchLastOpenLineSessionByChatId($chat_id);
print_r($session); Диалоги
Диалог открытой линии технически связан с IM-чатом и историей сообщений.
Диалог как чат
Если известен CHAT_ID, историю диалога можно читать как историю обычного
IM-чата через MessageTable.
История сообщений
<?php
use Bitrix\Main\Loader;
use Bitrix\Im\Model\MessageTable;
Loader::includeModule('im');
/**
* Получает историю сообщений диалога открытой линии.
*/
function fetchOpenLineDialogMessages(int $chat_id, int $limit): array
{
$messages = [];
$message_result = MessageTable::getList([
'select' => [
'ID',
'CHAT_ID',
'AUTHOR_ID',
'MESSAGE',
'DATE_CREATE',
],
'filter' => [
'=CHAT_ID' => $chat_id,
],
'order' => [
'ID' => 'DESC',
],
'limit' => $limit,
]);
while ($message = $message_result->fetch()) {
$messages[] = $message;
}
return array_reverse($messages);
}
$messages = fetchOpenLineDialogMessages($chat_id, 100);
print_r($messages);
В REST для истории открытой линии есть отдельный метод
imopenlines.session.history.get. Он может принимать SESSION_ID
или CHAT_ID.