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

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

Сессии и диалоги

Рабочая справка по сессиям и диалогам открытых линий 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.

Источники