108 lines
6.8 KiB
Markdown
108 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 с описанием исправлений.
|
|||
|
|
|