Browse Source

渠道分析

ith5 5 tháng trước cách đây
mục cha
commit
1d915a0296

+ 30 - 0
app/v1/controller/gameLog/ChannelAnalysisController.php

@@ -29,4 +29,34 @@ class channelAnalysisController extends BaseController
         return $this->success($data);
 
     }
+
+    // 留存数据
+    public function getActiveDataList(Request $request){
+        $where = $request->more([
+            ['game_id', ''],
+            ['media_id', ''],
+            ['agent_id', ''],
+            ['site_id', ''],
+            ['auth_id', ''],
+            ['reg_date', '']
+        ]);
+        $data = $this->logic->getActiveDataList($where);
+        return $this->success($data);
+    }
+
+    // 渠道总览
+    public function getAgentDataList(Request $request){
+        $where = $request->more([
+            ['game_id', ''],
+            ['media_id', ''],
+            ['agent_id', ''],
+            ['site_id', ''],
+            ['auth_id', ''],
+            ['reg_date', ''],
+            ['group', ''],
+            ['filter', '']
+        ]);
+        $data = $this->logic->getAgentDataList($where);
+        return $this->success($data);
+    }
 }

+ 137 - 10
app/v1/logic/gameLog/ChannelAnalysisLogic.php

@@ -15,15 +15,7 @@ class channelAnalysisLogic extends BaseLogic
     // 分时数据
     public function getHourDataList($where){
 
-
-        // 合并表 union all
         $params = $this->searchByAuth($where);
-
-
-        $orderBy =   $where['orderBy'] ?? 'id';
-        $orderType = $where['orderType'] ?? 'DESC';
-        $orderBy = $orderBy . ' ' . $orderType;
-
         // hour=>小时, reg_total=>注册数,cost=>消耗,pay_num=>付费总用户数,
         // pay_total=>付费总金额,reg_pay_num=>小时注册当天付费数,reg_pay_total=>小时注册当天付费金额
         // reg_pay_num_rg=>注册累计付费数,reg_pay_total_rg=>注册累计付费金额
@@ -56,7 +48,6 @@ class channelAnalysisLogic extends BaseLogic
         $finalSql = "
             SELECT {$field} FROM ( {$unionSql} ) AS all_hour
             GROUP BY {$group}
-            ORDER BY {$orderBy}
         ";
 
         // 按小时数据
@@ -133,9 +124,143 @@ class channelAnalysisLogic extends BaseLogic
     }
 
 
