177 lines
10 KiB
Markdown
177 lines
10 KiB
Markdown
|
|
# Лог сессии: Исправление загрузки документов и 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
|
|||
|
|
```
|
|||
|
|
|