- Добавлены логи в frontend (ClaimForm.tsx) для отслеживания unified_id и запросов к API - Добавлены логи в backend (claims.py) для отладки SQL запросов - Создан лог сессии с описанием проблемы и текущего состояния - Проблема: API возвращает 0 черновиков, хотя в БД есть данные
219 lines
6.0 KiB
Markdown
219 lines
6.0 KiB
Markdown
# Анализ 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) для всех систем
|
||
|