293 lines
5.4 KiB
Markdown
293 lines
5.4 KiB
Markdown
|
|
# 🔌 Интеграция 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! 🚀**
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|