Files
crm.clientright.ru/ticket_form/docs/SESSION_LOG_2025-11-28_documents_dedup.md
Fedor 840acca51a feat(documents): дедупликация documents_meta и исправление field_label
- Исправлен N8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js: использовать uploads_field_labels[0] вместо [grp]
- Создан SQL_CLAIMSAVE_FIXED_NEW_FLOW_DEDUP.sql с дедупликацией documents_meta
- Создан SQL_CLEANUP_DOCUMENTS_META_DUPLICATES.sql для очистки существующих дубликатов
- Создан полный уникальный индекс idx_document_texts_hash_unique на document_texts(file_hash)
- Добавлен SESSION_LOG_2025-11-28_documents_dedup.md с описанием всех изменений

Fixes:
- field_label теперь корректно отображает 'Переписка' вместо 'group-2'
- documents_meta не накапливает дубликаты при повторных сохранениях
- ON CONFLICT (file_hash) теперь работает для document_texts
2025-11-28 18:16:53 +03:00

4.2 KiB
Raw Permalink 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 для информирования о дубликатах