fix: link old
This commit is contained in:
@@ -40,9 +40,6 @@ class DashboardStatsService
|
||||
* balances: array{usdt: string, trx: string, eth: string, btc: string, bnb: string},
|
||||
* transfer_count: int,
|
||||
* transfers: array{usdt: string, trx: string, eth: string, btc: string},
|
||||
* by_os: list<array{label: string, uv: int, pct: float}>,
|
||||
* by_ios_version: list<array{label: string, uv: int, pct: float}>,
|
||||
* by_device_ios_version: list<array{label: string, count: int, pct: float}>,
|
||||
* range: string,
|
||||
* from: string,
|
||||
* to: string
|
||||
@@ -134,63 +131,13 @@ class DashboardStatsService
|
||||
"COUNT(*) as pv,
|
||||
COUNT(DISTINCT client_uid) as uv,
|
||||
COALESCE(SUM(CASE WHEN ({$effectiveSql}) THEN 1 ELSE 0 END), 0) as effective_pv,
|
||||
COUNT(DISTINCT CASE WHEN ({$effectiveSql}) THEN client_uid END) as effective_uv,
|
||||
COUNT(DISTINCT CASE WHEN os = 'iOS' THEN client_uid END) as ios_uv,
|
||||
COUNT(DISTINCT CASE WHEN os IS NULL OR os != 'iOS' THEN client_uid END) as other_uv",
|
||||
COUNT(DISTINCT CASE WHEN ({$effectiveSql}) THEN client_uid END) as effective_uv",
|
||||
)
|
||||
->first();
|
||||
$pv = (int) ($visitAgg?->pv ?? 0);
|
||||
$uv = (int) ($visitAgg?->uv ?? 0);
|
||||
$effectivePv = (int) ($visitAgg?->effective_pv ?? 0);
|
||||
$effectiveUv = (int) ($visitAgg?->effective_uv ?? 0);
|
||||
$iosUv = (int) ($visitAgg?->ios_uv ?? 0);
|
||||
$otherUv = (int) ($visitAgg?->other_uv ?? 0);
|
||||
|
||||
$iosVisits = (clone $visits)->where('os', 'iOS');
|
||||
|
||||
$byOs = [
|
||||
$this->visitRow('iOS', $iosUv, $uv),
|
||||
$this->visitRow('其他', $otherUv, $uv),
|
||||
];
|
||||
|
||||
$versionGroups = (clone $iosVisits)
|
||||
->select('os_version')
|
||||
->selectRaw('COUNT(DISTINCT client_uid) as uv')
|
||||
->groupBy('os_version')
|
||||
->orderByDesc('uv')
|
||||
->limit(20)
|
||||
->get();
|
||||
// Denominator = sum of per-version UVs (not global DISTINCT).
|
||||
// Same visitor may appear under multiple versions; using DISTINCT total would
|
||||
// make every overlapping bucket show ~100%.
|
||||
$versionUvSum = (int) $versionGroups->sum('uv');
|
||||
$byIosVersion = $versionGroups
|
||||
->map(fn ($r) => $this->visitRow(
|
||||
((string) ($r->os_version ?? '')) !== '' ? (string) $r->os_version : 'Unknown',
|
||||
(int) $r->uv,
|
||||
$versionUvSum > 0 ? $versionUvSum : $iosUv,
|
||||
))
|
||||
->values()
|
||||
->all();
|
||||
|
||||
$byDeviceIosVersion = (clone $createdInRange)
|
||||
->select('ios_version')
|
||||
->selectRaw('COUNT(*) as cnt')
|
||||
->groupBy('ios_version')
|
||||
->orderByDesc('cnt')
|
||||
->limit(20)
|
||||
->get()
|
||||
->map(function ($r) use ($total) {
|
||||
$label = trim((string) ($r->ios_version ?? ''));
|
||||
|
||||
return $this->deviceRow(
|
||||
$label !== '' ? $label : '未知',
|
||||
(int) $r->cnt,
|
||||
$total,
|
||||
);
|
||||
})
|
||||
->values()
|
||||
->all();
|
||||
|
||||
return [
|
||||
'total' => $total,
|
||||
@@ -206,9 +153,6 @@ class DashboardStatsService
|
||||
'balances' => $balances,
|
||||
'transfer_count' => $transferCount,
|
||||
'transfers' => $transfers,
|
||||
'by_os' => $byOs,
|
||||
'by_ios_version' => $byIosVersion,
|
||||
'by_device_ios_version' => $byDeviceIosVersion,
|
||||
'range' => $rangeLabel,
|
||||
'from' => $from->toDateTimeString(),
|
||||
'to' => $to->toDateTimeString(),
|
||||
@@ -480,33 +424,4 @@ class DashboardStatsService
|
||||
return [$major, $minor, $patch];
|
||||
}
|
||||
|
||||
/**
|
||||
* Visit breakdown row. pct = uv / $totalUv (UV share).
|
||||
*
|
||||
* @return array{label: string, uv: int, pct: float}
|
||||
*/
|
||||
private function visitRow(string $label, int $uv, int $totalUv): array
|
||||
{
|
||||
$pct = $totalUv > 0 ? round(($uv / $totalUv) * 100, 1) : 0.0;
|
||||
|
||||
return [
|
||||
'label' => $label,
|
||||
'uv' => $uv,
|
||||
'pct' => $pct,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array{label: string, count: int, pct: float}
|
||||
*/
|
||||
private function deviceRow(string $label, int $count, int $total): array
|
||||
{
|
||||
$pct = $total > 0 ? round(($count / $total) * 100, 1) : 0.0;
|
||||
|
||||
return [
|
||||
'label' => $label,
|
||||
'count' => $count,
|
||||
'pct' => $pct,
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user