- Добавлена поддержка project_id в parscourt.php для создания уведомлений - Создана система парсеров судов (BaseCourtParser, MoscowCourtParser, RegionalCourtParser) - Интегрирован Browserless для парсинга московских судов (mos-sud.ru, mos-gorsud.ru) - Добавлены уведомления VDNotifierPro при обнаружении новых событий судов - Создан ParseAndCreateEvent.php для интеграции с CRM workflow - Создан CreateCourtEvent_v2.php для прямого создания событий в календаре CRM - Поддержка проверки дубликатов событий (можно отключить для тестирования) - Автоматическое определение типа суда и выбор подходящего парсера Функции: - Парсинг региональных судов (*.sudrf.ru) через HTML - Парсинг московских судов через Browserless API - Создание событий в CRM календаре с привязкой к проектам - Уведомления ответственных пользователей о новых событиях - Сохранение событий в таблицу subject для истории
81 lines
3.1 KiB
PHP
81 lines
3.1 KiB
PHP
<?php
|
||
/**
|
||
* Базовый класс для парсеров судов
|
||
*/
|
||
abstract class BaseCourtParser {
|
||
protected $pdo;
|
||
protected $case_number;
|
||
protected $uid;
|
||
protected $skip_duplicate_check;
|
||
protected $project_id;
|
||
|
||
public function __construct($pdo, $case_number, $uid, $skip_duplicate_check = false, $project_id = null) {
|
||
$this->pdo = $pdo;
|
||
$this->case_number = $case_number;
|
||
$this->uid = $uid;
|
||
$this->skip_duplicate_check = $skip_duplicate_check;
|
||
$this->project_id = $project_id;
|
||
}
|
||
|
||
/**
|
||
* Определить, может ли этот парсер обработать данную ссылку
|
||
*/
|
||
abstract public function canHandle($url);
|
||
|
||
/**
|
||
* Парсить страницу дела
|
||
* @return array|null Массив с данными последнего события или null
|
||
*/
|
||
abstract public function parse($url, $status);
|
||
|
||
/**
|
||
* Логирование
|
||
*/
|
||
protected function log($message) {
|
||
$date = date('Y-m-d H:i:s');
|
||
file_put_contents('logs/parser.log', "[$date] $message" . PHP_EOL, FILE_APPEND);
|
||
}
|
||
|
||
/**
|
||
* Сохранить событие в БД
|
||
*/
|
||
protected function saveEvent($event) {
|
||
// Проверяем на дублирование (если не отключена проверка)
|
||
if (!$this->skip_duplicate_check) {
|
||
$checkQuery = "SELECT COUNT(*) FROM subject WHERE event_name = ? AND event_date = ? AND publication_date = ?";
|
||
$checkStmt = $this->pdo->prepare($checkQuery);
|
||
$checkStmt->execute([$event['event_name'], $event['event_date'], $event['publication_date']]);
|
||
$exists = $checkStmt->fetchColumn() > 0;
|
||
|
||
if ($exists) {
|
||
$this->log("Дубликат найден для события: {$event['event_name']}, пропускаем запись.");
|
||
return false;
|
||
}
|
||
} else {
|
||
$this->log("⚠️ ТЕСТОВЫЙ РЕЖИМ: Проверка дубликатов отключена для события: {$event['event_name']}");
|
||
}
|
||
|
||
// Запись данных в таблицу subject
|
||
$insertQuery = "INSERT INTO subject (case_number, uid, event_name, event_date, event_time, location, event_result, event_basis, note, publication_date, update_datetime) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
|
||
$insertStmt = $this->pdo->prepare($insertQuery);
|
||
$insertStmt->execute([
|
||
$this->case_number,
|
||
$this->uid,
|
||
$event['event_name'],
|
||
$event['event_date'],
|
||
$event['event_time'],
|
||
$event['location'],
|
||
$event['event_result'],
|
||
$event['event_basis'],
|
||
$event['note'],
|
||
$event['publication_date'],
|
||
date('Y-m-d H:i:s')
|
||
]);
|
||
|
||
$this->log("Данные успешно записаны в таблицу subject для события: {$event['event_name']}");
|
||
return true;
|
||
}
|
||
}
|
||
?>
|
||
|