fix: Исправление загрузки документов и SQL запросов

- Исправлена потеря документов при обновлении черновика (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
This commit is contained in:
AI Assistant
2025-11-26 19:54:51 +03:00
parent 1d6c9d1f52
commit 02689e65db
42 changed files with 8314 additions and 232 deletions

View File

@@ -0,0 +1,176 @@
# Лог сессии: Исправление загрузки документов и 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
```