Files
crm.clientright.ru/ticket_form/N8N_INTEGRATION.md
Fedor de011efba9 fix: исправлен конфликт имён переменных в loadDraft (claimId -> finalClaimId)
- Исправлена ошибка ReferenceError при загрузке черновиков
- Переименована локальная переменная claimId в finalClaimId для избежания конфликта с параметром функции
- Обновлена логика извлечения claim_id из разных источников (claim.claim_id, payload.claim_id, body.claim_id, claim.id)
- Добавлен fallback на параметр claimId функции для надёжности
2025-11-19 23:33:52 +03:00

293 lines
5.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🔌 Интеграция n8n с React Frontend
## 📡 Redis Pub/Sub для real-time событий
### Публикация события из n8n (HTTP Request Node)
**POST** `http://147.45.146.17:8100/api/v1/events/{task_id}`
```json
{
"status": "processing|ocr_started|ocr_completed|ai_started|completed|error",
"message": "Описание для пользователя",
"data": {
"chars": 1500,
"confidence": 0.95,
"document_type": "policy",
"extracted_data": {...}
}
}
```
**Примеры:**
1. **Начало обработки:**
```json
POST /api/v1/events/abc-123-def
{
"status": "processing",
"message": "Начата обработка файла",
"data": {
"filename": "Policy_123.pdf"
}
}
```
2. **OCR завершён:**
```json
POST /api/v1/events/abc-123-def
{
"status": "ocr_completed",
"message": "Распознано 1500 символов",
"data": {
"chars": 1500,
"ocr_text_preview": "ЕВРОИНС ПОЛИС E1000-..."
}
}
```
3. **AI анализ:**
```json
POST /api/v1/events/abc-123-def
{
"status": "ai_started",
"message": "Запущен AI анализ документа",
"data": {}
}
```
4. **Завершено:**
```json
POST /api/v1/events/abc-123-def
{
"status": "completed",
"message": "Обработка завершена",
"data": {
"document_type": "policy",
"is_valid": true,
"confidence": 0.95,
"extracted_data": {
"voucher": "E1000-302545808",
"holder_name": "ROMANOVA ANASTASIIA",
"insured_from": "22.09.2025",
"insured_to": "30.09.2025"
}
}
}
```
5. **Ошибка:**
```json
POST /api/v1/events/abc-123-def
{
"status": "error",
"message": "Ошибка обработки: файл повреждён",
"data": {
"error_code": "OCR_FAILED"
}
}
```
---
## 🎯 Вебхуки для n8n
### 1. Проверка полиса (MySQL)
**POST** `/webhook/check-policy`
**Request:**
```json
{
"policy_number": "E1000-302545808",
"inn": "123456789012"
}
```
**Response:**
```json
{
"found": true,
"policy": {
"voucher": "E1000-302545808",
"holder_name": "ROMANOVA ANASTASIIA",
"status": "active"
}
}
```
---
### 2. Загрузка файла в S3
**POST** `/webhook/upload-file`
**Request (multipart/form-data):**
- `file`: File
- `folder`: "policies" | "documents" | "tickets"
**Response:**
```json
{
"success": true,
"task_id": "abc-123-def",
"s3_url": "https://s3.twcstorage.ru/bucket/policies/file.pdf",
"message": "Файл загружен, обработка началась"
}
```
**n8n Flow:**
1. Загрузить в S3
2. Сгенерировать `task_id` (UUID)
3. Положить задачу в RabbitMQ (`erv_ocr_processing`)
4. Вернуть `task_id`
---
### 3. OCR Worker (RabbitMQ Trigger)
**n8n Workflow:**
```
RabbitMQ Trigger (erv_ocr_processing)
Скачать файл из S3
POST /api/v1/events/{task_id}
status: "processing"
HTTP Request → OCR API
POST http://147.45.146.17:8001/analyze-file
POST /api/v1/events/{task_id}
status: "ocr_completed"
data: {chars: ..., ocr_text: "..."}
HTTP Request → Gemini Vision (OpenRouter)
POST /api/v1/events/{task_id}
status: "completed"
data: {document_type, is_valid, extracted_data}
Сохранить результат в Redis
key: "ocr_result:{task_id}"
ttl: 3600
```
---
### 4. Получение результата OCR
**GET** `/webhook/ocr-result/{task_id}`
**Response:**
```json
{
"success": true,
"result": {
"document_type": "policy",
"is_valid": true,
"confidence": 0.95,
"ocr_text": "...",
"extracted_data": {...}
}
}
```
**n8n:** Читает из Redis `ocr_result:{task_id}`
---
### 5. Создание заявки (финал)
**POST** `/webhook/create-claim`
**Request:**
```json
{
"voucher": "E1000-302545808",
"email": "user@example.com",
"phone": "+79001234567",
"incident": {
"type": "flight_delay",
"date": "2025-10-25",
"flight_number": "SU123",
"description": "Задержка более 3 часов"
},
"payment": {
"method": "sbp",
"bank": "sberbank"
},
"documents": [
"https://s3.../ticket1.pdf",
"https://s3.../boarding_pass.pdf"
]
}
```
**Response:**
```json
{
"success": true,
"claim_id": "CLM-2025-001",
"crm_id": "12345",
"message": "Заявка успешно создана"
}
```
**n8n Flow:**
1. Проверить все данные
2. Создать запись в PostgreSQL
3. Отправить в Vtiger CRM
4. Отправить email подтверждение
5. Вернуть claim_id
---
## 📊 Draft (автосохранение)
**POST** `/webhook/draft/save`
```json
{
"session_id": "sess-abc-123",
"step": 1,
"form_data": {...}
}
```
**GET** `/webhook/draft/stats`
Возвращает статистику: сколько людей бросили на каждом шаге.
---
## 🔗 Redis Connection
**Host:** `crm.clientright.ru`
**Port:** `6379`
**Password:** `CRM_Redis_Pass_2025_Secure!`
**DB:** `0`
**Channels:**
- `ocr_events:{task_id}` - события обработки
---
## 📝 Примечания
1. **task_id** - генерируется как UUID в n8n
2. **Redis TTL** - результаты хранятся 1 час
3. **RabbitMQ** - `185.197.75.249:5672` (admin/tyejvtej)
4. **S3** - TWC Storage, креды в .env
---
**Готово для n8n! 🚀**