106 lines
4.3 KiB
PHP
106 lines
4.3 KiB
PHP
<?php
|
|
namespace App\Controllers\Admin;
|
|
|
|
use App\Core\AdminBaseController;
|
|
use Db\Database;
|
|
|
|
class ReportController extends AdminBaseController {
|
|
private $db;
|
|
public function __construct(Database $db) { $this->db = $db; }
|
|
|
|
public function index() {
|
|
$this->checkLogin(); $this->checkAdmin();
|
|
$dateFrom = $_GET['from'] ?? date('Y-m-d', strtotime('-7 days'));
|
|
$dateTo = $_GET['to'] ?? date('Y-m-d');
|
|
$range = [$dateFrom . ' 00:00:00', $dateTo . ' 23:59:59'];
|
|
|
|
// 总投注(排除虚拟)
|
|
$totalBet = $this->db->sum('bets', 'amount', [
|
|
'is_virtual' => 0, 'created_at[<>]' => $range
|
|
]) ?: 0;
|
|
|
|
// 总派奖
|
|
$totalWin = $this->db->sum('bets', 'win_amount', [
|
|
'is_virtual' => 0, 'status' => 'win', 'created_at[<>]' => $range
|
|
]) ?: 0;
|
|
|
|
// 平台利润
|
|
$profit = $totalBet - $totalWin;
|
|
|
|
// 总充值
|
|
$totalDeposit = $this->db->sum('transactions', 'amount', [
|
|
'is_virtual' => 0, 'type[~]' => '%deposit%', 'amount[>]' => 0,
|
|
'created_at[<>]' => $range
|
|
]) ?: 0;
|
|
|
|
// 总提现
|
|
$totalWithdraw = abs($this->db->sum('transactions', 'amount', [
|
|
'is_virtual' => 0, 'type[~]' => '%withdraw%', 'amount[<]' => 0,
|
|
'created_at[<>]' => $range
|
|
]) ?: 0);
|
|
|
|
// 代理佣金
|
|
$totalCommission = $this->db->sum('agent_commissions', 'commission', [
|
|
'created_at[<>]' => $range
|
|
]) ?: 0;
|
|
|
|
// 反水
|
|
$totalRebate = $this->db->sum('agent_commissions', 'commission', [
|
|
'type' => 'rebate', 'created_at[<>]' => $range
|
|
]) ?: 0;
|
|
|
|
// 用户统计
|
|
$totalUsers = $this->db->count('users', ['is_virtual' => 0]);
|
|
$newUsers = $this->db->count('users', [
|
|
'is_virtual' => 0, 'created_at[<>]' => $range
|
|
]);
|
|
|
|
// 每日明细
|
|
$dailyStats = [];
|
|
$start = new \DateTime($dateFrom);
|
|
$end = new \DateTime($dateTo);
|
|
$end->modify('+1 day');
|
|
$interval = new \DateInterval('P1D');
|
|
$period = new \DatePeriod($start, $interval, $end);
|
|
foreach ($period as $day) {
|
|
$d = $day->format('Y-m-d');
|
|
$dr = [$d . ' 00:00:00', $d . ' 23:59:59'];
|
|
$dailyStats[] = [
|
|
'date' => $d,
|
|
'bets' => $this->db->sum('bets', 'amount', ['is_virtual'=>0,'created_at[<>]'=>$dr]) ?: 0,
|
|
'wins' => $this->db->sum('bets', 'win_amount', ['is_virtual'=>0,'status'=>'win','created_at[<>]'=>$dr]) ?: 0,
|
|
'deposits' => $this->db->sum('transactions', 'amount', ['is_virtual'=>0,'type[~]'=>'%deposit%','amount[>]'=>0,'created_at[<>]'=>$dr]) ?: 0,
|
|
'withdraws' => abs($this->db->sum('transactions', 'amount', ['is_virtual'=>0,'type[~]'=>'%withdraw%','amount[<]'=>0,'created_at[<>]'=>$dr]) ?: 0),
|
|
];
|
|
}
|
|
|
|
// 代理报表
|
|
$agentStats = [];
|
|
$agents = $this->db->select('agents', '*', ['status' => 1]);
|
|
foreach ($agents as $ag) {
|
|
$playerIds = $this->db->select('users', 'id', ['agent_id' => $ag['id'], 'is_virtual' => 0]);
|
|
$agBet = 0; $agWin = 0;
|
|
if (!empty($playerIds)) {
|
|
$agBet = $this->db->sum('bets', 'amount', ['user_id' => $playerIds, 'is_virtual'=>0, 'created_at[<>]'=>$range]) ?: 0;
|
|
$agWin = $this->db->sum('bets', 'win_amount', ['user_id' => $playerIds, 'is_virtual'=>0, 'status'=>'win', 'created_at[<>]'=>$range]) ?: 0;
|
|
}
|
|
$agComm = $this->db->sum('agent_commissions', 'commission', ['agent_id'=>$ag['id'],'created_at[<>]'=>$range]) ?: 0;
|
|
$agentStats[] = [
|
|
'agent' => $ag,
|
|
'user' => $this->db->get('users', ['username'], ['id' => $ag['user_id']]),
|
|
'players' => count($playerIds),
|
|
'bets' => $agBet, 'wins' => $agWin, 'commission' => $agComm,
|
|
'profit' => $agBet - $agWin - $agComm,
|
|
];
|
|
}
|
|
|
|
$this->render('Admin/reports.php', compact(
|
|
'dateFrom','dateTo','totalBet','totalWin','profit',
|
|
'totalDeposit','totalWithdraw','totalCommission','totalRebate',
|
|
'totalUsers','newUsers','dailyStats','agentStats'
|
|
));
|
|
}
|
|
|
|
private function json($data) { header('Content-Type: application/json'); echo json_encode($data); }
|
|
}
|