Răsfoiți Sursa

游戏每日数据

aiden 3 luni în urmă
părinte
comite
0abe4ba86d
3 a modificat fișierele cu 79 adăugiri și 149 ștergeri
  1. 31 18
      app/controller/GameStatis.php
  2. 41 119
      app/model/GameStatisModel.php
  3. 7 12
      route/app.php

+ 31 - 18
app/controller/GameStatis.php

@@ -4,9 +4,9 @@ declare (strict_types = 1);
 namespace app\controller;
 
 use app\BaseController;
-use app\model\MerchantDailyModel;
-use app\model\GameDailyModel;
-use app\model\MerchantHistoryModel;
+use app\model\GameStatisModel;
+use app\common\CommonUtils;
+use app\model\GameModel;
 use think\facade\Request;
 
 class GameStatis extends BaseController
@@ -14,35 +14,48 @@ class GameStatis extends BaseController
     /**
      * 获取游戏每日数据列表
      */
-    public function DailyList()
+    public function Daily()
     {
         $userInfo = $this->request->userInfo;
         
         // 获取查询参数
         $page = Request::get('page', 1, 'intval');
         $limit = Request::get('limit', 10, 'intval');
-        $gameId = Request::get('game_id', 0, 'intval');
-        $gameName = Request::get('game_name', '', 'trim');
-        $startDate = Request::get('start_date', date('Y-m-d', strtotime('-7 days')), 'trim');
-        $endDate = Request::get('end_date', date('Y-m-d'), 'trim');
-        
+
+        // 筛选条件
         $filters = [
-            'merchant_id' => $userInfo['merchant_id'],
-            'game_id' => $gameId,
-            'game_name' => $gameName,
-            'start_date' => $startDate,
-            'end_date' => $endDate
+            // 时间筛选
+            'start_time' => Request::get('start_time', date('Y-m-d', strtotime('-7 days')), 'trim'),
+            'end_time' => Request::get('end_time', date('Y-m-d'), 'trim'),
+            'game_id' => Request::get('game_id', '', 'trim'),
         ];
         
         try {
             // 获取游戏每日数据
-            $result = GameDailyModel::getGameDailyList($filters, $page, $limit);
+            $result = GameStatisModel::getGameDailyList(
+                $userInfo['merchant_id'],
+                $page, 
+                $limit,
+                $filters,
+            );
+
+            // 获取游戏信息信息
+            $game_ids = array_unique(array_column($result['list'], 'game_id'));
+            $tempGameList = GameModel::where([['merchant_id', '=', $userInfo['merchant_id']], ['game_id', 'in', $game_ids]])->field(['game_id','title','image'])->select()->toArray();
+            $gameList = [];
+            foreach ($tempGameList as $item) {
+                $game_id = $item['game_id'];
+                $gameList[$game_id] = $item;
+            }            
             
             // 格式化数据
             foreach ($result['list'] as &$item) {
-                $item['game_profit'] = round($item['game_profit'], 2);
-                $item['bet_amount'] = round($item['bet_amount'], 2);
-                $item['commission_amount'] = round($item['commission_amount'], 2);
+                $item['game_profit'] = CommonUtils::convertBalance($item['game_profit'], false);
+                $item['bet_amount'] = CommonUtils::convertBalance($item['bet_amount'], false);
+                $item['commission_amount'] = CommonUtils::convertBalance($item['game_profit'] * 0.08, false);
+                $item['platform_fee'] = CommonUtils::convertBalance($item['bet_amount'] * 0.08, false);
+                $item['buy_free_bet'] = 0;
+                $item['game_title'] = $gameList[$item['game_id']]['title'] ?? '';
             }
             
             return json_success($result, '获取成功');

+ 41 - 119
app/model/GameStatisModel.php

@@ -11,140 +11,62 @@ use think\facade\Db;
  */
 class GameStatisModel extends Model
 {
+    protected $name = 'game_bet_game';
+
     // 连接到fortue_tiger数据库
     protected $connection = 'fortue_tiger';
     
     /**
      * 获取游戏每日数据列表
      */
-    public static function getGameDailyList($filters = [], $page = 1, $limit = 10)
+    public static function getGameDailyList($merchantId, $page = 1, $limit = 20, $filters = [])
     {
-        $query = Db::connect('fortue_tiger')->name('game_bet_order');
-        
-        // 应用过滤条件
-        if (!empty($filters['merchant_id'])) {
-            $query->where('app_id', $filters['merchant_id']);
-        }
-        
-        // 日期范围
-        $startDate = $filters['start_date'] ?? date('Y-m-d', strtotime('-7 days'));
-        $endDate = $filters['end_date'] ?? date('Y-m-d');
-        $startTime = strtotime($startDate . ' 00:00:00');
-        $endTime = strtotime($endDate . ' 23:59:59');
-        
-        $query->where('create_time', '>=', $startTime)
-              ->where('create_time', '<=', $endTime)
-              ->where('status', 1); // 只统计有效订单
+        $where = [
+            ['app_id', '=', $merchantId]
+        ];
         
-        // 游戏ID或名称过滤
-        if (!empty($filters['game_id'])) {
-            $query->where('game_id', $filters['game_id']);
+        // 时间筛选
+        if (!empty($filters['start_time'])) {
+            $startTime = strtotime($filters['start_time']);
+            $where[] = ['create_time', '>=', $startTime];
         }
         
-        if (!empty($filters['game_name'])) {
-            // 如果有游戏名称表,可以关联查询
-            $query->where('game_id', 'like', '%' . $filters['game_name'] . '%');
+        if (!empty($filters['end_time'])) {
+            $endTime = strtotime($filters['end_time']);
+            $where[] = ['create_time', '<=', $endTime];
         }
-        
-        // 按游戏和日期分组统计
-        $sql = "SELECT 
-                    DATE_FORMAT(FROM_UNIXTIME(create_time), '%Y-%m-%d') as date,
-                    game_id,
-                    COUNT(DISTINCT uname) as bet_users,
-                    COUNT(id) as bet_count,
-                    SUM(bet) as bet_amount,
-                    SUM(amount) as game_profit,
-                    SUM(total_win_amount) as total_win,
-                    COUNT(DISTINCT CASE WHEN action_type = 5 THEN id END) as free_game_count
-                FROM tp_game_bet_order
-                WHERE app_id = ? 
-                    AND create_time >= ? 
-                    AND create_time <= ?
-                    AND status = 1";
-        
-        $params = [$filters['merchant_id'] ?? 0, $startTime, $endTime];
-        
-        if (!empty($filters['game_id'])) {
-            $sql .= " AND game_id = ?";
-            $params[] = $filters['game_id'];
-        }
-        
-        $sql .= " GROUP BY date, game_id
-                  ORDER BY date DESC, game_id ASC";
-        
-        // 获取总数(用于分页)
-        $countSql = "SELECT COUNT(DISTINCT CONCAT(DATE_FORMAT(FROM_UNIXTIME(create_time), '%Y-%m-%d'), '-', game_id)) as total
-                     FROM tp_game_bet_order
-                     WHERE app_id = ? 
-                         AND create_time >= ? 
-                         AND create_time <= ?
-                         AND status = 1";
-        
-        $countParams = [$filters['merchant_id'] ?? 0, $startTime, $endTime];
+
         if (!empty($filters['game_id'])) {
-            $countSql .= " AND game_id = ?";
-            $countParams[] = $filters['game_id'];
+            $gameId = is_array($filters['game_id']) ? $filters['game_id'] : explode(',', $filters['game_id']);
+            $where[] = ['game_id', 'in', $gameId];
         }
         
-        $total = Db::connect('fortue_tiger')->query($countSql, $countParams)[0]['total'] ?? 0;
-        
-        // 添加分页
-        $sql .= " LIMIT " . (($page - 1) * $limit) . ", " . $limit;
-        
-        $list = Db::connect('fortue_tiger')->query($sql, $params);
+        $query = self::where($where);
+        // 统计总数
+        $total = $query->count();
+        // 获取列表数据
+        $list = $query->field([
+                    "FROM_UNIXTIME(create_time, '%Y-%m-%d') as date", // 日期
+                    'game_id',  //游戏id
+                    'AVG(rtp) AS rtp', // 平均RTP
+                    'COUNT(DISTINCT uname) as bet_users',  // 投注用户数
+                    'COUNT(id) as bet_count',  // 注单数
+                    'SUM(bet) as bet_amount',  // 注单金额(下注分数)
+                    'SUM(total_win_amount) as game_profit',  // 游戏输赢(金额变化)
+            ])
+            ->order('date', 'desc')
+            ->group('date, game_id')
+            ->page($page, $limit)
+            ->select()
+            ->toArray();
+
+        // 获取登录用户、注册用户    
+        $merchantsUserStatic = MerchantsUserModel::getPlayerStatistics($merchantId, $filters);
         
-        // 处理每条记录
-        foreach ($list as &$item) {
-            // 计算RTP
-            $item['game_rtp'] = 0;
-            if ($item['bet_amount'] > 0) {
-                $item['game_rtp'] = round(($item['total_win'] / $item['bet_amount']) * 100, 2);
-            }
-            
-            // 获取该游戏该天的注册用户(新用户首次玩该游戏)
-            $dayStart = strtotime($item['date'] . ' 00:00:00');
-            $dayEnd = strtotime($item['date'] . ' 23:59:59');
-            
-            $registerUsers = Db::connect('fortue_tiger')
-                ->name('game_bet_order')
-                ->alias('gbo')
-                ->join('tp_merchants_user mu', 'gbo.uname = mu.uname', 'INNER')
-                ->where('gbo.app_id', $filters['merchant_id'] ?? 0)
-                ->where('gbo.game_id', $item['game_id'])
-                ->where('gbo.create_time', '>=', $dayStart)
-                ->where('gbo.create_time', '<=', $dayEnd)
-                ->where('mu.create_time', '>=', $dayStart)
-                ->where('mu.create_time', '<=', $dayEnd)
-                ->count('DISTINCT gbo.uname');
-            
-            // 获取登录用户数
-            $loginUsers = Db::connect('fortue_tiger')
-                ->name('game_bet_order')
-                ->alias('gbo')
-                ->join('tp_merchants_user mu', 'gbo.uname = mu.uname', 'INNER')
-                ->where('gbo.app_id', $filters['merchant_id'] ?? 0)
-                ->where('gbo.game_id', $item['game_id'])
-                ->where('gbo.create_time', '>=', $dayStart)
-                ->where('gbo.create_time', '<=', $dayEnd)
-                ->where('mu.login_time', '>=', $dayStart)
-                ->where('mu.login_time', '<=', $dayEnd)
-                ->count('DISTINCT gbo.uname');
-            
-            // 计算抽水额度
-            $item['commission_amount'] = ($item['bet_amount'] - $item['total_win']) / 100;
-            
-            // 格式化金额字段(转换为元)
-            $item['game_profit'] = abs($item['game_profit']) / 100;
-            $item['bet_amount'] = $item['bet_amount'] / 100;
-            $item['total_win'] = $item['total_win'] / 100;
-            
-            // 添加其他字段
-            $item['game_name'] = '游戏' . $item['game_id']; // 如果有游戏名称表可以关联查询
-            $item['register_users'] = $registerUsers;
-            $item['login_users'] = $loginUsers;
-            
-            // 移除不需要的字段
-            unset($item['total_win']);
+        foreach ($list as &$row)
+        {
+            $row['login_users'] = $merchantsUserStatic[$row['date']]['login_users'] ?? 0;
+            $row['register_users'] = $merchantsUserStatic[$row['date']]['register_users'] ?? 0;
         }
         
         return [

+ 7 - 12
route/app.php

@@ -105,23 +105,18 @@ Route::group('transfer_log', function () {
     Route::get('export', 'TransferLog/export');
 })->middleware([\app\middleware\AuthMiddleware::class, \app\middleware\BehaviorLogMiddleware::class]);
 
-// 每日数据统计相关路由
+// 商户数据统计相关路由
 Route::group('merchant_statis', function () {
     // 商户数据
     Route::get('stage', 'MerchantStatis/Stage');
     // 商户每日数据
-    Route::get('daily', 'MerchantStatis/Daily');
-    // Route::get('merchant_summary', 'DailyStatistics/merchantSummary');
-    // Route::get('export_merchant_daily', 'DailyStatistics/exportMerchantDaily');
-    
+    Route::get('daily', 'MerchantStatis/Daily');    
     // 商户历史数据
     Route::get('history', 'MerchantStatis/history');
-    // Route::get('merchant_history_list', 'DailyStatistics/merchantHistoryList');
-    // Route::get('export_merchant_history', 'DailyStatistics/exportMerchantHistory');
-    
+})->middleware([\app\middleware\AuthMiddleware::class, \app\middleware\BehaviorLogMiddleware::class]);
+
+// 游戏数据统计相关路由
+Route::group('game_statis', function () {
     // 游戏每日数据
-    // Route::get('game_daily_list', 'DailyStatistics/gameDailyList');
-    // Route::get('game_summary', 'DailyStatistics/gameSummary');
-    // Route::get('game_list', 'DailyStatistics/getGameList');
-    // Route::get('export_game_daily', 'DailyStatistics/exportGameDaily');
+    Route::get('daily', 'GameStatis/Daily');
 })->middleware([\app\middleware\AuthMiddleware::class, \app\middleware\BehaviorLogMiddleware::class]);