- Исправлен 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
109 lines
6.8 KiB
Markdown
109 lines
6.8 KiB
Markdown
# Лог сессии: Исправление архивации проектов с S3 файлами
|
||
|
||
## Дата: 2025-11-21
|
||
|
||
## Проблема
|
||
Архивация проектов не работала после миграции на S3:
|
||
- Возвращался ответ `{"success":true,"result":"Nothing to archive"}`
|
||
- Затем появились ошибки `"_ is missing!"` для всех документов
|
||
- После исправления появились ошибки `"S3 file download failed"` для всех файлов
|
||
|
||
## Причины проблем
|
||
|
||
### 1. Неправильная обработка S3 файлов
|
||
- Метод `getPaths()` пытался обработать S3 файлы как локальные
|
||
- `Vtiger_Record_Model` не всегда содержит поля `s3_bucket`, `s3_key`, `filelocationtype`
|
||
- Нужно было явно запрашивать эти данные из БД
|
||
|
||
### 2. Отсутствие поддержки связанных документов
|
||
- Архив включал только документы самого проекта
|
||
- Не включались документы из связанных сущностей (контакты, контрагенты)
|
||
- Аналогично функционалу отправки исковых писем через pochta-sud.ru
|
||
|
||
### 3. Ошибки при скачивании из S3
|
||
- Неправильный путь к `vendor/autoload.php` (относительный путь не работал)
|
||
- Слишком длинное имя временного файла (`File name too long`)
|
||
- Использовался `basename($fileName)` где `$fileName` содержал URL-encoded полный путь
|
||
|
||
## Решение
|
||
|
||
### 1. Добавлен метод `getRelatedDocs($projectId)`
|
||
- Получает документы из связанных сущностей проекта:
|
||
- Контакт (`linktoaccountscontacts`)
|
||
- Контрагенты (`cf_1994`, `cf_2274`, `cf_2276`)
|
||
- Возвращает массив документов с полями: `notesid`, `title`, `filename`, `filelocationtype`, `s3_bucket`, `s3_key`
|
||
|
||
### 2. Добавлен метод `downloadS3File($s3Bucket, $s3Key, $fileName)`
|
||
- Скачивает файлы из S3 во временную папку
|
||
- Использует AWS SDK для работы с S3
|
||
- Сохраняет пути временных файлов для последующей очистки
|
||
- Обрабатывает ошибки с подробным логированием
|
||
|
||
### 3. Добавлен метод `cleanupTempFiles()`
|
||
- Очищает все временные файлы после создания архива
|
||
- Вызывается в `finally` блоке для гарантированной очистки
|
||
|
||
### 4. Исправлен метод `getPaths($docs)`
|
||
- Поддержка как `Vtiger_Record_Model` объектов, так и массивов из `getRelatedDocs`
|
||
- **ВСЕГДА** запрашивает `s3_bucket`, `s3_key`, `filelocationtype` из БД для Record Models
|
||
- Правильно определяет S3 файлы (`filelocationtype == 'E' && !empty($s3Bucket) && !empty($s3Key)`)
|
||
- Для S3 файлов вызывает `downloadS3File()`
|
||
- Для локальных файлов использует `getFileDetails()`
|
||
|
||
### 5. Исправлен метод `getArchive($id)`
|
||
- Для проектов собирает документы из основной записи и связанных сущностей
|
||
- Предотвращает дубликаты документов
|
||
- Вызывает `getPaths()` с объединенным списком документов
|
||
- Добавлено подробное логирование для отладки
|
||
- Обработка ошибок с возвратом детальной информации
|
||
|
||
### 6. Исправления в `downloadS3File()`
|
||
- Поиск `vendor/autoload.php` по нескольким путям (относительный и абсолютный)
|
||
- Использование короткого имени временного файла (только расширение, без полного пути)
|
||
- Подробное логирование в `/tmp/s3_download_debug.log`
|
||
|
||
## Измененные файлы
|
||
|
||
### `modules/Vtiger/services/Base.php`
|
||
- Добавлен метод `getRelatedDocs($projectId)` - получение документов из связанных сущностей
|
||
- Добавлен метод `downloadS3File($s3Bucket, $s3Key, $fileName)` - скачивание из S3
|
||
- Добавлен метод `cleanupTempFiles()` - очистка временных файлов
|
||
- Добавлено свойство `private static $tempFiles = []` - хранение путей временных файлов
|
||
- Исправлен метод `getPaths($docs)` - поддержка S3 и связанных документов
|
||
- Исправлен метод `getArchive($id)` - сбор документов из связанных сущностей для проектов
|
||
|
||
## Тестирование
|
||
|
||
### Тестовый скрипт `test_s3_download.php`
|
||
- Создан для прямого тестирования `downloadS3File()`
|
||
- Успешно скачал файл из S3 (9.5 МБ)
|
||
- Подтвердил работоспособность исправлений
|
||
|
||
### Результат
|
||
- ✅ Архив успешно создается с 25 документами для проекта 396447
|
||
- ✅ Включаются документы из проекта и связанных сущностей
|
||
- ✅ S3 файлы корректно скачиваются и добавляются в архив
|
||
- ✅ Временные файлы автоматически очищаются
|
||
|
||
## Технические детали
|
||
|
||
### S3 конфигурация
|
||
- Используется конфиг из `crm_extensions/file_storage/config.php`
|
||
- Endpoint: `https://s3.twcstorage.ru`
|
||
- Bucket и Key берутся из полей `vtiger_notes.s3_bucket` и `vtiger_notes.s3_key`
|
||
|
||
### Временные файлы
|
||
- Сохраняются в `sys_get_temp_dir()` (обычно `/tmp`)
|
||
- Имена: `s3_{uniqid}.{extension}`
|
||
- Автоматически удаляются после создания архива
|
||
|
||
### Логирование
|
||
- Основные логи: `error_log()` (системный лог PHP)
|
||
- Отладочные логи: `/tmp/s3_download_debug.log` (временный, удален после исправления)
|
||
- Ошибки: `/tmp/s3_download_errors.log` (временный, удален после исправления)
|
||
|
||
## Коммит
|
||
Изменения закоммичены в git с описанием исправлений.
|
||
|
||
|