Files
crm.clientright.ru/restore_project_394091_simple.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

157 lines
5.7 KiB
PHP
Raw 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';
$config = require '/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/config.php';
$s3Bucket = $config['s3']['bucket'];
$projectId = 394091;
// Файлы проекта из БД
$files = [
'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/Договор_394094.pdf',
'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/Подтверждение_оплаты_394096.pdf',
'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/Претензия_394098.pdf',
'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/Ответ_на_претензию_394100.pdf',
'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/7_заявление_потребителя_394105.pdf',
'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/experimental_report_20251018_095026_395943.xlsx',
];
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
]);
$stats = [
'total' => count($files),
'existing' => 0,
'deleted' => 0,
'missing' => 0,
'restored' => 0,
'failed' => 0,
];
foreach ($files as $s3Key) {
$filename = basename($s3Key);
echo "Файл: {$filename}\n";
echo " Путь: {$s3Key}\n";
// Проверяем существование
$exists = $s3Client->doesObjectExist($s3Bucket, $s3Key);
if ($exists) {
echo " ✅ Файл существует\n\n";
$stats['existing']++;
continue;
}
// Проверяем версии
try {
$versions = $s3Client->listObjectVersions([
'Bucket' => $s3Bucket,
'Prefix' => $s3Key,
]);
$deleteMarker = null;
$fileVersion = null;
foreach ($versions['Versions'] ?? [] as $version) {
if (isset($version['IsDeleteMarker']) && $version['IsDeleteMarker']) {
$deleteMarker = $version;
} else {
$fileVersion = $version;
}
}
if ($deleteMarker) {
echo " ❌ Файл удален (delete marker от " . $deleteMarker['LastModified']->format('Y-m-d H:i:s') . ")\n";
if (!$dryRun) {
// Удаляем delete marker
$s3Client->deleteObject([
'Bucket' => $s3Bucket,
'Key' => $s3Key,
'VersionId' => $deleteMarker['VersionId'],
]);
echo " ✅ Delete marker удален\n";
// Восстанавливаем файл из версии
if ($fileVersion) {
$s3Client->copyObject([
'Bucket' => $s3Bucket,
'Key' => $s3Key,
'CopySource' => "{$s3Bucket}/{$s3Key}?versionId={$fileVersion['VersionId']}",
]);
echo " ✅ Файл восстановлен из версии\n";
$stats['restored']++;
} else {
echo " ⚠️ Версия файла не найдена\n";
$stats['missing']++;
}
sleep(1);
} else {
echo " ⏸️ Будет восстановлен (dry-run)\n";
$stats['restored']++;
}
$stats['deleted']++;
} else {
echo " ⚠️ Файл отсутствует, delete marker не найден\n";
$stats['missing']++;
}
} catch (Exception $e) {
echo " ❌ Ошибка: " . $e->getMessage() . "\n";
$stats['failed']++;
}
echo "\n";
}
// Итоги
echo str_repeat("=", 80) . "\n";
echo "ИТОГИ:\n";
echo "Всего файлов: {$stats['total']}\n";
echo "Существующих: {$stats['existing']}\n";
echo "Удаленных: {$stats['deleted']}\n";
echo "Отсутствующих: {$stats['missing']}\n";
if (!$dryRun) {
echo "Восстановлено: {$stats['restored']}\n";
echo "Ошибок: {$stats['failed']}\n";
} else {
echo "Будет восстановлено: {$stats['restored']}\n";
}
echo "\n=== ГОТОВО ===\n";
} catch (Exception $e) {
echo "❌ Ошибка: " . $e->getMessage() . "\n";
exit(1);
}