From 6f56574aace1cd95abbf7e0e32aaea50e5b89bb7 Mon Sep 17 00:00:00 2001 From: zhenhui <1276357500@qq.com> Date: Tue, 10 Mar 2026 12:42:29 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=BB=E9=A1=B5=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BB=9F=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- saiadmin-artd/src/api/dashboard.ts | 17 +- .../src/views/dashboard/console/index.vue | 2 - .../console/modules/about-project.vue | 43 ---- .../dashboard/console/modules/active-user.vue | 14 +- .../dashboard/console/modules/card-list.vue | 91 ++++++--- .../console/modules/sales-overview.vue | 14 +- .../controller/DiceDashboardController.php | 183 ++++++++++++++++++ server/plugin/saiadmin/config/route.php | 4 + 8 files changed, 279 insertions(+), 89 deletions(-) delete mode 100644 saiadmin-artd/src/views/dashboard/console/modules/about-project.vue create mode 100644 server/app/dice/controller/DiceDashboardController.php diff --git a/saiadmin-artd/src/api/dashboard.ts b/saiadmin-artd/src/api/dashboard.ts index 2bda696..41dd455 100644 --- a/saiadmin-artd/src/api/dashboard.ts +++ b/saiadmin-artd/src/api/dashboard.ts @@ -1,31 +1,32 @@ import request from '@/utils/http' /** - * 基础数据统计 + * 大富翁工作台卡片统计(玩家注册、充值、提现、游玩次数,含较上周对比) * @returns 响应 */ export function fetchStatistics() { return request.get({ - url: '/core/system/statistics' + url: '/core/dice/dashboard/statistics' }) } /** - * 登录统计图表数据 + * 近期玩家充值统计(近10天每日充值金额) * @returns 响应 */ -export function fetchLoginChart() { +export function fetchRechargeChart() { return request.get({ - url: '/core/system/loginChart' + url: '/core/dice/dashboard/rechargeChart' }) } /** - * 登录统计图表数据 + * 月度玩家充值汇总(当年1-12月每月充值金额) * @returns 响应 */ -export function fetchLoginBarChart() { +export function fetchRechargeBarChart() { return request.get({ - url: '/core/system/loginBarChart' + url: '/core/dice/dashboard/rechargeBarChart' }) } + diff --git a/saiadmin-artd/src/views/dashboard/console/index.vue b/saiadmin-artd/src/views/dashboard/console/index.vue index 4fd0d2c..075ea8a 100644 --- a/saiadmin-artd/src/views/dashboard/console/index.vue +++ b/saiadmin-artd/src/views/dashboard/console/index.vue @@ -28,7 +28,6 @@ - @@ -36,7 +35,6 @@ import CardList from './modules/card-list.vue' import ActiveUser from './modules/active-user.vue' import SalesOverview from './modules/sales-overview.vue' - import AboutProject from './modules/about-project.vue' import NewUser from './modules/new-user.vue' import Dynamic from './modules/dynamic-stats.vue' import TodoList from './modules/todo-list.vue' diff --git a/saiadmin-artd/src/views/dashboard/console/modules/about-project.vue b/saiadmin-artd/src/views/dashboard/console/modules/about-project.vue deleted file mode 100644 index 2bf075a..0000000 --- a/saiadmin-artd/src/views/dashboard/console/modules/about-project.vue +++ /dev/null @@ -1,43 +0,0 @@ - - - diff --git a/saiadmin-artd/src/views/dashboard/console/modules/active-user.vue b/saiadmin-artd/src/views/dashboard/console/modules/active-user.vue index c19531b..fcfa230 100644 --- a/saiadmin-artd/src/views/dashboard/console/modules/active-user.vue +++ b/saiadmin-artd/src/views/dashboard/console/modules/active-user.vue @@ -2,7 +2,7 @@
-

月度登录汇总

+

月度玩家充值汇总

diff --git a/saiadmin-artd/src/views/dashboard/console/modules/card-list.vue b/saiadmin-artd/src/views/dashboard/console/modules/card-list.vue index a85b6c3..9cddb0b 100644 --- a/saiadmin-artd/src/views/dashboard/console/modules/card-list.vue +++ b/saiadmin-artd/src/views/dashboard/console/modules/card-list.vue @@ -2,73 +2,95 @@
- 用户统计 - + 玩家注册 +
较上周 - +10% + + {{ formatChange(statData.player_count_change) }} +
- +
- 附件统计 + 玩家充值
较上周 - +10% + + {{ formatChange(statData.charge_amount_change) }} +
- +
- 登录统计 + 玩家提现
较上周 - +12% + + {{ formatChange(statData.withdraw_amount_change) }} +
- +
- 操作统计 + 玩家游玩次数
较上周 - -5% + + {{ formatChange(statData.play_count_change) }} +
- +
@@ -79,15 +101,40 @@ import { fetchStatistics } from '@/api/dashboard' const statData = ref({ - user: 0, - attach: 0, - login: 0, - operate: 0 + player_count: 0, + player_count_change: 0, + charge_amount: 0, + charge_amount_change: 0, + withdraw_amount: 0, + withdraw_amount_change: 0, + play_count: 0, + play_count_change: 0 }) + function formatChange(val: number): string { + if (val > 0) return `+${val}%` + if (val < 0) return `${val}%` + return '0%' + } + + function changeClass(val: number): string { + if (val > 0) return 'text-success' + if (val < 0) return 'text-danger' + return 'text-g-600' + } + onMounted(() => { - fetchStatistics().then((data) => { - statData.value = data + fetchStatistics().then((data: any) => { + statData.value = { + player_count: data?.player_count ?? 0, + player_count_change: data?.player_count_change ?? 0, + charge_amount: data?.charge_amount ?? 0, + charge_amount_change: data?.charge_amount_change ?? 0, + withdraw_amount: data?.withdraw_amount ?? 0, + withdraw_amount_change: data?.withdraw_amount_change ?? 0, + play_count: data?.play_count ?? 0, + play_count_change: data?.play_count_change ?? 0 + } }) }) diff --git a/saiadmin-artd/src/views/dashboard/console/modules/sales-overview.vue b/saiadmin-artd/src/views/dashboard/console/modules/sales-overview.vue index fbdbaa2..3280d2e 100644 --- a/saiadmin-artd/src/views/dashboard/console/modules/sales-overview.vue +++ b/saiadmin-artd/src/views/dashboard/console/modules/sales-overview.vue @@ -2,7 +2,7 @@
-

近期登录统计

+

近期玩家充值统计

diff --git a/server/app/dice/controller/DiceDashboardController.php b/server/app/dice/controller/DiceDashboardController.php new file mode 100644 index 0000000..65d2133 --- /dev/null +++ b/server/app/dice/controller/DiceDashboardController.php @@ -0,0 +1,183 @@ +adminInfo ?? null; + + $playerQueryThis = DicePlayer::whereBetween('create_time', [$thisWeekStart, $thisWeekEnd]); + $playerQueryLast = DicePlayer::whereBetween('create_time', [$lastWeekStart, $lastWeekEnd]); + AdminScopeHelper::applyAdminScope($playerQueryThis, $adminInfo); + AdminScopeHelper::applyAdminScope($playerQueryLast, $adminInfo); + $playerThis = $playerQueryThis->count(); + $playerLast = $playerQueryLast->count(); + + $chargeQueryThis = DicePlayerWalletRecord::where('type', 0) + ->where('coin', '>', 0) + ->whereBetween('create_time', [$thisWeekStart, $thisWeekEnd]); + $chargeQueryLast = DicePlayerWalletRecord::where('type', 0) + ->where('coin', '>', 0) + ->whereBetween('create_time', [$lastWeekStart, $lastWeekEnd]); + AdminScopeHelper::applyAdminScope($chargeQueryThis, $adminInfo); + AdminScopeHelper::applyAdminScope($chargeQueryLast, $adminInfo); + $chargeThis = $chargeQueryThis->sum('coin'); + $chargeLast = $chargeQueryLast->sum('coin'); + + $withdrawQueryThis = DicePlayerWalletRecord::where('type', 1) + ->whereBetween('create_time', [$thisWeekStart, $thisWeekEnd]); + $withdrawQueryLast = DicePlayerWalletRecord::where('type', 1) + ->whereBetween('create_time', [$lastWeekStart, $lastWeekEnd]); + AdminScopeHelper::applyAdminScope($withdrawQueryThis, $adminInfo); + AdminScopeHelper::applyAdminScope($withdrawQueryLast, $adminInfo); + $withdrawThis = $withdrawQueryThis->sum(Db::raw('ABS(coin)')); + $withdrawLast = $withdrawQueryLast->sum(Db::raw('ABS(coin)')); + + $playQueryThis = DicePlayRecord::whereBetween('create_time', [$thisWeekStart, $thisWeekEnd]); + $playQueryLast = DicePlayRecord::whereBetween('create_time', [$lastWeekStart, $lastWeekEnd]); + AdminScopeHelper::applyAdminScope($playQueryThis, $adminInfo); + AdminScopeHelper::applyAdminScope($playQueryLast, $adminInfo); + $playThis = $playQueryThis->count(); + $playLast = $playQueryLast->count(); + + $playerChange = $this->calcWeekChange($playerThis, $playerLast); + $chargeChange = $this->calcWeekChange((float) $chargeThis, (float) $chargeLast); + $withdrawChange = $this->calcWeekChange((float) $withdrawThis, (float) $withdrawLast); + $playChange = $this->calcWeekChange($playThis, $playLast); + + return $this->success([ + 'player_count' => $playerThis, + 'player_count_change' => $playerChange, + 'charge_amount' => (float) $chargeThis, + 'charge_amount_change' => $chargeChange, + 'withdraw_amount' => (float) $withdrawThis, + 'withdraw_amount_change' => $withdrawChange, + 'play_count' => $playThis, + 'play_count_change' => $playChange, + ]); + } + + /** + * 近期玩家充值统计(近10天每日充值金额) + */ + #[Permission('工作台数据统计', 'core:console:list')] + public function rechargeChart(): Response + { + $adminInfo = $this->adminInfo ?? null; + $allowedIds = AdminScopeHelper::getAllowedAdminIds($adminInfo); + $adminCondition = ''; + if ($allowedIds !== null) { + if (empty($allowedIds)) { + $data = []; + foreach (range(0, 9) as $n) { + $data[] = ['recharge_date' => date('Y-m-d', strtotime("-{$n} days")), 'recharge_amount' => 0]; + } + $data = array_reverse($data); + return $this->success([ + 'recharge_amount' => array_map('floatval', array_column($data, 'recharge_amount')), + 'recharge_date' => array_column($data, 'recharge_date'), + ]); + } + $idsStr = implode(',', array_map('intval', $allowedIds)); + $adminCondition = " AND w.admin_id IN ({$idsStr})"; + } + $sql = " + SELECT + d.date AS recharge_date, + IFNULL(SUM(w.coin), 0) AS recharge_amount + FROM + (SELECT CURDATE() - INTERVAL (a.N) DAY AS date + FROM (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 + UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 + UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a + ) d + LEFT JOIN dice_player_wallet_record w + ON DATE(w.create_time) = d.date AND w.type = 0 AND w.coin > 0 {$adminCondition} + GROUP BY d.date + ORDER BY d.date ASC + "; + $data = Db::query($sql); + return $this->success([ + 'recharge_amount' => array_map('floatval', array_column($data, 'recharge_amount')), + 'recharge_date' => array_column($data, 'recharge_date'), + ]); + } + + /** + * 月度玩家充值汇总(当年1-12月每月充值金额) + */ + #[Permission('工作台数据统计', 'core:console:list')] + public function rechargeBarChart(): Response + { + $adminInfo = $this->adminInfo ?? null; + $allowedIds = AdminScopeHelper::getAllowedAdminIds($adminInfo); + $adminCondition = ''; + if ($allowedIds !== null) { + if (empty($allowedIds)) { + $data = []; + for ($m = 1; $m <= 12; $m++) { + $data[] = ['recharge_month' => sprintf('%02d月', $m), 'recharge_amount' => 0]; + } + return $this->success([ + 'recharge_amount' => array_map('floatval', array_column($data, 'recharge_amount')), + 'recharge_month' => array_column($data, 'recharge_month'), + ]); + } + $idsStr = implode(',', array_map('intval', $allowedIds)); + $adminCondition = " AND w.admin_id IN ({$idsStr})"; + } + $sql = " + SELECT + CONCAT(LPAD(m.month_num, 2, '0'), '月') AS recharge_month, + IFNULL(SUM(w.coin), 0) AS recharge_amount + FROM + (SELECT 1 AS month_num UNION ALL SELECT 2 UNION ALL SELECT 3 + UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 + UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 + UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL SELECT 12) m + LEFT JOIN dice_player_wallet_record w + ON YEAR(w.create_time) = YEAR(CURDATE()) + AND MONTH(w.create_time) = m.month_num + AND w.type = 0 AND w.coin > 0 {$adminCondition} + GROUP BY m.month_num + ORDER BY m.month_num ASC + "; + $data = Db::query($sql); + return $this->success([ + 'recharge_amount' => array_map('floatval', array_column($data, 'recharge_amount')), + 'recharge_month' => array_column($data, 'recharge_month'), + ]); + } + + private function calcWeekChange($current, $last): float + { + if ($last == 0) { + return $current > 0 ? 100.0 : 0.0; + } + return round((($current - $last) / $last) * 100, 1); + } +} diff --git a/server/plugin/saiadmin/config/route.php b/server/plugin/saiadmin/config/route.php index 51dc8b4..8aabaf1 100644 --- a/server/plugin/saiadmin/config/route.php +++ b/server/plugin/saiadmin/config/route.php @@ -17,6 +17,10 @@ Route::group('/core', function () { Route::get('/system/statistics', [plugin\saiadmin\app\controller\SystemController::class, 'statistics']); Route::get('/system/loginChart', [plugin\saiadmin\app\controller\SystemController::class, 'loginChart']); Route::get('/system/loginBarChart', [plugin\saiadmin\app\controller\SystemController::class, 'loginBarChart']); + // 大富翁工作台统计(覆盖默认统计) + Route::get('/dice/dashboard/statistics', [\app\dice\controller\DiceDashboardController::class, 'statistics']); + Route::get('/dice/dashboard/rechargeChart', [\app\dice\controller\DiceDashboardController::class, 'rechargeChart']); + Route::get('/dice/dashboard/rechargeBarChart', [\app\dice\controller\DiceDashboardController::class, 'rechargeBarChart']); Route::get('/system/clearAllCache', [plugin\saiadmin\app\controller\SystemController::class, 'clearAllCache']); Route::get("/system/getResourceCategory", [plugin\saiadmin\app\controller\SystemController::class, 'getResourceCategory']);