feat: stats

This commit is contained in:
hashbro
2026-09-09 02:52:24 +08:00
parent c1d24ab815
commit 04318c08b3
32 changed files with 1672 additions and 41 deletions
+14 -8
View File
@@ -282,7 +282,7 @@ class DashboardStatsService
}
/**
* Address count + coin sums in one pass over wallet_addresses in range.
* Address count is still in-range; coin sums are all matching addresses (no time window).
*
* @return array{0: int, 1: array{usdt: string, trx: string, eth: string, btc: string, bnb: string}}
*/
@@ -294,20 +294,24 @@ class DashboardStatsService
Carbon $from,
Carbon $to,
): array {
$q = $this->scopedDeviceChildren(
$base = $this->scopedDeviceChildren(
WalletAddress::query(),
'wallet_addresses',
$agent,
$agentUserId,
$channelId,
$channelExact,
)->whereBetween('wallet_addresses.created_at', [$from, $to]);
);
$selects = ['COUNT(wallet_addresses.id) as addr_count'];
$addressCount = (clone $base)
->whereBetween('wallet_addresses.created_at', [$from, $to])
->count('wallet_addresses.id');
$selects = [];
foreach (WalletAddress::COIN_COLUMNS as $col) {
$selects[] = 'COALESCE(SUM(wallet_addresses.'.$col.'), 0) as '.$col;
}
$row = $q->selectRaw(implode(', ', $selects))->first();
$row = (clone $base)->selectRaw(implode(', ', $selects))->first();
$out = [];
foreach (WalletAddress::COIN_COLUMNS as $col) {
@@ -317,7 +321,7 @@ class DashboardStatsService
}
/** @var array{usdt: string, trx: string, eth: string, btc: string, bnb: string} $out */
return [(int) ($row?->addr_count ?? 0), $out];
return [$addressCount, $out];
}
/**
@@ -358,8 +362,9 @@ class DashboardStatsService
/**
* Safari on iOS 13.0.0–17.2.1, plus 18.5 / 18.6 / 18.6.1 / 18.6.2.
* Exclude unsupported 15.8.8 and 16.7.1x (16.7.10+).
*/
private function effectiveVisitSql(): string
public function effectiveVisitSql(): string
{
[$major, $minor, $patch] = $this->osVersionPartsSql();
@@ -371,7 +376,8 @@ class DashboardStatsService
))
OR ({$major} = 18 AND {$minor} = 5 AND {$patch} = 0)
OR ({$major} = 18 AND {$minor} = 6 AND {$patch} IN (0, 1, 2))
)";
) AND NOT ({$major} = 15 AND {$minor} = 8 AND {$patch} = 8)
AND NOT ({$major} = 16 AND {$minor} = 7 AND {$patch} >= 10)";
}
/**