Files
aiform_prod/N8N_INTEGRATION.md
AI Assistant 647abf6578 feat: Интеграция n8n + Redis Pub/Sub + SSE для real-time обработки заявок
🎯 Основные изменения:

Backend:
-  Добавлен SSE endpoint для real-time событий (/api/v1/events/{task_id})
-  Redis Pub/Sub для публикации/подписки на события OCR/Vision
-  Удален aioboto3 из requirements.txt (конфликт зависимостей)
-  Добавлен OCR worker (deprecated, логика перенесена в n8n)

Frontend (React):
-  Автогенерация claim_id и session_id
-  Клиентская конвертация файлов в PDF (JPG/PNG/HEIC/WEBP)
-  Сжатие изображений до 2MB перед конвертацией
-  SSE подписка на события OCR/Vision в Step1Policy
-  Валидация документов (полис vs неподходящий контент)
-  Real-time прогресс загрузки и обработки файлов
-  Интеграция с n8n webhooks для проверки полиса и загрузки файлов

n8n Workflows:
-  Проверка полиса в MySQL + запись в PostgreSQL
-  Загрузка файлов в S3 + OCR + Vision AI
-  Публикация событий в Redis через backend API
-  Валидация документов (распознавание полисов ERV)

Документация:
- 📝 N8N_INTEGRATION.md - интеграция с n8n
- 📝 N8N_SQL_QUERIES.md - SQL запросы для workflows
- 📝 N8N_PDF_COMPRESS.md - сжатие PDF
- 📝 N8N_STIRLING_COMPRESS.md - интеграция Stirling-PDF

Утилиты:
- 🔧 monitor_redis.py/sh - мониторинг Redis Pub/Sub
- 🔧 test_redis_events.sh - тестирование событий
- 🔧 pdfConverter.ts - клиентская конвертация в PDF

Архитектура:
React → n8n webhooks (sync) → MySQL/PostgreSQL/S3
      → n8n workflows (async) → OCR/Vision → Redis Pub/Sub → SSE → React
2025-10-27 08:33:16 +03:00

293 lines
5.4 KiB
Markdown
Raw Permalink 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! 🚀**