ith5 5 kuukautta sitten
vanhempi
commit
cbceea617c

+ 12 - 1
app/v1/controller/gameLog/AnalyseController.php

@@ -84,5 +84,16 @@ class AnalyseController extends BaseController
         return $this->success($data);
     }
 
-
+    // 付费留存
+    public function getPayRetention(Request $request){
+        $where = $request->more([
+            ['game_id', ''],
+            ['reg_date', ''],
+            ['auth_id', ''],
+            ['media_id', ''],
+            ['show_type', '1']
+        ]);
+        $data = $this->logic->getPayRetention($where);
+        return $this->success($data);
+    }
 }

+ 129 - 1
app/v1/logic/gameLog/AnalyseLogic.php

@@ -6,6 +6,7 @@ namespace app\v1\logic\gameLog;
 
 use app\v1\logic\tool\ToolLogic;
 use plugin\saiadmin\basic\BaseLogic;
+use plugin\saiadmin\exception\ApiException;
 use support\think\Db;
 
 class AnalyseLogic extends BaseLogic
@@ -478,7 +479,8 @@ class AnalyseLogic extends BaseLogic
       $totalRow['pay_increase_week'] = $totalRow['pay_total'] - $totalRow['week_pay_total']; // 7天增长
 
       foreach($data as &$row){
-        $data['pay_ratio'] = ToolLogic::getPercent($row['pay_total'],$allTotal); // 今日充值占比
+        
+        $row['pay_ratio'] = ToolLogic::getPercent($row['pay_total'],$allTotal); // 今日充值占比
         $row['pay_increase_yestoday'] = $row['pay_total'] - $row['yestoday_pay_total']; // 昨日增长
         $row['pay_increase_week'] = $row['pay_total'] - $row['week_pay_total']; // 7天增长
       }
@@ -490,6 +492,132 @@ class AnalyseLogic extends BaseLogic
       ];
     }
 
