- Исправлен 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
10 KiB
Лог сессии: Исправление загрузки документов и SQL запросов
Дата: 2025-11-26
Тема: Исправление потери документов, дубликатов и правильного определения field_name
Проблемы, которые были решены
1. Потеря документов при обновлении черновика
Проблема: При обработке нового документа через SQL claimsave_final существующие документы терялись.
Причина:
- SQL перезаписывал
documents_metaвместо объединения documents_uploadedмог быть перезаписан пустым массивом, еслиjsonb_aggвозвращал NULL
Решение:
- Исправлен SQL
SQL_CLAIMSAVE_FINAL_FIXED_NEW_FLOW_WITH_UPLOADED.sql:documents_metaтеперь объединяется с существующимиdocuments_uploadedвсегда начинается с существующих документов- Добавлена проверка на пустой массив перед перезаписью
2. Дубликаты документов в documents_meta
Проблема: В documents_meta были дубликаты (один и тот же file_id встречался несколько раз).
Решение:
- Создан скрипт
fix_documents_meta_duplicates.pyдля удаления дубликатов - Исправлена логика объединения в SQL
3. Неправильное определение типа документа
Проблема: Чек определялся как contract вместо payment.
Причина:
- SQL проверял
field_nameраньше, чемfield_label field_nameбылuploads[0][0]для всех документов
Решение:
- Изменён порядок проверки в SQL: сначала
field_label, потомfield_name - Исправлен файл
SQL_CLAIMSAVE_FINAL_FIXED_NEW_FLOW_WITH_UPLOADED.sql
4. Все документы имели одинаковый field_name
Проблема: В таблице clpr_claim_documents все документы имели field_name: uploads[0][0], из-за чего второй документ перезаписывал первый.
Причина:
group_index(индекс документа вdocuments_required) не передавался с фронтенда- Код n8n использовал
group_index_numиз OCR, который всегда был0
Решение:
- Фронтенд (
StepWizardPlan.tsx): добавлена передачаgroup_indexв запрос - Бэкенд (
documents.py): добавлено получениеgroup_indexиз Form и передача в n8n - Код n8n (
N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js): приоритетgroup_indexиз body надgroup_index_numиз OCR - Создан скрипт
fix_claim_documents_field_names.pyдля исправления существующих документов
5. SQL для claimsave перезаписывал documents_meta
Проблема: SQL claimsave перезаписывал documents_meta вместо объединения.
Решение:
- Исправлен файл
SQL_CLAIMSAVE_FIXED_NEW_FLOW.sql:documents_metaобъединяется с существующими- Критичные поля удаляются из нового payload перед объединением
- Затем устанавливаются отдельно через
jsonb_set
6. Дубликаты в списке загруженных документов на фронтенде
Проблема: React ошибка "Encountered two children with the same key, contract".
Решение:
- Исправлен
StepWizardPlan.tsx:- Убраны дубликаты при инициализации
uploadedDocs - Проверка на дубликаты при добавлении нового документа
- Использование
Array.from(new Set())при рендеринге
- Убраны дубликаты при инициализации
Созданные файлы
SQL запросы
docs/SQL_CLAIMSAVE_FINAL_FIXED_NEW_FLOW_WITH_UPLOADED.sql- SQL для сохранения документов с автоматическим созданиемdocuments_uploadeddocs/SQL_CLAIMSAVE_FIXED_NEW_FLOW.sql- Исправленный SQL дляclaimsaveс объединениемdocuments_metadocs/SQL_FIX_DRAFT_BDDB6815.sql- SQL для исправления конкретного черновикаdocs/SQL_FIX_CLAIM_DOCUMENTS_FIELD_NAMES.sql- SQL для исправленияfield_nameв таблице
Код n8n
docs/N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js- Исправленный код для обработки загруженных файлов с поддержкойgroup_index
Скрипты для исправления данных
fix_draft_bddb6815_with_contract.py- Скрипт для исправления черновика с учётом загруженных документовfix_documents_meta_duplicates.py- Скрипт для удаления дубликатов изdocuments_metafix_claim_documents_field_names.py- Скрипт для исправленияfield_nameв таблицеclpr_claim_documentscheck_documents_detailed.py- Скрипт для детальной проверки документовcheck_documents_mismatch.py- Скрипт для проверки несоответствий междуdocuments_uploadedи таблицей
Изменённые файлы
Backend
backend/app/api/documents.py- Добавлена передачаgroup_indexв n8nbackend/app/api/claims.py- Обновлена логика загрузки черновиков, добавлена поддержкаdocuments_requiredbackend/app/api/events.py- Исправлены синтаксические ошибки (удалены дубликаты кода)backend/app/api/models.py- Добавлены поляunified_idиcontact_id
Frontend
frontend/src/pages/ClaimForm.tsx- Обновлена логика загрузки черновиков, добавлена поддержка нового флоуfrontend/src/components/form/StepWizardPlan.tsx- Добавлена передачаgroup_index, исправлены дубликаты в списке документовfrontend/src/components/form/StepDraftSelection.tsx- Обновлена логика определения legacy черновиковfrontend/src/components/form/StepDescription.tsx- Добавлена передачаunified_idиcontact_id
Результаты
Исправлено для черновика bddb6815-8e17-4d54-a721-5e94382942c7:
- ✅ Удалены дубликаты из
documents_meta(было 4, стало 3) - ✅ Исправлены типы документов в
documents_uploaded(чек теперьpayment, а неcontract) - ✅ Исправлены
field_nameв таблицеclpr_claim_documents:uploads[0][0]- contract (договор)uploads[1][0]- payment (чек)uploads[3][0]- evidence_photo (фото доказательства)
Текущее состояние:
documents_required: 4 документаdocuments_uploaded: 2 документа (contract, payment)documents_meta: 3 документа (без дубликатов)current_doc_index: 2 (следующий документ - correspondence)status_code:draft_docs_progress
Что нужно сделать дальше
-
Обновить код n8n:
- Заменить код в узле "Process Uploaded Files" на версию из
N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js - Убедиться, что
group_indexпередаётся из body
- Заменить код в узле "Process Uploaded Files" на версию из
-
Обновить SQL в n8n:
- Заменить SQL в узле "claimsave" на версию из
SQL_CLAIMSAVE_FIXED_NEW_FLOW.sql - Заменить SQL в узле "claimsave_final" на версию из
SQL_CLAIMSAVE_FINAL_FIXED_NEW_FLOW_WITH_UPLOADED.sql
- Заменить SQL в узле "claimsave" на версию из
-
Проверить работу:
- Загрузить новый документ через интерфейс
- Убедиться, что он получает правильный
field_name(например,uploads[2][0]для третьего документа) - Проверить, что документы не теряются при обновлении черновика
Важные моменты
-
Приоритет определения типа документа:
- Сначала проверяется
field_label(более точный) - Потом проверяется
field_name(fallback)
- Сначала проверяется
-
Объединение документов:
documents_metaвсегда объединяется с существующимиdocuments_uploadedвсегда начинается с существующих документов- Новые документы добавляются только если их нет в существующих
-
field_name:
- Формат:
uploads[{group_index}][0] group_index= индекс документа вdocuments_required(0-based)- Передаётся с фронтенда через параметр
group_index
- Формат:
Команды для проверки
# Проверить документы в черновике
docker exec ticket_form_backend python3 /app/check_documents_detailed.py
# Проверить документы в таблице
docker exec ticket_form_backend python3 /app/check_claim_documents_table.py
# Исправить field_name для существующих документов
docker exec ticket_form_backend python3 /app/fix_claim_documents_field_names.py