'localhost', 'db_port' => '3306', 'db_username' => 'ci20465_72new', 'db_password' => 'EcY979Rn', 'db_name' => 'ci20465_72new', 'db_type' => 'mysqli' ]; $conn = new mysqli( $dbconfig['db_server'], $dbconfig['db_username'], $dbconfig['db_password'], $dbconfig['db_name'], $dbconfig['db_port'] ); if ($conn->connect_error) { logMessage("Ошибка подключения к БД: " . $conn->connect_error); die(json_encode(["status" => "error", "message" => "Ошибка подключения к БД."])); } // Устанавливаем кодировку UTF-8 $conn->set_charset("utf8mb4"); // ✅ Получаем `$id` из POST-запроса $id = $_POST['id'] ?? null; if (!$id || !is_numeric($id)) { logMessage("Ошибка: Некорректный ID."); die(json_encode(["status" => "error", "message" => "Некорректный ID."])); } logMessage("Получен ID: $id"); // 🔹 SQL-запрос для получения файлов $sql = " SELECT n.title, CASE WHEN a.storedname IS NOT NULL THEN CONCAT(a.path, a.attachmentsid, '_', a.storedname) ELSE CONCAT(a.path, a.attachmentsid, '_', a.name) END AS filepath FROM vtiger_senotesrel r LEFT JOIN vtiger_notes n ON n.notesid = r.notesid LEFT JOIN vtiger_crmentity e ON e.crmid = r.notesid LEFT JOIN vtiger_seattachmentsrel r2 ON r2.crmid = r.notesid LEFT JOIN vtiger_attachments a ON a.attachmentsid = r2.attachmentsid WHERE r.crmid = ? AND e.deleted = 0 AND (a.type = 'application/pdf' OR a.type = 'application/octet-stream') "; $stmt = $conn->prepare($sql); $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows == 0) { logMessage("Ошибка: Данные не найдены в БД."); die(json_encode(["status" => "error", "message" => "Нет данных."])); } // 🔹 Функция конвертации PDF в изображения function convertPdfToImages($pdfPath, $outputDir) { if (!file_exists($pdfPath)) { logMessage("Ошибка: Файл $pdfPath не найден."); return []; } // 🔹 Генерируем безопасное имя файла $safePdfPath = "scanpdf/pdf_" . uniqid() . ".pdf"; if (!copy($pdfPath, $safePdfPath)) { logMessage("Ошибка: Не удалось скопировать $pdfPath в $safePdfPath."); return []; } logMessage("Файл скопирован в безопасное место: $safePdfPath"); // 🔹 Создаем временную папку для изображений if (!file_exists($outputDir)) { mkdir($outputDir, 0777, true); } // 🔹 Конвертация PDF -> JPG $imagePattern = $outputDir . '/page-%03d.jpg'; $command = "convert -density 300 " . escapeshellarg($safePdfPath) . " -quality 90 " . escapeshellarg($imagePattern); logMessage("Выполняем команду: $command"); exec($command, $output, $returnVar); // 🔹 Удаляем временный PDF unlink($safePdfPath); if ($returnVar !== 0) { logMessage("Ошибка при конвертации PDF в изображения."); return []; } // 🔹 Получаем список созданных изображений $images = glob($outputDir . '/*.jpg'); logMessage("Создано изображений: " . count($images)); return $images; } // 🔹 Обработка всех файлов $files_data = []; while ($row = $result->fetch_assoc()) { $title = $row["title"]; $filePath = $row["filepath"]; $outputDir = "scanpdf/pdf_images_" . uniqid(); logMessage("Обрабатываем файл: " . $filePath); if (!file_exists($filePath)) { logMessage("Ошибка: Файл $filePath не найден."); continue; } // 🔹 Конвертация PDF в изображения $imageFiles = convertPdfToImages($filePath, $outputDir); if (empty($imageFiles)) { logMessage("Ошибка: Не удалось создать изображения для файла $filePath."); continue; } // 🔹 Добавляем в список для анализа $files_data[] = ["title" => $title, "images" => $imageFiles]; } // 🔹 Отправка всех изображений в GPT function analyzeDocumentsWithGPT($documents) { logMessage("DEBUG: Получено для анализа: " . json_encode($documents, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); logMessage("Отправка запроса в GPT-4-Turbo..."); $task = "🔹 Отвечай по шаблону. **Задача**: Проанализируй загруженные документы, выполнив следующие действия: 1️⃣ **Список файлов и проверка соответствия названий** - Перечисли все загруженные файлы. 🔹 Внимательно анализируй изображения. - Если изображение содержит текст, сначала **извлеки текст** и **проанализируй его содержание**. - Укажи, если текст плохо читается или частично распознан. - Если изображение не содержит текста, но является **важной частью документа**, опиши, что на нем изображено. - Определи их содержимое (например, \"договор\", \"претензия\", \"ответ на претензию\", \"подтверждение оплаты\" и т. д.). - Проверь, соответствует ли название файла его реальному содержимому. - Если обнаружено несоответствие, укажи, в чем именно проблема. 2️⃣ **Краткий анализ спора** - Определи **истца** (потребителя) и **ответчика** (компанию, на которую подана жалоба). - Опиши **суть спора** (что произошло и какая проблема заявлена). - Укажи **основные аргументы сторон** (что заявляет потребитель и какие возражения возможны у компании). 3️⃣ **Проверка на цензуру** - Проверь документы на наличие **ненормативной лексики** и **нецензурных изображений**. - **Анализируй изображения на наличие нецензурного контента, запрещенной символики, сцен насилия и других нарушений. Если найдены такие элементы, укажи это в отчете.** - Если обнаружены изображения, укажи что именно и требуется ли их ручная проверка. 4️⃣ **Выдача итогового вердикта** - **Прошло модерацию** – если всё соответствует названию и нет проблем. - **Не прошло модерацию (требуется участие человека)** – если есть несоответствия или потенциальные проблемы (укажи, что именно требует ручной проверки). 5️⃣ **Характер спора** - Дай краткую характеристику дела (например, \"некачественный товар\", \"товар не привезли\", \"не возвращают деньги\", \"некачественная услуга\" и т. д.). 📌 **Важно**: Отчет должен быть структурированным, четким и лаконичным. Укажи, какими нормами права РФ будет регулироваться рассмотение данного спора. Если требуется ручная проверка, укажи приоритетные файлы для проверки."; $body = json_encode([ // "model" => "o1-mini", "model" => "gpt-4-turbo", "messages" => [ ["role" => "system", "content" => "Ты юридический аналитик. Анализируй изображения согласно задаче."], ["role" => "user", "content" => $task], ["role" => "user", "content" => json_encode($documents, JSON_UNESCAPED_UNICODE)] ], "max_completion_tokens" => 4000 ]); logMessage("Запрос к GPT-4-Turbo: " . substr($body, 0, 1000)); $curl = curl_init(); curl_setopt_array($curl, [ CURLOPT_URL => OPENAI_API_URL, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $body, CURLOPT_HTTPHEADER => [ 'Content-Type: application/json', 'Authorization: Bearer ' . OPENAI_API_KEY ] ]); $response = curl_exec($curl); curl_close($curl); return json_decode($response, true); } logMessage("DEBUG: Данные перед отправкой в GPT: " . json_encode($files_data, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT)); $gptAnalysis = analyzeDocumentsWithGPT($files_data); logMessage("Ответ от GPT-4-Turbo: " . json_encode($gptAnalysis, JSON_UNESCAPED_UNICODE)); // Проверка корректности JSON if (!isset($gptAnalysis['choices']) || empty($gptAnalysis['choices'])) { logMessage("Ошибка: в JSON-ответе отсутствует ключ 'choices'."); die(json_encode(["status" => "error", "message" => "Ошибка: в JSON-ответе отсутствует ключ 'choices'."])); } // Получаем контент $content = $gptAnalysis['choices'][0]['message']['content'] ?? null; if (!$content) { logMessage("Ошибка: контент не найден в ответе от GPT."); die(json_encode(["status" => "error", "message" => "Ошибка: контент не найден в ответе от GPT."])); } logMessage("DEBUG: Извлеченный контент: " . $content); // Возвращаем JSON с контентом echo json_encode(["status" => "complete", "content" => $content], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT); ?>