147 lines
5.1 KiB
PHP
147 lines
5.1 KiB
PHP
|
|
<?php
|
|||
|
|
/**
|
|||
|
|
* Скрипт переноса Project файлов в папку Project/
|
|||
|
|
*
|
|||
|
|
* Было: Название_проекта_123/document_456.pdf
|
|||
|
|
* Станет: Project/Название_проекта_123/document_456.pdf
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
require_once(__DIR__ . '/../../config.inc.php');
|
|||
|
|
require_once(__DIR__ . '/../../include/utils/utils.php');
|
|||
|
|
require_once(__DIR__ . '/../../include/utils/CommonUtils.php');
|
|||
|
|
require_once(__DIR__ . '/S3Client.php');
|
|||
|
|
require_once(__DIR__ . '/FilePathManager.php');
|
|||
|
|
|
|||
|
|
global $adb;
|
|||
|
|
|
|||
|
|
echo "🔄 ПЕРЕНОС PROJECT ФАЙЛОВ В ПАПКУ Project/\n";
|
|||
|
|
echo "==========================================\n\n";
|
|||
|
|
|
|||
|
|
// Инициализация S3
|
|||
|
|
$s3Client = new S3Client();
|
|||
|
|
$pathManager = new FilePathManager();
|
|||
|
|
|
|||
|
|
// Получаем все файлы Project в старой структуре (2 части пути)
|
|||
|
|
$sql = "SELECT n.notesid, n.filename, n.title,
|
|||
|
|
p.projectid, c.projectname
|
|||
|
|
FROM vtiger_notes n
|
|||
|
|
INNER JOIN vtiger_senotesrel sr ON n.notesid = sr.notesid
|
|||
|
|
INNER JOIN vtiger_project p ON sr.crmid = p.projectid
|
|||
|
|
INNER JOIN vtiger_crmentity c ON p.projectid = c.crmid
|
|||
|
|
WHERE n.deleted = 0
|
|||
|
|
AND c.deleted = 0
|
|||
|
|
AND n.filelocationtype = 'S'
|
|||
|
|
AND n.filename LIKE '%/%'
|
|||
|
|
AND n.filename NOT LIKE 'Project/%'
|
|||
|
|
ORDER BY p.projectid";
|
|||
|
|
|
|||
|
|
$result = $adb->query($sql);
|
|||
|
|
$totalFiles = $adb->num_rows($result);
|
|||
|
|
|
|||
|
|
echo "📊 Найдено файлов для переноса: $totalFiles\n\n";
|
|||
|
|
|
|||
|
|
if ($totalFiles == 0) {
|
|||
|
|
echo "✅ Все файлы уже в правильной структуре!\n";
|
|||
|
|
exit(0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Статистика
|
|||
|
|
$stats = [
|
|||
|
|
'processed' => 0,
|
|||
|
|
'moved' => 0,
|
|||
|
|
'updated' => 0,
|
|||
|
|
'errors' => 0,
|
|||
|
|
'skipped' => 0
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
// Обрабатываем каждый файл
|
|||
|
|
while ($row = $adb->fetch_array($result)) {
|
|||
|
|
$stats['processed']++;
|
|||
|
|
|
|||
|
|
$notesId = $row['notesid'];
|
|||
|
|
$oldFilename = $row['filename'];
|
|||
|
|
$projectId = $row['projectid'];
|
|||
|
|
$projectName = $row['projectname'];
|
|||
|
|
|
|||
|
|
echo "[$stats[processed]/$totalFiles] Проект: $projectName (ID: $projectId)\n";
|
|||
|
|
echo " Старый путь: $oldFilename\n";
|
|||
|
|
|
|||
|
|
// Формируем новый путь
|
|||
|
|
$newFilename = "Project/" . $oldFilename;
|
|||
|
|
|
|||
|
|
echo " Новый путь: $newFilename\n";
|
|||
|
|
|
|||
|
|
// Формируем S3 ключи
|
|||
|
|
$oldS3Key = "crm2/CRM_Active_Files/Documents/" . urldecode($oldFilename);
|
|||
|
|
$newS3Key = "crm2/CRM_Active_Files/Documents/" . $newFilename;
|
|||
|
|
|
|||
|
|
try {
|
|||
|
|
// Проверяем существование исходного файла
|
|||
|
|
if (!$s3Client->exists($oldS3Key)) {
|
|||
|
|
echo " ⚠️ Исходный файл не найден в S3: $oldS3Key\n";
|
|||
|
|
$stats['skipped']++;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Проверяем, не существует ли уже новый файл
|
|||
|
|
if ($s3Client->exists($newS3Key)) {
|
|||
|
|
echo " ⚠️ Целевой файл уже существует: $newS3Key\n";
|
|||
|
|
// Обновляем только БД
|
|||
|
|
$updateSql = "UPDATE vtiger_notes SET filename = ? WHERE notesid = ?";
|
|||
|
|
$adb->pquery($updateSql, [$newFilename, $notesId]);
|
|||
|
|
$stats['updated']++;
|
|||
|
|
echo " ✅ БД обновлена\n\n";
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Копируем файл в новое место
|
|||
|
|
if ($s3Client->copy($oldS3Key, $newS3Key)) {
|
|||
|
|
echo " ✅ Файл скопирован в S3\n";
|
|||
|
|
|
|||
|
|
// Удаляем старый файл
|
|||
|
|
$s3Client->delete($oldS3Key);
|
|||
|
|
echo " ✅ Старый файл удален\n";
|
|||
|
|
|
|||
|
|
// Обновляем путь в базе данных
|
|||
|
|
$updateSql = "UPDATE vtiger_notes SET filename = ? WHERE notesid = ?";
|
|||
|
|
$adb->pquery($updateSql, [$newFilename, $notesId]);
|
|||
|
|
echo " ✅ БД обновлена\n";
|
|||
|
|
|
|||
|
|
$stats['moved']++;
|
|||
|
|
echo " ✅ УСПЕШНО!\n\n";
|
|||
|
|
} else {
|
|||
|
|
throw new Exception("Failed to copy file in S3");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} catch (Exception $e) {
|
|||
|
|
echo " ❌ ОШИБКА: " . $e->getMessage() . "\n\n";
|
|||
|
|
$stats['errors']++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Небольшая пауза чтобы не нагружать S3
|
|||
|
|
usleep(100000); // 0.1 сек
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Итоговая статистика
|
|||
|
|
echo "\n";
|
|||
|
|
echo "==========================================\n";
|
|||
|
|
echo "📊 ИТОГОВАЯ СТАТИСТИКА:\n";
|
|||
|
|
echo "==========================================\n";
|
|||
|
|
echo "Обработано: $stats[processed]\n";
|
|||
|
|
echo "Перенесено: $stats[moved]\n";
|
|||
|
|
echo "Обновлено БД: $stats[updated]\n";
|
|||
|
|
echo "Пропущено: $stats[skipped]\n";
|
|||
|
|
echo "Ошибок: $stats[errors]\n";
|
|||
|
|
echo "\n";
|
|||
|
|
|
|||
|
|
if ($stats['errors'] == 0 && $stats['moved'] + $stats['updated'] == $totalFiles) {
|
|||
|
|
echo "✅ ВСЕ ФАЙЛЫ УСПЕШНО ПЕРЕНЕСЕНЫ В ПАПКУ Project/!\n";
|
|||
|
|
} else {
|
|||
|
|
echo "⚠️ Есть ошибки или пропущенные файлы. Проверьте логи.\n";
|
|||
|
|
}
|
|||
|
|
?>
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
|