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
This commit is contained in:
126
move_project_394091_simple.php
Normal file
126
move_project_394091_simple.php
Normal file
@@ -0,0 +1,126 @@
|
||||
<?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'];
|
||||
|
||||
// Маппинг: текущий путь => правильный путь
|
||||
$filesToMove = [
|
||||
'crm2/CRM_Active_Files/Documents/394094/doc_394094_d583b5d6.pdf' => 'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/Договор_394094.pdf',
|
||||
'crm2/CRM_Active_Files/Documents/394096/doc_394096_ce9e6bdc.pdf' => 'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/Подтверждение_оплаты_394096.pdf',
|
||||
'crm2/CRM_Active_Files/Documents/394100/doc_394100_3f15e3c1.pdf' => 'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/Ответ_на_претензию_394100.pdf',
|
||||
'crm2/CRM_Active_Files/Documents/394105/potrebitelya_Zgurskiy_1.pdf' => 'crm2/CRM_Active_Files/Documents/Project/Згурский_ООО_РЕНТСОФТ_394091/7_заявление_потребителя_394105.pdf',
|
||||
];
|
||||
|
||||
echo "=== ПЕРЕМЕЩЕНИЕ ФАЙЛОВ ПРОЕКТА 394091 ===\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($filesToMove),
|
||||
'moved' => 0,
|
||||
'skipped' => 0,
|
||||
'failed' => 0,
|
||||
];
|
||||
|
||||
foreach ($filesToMove as $oldPath => $newPath) {
|
||||
$filename = basename($newPath);
|
||||
echo "Файл: {$filename}\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";
|
||||
|
||||
$stats['moved']++;
|
||||
sleep(1);
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo " ❌ Ошибка: " . $e->getMessage() . "\n";
|
||||
$stats['failed']++;
|
||||
}
|
||||
} 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";
|
||||
}
|
||||
|
||||
if (!$dryRun && $stats['moved'] > 0) {
|
||||
echo "\n⚠️ ВАЖНО: Обновите БД вручную:\n";
|
||||
echo "UPDATE vtiger_notes SET s3_key = '...', filename = '...' WHERE notesid = ...;\n";
|
||||
}
|
||||
|
||||
echo "\n=== ГОТОВО ===\n";
|
||||
|
||||
} catch (Exception $e) {
|
||||
echo "❌ Ошибка: " . $e->getMessage() . "\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user