# Анализ workflow: шаг ?? ocr_jobs_clime (1IKe2PccqXLkD2KR) ## Общая информация **ID:** `1IKe2PccqXLkD2KR` **Название:** `шаг ?? ocr_jobs_clime` **Статус:** Active **Триггер:** Redis Pub/Sub на канале `clpr:ocr:jobs` --- ## Архитектура workflow ### 1. Триггер: Redis Pub/Sub **Канал:** `clpr:ocr:jobs` **Формат сообщения:** ```json { "message": { "job_id": "...", "claim_id": "uuid", // UUID из clpr_claims.id "prefix": "clpr_", "telegram_id": "...", "session_token": "...", "channel": "telegram|web_form", "created_at": "..." } } ``` --- ### 2. Основной поток обработки #### Шаг 1: Получение файлов из PostgreSQL **Нода:** `Execute a SQL query` **Запрос:** ```sql -- Получает документы из clpr_claim_documents по claim_id (UUID) SELECT cd.id AS claim_document_id, cd.claim_id::text AS claim_id, cd.field_name, cd.file_id, cd.uploaded_at, m.file_url, m.file_name, m.original_file_name, -- ... описание из payload FROM clpr_claim_documents cd JOIN clpr_claims c ON c.id = cd.claim_id::uuid -- ... метаданные из payload.documents_meta ``` **Важно:** Использует `claim_id` как **UUID** (из `clpr_claims.id`) --- #### Шаг 2: Загрузка файла в S3 **Нода:** `Upload_OCR_File` **Путь:** `temp/{telegram_id}/{file_name}` --- #### Шаг 3: OCR обработка **Нода:** `HTTP Request2` → `http://147.45.146.17:8001/analyze-file` **Параметры:** - `file_url` - URL файла из S3 - `file_name` - имя файла --- #### Шаг 4: Обработка результатов OCR **Нода:** `Edit Fields6` **Извлекает:** - `ocr_text` - текст OCR - `vision_reason` - причина отправки в vision - `nsfw` - флаг NSFW - `page` - номер страницы - `file_id` - ID документа из `claim_document_id` --- #### Шаг 5: Сохранение результатов **Нода:** `give_data1` (SQL запрос) **Запрос:** Получает полные данные заявки: - `claim` - данные заявки - `documents` - документы - `ocr_pages` - страницы OCR - `vision_docs` - результаты vision - `combined_docs` - объединенные документы **Использует:** `claim_id` как **UUID** (из `clpr_claims.id`) --- #### Шаг 6: Публикация событий **Нода:** `Redis Publish (SendMessage)2` **Канал:** `events:SendMessage` **Сообщение:** JSON с результатами обработки --- ## Интеграция с веб-формой ### Текущая ситуация: 1. **Веб-форма использует:** - `claim_id` в формате `CLM-YYYY-MM-DD-XXXXXX` (строка) - Сохраняет в `clpr_claims.payload->>'claim_id'` 2. **SQL запросы возвращают:** - `claim.claim_id` = **UUID** в виде строки (из `clpr_claims.id`) - `claim.claim_id_str` = строка `CLM-...` (из `payload->>'claim_id'`) 3. **Workflow ожидает:** - `claim_id` как **UUID** (из `clpr_claims.id`) - Использует `clpr_claims.id` для поиска ### Решение: ✅ **Ничего менять не нужно!** При публикации в Redis канал `clpr:ocr:jobs` используем `claim.claim_id` (UUID), который возвращается из SQL запроса. ### Пример публикации в Redis: ```javascript // После claimsave или claimsave_final const claim = $json.claim; // Публикуем в Redis канал clpr:ocr:jobs await redis.publish('clpr:ocr:jobs', JSON.stringify({ job_id: generateJobId(), claim_id: claim.claim_id, // UUID из clpr_claims.id prefix: 'clpr_', channel: 'web_form', session_token: claim.payload?.session_token, created_at: new Date().toISOString() })); ``` **Важно:** Используем `claim.claim_id` (UUID), а не `claim.claim_id_str` (CLM-...) --- ## Рекомендации ### Для интеграции с веб-формой: ✅ **Ничего менять не нужно!** 1. **SQL запросы уже возвращают UUID:** - `claim.claim_id` = UUID из `clpr_claims.id` - `claim.claim_id_str` = строка CLM-... (для отображения) 2. **Публикация в Redis:** - Используем `claim.claim_id` (UUID) при публикации в `clpr:ocr:jobs` - Workflow будет работать без изменений 3. **Workflow:** - Остается без изменений - Принимает UUID и работает как обычно --- ## Текущие SQL запросы в workflow ### Запрос 1: Получение файлов (строка 485) ```sql -- Использует: WHERE id = $1 (UUID) FROM clpr_claims WHERE id = $1 ``` ✅ **Работает как есть** - получаем UUID из `claim.claim_id` ### Запрос 2: Получение полных данных (строка 1020) ```sql -- Использует: WHERE id = $1 (UUID) FROM clpr_claims WHERE id = $1 ``` ✅ **Работает как есть** - получаем UUID из `claim.claim_id` --- ## Итог ✅ **Ничего менять не нужно!** **Как это работает:** 1. Веб-форма сохраняет данные в PostgreSQL через `claimsave` 2. SQL запрос возвращает `claim.claim_id` (UUID из `clpr_claims.id`) 3. При публикации в Redis используем `claim.claim_id` (UUID) 4. Workflow получает UUID и работает без изменений **Преимущества:** - ✅ Workflow остается без изменений - ✅ Нет необходимости в дополнительных преобразованиях - ✅ Единый формат (UUID) для всех систем