Добавлена система уведомлений для Telegram AI бота
- Реализована функция createTelegramAINotification() в telegram_ai_qa.php - Автоматическое создание уведомлений при общении клиента с AI ботом - Уведомления отправляются ответственному по проекту - Умная дедупликация - обновление существующих непрочитанных уведомлений - Краткий заголовок с именем клиента и началом вопроса (до 80 символов) - Ссылка ведет на проект с комментариями диалога - Добавлена документация TELEGRAM_AI_NOTIFICATIONS.md - Протестировано и работает корректно
This commit is contained in:
185
TELEGRAM_AI_NOTIFICATIONS.md
Normal file
185
TELEGRAM_AI_NOTIFICATIONS.md
Normal file
@@ -0,0 +1,185 @@
|
||||
# Система уведомлений для Telegram AI бота
|
||||
|
||||
**Дата:** 16 октября 2025
|
||||
**Статус:** ✅ Реализовано и протестировано
|
||||
|
||||
## Описание
|
||||
|
||||
Интегрирована система уведомлений в endpoint `telegram_ai_qa.php` для сохранения AI-диалогов из Telegram. Теперь при общении клиента с AI ботом автоматически создается уведомление для ответственного по проекту.
|
||||
|
||||
## Как это работает
|
||||
|
||||
### 1. Процесс обработки диалога
|
||||
|
||||
1. **Клиент пишет в Telegram** → AI бот отвечает → бот вызывает `telegram_ai_qa.php`
|
||||
2. **Система находит контакт** по TGID (Telegram ID в поле phone)
|
||||
3. **Система находит проект** (активный или указанный)
|
||||
4. **Создаются 2 комментария:**
|
||||
- Вопрос клиента (от имени ответственного, customer=contactid)
|
||||
- Ответ AI бота (от пользователя AI Bot ID=23)
|
||||
5. **🆕 Создается уведомление** для ответственного по проекту
|
||||
|
||||
### 2. Структура уведомления
|
||||
|
||||
```sql
|
||||
INSERT INTO vtiger_vdnotifierpro (
|
||||
userid, -- Ответственный по проекту
|
||||
modulename, -- 'Project'
|
||||
crmid, -- ID проекта
|
||||
link, -- Ссылка на проект
|
||||
title, -- "Telegram AI: [ФИО] - [вопрос]"
|
||||
status -- 5 (непрочитанное)
|
||||
)
|
||||
```
|
||||
|
||||
### 3. Пример уведомления
|
||||
|
||||
- **Текст:** "Telegram AI: Дария Сатюкова - Я уже получила письмо от Гагаринского районного суда"
|
||||
- **Ссылка:** `module=Project&view=Detail&record=379166`
|
||||
- **Получатель:** Ответственный по проекту (пользователь 8)
|
||||
|
||||
## Технические детали
|
||||
|
||||
### Функция `createTelegramAINotification()`
|
||||
|
||||
```php
|
||||
function createTelegramAINotification($projectId, $contactId, $contactName, $questionPreview) {
|
||||
// 1. Получаем ответственного по проекту
|
||||
// 2. Формируем текст уведомления (обрезаем вопрос до 80 символов)
|
||||
// 3. Проверяем существующие непрочитанные уведомления от AI
|
||||
// 4. Обновляем существующее или создаем новое
|
||||
}
|
||||
```
|
||||
|
||||
### Интеграция в основной процесс
|
||||
|
||||
```php
|
||||
// После создания комментариев с вопросом и ответом
|
||||
$contactName = $firstname . ' ' . $lastname;
|
||||
$notificationId = createTelegramAINotification($projectid, $contactid, $contactName, $question);
|
||||
```
|
||||
|
||||
### Обработка дубликатов
|
||||
|
||||
- **Логика:** Если есть непрочитанное уведомление от AI для этого проекта → обновляется заголовок и время
|
||||
- **Преимущество:** Не засоряет панель уведомлений множественными сообщениями от одного клиента
|
||||
- **Результат:** Ответственный всегда видит последний вопрос клиента
|
||||
|
||||
### Формат заголовка
|
||||
|
||||
```php
|
||||
// Вопрос обрезается до 80 символов для краткости
|
||||
$shortQuestion = mb_strlen($questionPreview) > 80 ? mb_substr($questionPreview, 0, 80) . '...' : $questionPreview;
|
||||
$notificationTitle = "Telegram AI: " . $contactName . " - " . $shortQuestion;
|
||||
```
|
||||
|
||||
## Результаты тестирования
|
||||
|
||||
### ✅ Тест прошел успешно
|
||||
|
||||
```
|
||||
=== Тест уведомлений Telegram AI ===
|
||||
|
||||
Тестовые данные:
|
||||
- Contact ID: 379165 (Дария Сатюкова)
|
||||
- Project ID: 379166
|
||||
- Вопрос: "Я уже получила письмо от Гагаринского районного суда"
|
||||
|
||||
✅ Создано уведомление ID: 6870
|
||||
✅ Пользователь: 8 (ответственный по проекту)
|
||||
✅ Модуль: Project
|
||||
✅ Ссылка: module=Project&view=Detail&record=379166
|
||||
✅ Заголовок: Telegram AI: Дария Сатюкова - Я уже получила письмо от Гагаринского районного суда
|
||||
✅ Статус: 5 (непрочитанное)
|
||||
```
|
||||
|
||||
### Проверка в CRM
|
||||
|
||||
1. **Войти в CRM** под ответственным за проект
|
||||
2. **Посмотреть панель уведомлений** (справа вверху)
|
||||
3. **Увидеть уведомление:** "Telegram AI: [Имя клиента] - [вопрос]"
|
||||
4. **Кликнуть на уведомление** → откроется проект с комментариями
|
||||
|
||||
## Логирование
|
||||
|
||||
Все действия логируются в `logs/tg_ai_qa.log`:
|
||||
|
||||
```
|
||||
2025-10-16 16:19:26 - Создаем уведомление для проекта 379166 о диалоге с AI ботом
|
||||
2025-10-16 16:19:26 - Ответственный по проекту: пользователь 8
|
||||
2025-10-16 16:19:26 - ✅ Создано новое уведомление ID: 6870 для пользователя 8
|
||||
```
|
||||
|
||||
## Формат запроса
|
||||
|
||||
### Endpoint
|
||||
`POST https://crm.clientright.ru/telegram_ai_qa.php`
|
||||
|
||||
### Тело запроса (JSON)
|
||||
```json
|
||||
{
|
||||
"tgid": "663733547",
|
||||
"projectid": 379166,
|
||||
"question": "Я уже получила письмо от Гагаринского районного суда",
|
||||
"answer": "Если вы не можете присутствовать на судебном заседании...",
|
||||
"botname": "klientprav_bot"
|
||||
}
|
||||
```
|
||||
|
||||
### Ответ (JSON)
|
||||
```json
|
||||
{
|
||||
"status": "success",
|
||||
"contact_id": "379165",
|
||||
"project_id": 379166,
|
||||
"question_comment_id": 395300,
|
||||
"answer_comment_id": 395301,
|
||||
"notification_id": 6870,
|
||||
"botname": "klientprav_bot"
|
||||
}
|
||||
```
|
||||
|
||||
## Преимущества
|
||||
|
||||
1. **Мгновенное оповещение** - ответственный сразу видит обращение клиента
|
||||
2. **Контекст в заголовке** - сразу видно имя клиента и суть вопроса
|
||||
3. **Прямая ссылка** - клик ведет сразу к проекту с комментариями
|
||||
4. **Умная дедупликация** - обновление существующих уведомлений вместо создания новых
|
||||
5. **Интеграция с VDNotifierPro** - использует существующую систему уведомлений
|
||||
6. **Полное логирование** - все действия записываются в лог
|
||||
|
||||
## Отличия от уведомлений о письмах
|
||||
|
||||
| Характеристика | Письма (Documents) | Telegram AI (Project) |
|
||||
|----------------|--------------------|-----------------------|
|
||||
| **Модуль** | Documents | Project |
|
||||
| **Триггер** | Поступление судебного письма | Диалог с AI ботом |
|
||||
| **Ссылка на** | Документ | Проект |
|
||||
| **Заголовок** | "Письмо от [ФИО] - [тип документа]" | "Telegram AI: [ФИО] - [вопрос]" |
|
||||
| **Дедупликация** | По documentId | По projectId + префикс "Telegram AI:" |
|
||||
| **Обновление** | Только время | Заголовок + время |
|
||||
|
||||
## Файлы
|
||||
|
||||
### Измененные файлы:
|
||||
- ✅ `telegram_ai_qa.php` - добавлена функция уведомлений
|
||||
|
||||
### Логи:
|
||||
- ✅ `logs/tg_ai_qa.log` - все операции
|
||||
|
||||
## Использование
|
||||
|
||||
Система работает автоматически при каждом запросе к `telegram_ai_qa.php`. Никаких дополнительных действий не требуется.
|
||||
|
||||
### Telegram бот должен:
|
||||
1. Получить вопрос от клиента
|
||||
2. Сгенерировать ответ через AI
|
||||
3. Отправить POST запрос к `telegram_ai_qa.php` с вопросом и ответом
|
||||
4. **Автоматически создастся уведомление** для ответственного
|
||||
|
||||
---
|
||||
|
||||
**Статус:** ✅ Готово к использованию
|
||||
**Автор:** AI Assistant + Фёдор
|
||||
**Дата:** 16 октября 2025
|
||||
|
||||
@@ -42,6 +42,63 @@ $botname = isset($data['botname']) ? $data['botname'] : 'AI Bot';
|
||||
|
||||
$user = Users::getActiveAdminUser();
|
||||
|
||||
// Функция для создания уведомления о диалоге с AI ботом
|
||||
function createTelegramAINotification($projectId, $contactId, $contactName, $questionPreview) {
|
||||
global $adb;
|
||||
|
||||
$logstring = date('Y-m-d H:i:s').' Создаем уведомление для проекта '.$projectId.' о диалоге с AI ботом'.PHP_EOL;
|
||||
file_put_contents('logs/tg_ai_qa.log', $logstring, FILE_APPEND);
|
||||
|
||||
// Получаем ответственного по проекту
|
||||
$query = 'SELECT e.smownerid FROM vtiger_crmentity e WHERE e.crmid = ? AND e.deleted = 0';
|
||||
$result = $adb->pquery($query, array($projectId));
|
||||
|
||||
if ($adb->num_rows($result) === 0) {
|
||||
$logstring = date('Y-m-d H:i:s').' WARNING: Проект '.$projectId.' не найден или удален'.PHP_EOL;
|
||||
file_put_contents('logs/tg_ai_qa.log', $logstring, FILE_APPEND);
|
||||
return false;
|
||||
}
|
||||
|
||||
$userId = $adb->query_result($result, 0, 'smownerid');
|
||||
|
||||
$logstring = date('Y-m-d H:i:s').' Ответственный по проекту: пользователь '.$userId.PHP_EOL;
|
||||
file_put_contents('logs/tg_ai_qa.log', $logstring, FILE_APPEND);
|
||||
|
||||
// Формируем текст уведомления
|
||||
// Обрезаем вопрос до 80 символов для краткости
|
||||
$shortQuestion = mb_strlen($questionPreview) > 80 ? mb_substr($questionPreview, 0, 80) . '...' : $questionPreview;
|
||||
$notificationTitle = "Telegram AI: " . $contactName . " - " . $shortQuestion;
|
||||
|
||||
// Формируем ссылку на проект (VDNotifierPro убирает index.php? из ссылки)
|
||||
$projectLink = "module=Project&view=Detail&record=" . $projectId;
|
||||
|
||||
// Проверяем, нет ли уже непрочитанного уведомления для этого проекта от AI бота
|
||||
// Используем modulename='Project' и проверяем title на начало с "Telegram AI:"
|
||||
$checkQuery = "SELECT id FROM vtiger_vdnotifierpro WHERE userid = ? AND crmid = ? AND modulename = 'Project' AND title LIKE 'Telegram AI:%' AND status = 5 ORDER BY modifiedtime DESC LIMIT 1";
|
||||
$checkResult = $adb->pquery($checkQuery, array($userId, $projectId));
|
||||
|
||||
if ($adb->num_rows($checkResult) > 0) {
|
||||
// Обновляем существующее уведомление - обновляем заголовок и время
|
||||
$existingId = $adb->query_result($checkResult, 0, 'id');
|
||||
$updateQuery = "UPDATE vtiger_vdnotifierpro SET title = ?, modifiedtime = NOW() WHERE id = ?";
|
||||
$adb->pquery($updateQuery, array($notificationTitle, $existingId));
|
||||
|
||||
$logstring = date('Y-m-d H:i:s').' Обновлено существующее уведомление ID: '.$existingId.PHP_EOL;
|
||||
file_put_contents('logs/tg_ai_qa.log', $logstring, FILE_APPEND);
|
||||
return $existingId;
|
||||
} else {
|
||||
// Создаем новое уведомление
|
||||
$insertQuery = "INSERT INTO vtiger_vdnotifierpro (userid, modulename, crmid, modiuserid, link, title, action, modifiedtime, status) VALUES (?, 'Project', ?, 0, ?, ?, '', NOW(), 5)";
|
||||
$adb->pquery($insertQuery, array($userId, $projectId, $projectLink, $notificationTitle));
|
||||
|
||||
$notificationId = $adb->getLastInsertID();
|
||||
$logstring = date('Y-m-d H:i:s').' ✅ Создано новое уведомление ID: '.$notificationId.' для пользователя '.$userId.PHP_EOL;
|
||||
file_put_contents('logs/tg_ai_qa.log', $logstring, FILE_APPEND);
|
||||
|
||||
return $notificationId;
|
||||
}
|
||||
}
|
||||
|
||||
// 1. Находим контакт по tgid
|
||||
$query = 'select c.contactid, c.firstname, c.lastname, e.smownerid as userid
|
||||
from vtiger_contactdetails c
|
||||
@@ -166,13 +223,18 @@ $adb->pquery($sql, $params);
|
||||
$logstring = date('Y-m-d H:i:s').' ✅ Создан комментарий с ОТВЕТОМ: '.$answer_commentid.PHP_EOL;
|
||||
file_put_contents('logs/tg_ai_qa.log', $logstring, FILE_APPEND);
|
||||
|
||||
// 6. Возвращаем успех
|
||||
// 6. Создаем уведомление для ответственного по проекту
|
||||
$contactName = $firstname . ' ' . $lastname;
|
||||
$notificationId = createTelegramAINotification($projectid, $contactid, $contactName, $question);
|
||||
|
||||
// 7. Возвращаем успех
|
||||
$response = array(
|
||||
'status' => 'success',
|
||||
'contact_id' => $contactid,
|
||||
'project_id' => $projectid,
|
||||
'question_comment_id' => $question_commentid,
|
||||
'answer_comment_id' => $answer_commentid,
|
||||
'notification_id' => $notificationId,
|
||||
'botname' => $botname
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user