Files
crm.clientright.ru/move_project_394091_files.php
Fedor 840acca51a feat(documents): дедупликация documents_meta и исправление field_label
- Исправлен 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
2025-11-28 18:16:53 +03:00

166 lines
6.1 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* Скрипт для перемещения файлов проекта 394091 в правильное место
*/
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once '/var/www/fastuser/data/www/crm.clientright.ru/vendor/autoload.php';
require_once '/var/www/fastuser/data/www/crm.clientright.ru/config.inc.php';
$config = require '/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/config.php';
$s3Bucket = $config['s3']['bucket'];
$projectId = 394091;
// Маппинг: текущий путь => правильный путь
$filesToMove = [
// 394094 - Договор
'crm2/CRM_Active_Files/Documents/394094/doc_394094_d583b5d6.pdf' => [
'new_path' => 'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/Договор_394094.pdf',
'doc_id' => 394094,
],
// 394096 - Подтверждение оплаты
'crm2/CRM_Active_Files/Documents/394096/doc_394096_ce9e6bdc.pdf' => [
'new_path' => 'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/Подтверждение_оплаты_394096.pdf',
'doc_id' => 394096,
],
// 394100 - Ответ на претензию
'crm2/CRM_Active_Files/Documents/394100/doc_394100_3f15e3c1.pdf' => [
'new_path' => 'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/Ответ_на_претензию_394100.pdf',
'doc_id' => 394100,
],
// 394105 - Заявление потребителя
'crm2/CRM_Active_Files/Documents/394105/potrebitelya_Zgurskiy_1.pdf' => [
'new_path' => 'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/7_заявление_потребителя_394105.pdf',
'doc_id' => 394105,
],
];
echo "=== ПЕРЕМЕЩЕНИЕ ФАЙЛОВ ПРОЕКТА {$projectId} ===\n";
echo str_repeat("=", 80) . "\n\n";
$dryRun = isset($argv[1]) && $argv[1] === '--dry-run';
if ($dryRun) {
echo "⚠️ РЕЖИМ ПРОВЕРКИ (dry-run) - файлы не будут перемещены\n\n";
}
try {
$s3Client = new \Aws\S3\S3Client([
'version' => 'latest',
'region' => $config['s3']['region'],
'endpoint' => $config['s3']['endpoint'],
'use_path_style_endpoint' => true,
'credentials' => [
'key' => $config['s3']['key'],
'secret' => $config['s3']['secret'],
],
'suppress_php_deprecation_warning' => true
]);
$db = PearDatabase::getInstance();
$stats = [
'total' => count($filesToMove),
'moved' => 0,
'skipped' => 0,
'failed' => 0,
'errors' => [],
];
foreach ($filesToMove as $oldPath => $info) {
$newPath = $info['new_path'];
$docId = $info['doc_id'];
echo "Документ ID: {$docId}\n";
echo " Старый путь: {$oldPath}\n";
echo " Новый путь: {$newPath}\n";
// Проверяем существование старого файла
if (!$s3Client->doesObjectExist($s3Bucket, $oldPath)) {
echo " ⚠️ Старый файл не найден, пропускаем\n\n";
$stats['skipped']++;
continue;
}
// Проверяем, не существует ли уже новый файл
if ($s3Client->doesObjectExist($s3Bucket, $newPath)) {
echo " ⚠️ Новый файл уже существует, пропускаем\n\n";
$stats['skipped']++;
continue;
}
if (!$dryRun) {
try {
// Копируем файл в новое место
$s3Client->copyObject([
'Bucket' => $s3Bucket,
'Key' => $newPath,
'CopySource' => "{$s3Bucket}/{$oldPath}",
]);
echo " ✅ Файл скопирован в новое место\n";
// Удаляем старый файл
$s3Client->deleteObject([
'Bucket' => $s3Bucket,
'Key' => $oldPath,
]);
echo " ✅ Старый файл удален\n";
// Обновляем БД
$newFilename = 'https://s3.twcstorage.ru/' . $s3Bucket . '/' . $newPath;
$db->pquery("
UPDATE vtiger_notes
SET s3_key = ?, filename = ?
WHERE notesid = ?
", array($newPath, $newFilename, $docId));
echo " ✅ БД обновлена\n";
$stats['moved']++;
sleep(1); // Пауза между операциями
} catch (Exception $e) {
echo " ❌ Ошибка: " . $e->getMessage() . "\n";
$stats['failed']++;
$stats['errors'][] = "{$oldPath}: " . $e->getMessage();
}
} else {
echo " ⏸️ Будет перемещен (dry-run)\n";
$stats['moved']++;
}
echo "\n";
}
// Итоги
echo str_repeat("=", 80) . "\n";
echo "ИТОГИ:\n";
echo "Всего файлов: {$stats['total']}\n";
if (!$dryRun) {
echo "Перемещено: {$stats['moved']}\n";
echo "Пропущено: {$stats['skipped']}\n";
echo "Ошибок: {$stats['failed']}\n";
} else {
echo "Будет перемещено: {$stats['moved']}\n";
echo "Будет пропущено: {$stats['skipped']}\n";
}
if (!empty($stats['errors'])) {
echo "\nОшибки:\n";
foreach ($stats['errors'] as $error) {
echo " - {$error}\n";
}
}
echo "\n=== ГОТОВО ===\n";
} catch (Exception $e) {
echo "❌ Критическая ошибка: " . $e->getMessage() . "\n";
exit(1);
}