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) для всех систем
|
|||
|
|
|