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

150 lines
4.4 KiB
PHP
Raw Permalink 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
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";
}