Files
aiform_dev/docs/WORKFLOW_OCR_ANALYSIS.md
AI Assistant 4c8fda5f55 Добавлено логирование для отладки черновиков
- Добавлены логи в frontend (ClaimForm.tsx) для отслеживания unified_id и запросов к API
- Добавлены логи в backend (claims.py) для отладки SQL запросов
- Создан лог сессии с описанием проблемы и текущего состояния
- Проблема: API возвращает 0 черновиков, хотя в БД есть данные
2025-11-19 18:46:48 +03:00

6.0 KiB
Raw Blame History

Анализ 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

Формат сообщения:

{
  "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

Запрос:

-- Получает документы из 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 Request2http://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:

// После 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)

-- Использует: WHERE id = $1 (UUID)
FROM clpr_claims WHERE id = $1

Работает как есть - получаем UUID из claim.claim_id

Запрос 2: Получение полных данных (строка 1020)

-- Использует: 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) для всех систем