- Добавлен сервис CrmMySQLService для прямого подключения к MySQL CRM - Обновлён метод get_draft() для получения cf_2624 напрямую из БД - Реализована блокировка полей (readonly) при contact_data_confirmed = true - Добавлен выбор банка для СБП выплат с динамической загрузкой из API - Обновлена документация по работе с cf_2624 и MySQL - Добавлен network_mode: host в docker-compose для доступа к MySQL - Обновлены компоненты формы для поддержки блокировки полей
4.2 KiB
Лог сессии 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;
Изменения в БД
- Создан уникальный индекс
idx_document_texts_hash_uniqueнаdocument_texts(file_hash) - Очищены дубликаты в
documents_metaдля заявкиef853bac-f54b-46aa-adf8-f0c9c0cd76bc(было 28 → стало 2) - Исправлен
field_labelдляuploads[2][0]на "Переписка"
Рекомендации
- Обновить SQL в n8n ноде
claimsaveна версию изSQL_CLAIMSAVE_FIXED_NEW_FLOW_DEDUP.sql - Обновить код в ноде
editfiletobd1на версию изN8N_CODE_PROCESS_UPLOADED_FILES_FIXED.js - Добавить проверку хеша перед вставкой в
document_textsдля информирования о дубликатах