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

217 lines
8.3 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
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 = 371231;
$docId = 371983;
echo "Поиск файла в S3\n";
echo "Bucket: $s3Bucket\n";
echo "Project ID: $projectId\n";
echo "Document ID: $docId\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
]);
// Получаем s3_key из БД
require_once '/var/www/fastuser/data/www/crm.clientright.ru/config.inc.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]
);
$stmt = $pdo->prepare('SELECT s3_key, filename FROM vtiger_notes WHERE notesid = ?');
$stmt->execute([$docId]);
$doc = $stmt->fetch(PDO::FETCH_ASSOC);
if (!$doc) {
die("Документ $docId не найден в БД\n");
}
$s3Key = $doc['s3_key'];
echo "S3 Key из БД: $s3Key\n\n";
// Варианты путей для проверки
$variants = [
$s3Key, // Оригинальный путь
rawurlencode($s3Key), // URL-encoded
str_replace(' ', '_', $s3Key), // Замена пробелов
str_replace(' ', '%20', $s3Key), // Пробелы как %20
];
echo "1. Проверка существования файла по разным вариантам пути:\n";
foreach ($variants as $i => $variant) {
echo " Вариант " . ($i + 1) . ": " . substr($variant, 0, 100) . "...\n";
try {
$result = $s3Client->headObject([
'Bucket' => $s3Bucket,
'Key' => $variant
]);
echo " ✅ Файл найден! Size: " . $result['ContentLength'] . " bytes\n";
echo " ContentType: " . $result['ContentType'] . "\n";
break;
} catch (\Aws\Exception\AwsException $e) {
if ($e->getAwsErrorCode() == 'NotFound') {
echo "Не найден\n";
} else {
echo " ⚠️ Ошибка: " . $e->getAwsErrorCode() . "\n";
}
}
}
echo "\n";
// Поиск всех файлов в папке проекта
echo "2. Поиск всех файлов в папке проекта:\n";
$prefixes = [
"crm2/CRM_Active_Files/Documents/Project/",
"crm2/CRM_Active_Files/Documents/",
"Documents/Project/",
"Documents/",
];
$allFoundFiles = [];
foreach ($prefixes as $projectPrefix) {
echo " Проверка префикса: $projectPrefix\n";
try {
$objects = $s3Client->listObjectsV2([
'Bucket' => $s3Bucket,
'Prefix' => $projectPrefix,
'MaxKeys' => 1000
]);
if (isset($objects['Contents'])) {
foreach ($objects['Contents'] as $object) {
$key = $object['Key'];
// Ищем файлы, связанные с проектом 371231 или документом 371983
if (strpos($key, (string)$projectId) !== false || strpos($key, '371983') !== false ||
strpos($key, 'Ломакин') !== false || strpos($key, 'НЕТОЛОГИЯ') !== false) {
if (!in_array($key, $allFoundFiles)) {
$allFoundFiles[] = $key;
}
}
}
}
} catch (\Aws\Exception\AwsException $e) {
echo " Ошибка при поиске: " . $e->getMessage() . "\n";
}
}
if (!empty($allFoundFiles)) {
echo " Найдено " . count($allFoundFiles) . " файлов:\n";
foreach ($allFoundFiles as $file) {
echo " - $file\n";
}
} else {
echo " Файлы проекта не найдены в S3\n";
}
echo "\n";
// Поиск файла по имени (без полного пути)
echo "3. Поиск файла по имени и ID документа:\n";
$searchPatterns = [
"11.1_Доказательство_соблюдения_претензионного_поря_371983.pdf",
"371983",
"11.1",
"Доказательство_соблюдения"
];
$foundFiles = [];
foreach ($searchPatterns as $pattern) {
echo " Поиск по паттерну: $pattern\n";
try {
// Ищем в разных префиксах
$searchPrefixes = [
"crm2/CRM_Active_Files/",
"Documents/",
""
];
foreach ($searchPrefixes as $prefix) {
$objects = $s3Client->listObjectsV2([
'Bucket' => $s3Bucket,
'Prefix' => $prefix,
'MaxKeys' => 5000
]);
if (isset($objects['Contents'])) {
foreach ($objects['Contents'] as $object) {
$key = $object['Key'];
if (stripos($key, $pattern) !== false) {
if (!in_array($key, $foundFiles)) {
$foundFiles[] = $key;
}
}
}
}
}
} catch (\Aws\Exception\AwsException $e) {
echo " Ошибка при поиске: " . $e->getMessage() . "\n";
}
}
if (!empty($foundFiles)) {
echo " Найдено " . count($foundFiles) . " файлов:\n";
foreach ($foundFiles as $file) {
echo " - $file\n";
// Проверяем доступность
try {
$result = $s3Client->headObject([
'Bucket' => $s3Bucket,
'Key' => $file
]);
echo " ✅ Доступен, размер: " . $result['ContentLength'] . " bytes\n";
} catch (\Aws\Exception\AwsException $e) {
echo " ❌ Недоступен: " . $e->getAwsErrorCode() . "\n";
}
}
} else {
echo " Файл не найден по имени\n";
}
// Проверяем все документы проекта из БД
echo "\n4. Проверка всех документов проекта из БД:\n";
$stmt = $pdo->prepare('SELECT n.notesid, n.title, 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 LIMIT 10');
$stmt->execute([$projectId]);
$docs = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo " Проверка " . count($docs) . " документов:\n";
$foundCount = 0;
foreach ($docs as $doc) {
$key = $doc['s3_key'];
try {
$result = $s3Client->headObject([
'Bucket' => $s3Bucket,
'Key' => $key
]);
echo " ✅ ID {$doc['notesid']}: " . substr($doc['title'], 0, 50) . "...\n";
$foundCount++;
} catch (\Aws\Exception\AwsException $e) {
if ($e->getAwsErrorCode() == 'NotFound') {
echo " ❌ ID {$doc['notesid']}: " . substr($doc['title'], 0, 50) . "... (не найден)\n";
}
}
}
echo " Найдено в S3: $foundCount из " . count($docs) . "\n";
} catch (Exception $e) {
echo "ОШИБКА: " . $e->getMessage() . "\n";
echo "Trace: " . $e->getTraceAsString() . "\n";
}