Files
aiform_prod/SESSION_LOG_2025-11-26_DOCUMENTS_FIX.md
AI Assistant 02689e65db 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
2025-11-26 19:54:51 +03:00

10 KiB
Raw Blame History

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

Команды для проверки

# Проверить документы в черновике
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