Files
aiform_dev/docs/SESSION_LOG_2025-11-28_documents_dedup.md
AI Assistant 080e7ec105 feat: Получение cf_2624 из MySQL и блокировка полей при подтверждении данных
- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM
- Обновлён метод get_draft() для получения cf_2624 напрямую из БД
- Реализована блокировка полей (readonly) при contact_data_confirmed = true
- Добавлен выбор банка для СБП выплат с динамической загрузкой из API
- Обновлена документация по работе с cf_2624 и MySQL
- Добавлен network_mode: host в docker-compose для доступа к MySQL
- Обновлены компоненты формы для поддержки блокировки полей
2025-12-04 12:22:23 +03:00

4.2 KiB
Raw Blame History

Лог сессии 28.11.2025 — Дедупликация документов и исправление field_label

Проблемы, которые были решены

1. Неправильный field_label ("group-2" вместо "Переписка")

Причина: В коде N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js использовался индекс grp (позиция в documents_required) для доступа к массиву uploads_field_labels, но этот массив содержит элементы с индексами от 0 (текущий запрос).

Исправление: Изменён доступ к массивам на индекс 0:

// Было:
const field_label = uploads_field_labels[grp] || ...

// Стало:
const field_label = uploads_field_labels[0] || uploads_field_names[0] || uploads_descriptions[0] || `group-${grp}`;

Файл: ticket_form/docs/N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js


2. Дублирование записей в documents_meta

Причина: SQL использовал простую конкатенацию || для объединения новых и существующих documents_meta, что приводило к накоплению дубликатов (было 28 записей вместо 2).

Исправление: Создан новый SQL с дедупликацией — новые записи заменяют старые с тем же field_name:

SELECT DISTINCT ON (doc->>'field_name') doc
FROM (
  SELECT ... AS doc, 1 AS priority  -- новые (приоритет)
  UNION ALL
  SELECT ... AS doc, 2 AS priority  -- существующие
) all_docs
ORDER BY doc->>'field_name', priority, (doc->>'uploaded_at') DESC NULLS LAST

Файл: ticket_form/docs/SQL_CLAIMSAVE_FIXED_NEW_FLOW_DEDUP.sql


3. Ошибка ON CONFLICT для document_texts

Причина: Уникальный индекс на file_hash был частичным (WHERE file_hash IS NOT NULL), что не позволяло использовать ON CONFLICT (file_hash).

Исправление: Создан полный уникальный индекс:

DROP INDEX IF EXISTS idx_document_texts_hash_unique;
CREATE UNIQUE INDEX idx_document_texts_hash_unique ON document_texts(file_hash);

Созданные/изменённые файлы

Файл Описание
SQL_CLAIMSAVE_FIXED_NEW_FLOW_DEDUP.sql SQL с дедупликацией documents_meta
SQL_CLEANUP_DOCUMENTS_META_DUPLICATES.sql SQL для очистки существующих дубликатов
N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js Исправлен доступ к uploads_field_labels[0]

SQL-запросы для n8n

Проверка дубликата по хешу

SELECT 
  EXISTS (SELECT 1 FROM document_texts WHERE file_hash = '{{ $json.file_hash }}') AS found,
  (SELECT id FROM document_texts WHERE file_hash = '{{ $json.file_hash }}' LIMIT 1) AS existing_id;

Вставка с дедупликацией

INSERT INTO document_texts
(file_id, file_url, path, title, filename_for_upload, "text", description, file_hash)
VALUES (...)
ON CONFLICT (file_hash) DO NOTHING
RETURNING id, file_id, title, file_hash;

Изменения в БД

  1. Создан уникальный индекс idx_document_texts_hash_unique на document_texts(file_hash)
  2. Очищены дубликаты в documents_meta для заявки ef853bac-f54b-46aa-adf8-f0c9c0cd76bc (было 28 → стало 2)
  3. Исправлен field_label для uploads[2][0] на "Переписка"

Рекомендации

  1. Обновить SQL в n8n ноде claimsave на версию из SQL_CLAIMSAVE_FIXED_NEW_FLOW_DEDUP.sql
  2. Обновить код в ноде editfiletobd1 на версию из N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js
  3. Добавить проверку хеша перед вставкой в document_texts для информирования о дубликатах