- Исправлен 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
150 lines
4.4 KiB
PHP
150 lines
4.4 KiB
PHP
<?php
|
||
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]
|
||
);
|
||
|
||
$projectId = 371231;
|
||
|
||
// Получаем информацию о проекте
|
||
$sqlProject = "SELECT projectid, projectname, projectstatus FROM vtiger_project WHERE projectid = ?";
|
||
$stmtProject = $pdo->prepare($sqlProject);
|
||
$stmtProject->execute([$projectId]);
|
||
$project = $stmtProject->fetch(PDO::FETCH_ASSOC);
|
||
|
||
if (!$project) {
|
||
die("❌ Проект $projectId не найден!\n");
|
||
}
|
||
|
||
echo "📋 ПРОЕКТ: {$project['projectname']}\n";
|
||
echo " ID: {$project['projectid']}\n";
|
||
echo " Статус: {$project['projectstatus']}\n";
|
||
echo "\n" . str_repeat("=", 80) . "\n\n";
|
||
|
||
// Получаем документы проекта
|
||
$sql = "SELECT
|
||
n.notesid,
|
||
n.title,
|
||
n.filename,
|
||
n.filelocationtype,
|
||
n.foldername,
|
||
n.s3_bucket,
|
||
n.s3_key,
|
||
n.nc_path,
|
||
n.filesize,
|
||
e.createdtime,
|
||
e.modifiedtime,
|
||
u.user_name,
|
||
e.deleted
|
||
FROM vtiger_notes n
|
||
INNER JOIN vtiger_crmentity e ON e.crmid = n.notesid
|
||
INNER JOIN vtiger_senotesrel snr ON snr.notesid = n.notesid
|
||
LEFT JOIN vtiger_users u ON u.id = e.smownerid
|
||
WHERE snr.crmid = ? AND e.deleted = 0
|
||
ORDER BY e.createdtime DESC";
|
||
|
||
$stmt = $pdo->prepare($sql);
|
||
$stmt->execute([$projectId]);
|
||
$documents = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||
|
||
$count = count($documents);
|
||
echo "📄 НАЙДЕНО ДОКУМЕНТОВ: $count\n\n";
|
||
|
||
if ($count == 0) {
|
||
echo "⚠️ Документы не найдены!\n";
|
||
exit;
|
||
}
|
||
|
||
$totalSize = 0;
|
||
$s3Count = 0;
|
||
$localCount = 0;
|
||
$brokenCount = 0;
|
||
$accessibleCount = 0;
|
||
$notAccessibleCount = 0;
|
||
|
||
foreach ($documents as $i => $doc) {
|
||
$num = $i + 1;
|
||
$filelocationtype = $doc['filelocationtype'] ?? 'I';
|
||
$s3Bucket = $doc['s3_bucket'] ?? null;
|
||
$s3Key = $doc['s3_key'] ?? null;
|
||
$filename = $doc['filename'] ?? '';
|
||
$title = $doc['title'] ?? 'Без названия';
|
||
|
||
$isS3 = ($filelocationtype == 'E' && !empty($s3Bucket) && !empty($s3Key));
|
||
$isLocal = ($filelocationtype == 'I' || empty($filelocationtype));
|
||
|
||
if ($isS3) {
|
||
$s3Count++;
|
||
$status = "☁️ S3";
|
||
$filePath = "s3://{$s3Bucket}/{$s3Key}";
|
||
$accessibleCount++; // Пока считаем доступными, проверим отдельно
|
||
|
||
} else {
|
||
$localCount++;
|
||
$status = "💾 Локальный";
|
||
|
||
// Для локальных файлов проверяем путь
|
||
if (!empty($filename)) {
|
||
// Парсим путь из filename
|
||
$filePath = $filename;
|
||
if (file_exists($filePath)) {
|
||
$accessibleCount++;
|
||
$status .= " ✅";
|
||
} else {
|
||
$notAccessibleCount++;
|
||
$brokenCount++;
|
||
$status .= " ❌ ФАЙЛ НЕ НАЙДЕН";
|
||
}
|
||
} else {
|
||
$notAccessibleCount++;
|
||
$brokenCount++;
|
||
$status .= " ❌ НЕТ ПУТИ";
|
||
}
|
||
}
|
||
|
||
$size = $doc['filesize'] ?? 0;
|
||
$totalSize += $size;
|
||
$sizeStr = $size > 0 ? number_format($size / 1024, 2) . ' KB' : '0 KB';
|
||
|
||
echo sprintf(
|
||
"%3d. [%s] %s\n",
|
||
$num,
|
||
$status,
|
||
$title
|
||
);
|
||
echo sprintf(
|
||
" ID: %d | Размер: %s | Тип: %s\n",
|
||
$doc['notesid'],
|
||
$sizeStr,
|
||
$filelocationtype
|
||
);
|
||
|
||
if ($isS3) {
|
||
echo sprintf(" S3 Key: %s\n", $s3Key);
|
||
} else {
|
||
echo sprintf(" Путь: %s\n", substr($filename, 0, 100));
|
||
}
|
||
|
||
if ($notAccessibleCount > 0 && ($i == $count - 1 || ($i + 1) % 10 == 0)) {
|
||
echo "\n";
|
||
}
|
||
}
|
||
|
||
echo "\n" . str_repeat("=", 80) . "\n";
|
||
echo "📊 СТАТИСТИКА:\n";
|
||
echo " Всего документов: $count\n";
|
||
echo " S3 документов: $s3Count\n";
|
||
echo " Локальных документов: $localCount\n";
|
||
echo " Доступных: $accessibleCount ✅\n";
|
||
echo " Недоступных: $notAccessibleCount ❌\n";
|
||
echo " Общий размер: " . number_format($totalSize / 1024 / 1024, 2) . " MB\n";
|
||
|
||
if ($brokenCount > 0) {
|
||
echo "\n⚠️ ВНИМАНИЕ: Найдено $brokenCount недоступных файлов!\n";
|
||
}
|
||
|