- Исправлен N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js: использовать uploads_field_labels[0] вместо [grp] - Создан SQL_CLAIMSAVE_FIXED_NEW_FLOW_DEDUP.sql с дедупликацией documents_meta - Создан SQL_CLEANUP_DOCUMENTS_META_DUPLICATES.sql для очистки существующих дубликатов - Создан полный уникальный индекс idx_document_texts_hash_unique на document_texts(file_hash) - Добавлен SESSION_LOG_2025-11-28_documents_dedup.md с описанием всех изменений Fixes: - field_label теперь корректно отображает 'Переписка' вместо 'group-2' - documents_meta не накапливает дубликаты при повторных сохранениях - ON CONFLICT (file_hash) теперь работает для document_texts
2.8 KiB
2.8 KiB
Структура documents_meta в SQL запросах
Текущая структура после OCR объединения
После обработки файлов OCR возвращает объединённые документы со следующей структурой:
{
"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 для извлечения только нужных полей:
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:
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 запроса можно проверить:
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 - текущая структура достаточна для работы.