Files
aiform_prod/N8N_INTEGRATION.md

293 lines
5.4 KiB
Markdown
Raw Permalink Normal View History

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