# Лог сессии: Исправление загрузки документов и 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_uploaded` - `docs/SQL_CLAIMSAVE_FIXED_NEW_FLOW.sql` - Исправленный SQL для `claimsave` с объединением `documents_meta` - `docs/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_meta` - `fix_claim_documents_field_names.py` - Скрипт для исправления `field_name` в таблице `clpr_claim_documents` - `check_documents_detailed.py` - Скрипт для детальной проверки документов - `check_documents_mismatch.py` - Скрипт для проверки несоответствий между `documents_uploaded` и таблицей --- ## Изменённые файлы ### Backend - `backend/app/api/documents.py` - Добавлена передача `group_index` в n8n - `backend/app/api/claims.py` - Обновлена логика загрузки черновиков, добавлена поддержка `documents_required` - `backend/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` --- ## Что нужно сделать дальше 1. **Обновить код n8n:** - Заменить код в узле "Process Uploaded Files" на версию из `N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js` - Убедиться, что `group_index` передаётся из body 2. **Обновить SQL в n8n:** - Заменить SQL в узле "claimsave" на версию из `SQL_CLAIMSAVE_FIXED_NEW_FLOW.sql` - Заменить SQL в узле "claimsave_final" на версию из `SQL_CLAIMSAVE_FINAL_FIXED_NEW_FLOW_WITH_UPLOADED.sql` 3. **Проверить работу:** - Загрузить новый документ через интерфейс - Убедиться, что он получает правильный `field_name` (например, `uploads[2][0]` для третьего документа) - Проверить, что документы не теряются при обновлении черновика --- ## Важные моменты 1. **Приоритет определения типа документа:** - Сначала проверяется `field_label` (более точный) - Потом проверяется `field_name` (fallback) 2. **Объединение документов:** - `documents_meta` всегда объединяется с существующими - `documents_uploaded` всегда начинается с существующих документов - Новые документы добавляются только если их нет в существующих 3. **field_name:** - Формат: `uploads[{group_index}][0]` - `group_index` = индекс документа в `documents_required` (0-based) - Передаётся с фронтенда через параметр `group_index` --- ## Команды для проверки ```bash # Проверить документы в черновике 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 ```