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

173 lines
7.1 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';
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';
$projectId = 384256;
$s3Bucket = $config['s3']['bucket'];
echo "Проверка доступности всех файлов проекта $projectId\n";
echo str_repeat("=", 80) . "\n\n";
try {
// Инициализация S3 клиента
$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
]);
// Подключение к БД
$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 n.notesid, n.title, n.s3_key, n.filename, n.filelocationtype
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
ORDER BY n.notesid ASC
');
$stmt->execute([$projectId]);
$docs = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo "Всего документов в проекте: " . count($docs) . "\n\n";
$accessible = [];
$notAccessible = [];
foreach ($docs as $doc) {
$docId = $doc['notesid'];
$title = $doc['title'];
$s3Key = $doc['s3_key'];
$filelocationtype = $doc['filelocationtype'];
echo "ID: $docId | $title\n";
if ($filelocationtype == 'E' && !empty($s3Key)) {
// Проверяем доступность в S3
try {
$result = $s3Client->headObject([
'Bucket' => $s3Bucket,
'Key' => $s3Key
]);
$size = number_format($result['ContentLength'] / 1024, 2);
echo " ✅ Доступен в S3 (" . $size . " KB)\n";
echo " Путь: $s3Key\n";
$accessible[] = ['doc' => $doc, 'size' => $result['ContentLength']];
} catch (\Aws\Exception\AwsException $e) {
if ($e->getAwsErrorCode() == 'NotFound') {
echo "НЕ найден в S3\n";
echo " Ожидаемый путь: $s3Key\n";
$notAccessible[] = $doc;
} else {
echo " ⚠️ Ошибка доступа: " . $e->getAwsErrorCode() . "\n";
$notAccessible[] = $doc;
}
}
} else {
echo " ⚠️ Тип хранения: " . ($filelocationtype ?: 'не указан') . "\n";
if (!empty($doc['filename'])) {
echo " Filename: " . substr($doc['filename'], 0, 100) . "\n";
}
}
echo "\n";
}
echo str_repeat("=", 80) . "\n";
echo "СТАТИСТИКА:\n";
echo " Доступных файлов: " . count($accessible) . "\n";
echo " Недоступных файлов: " . count($notAccessible) . "\n\n";
// Поиск недоступных файлов в других местах S3
if (!empty($notAccessible)) {
echo "Поиск недоступных файлов в других местах S3...\n\n";
foreach ($notAccessible as $doc) {
$docId = $doc['notesid'];
$title = $doc['title'];
echo "Поиск файла для документа $docId: $title\n";
// Ищем по ID документа в разных местах
$searchPatterns = [
"temp/$projectId/",
"temp/",
"crm2/CRM_Active_Files/Documents/",
"Documents/",
];
$found = false;
foreach ($searchPatterns as $prefix) {
try {
$objects = $s3Client->listObjectsV2([
'Bucket' => $s3Bucket,
'Prefix' => $prefix,
'MaxKeys' => 1000
]);
if (isset($objects['Contents'])) {
foreach ($objects['Contents'] as $object) {
$key = $object['Key'];
// Ищем файлы, содержащие ID документа или похожие названия
if (strpos($key, (string)$docId) !== false ||
strpos($key, (string)($docId - 1)) !== false ||
strpos($key, (string)($docId + 1)) !== false) {
// Проверяем доступность
try {
$headResult = $s3Client->headObject([
'Bucket' => $s3Bucket,
'Key' => $key
]);
echo " ✅ НАЙДЕН: $key\n";
echo " Размер: " . number_format($headResult['ContentLength'] / 1024, 2) . " KB\n";
echo " Дата: " . ($headResult['LastModified'] ?? 'не указана') . "\n";
// Предлагаем переместить
echo " 💡 Рекомендация: переместить в правильный путь\n";
$found = true;
break 2;
} catch (\Aws\Exception\AwsException $e) {
// Пропускаем
}
}
}
}
} catch (\Aws\Exception\AwsException $e) {
// Пропускаем ошибки
}
}
if (!$found) {
echo " ❌ Файл не найден ни в одном месте S3\n";
}
echo "\n";
}
}
} catch (Exception $e) {
echo "ОШИБКА: " . $e->getMessage() . "\n";
echo "Trace: " . $e->getTraceAsString() . "\n";
}