Найти тему

Поиск по диалогам Битрикс24

Привет всем!

Сегодня описание решения реальной задачи от клиента.

Ситуация

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

Задача

Нужно найти этот диалог, понять, что сказал оператор. Известны только ключевые слова. Удобно будет найти лид, далее открыть его карточку и посмотреть диалог.

Решение

Я не нашел такого штатного функционала. В этом случае я делаю свою страничку, где реализую нужный функционал. Как правило, реализация делается через функции API или SQL-запрос. Почему-то в этом случае мне показалось проще реализовать задачу через SQL-запрос. Осталось найти нужные таблицы базы данных.

Функционал обмена сообщениями относиться к модулю "Веб-мессенджер", его код "im". Значит нужная таблица начинается с im. Недолгий поиск по таблицам, и нужная найдена - b_im_messages.

Среди полей этой таблицы нам пригодятся - message и chat_id.

Составим простейший SQL-запрос для поиска нужного сообщения

SELECT * FROM b_im_message WHERE MESSAGE LIKE 'тест'

Теперь посмотрим таблицу - b_im_chat. Получим чат с нужным ID

SELECT * FROM b_im_chat WHERE ID = '1000'

Обратим внимание на поле ENTITY_DATA_2 этой таблицы. Приведу пример данных этого поля - LEAD|941|COMPANY|0|CONTACT|0|DEAL|0.

Очевидно, что в этом поле содержаться данные об имеющих отношение к этому чату сущностях.

Сформируем конечный SQL-запрос:

SELECT b_im_message.ID, b_im_message.CHAT_ID,b_im_message.MESSAGE, b_im_chat.ID, b_im_chat.TITLE,b_im_chat.ENTITY_DATA_2 FROM b_im_message, b_im_chat WHERE MESSAGE LIKE '%".$find."%' AND b_im_message.CHAT_ID=b_im_chat.ID ORDER BY b_im_message.DATE_CREATE DESC

где переменная $find - наш поисковый запрос.

Теперь кусочек php-кода для решения этой задачи с пояснениями

$find=str_replace(' ','%',$find); - заменим пробелы в запросе на символы процента, чтобы расширить результаты поиска. Таким образом поисковые слова могут быть в диалоге не рядом.
global $DB;
$query="..."; - запрос дал выше
$res = $DB->Query($query); - отправляем запрос в СУБД
while ($arRes=$res->GetNext()) - обрабатываем выборку
{
$p=$arRes["ENTITY_DATA_2"]; - берем нужное поле
$p=explode('|',$p); - разделяем его на компоненты
?>
<?if ($p[0]=="LEAD" && $p[1]!=0) - проверяем формат поля
{?>
<div class="fmsg">
<p><a href="/crm/lead/details/<?=$p[1]?>/"><?=$arRes["TITLE"]?></a> - выводим ссылку на нужный лид
<p><?=$arRes["MESSAGE"]?> - и сообщение
</div>
<?}?>
<?
}

Как можно улучшить

Хотелось бы сделать поиск по диалогам не через запрос, а с использованием штатного модуля поиска. Это позволит осуществлять поиск более гибко.

Заключение

В принципе задача решена. Клиенту понравилось. Если вам понравилось или было полезно, можете поставить лайк и подписаться.

Картинка для заголовка

Скриншот формы поиска
Скриншот формы поиска