🎯 Основные изменения: 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
58 lines
1.9 KiB
Python
Executable File
58 lines
1.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
Redis Channel Monitor - слушает события на каналах ocr_events:*
|
|
"""
|
|
import redis
|
|
import json
|
|
import sys
|
|
from datetime import datetime
|
|
|
|
def monitor_redis_channels():
|
|
try:
|
|
# Подключаемся к Redis
|
|
r = redis.Redis(host='crm.clientright.ru', port=6379, decode_responses=True)
|
|
|
|
# Создаем PubSub объект
|
|
pubsub = r.pubsub()
|
|
|
|
# Подписываемся на pattern
|
|
pubsub.psubscribe('ocr_events:*')
|
|
|
|
print(f"🔊 Слушаем Redis каналы: ocr_events:*")
|
|
print(f"⏰ Начало мониторинга: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
|
|
print("=" * 80)
|
|
print()
|
|
|
|
# Слушаем сообщения
|
|
for message in pubsub.listen():
|
|
if message['type'] == 'pmessage':
|
|
channel = message['channel']
|
|
data = message['data']
|
|
timestamp = datetime.now().strftime('%H:%M:%S.%f')[:-3]
|
|
|
|
print(f"⏰ {timestamp}")
|
|
print(f"📢 Канал: {channel}")
|
|
|
|
# Пытаемся распарсить JSON
|
|
try:
|
|
parsed_data = json.loads(data)
|
|
print(f"📦 Данные:")
|
|
print(json.dumps(parsed_data, indent=2, ensure_ascii=False))
|
|
except json.JSONDecodeError:
|
|
print(f"📦 Данные (raw): {data}")
|
|
|
|
print("-" * 80)
|
|
print()
|
|
|
|
except KeyboardInterrupt:
|
|
print("\n\n⛔ Мониторинг остановлен")
|
|
sys.exit(0)
|
|
except Exception as e:
|
|
print(f"❌ Ошибка: {e}")
|
|
sys.exit(1)
|
|
|
|
if __name__ == '__main__':
|
|
monitor_redis_channels()
|
|
|
|
|