- Исправлена потеря документов при обновлении черновика (SQL объединяет вместо перезаписи) - Исправлено определение типа документа (приоритет field_label над field_name) - Исправлены дубликаты в documents_meta и documents_uploaded - Добавлена передача group_index с фронтенда для правильного field_name - Исправлены все документы в таблице clpr_claim_documents с правильными field_name - Обновлены SQL запросы: claimsave и claimsave_final для нового флоу - Добавлена поддержка multi-file upload для одного документа - Исправлены дубликаты в списке загруженных документов на фронтенде Файлы: - SQL: SQL_CLAIMSAVE_FIXED_NEW_FLOW.sql, SQL_CLAIMSAVE_FINAL_FIXED_NEW_FLOW_WITH_UPLOADED.sql - n8n: N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js (поддержка group_index) - Backend: documents.py (передача group_index в n8n) - Frontend: StepWizardPlan.tsx (передача group_index, исправление дубликатов) - Скрипты: fix_claim_documents_field_names.py, fix_documents_meta_duplicates.py Результат: документы больше не теряются, имеют правильные типы и field_name
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** - текущая структура достаточна для работы.
|
||
|