Files
aiform_dev/docs/WORKFLOW_OCR_ANALYSIS.md

219 lines
6.0 KiB
Markdown
Raw Normal View 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`
**Формат сообщения:**
```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) для всех систем