| Current Path : /home/seto/888mirror.pm/admin/ |
| Current File : /home/seto/888mirror.pm/admin/map-data.php |
<?php
require_once __DIR__ . '/../includes/auth.php';
auth_check();
header('Content-Type: application/json');
$db = db();
$excl = (($_GET['exclude_cnus'] ?? '1') !== '0');
$excl_sql = $excl ? "AND country NOT IN ('cn','us')" : '';
// Агрегат по странам (всё время)
$stats_raw = $db->query("
SELECT country,
COUNT(DISTINCT CASE WHEN event_type='impression' THEN visit_id END) as imp,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END) as clk
FROM stats
WHERE country != '-' AND country != '' AND length(country) = 2 $excl_sql
GROUP BY country
")->fetchAll();
$stats = [];
foreach ($stats_raw as $r) {
$stats[strtolower($r['country'])] = ['imp' => (int)$r['imp'], 'clk' => (int)$r['clk']];
}
// Последние события за 30 минут (для пульсации)
$recent_raw = $db->query("
SELECT country, event_type, created_at
FROM stats
WHERE country != '-' AND country != '' AND length(country) = 2
AND created_at >= datetime('now', '-30 minutes') $excl_sql
ORDER BY created_at DESC
LIMIT 100
")->fetchAll();
$recent = [];
foreach ($recent_raw as $r) {
$recent[] = [
'cc' => strtolower($r['country']),
'type' => $r['event_type'],
'ts' => strtotime($r['created_at']),
];
}
// Drill-down: топ брендов + статистика по дням для страны
$cc = isset($_GET['cc']) ? strtolower(preg_replace('/[^a-z]/', '', $_GET['cc'])) : null;
$drill = null;
if ($cc && strlen($cc) === 2) {
$brands_raw = $db->prepare("
SELECT b.name, b.logo,
COUNT(DISTINCT CASE WHEN s.event_type='impression' THEN s.visit_id END) as imp,
SUM(CASE WHEN s.event_type='click' THEN 1 ELSE 0 END) as clk
FROM stats s
JOIN brands b ON b.id = s.brand_id
WHERE s.country = ? AND s.country != '-'
GROUP BY s.brand_id
HAVING imp > 0 OR clk > 0
ORDER BY clk DESC
LIMIT 8
");
$brands_raw->execute([$cc]);
$brands = $brands_raw->fetchAll();
$days_raw = $db->prepare("
SELECT DATE(created_at) as day,
COUNT(DISTINCT CASE WHEN event_type='impression' THEN visit_id END) as imp,
SUM(CASE WHEN event_type='click' THEN 1 ELSE 0 END) as clk
FROM stats
WHERE country = ? AND created_at >= date('now', '-14 days')
GROUP BY DATE(created_at)
ORDER BY day
");
$days_raw->execute([$cc]);
$days = $days_raw->fetchAll();
$drill = ['brands' => $brands, 'days' => $days];
}
echo json_encode(['stats' => $stats, 'recent' => $recent, 'drill' => $drill, 'ts' => time()]);