+    /**
+     * 付费留存
+     * 1. 登录日志表:sdk_login_log_, 查找符合注册时间的用户, 获取用户id
+     * 
+     * inner join  ON login.uid = order.uid, 
+     * 
+     * 2. 根据用户id,去订单表,筛选出,次留、2留的日期为充值日期, 从而获取充值人数
+     * 3. 根据注册时间,获取总的pay_num
+     */
+    public function getPayRetention($where){
+      $params = $this->searchByAuth($where);
+      // $whereSql = $this->generateWhereSql($params);
+      // 判断不能超过90天查询
+      $days = ToolLogic::getDays($where['reg_date'][0],$where['reg_date'][1]);
+      if($days > 90){
+          throw new ApiException('时间查询范围请勿超过90天'); 
+      }
+      $whereRaw = '1=1';
+      if(!empty($params['game_id'])){
+        $whereRaw .= " AND game_id IN(".implode(',',$params['game_id']).")";
+      }
+      if(!empty($params['media_id'])){
+        $whereRaw .= " AND media_id = ({$params['media_id']})";
+      }
+      if(!empty($params['agent_id'])){
+        $whereRaw .= " AND agent_id IN(".implode(',',$params['agent_id']).")";
+      }
+
+
+      // 1. 根据注册时间,获取注册付费人数
+      $payData = Db::connect('db_game_log')->query("
+        SELECT 
+          SUBSTRING(reg_date,1,10) as dimension,  -- 注册日期
+          COUNT(DISTINCT uid) as pay_num  -- 注册付费人数
+        FROM sdk_order_success
+          WHERE {$whereRaw} AND reg_date BETWEEN '{$params['reg_date'][0]} 00:00:00' AND '{$params['reg_date'][1]} 23:59:59'
+            GROUP BY 
+              dimension
+      ");
+      $payDataMap = array_column($payData,null,'dimension');
+
+      // 2. 计算留存付费的人数
+      $sqlArr = [];
+      $medate = date("Y-m-d", strtotime( "+ 60 day", strtotime($params['reg_date'][1])));
+       $tableNames = ToolLogic::getMonthlyTableNames('sdk_login_log_', $params['reg_date'][0], $medate);
+       foreach($tableNames as $tableName){
+        $sqlArr[] = "
+          SELECT  
+            CONCAT(FROM_UNIXTIME(reg_time, '%Y-%m-%d'), '|', TIMESTAMPDIFF(DAY, FROM_UNIXTIME(reg_time), FROM_UNIXTIME(login_time))) AS dimension, -- 注册日期|留存天数
+            FROM_UNIXTIME(reg_time, '%Y-%m-%d') AS reg_date, -- 注册日期
+            TIMESTAMPDIFF(DAY, FROM_UNIXTIME(reg_time), FROM_UNIXTIME(login_time)) AS day_num, -- 留存天数
+            COUNT(DISTINCT a.user_name) AS remain_num -- 留存人数
+          FROM {$tableName} AS a
+            INNER JOIN (
+              SELECT 
+                DISTINCT user_name
+              FROM sdk_order_success
+               WHERE 
+                {$whereRaw} AND reg_date BETWEEN '{$params['reg_date'][0]} 00:00:00' AND '{$params['reg_date'][1]} 23:59:59'
+            )  AS b ON a.user_name = b.user_name
+           WHERE
+              {$whereRaw} AND reg_time BETWEEN ".strtotime($params['reg_date'][0]." 00:00:00")." AND ".strtotime($params['reg_date'][1]." 23:59:59")."
+          GROUP BY dimension
+        ";
+       }
+
+      $sql = implode(" UNION ALL ", $sqlArr);
+
+
+      $remainData = Db::connect('db_game_log')->query($sql);
+      $remainData = $remainData ? array_column($remainData, null, "dimension") : [];
+
+      $regDateRange = ToolLogic::getDatesBetween($params['reg_date'][0],$params['reg_date'][1]);
+      $remainRange = [];
+      for ($i=2; $i<=30; $i++){
+          $remainRange[] = $i;
+      }
+      $remainRange = array_merge($remainRange, [35,40,45,50,55,60]);
+      $data = [];
+      foreach ($regDateRange as $regDate){
+          $row['reg_date']    = $regDate;
+          $row['reg_pay_num'] = $payDataMap[$regDate]['pay_num'] ?? 0;
+          foreach ($remainRange as $remainNum){
+              $dimension = $regDate . "|" . ($remainNum-1);
+              $row['remain_' . $remainNum] = $remainData[$dimension]['remain_num'] ?? 0;
+          }
+          $data[] = $row;
+      }
+
+
+      // 合计
+      $totalRow = [
+        'reg_date' => '合计',
+      ];
+
+      // 计算合计
+      if($data) foreach ($data as $item){
+        
+          $totalRow['reg_pay_num'] = $totalRow['reg_pay_num'] ?? 0;
+          $totalRow['reg_pay_num'] += $item['reg_pay_num'];
+
+          foreach ($remainRange as $remainNum){
+              $key = 'remain_'.$remainNum;
+
+              $totalRow[$key] = $totalRow[$key] ?? 0;
+              $totalRow[$key] += $item[$key];
+          }
+      }
+
+      // 计算比率
+      if ($params['show_type'] == 'rate') {
+        if($data) foreach ($remainRange as $remainNum) {
+            $key         = 'remain_' . $remainNum;
+            $totalRow[$key] = ToolLogic::getPercent($totalRow[$key], $totalRow['reg_pay_num']);
+            foreach ($data as &$val) {
+                $val[$key] = ToolLogic::getPercent($val[$key], $val['reg_pay_num']);
+            }
+        }
+      }
+
+      return [
+        'data' => $data,
+        'totalRow' => $totalRow
+      ];
+    }
+
     // 生成基础日统计表的联合查询列表
     public function generateYearUnionList($namePrefix, $regDate,$whereSql='',$field='*',$group=null){
 

+ 10 - 0
app/v1/logic/tool/ToolLogic.php

@@ -107,5 +107,15 @@ class ToolLogic
         return abs(($y2-$y1)*12 + $m2-$m1);
     }
 
+    /**
+     * 获取两个日期之间的天数
+     */
+    public static function getDays($sdate,$edate){
+        $days = (strtotime($edate) - strtotime($sdate)) / 86400;
+        return $days;
+    }
+
+    
+
 
 }