167 lines
5.6 KiB
PHP
167 lines
5.6 KiB
PHP
|
|
<?php
|
|||
|
|
/**
|
|||
|
|
* Простая миграция одного проекта в новую структуру
|
|||
|
|
* Использование: php migrate_single_project.php PROJECT_ID
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
require_once(__DIR__ . '/../../config.inc.php');
|
|||
|
|
require_once(__DIR__ . '/../../include/database/PearDatabase.php');
|
|||
|
|
|
|||
|
|
$adb = PearDatabase::getInstance();
|
|||
|
|
|
|||
|
|
// Получаем ID проекта
|
|||
|
|
$projectId = isset($argv[1]) ? (int)$argv[1] : null;
|
|||
|
|
|
|||
|
|
if (!$projectId) {
|
|||
|
|
echo "❌ Укажите ID проекта!\n";
|
|||
|
|
echo "Использование: php migrate_single_project.php PROJECT_ID\n";
|
|||
|
|
exit(1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo "🔄 МИГРАЦИЯ ПРОЕКТА $projectId\n";
|
|||
|
|
echo "==========================================\n\n";
|
|||
|
|
|
|||
|
|
// Получаем информацию о проекте
|
|||
|
|
$result = $adb->pquery("SELECT p.projectname FROM vtiger_project p WHERE p.projectid = ?", [$projectId]);
|
|||
|
|
|
|||
|
|
if ($adb->num_rows($result) == 0) {
|
|||
|
|
echo "❌ Проект не найден!\n";
|
|||
|
|
exit(1);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$projectName = $adb->query_result($result, 0, 'projectname');
|
|||
|
|
echo "📁 Проект: $projectName\n\n";
|
|||
|
|
|
|||
|
|
// Функция очистки имени файла
|
|||
|
|
function sanitizeName($name) {
|
|||
|
|
// Транслитерация
|
|||
|
|
$translitMap = [
|
|||
|
|
'А' => 'A', 'Б' => 'B', 'В' => 'V', 'Г' => 'G', 'Д' => 'D',
|
|||
|
|
'Е' => 'E', 'Ё' => 'E', 'Ж' => 'Zh', 'З' => 'Z', 'И' => 'I',
|
|||
|
|
'Й' => 'Y', 'К' => 'K', 'Л' => 'L', 'М' => 'M', 'Н' => 'N',
|
|||
|
|
'О' => 'O', 'П' => 'P', 'Р' => 'R', 'С' => 'S', 'Т' => 'T',
|
|||
|
|
'У' => 'U', 'Ф' => 'F', 'Х' => 'H', 'Ц' => 'Ts', 'Ч' => 'Ch',
|
|||
|
|
'Ш' => 'Sh', 'Щ' => 'Sch', 'Ъ' => '', 'Ы' => 'Y', 'Ь' => '',
|
|||
|
|
'Э' => 'E', 'Ю' => 'Yu', 'Я' => 'Ya',
|
|||
|
|
'а' => 'a', 'б' => 'b', 'в' => 'v', 'г' => 'g', 'д' => 'd',
|
|||
|
|
'е' => 'e', 'ё' => 'e', 'ж' => 'zh', 'з' => 'z', 'и' => 'i',
|
|||
|
|
'й' => 'y', 'к' => 'k', 'л' => 'l', 'м' => 'm', 'н' => 'n',
|
|||
|
|
'о' => 'o', 'п' => 'p', 'р' => 'r', 'с' => 's', 'т' => 't',
|
|||
|
|
'у' => 'u', 'ф' => 'f', 'х' => 'h', 'ц' => 'ts', 'ч' => 'ch',
|
|||
|
|
'ш' => 'sh', 'щ' => 'sch', 'ъ' => '', 'ы' => 'y', 'ь' => '',
|
|||
|
|
'э' => 'e', 'ю' => 'yu', 'я' => 'ya'
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
$name = strtr($name, $translitMap);
|
|||
|
|
$name = preg_replace('/[^a-zA-Z0-9_\-]/', '_', $name);
|
|||
|
|
$name = preg_replace('/_+/', '_', $name);
|
|||
|
|
$name = trim($name, '_');
|
|||
|
|
|
|||
|
|
if (strlen($name) > 100) {
|
|||
|
|
$name = substr($name, 0, 100);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return $name;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$sanitizedName = sanitizeName($projectName);
|
|||
|
|
$newFolder = "Documents/Project/{$sanitizedName}_{$projectId}";
|
|||
|
|
|
|||
|
|
echo "📁 Новая папка: $newFolder\n\n";
|
|||
|
|
|
|||
|
|
// Получаем все документы проекта
|
|||
|
|
$result = $adb->pquery(
|
|||
|
|
"SELECT n.notesid, n.title, n.filename, n.s3_key, n.filelocationtype
|
|||
|
|
FROM vtiger_notes n
|
|||
|
|
JOIN vtiger_senotesrel snr ON snr.notesid = n.notesid
|
|||
|
|
JOIN vtiger_crmentity e ON e.crmid = n.notesid
|
|||
|
|
WHERE snr.crmid = ? AND e.deleted = 0 AND n.filelocationtype = 'E'
|
|||
|
|
ORDER BY n.notesid",
|
|||
|
|
[$projectId]
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
$total = $adb->num_rows($result);
|
|||
|
|
echo "📊 Найдено документов: $total\n\n";
|
|||
|
|
|
|||
|
|
if ($total == 0) {
|
|||
|
|
echo "✅ Нет документов для миграции\n";
|
|||
|
|
exit(0);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$migrated = 0;
|
|||
|
|
$errors = 0;
|
|||
|
|
|
|||
|
|
while ($doc = $adb->fetch_array($result)) {
|
|||
|
|
$notesid = $doc['notesid'];
|
|||
|
|
$title = $doc['title'];
|
|||
|
|
$oldS3Key = $doc['s3_key'];
|
|||
|
|
|
|||
|
|
echo "[$migrated/$total] Документ: $title (ID: $notesid)\n";
|
|||
|
|
echo " Старый s3_key: $oldS3Key\n";
|
|||
|
|
|
|||
|
|
// Извлекаем имя файла и расширение
|
|||
|
|
$oldFilename = basename($oldS3Key);
|
|||
|
|
$pathInfo = pathinfo($oldFilename);
|
|||
|
|
$extension = isset($pathInfo['extension']) ? '.' . $pathInfo['extension'] : '';
|
|||
|
|
|
|||
|
|
// Новое имя файла: file_docID_название.ext
|
|||
|
|
$newFilename = "file_{$notesid}_{$pathInfo['filename']}{$extension}";
|
|||
|
|
|
|||
|
|
// Новый путь в S3
|
|||
|
|
$newS3Key = "{$newFolder}/{$newFilename}";
|
|||
|
|
$newNcPath = "/crm/crm2/CRM_Active_Files/{$newFolder}/{$newFilename}";
|
|||
|
|
|
|||
|
|
// Новый URL
|
|||
|
|
$bucket = 'f9825c87-4e3558f6-f9b6-405c-ad3d-d1535c49b61c';
|
|||
|
|
$newUrl = "https://s3.twcstorage.ru/{$bucket}/crm2/CRM_Active_Files/{$newS3Key}";
|
|||
|
|
|
|||
|
|
echo " Новый s3_key: $newS3Key\n";
|
|||
|
|
echo " Новый nc_path: $newNcPath\n";
|
|||
|
|
|
|||
|
|
// Копируем файл в S3 (используем aws s3 cp)
|
|||
|
|
$oldKey = "crm2/CRM_Active_Files/" . $oldS3Key;
|
|||
|
|
$newKey = "crm2/CRM_Active_Files/" . $newS3Key;
|
|||
|
|
|
|||
|
|
$copyCmd = "aws s3 cp " .
|
|||
|
|
"s3://{$bucket}/{$oldKey} " .
|
|||
|
|
"s3://{$bucket}/{$newKey} " .
|
|||
|
|
"--endpoint-url https://s3.twcstorage.ru " .
|
|||
|
|
"--region ru-1 2>&1";
|
|||
|
|
|
|||
|
|
echo " Копирование в S3...\n";
|
|||
|
|
exec($copyCmd, $output, $returnCode);
|
|||
|
|
|
|||
|
|
if ($returnCode !== 0) {
|
|||
|
|
echo " ❌ ОШИБКА копирования: " . implode("\n", $output) . "\n";
|
|||
|
|
$errors++;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo " ✅ Скопировано в S3\n";
|
|||
|
|
|
|||
|
|
// Обновляем БД
|
|||
|
|
$updateResult = $adb->pquery(
|
|||
|
|
"UPDATE vtiger_notes
|
|||
|
|
SET s3_key = ?, nc_path = ?, filename = ?
|
|||
|
|
WHERE notesid = ?",
|
|||
|
|
[$newS3Key, $newNcPath, $newUrl, $notesid]
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
if ($updateResult) {
|
|||
|
|
echo " ✅ БД обновлена\n";
|
|||
|
|
$migrated++;
|
|||
|
|
} else {
|
|||
|
|
echo " ❌ ОШИБКА обновления БД\n";
|
|||
|
|
$errors++;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo "\n";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
echo "==========================================\n";
|
|||
|
|
echo "✅ МИГРАЦИЯ ЗАВЕРШЕНА!\n";
|
|||
|
|
echo "Обработано: $total\n";
|
|||
|
|
echo "Мигрировано: $migrated\n";
|
|||
|
|
echo "Ошибок: $errors\n";
|
|||
|
|
|