Files
aiform_dev/docs/SESSION_LOG_2025-11-28_documents_dedup.md

97 lines
4.2 KiB
Markdown
Raw Normal View 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`:
```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` для информирования о дубликатах