97 lines
4.2 KiB
Markdown
97 lines
4.2 KiB
Markdown
|
|
# Лог сессии 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`:
|
|||
|
|
```javascript
|
|||
|
|
// Было:
|
|||
|
|
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`:
|
|||
|
|
```sql
|
|||
|
|
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)`.
|
|||
|
|
|
|||
|
|
**Исправление:** Создан полный уникальный индекс:
|
|||
|
|
```sql
|
|||
|
|
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
|
|||
|
|
|
|||
|
|
### Проверка дубликата по хешу
|
|||
|
|
```sql
|
|||
|
|
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;
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### Вставка с дедупликацией
|
|||
|
|
```sql
|
|||
|
|
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` для информирования о дубликатах
|
|||
|
|
|