- Исправлен 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
117 lines
3.5 KiB
PHP
117 lines
3.5 KiB
PHP
<?php
|
|
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';
|
|
require_once '/var/www/fastuser/data/www/crm.clientright.ru/crm_extensions/file_storage/config.php';
|
|
|
|
$pdo = new PDO(
|
|
"mysql:host={$dbconfig['db_server']};port=3306;dbname={$dbconfig['db_name']};charset=utf8",
|
|
$dbconfig['db_username'],
|
|
$dbconfig['db_password'],
|
|
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
|
|
);
|
|
|
|
$projectId = 371231;
|
|
|
|
// Получаем документы проекта
|
|
$sql = "SELECT
|
|
n.notesid,
|
|
n.title,
|
|
n.filename,
|
|
n.filelocationtype,
|
|
n.s3_bucket,
|
|
n.s3_key
|
|
FROM vtiger_notes n
|
|
INNER JOIN vtiger_crmentity e ON e.crmid = n.notesid
|
|
INNER JOIN vtiger_senotesrel snr ON snr.notesid = n.notesid
|
|
WHERE snr.crmid = ? AND e.deleted = 0 AND n.filelocationtype = 'E'
|
|
ORDER BY n.notesid DESC";
|
|
|
|
$stmt = $pdo->prepare($sql);
|
|
$stmt->execute([$projectId]);
|
|
$documents = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
|
|
|
echo "Проверка доступности S3 файлов для проекта $projectId\n";
|
|
echo str_repeat("=", 80) . "\n\n";
|
|
|
|
// Инициализируем S3 клиент
|
|
$s3Config = $config['s3'];
|
|
$awsClient = new \Aws\S3\S3Client([
|
|
'version' => 'latest',
|
|
'region' => $s3Config['region'],
|
|
'endpoint' => $s3Config['endpoint'],
|
|
'credentials' => [
|
|
'key' => $s3Config['key'],
|
|
'secret' => $s3Config['secret'],
|
|
],
|
|
'use_path_style_endpoint' => true,
|
|
]);
|
|
|
|
$accessible = 0;
|
|
$notAccessible = 0;
|
|
$errors = [];
|
|
|
|
foreach ($documents as $doc) {
|
|
$notesid = $doc['notesid'];
|
|
$title = $doc['title'];
|
|
$s3Bucket = $doc['s3_bucket'];
|
|
$s3Key = $doc['s3_key'];
|
|
|
|
try {
|
|
$exists = $awsClient->doesObjectExist($s3Bucket, $s3Key);
|
|
|
|
if ($exists) {
|
|
$accessible++;
|
|
echo "✅ ID: $notesid - $title\n";
|
|
} else {
|
|
$notAccessible++;
|
|
echo "❌ ID: $notesid - $title\n";
|
|
echo " S3 Key: $s3Key\n";
|
|
$errors[] = [
|
|
'id' => $notesid,
|
|
'title' => $title,
|
|
's3_key' => $s3Key,
|
|
'reason' => 'File does not exist in S3'
|
|
];
|
|
}
|
|
} catch (\Aws\Exception\AwsException $e) {
|
|
$notAccessible++;
|
|
echo "❌ ID: $notesid - $title\n";
|
|
echo " Ошибка: " . $e->getMessage() . "\n";
|
|
echo " S3 Key: $s3Key\n";
|
|
$errors[] = [
|
|
'id' => $notesid,
|
|
'title' => $title,
|
|
's3_key' => $s3Key,
|
|
'reason' => 'AWS Exception: ' . $e->getMessage()
|
|
];
|
|
} catch (Exception $e) {
|
|
$notAccessible++;
|
|
echo "❌ ID: $notesid - $title\n";
|
|
echo " Ошибка: " . $e->getMessage() . "\n";
|
|
$errors[] = [
|
|
'id' => $notesid,
|
|
'title' => $title,
|
|
's3_key' => $s3Key,
|
|
'reason' => 'Exception: ' . $e->getMessage()
|
|
];
|
|
}
|
|
}
|
|
|
|
echo "\n" . str_repeat("=", 80) . "\n";
|
|
echo "СТАТИСТИКА:\n";
|
|
echo " Доступных файлов: $accessible\n";
|
|
echo " Недоступных файлов: $notAccessible\n";
|
|
|
|
if (!empty($errors)) {
|
|
echo "\nНЕДОСТУПНЫЕ ФАЙЛЫ:\n";
|
|
foreach ($errors as $error) {
|
|
echo " - ID {$error['id']}: {$error['title']}\n";
|
|
echo " S3 Key: {$error['s3_key']}\n";
|
|
echo " Причина: {$error['reason']}\n\n";
|
|
}
|
|
}
|
|
|