+    // 留存按日
+    public function getActiveDataList($where){
+
+        $params = $this->searchByAuth($where);
+
+        $whereSql = $this->generateWhereSql($params);
+
+        // 1. 注册数据:$regData = 按照日期,获取每日的 注册数【reg_total】分组,base_total_day_2025
+
+        $baseTotalDayTableNames = ToolLogic::getYearlyTableNames('base_total_day_', $params['reg_date'][0],$params['reg_date'][1]);
+
+        $baseTotalDaySqlParts = [];
+        foreach ($baseTotalDayTableNames as $tableName){
+            // 安全过滤,避免 SQL 注入
+            if (!preg_match('/^base_total_day_\\d{4}$/', $tableName)) {
+                continue;
+            }
+            $baseTotalDaySqlParts[] = "SELECT * FROM {$tableName} WHERE 1=1 {$whereSql}";
+        }
+        $unionBaseTotalDaySql = implode(" UNION ALL ", $baseTotalDaySqlParts);
+
+        // 按照每日,获取=>注册数据
+        $regData = Db::connect('db_data_report')->query("SELECT tdate, SUM('reg_total') reg_total FROM ( {$unionBaseTotalDaySql} ) AS all_base_total_day  GROUP BY tdate order by tdate ");
+
+
+        // 2. 活跃数据:$actData = 按照日期,获取每日的 活跃数 SUM(【active_total】) 活跃天数 【days】, 分组 【reg_date,days】,game_active_day_2025
+
+        $gameActiveDayTableNames = ToolLogic::getYearlyTableNames('game_active_day_', $params['reg_date'][0],$params['reg_date'][1]);
+
+        $gameActiveDaySqlParts = [];
+
+        foreach ($gameActiveDayTableNames as $tableName){
+            if (!preg_match('/^game_active_day_\\d{4}$/', $tableName)) {
+                continue;
+            }
+            $gameActiveDaySqlParts[] = "SELECT * FROM {$tableName} WHERE 1=1 {$whereSql}";
+        }
+
+        $unionGameActiveDaySql = implode(" UNION ALL ", $gameActiveDaySqlParts);
+
+        $actDataSql = "select reg_date as tdate, days, sum(active_total) as active from ({$unionGameActiveDaySql}) as all_game_active_day group by reg_date,days";
+        // 替换日期字段, 因为game_active_day_表的日期字段是[reg_date]
+        $actDataSql = str_replace("AND tdate", "AND reg_date", $actDataSql);
+
+        // 日期、活跃天数、活跃数,按日期和活跃天数分组
+        $actData = Db::connect('db_data_report')->query($actDataSql);
+
+        $tdate = date('Y-m-d');
+        $list = $totalData = [];
+        // 遍历每日的注册数
+        foreach($regData as $r){
+            // 如果当日没有注册的话,则跳过
+            if(!$r['reg_total']){
+                continue;
+            }
+            // 注册日期
+            $reg_date = $r['tdate'];
+            $list[$reg_date]['tdate'] = $reg_date;
+            // 注册数
+            $list[$reg_date]['reg'] = $r['reg_total'];
+
+            // 从注册日期 ($reg_date) 到当前日期的天数
+            $days = (strtotime($tdate)-strtotime($reg_date))/86400;
+            for($i=1;$i<=$days;$i++){
+                $dayKey  = 'd'.$i;
+                // d1...dn的reg = 记录按日的注册数
+                $totalData[$dayKey]['reg'] += $r['reg_total'];
+            }
+            $totalData['reg'] += $r['reg_total'];
+        }
+
+        // 遍历每日的活跃数
+        foreach($actData as $r){
+            // 注册日期
+            $reg_date = $r['tdate'];
+            // 如果日期,没有注册数/活跃数, 则跳过
+            if(!$list[$reg_date]['reg'] || !$r['active']){
+                continue;
+            }
+            // 如果活跃天数超过30天,并且活跃数不在[45,60,90,119,120]数组里面, 则跳过
+            if($r['days']>30 && !in_array($r['days'],[45,60,90,119,120])){
+                continue;
+            }
+            // 活跃天数的key
+            $dayKey  = 'd'.$r['days'];
+
+            // N日留存率 = 第N天活跃数 ÷ 注册日注册数 × 100%。
+            // $list['2025-07-23'][d1]['active']/$list['2025-07-23']['reg']
+            // $list['2025-07-23'][d2]['active']/$list['2025-07-23']['reg']
+            $list[$reg_date][$dayKey] = ToolLogic::getPercent($r['active'],$list[$reg_date]['reg']);
+            // d1...dn的reg = 记录按日的活跃数
+            $totalData[$dayKey]['active'] += $r['active'];
+        }
+
+        $total=[];
+        foreach($totalData as $key=>$val){
+            if($key == 'reg'){
+                $total['reg'] = $val;
+            } else {
+                $total[$key] = ToolLogic::getPercent($val['active'],$val['reg']);
+            }
+        }
+
+        $data = [
+            'data'  => array_values($list),
+            'totalRow' => $total,
+        ];
+        return $data;
+    }
+
+    // 渠道总览
+    public function getAgentDataList($where){
+        $params = $this->searchByAuth($where);
+
+        $filter = $params['filter'];
+        $group = $params['group'];
+        $type = '';
+
+        // 如果分组按照 游戏ID||游戏组
+        if($group===1 || $group==4){
+            $type = 'game_id';
+        }else{
+            $type = 'agent_id';
+        }
+
+        $whereSql = $this->generateWhereSql($params);
+
+        // 1.
+
+
+    }
+
+
+
+
     // 生成wheresql
     public function generateWhereSql($params){
-        print_r($params);
         $startDate = $params['reg_date'][0];
         $endDate = $params['reg_date'][1];
         $whereSql = "";
@@ -159,6 +284,7 @@ class channelAnalysisLogic extends BaseLogic
                 $whereSql .= " AND site_id = {$params['site_id']}";
             }
         }
+        // 负责人
         if(!empty($params['auth_id'])){
             if (is_array($params['auth_id'])) {
                 $whereSql .= " AND auth_id IN(" . implode(',', $params['auth_id']) . ")";
@@ -166,6 +292,7 @@ class channelAnalysisLogic extends BaseLogic
                 $whereSql .= " AND auth_id = {$params['auth_id']}";
             }
         }
+        // 注册日期
         if(!empty($params['reg_date'])){
             $whereSql .= " AND tdate BETWEEN '{$startDate}' AND '{$endDate}'";
         }