82 lines
2.8 KiB
Markdown
82 lines
2.8 KiB
Markdown
|
|
# Структура documents_meta в SQL запросах
|
|||
|
|
|
|||
|
|
## Текущая структура после OCR объединения
|
|||
|
|
|
|||
|
|
После обработки файлов OCR возвращает объединённые документы со следующей структурой:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"documents_meta": [
|
|||
|
|
{
|
|||
|
|
"field_name": "uploads[0][0]",
|
|||
|
|
"field_label": "Договор или заказ",
|
|||
|
|
"file_id": "clientright/0/1764167196926.pdf",
|
|||
|
|
"file_name": "1764167196926.pdf",
|
|||
|
|
"original_file_name": "1764167196926.pdf",
|
|||
|
|
"uploaded_at": "2025-11-26T14:44:51.430Z",
|
|||
|
|
"files_count": 2, // ✅ Новое поле: сколько файлов было объединено
|
|||
|
|
"pages": 4 // ✅ Новое поле: сколько страниц в объединённом PDF
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## Как SQL обрабатывает эту структуру
|
|||
|
|
|
|||
|
|
### 1. Сохранение в `clpr_claim_documents`
|
|||
|
|
|
|||
|
|
SQL использует `jsonb_to_recordset` для извлечения только нужных полей:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
CROSS JOIN LATERAL jsonb_to_recordset(
|
|||
|
|
COALESCE(partial.p->'documents_meta', '[]'::jsonb)
|
|||
|
|
) AS doc(
|
|||
|
|
field_name text,
|
|||
|
|
file_id text,
|
|||
|
|
file_name text,
|
|||
|
|
original_file_name text,
|
|||
|
|
uploaded_at text
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Важно:** `field_label`, `files_count`, `pages` не извлекаются, но это нормально - они не нужны в таблице `clpr_claim_documents`.
|
|||
|
|
|
|||
|
|
### 2. Сохранение в `payload->'documents_meta'`
|
|||
|
|
|
|||
|
|
Полный JSON сохраняется в `payload` через `jsonb_build_object`:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
jsonb_build_object(
|
|||
|
|
'claim_id', partial.claim_id_str,
|
|||
|
|
'documents_meta', COALESCE(partial.p->'documents_meta', '[]'::jsonb),
|
|||
|
|
...
|
|||
|
|
)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**Результат:** Все поля (`field_label`, `files_count`, `pages`) сохраняются в `payload->'documents_meta'` в полном объёме.
|
|||
|
|
|
|||
|
|
## Проверка сохранения
|
|||
|
|
|
|||
|
|
После выполнения SQL запроса можно проверить:
|
|||
|
|
|
|||
|
|
```sql
|
|||
|
|
SELECT
|
|||
|
|
payload->'documents_meta'->0->>'field_label' AS field_label,
|
|||
|
|
payload->'documents_meta'->0->>'files_count' AS files_count,
|
|||
|
|
payload->'documents_meta'->0->>'pages' AS pages
|
|||
|
|
FROM clpr_claims
|
|||
|
|
WHERE payload->>'claim_id' = 'bddb6815-8e17-4d54-a721-5e94382942c7';
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Должны вернуться:
|
|||
|
|
- `field_label`: "Договор или заказ"
|
|||
|
|
- `files_count`: "2"
|
|||
|
|
- `pages`: "4"
|
|||
|
|
|
|||
|
|
## Вывод
|
|||
|
|
|
|||
|
|
✅ **SQL запрос работает правильно** - дополнительные поля сохраняются в `payload->'documents_meta'` и доступны для использования в дальнейших операциях.
|
|||
|
|
|
|||
|
|
❌ **Не нужно менять SQL** - текущая структура достаточна для работы.
|
|||
|
|
|