Просмотр исходного кода

Merge branch 'dev' of http://git.range8.cn/youyou/dms-api into dev

PC-202304251453\Administrator 5 месяцев назад
Родитель
Сommit
b41ae41919

+ 41 - 0
app/v1/controller/gameLog/AnalyseController.php

@@ -0,0 +1,41 @@
+<?php
+/**
+ * 运营分析
+ */
+namespace app\v1\controller\gameLog;
+use app\v1\logic\gameLog\AnalyseLogic;
+use plugin\saiadmin\basic\BaseController;
+use support\Request;
+use support\Response;
+class AnalyseController extends BaseController
+{
+    public function __construct()
+    {
+        $this->logic = new AnalyseLogic();
+        parent::__construct();
+    }
+
+    // 注册按日
+    public function getRegDayDataList(Request $request){
+        $where = $request->more([
+            ['game_id', ''],
+            ['reg_date', '']
+        ]);
+        $data = $this->logic->getRegDayDataList($where);
+        $data['data'] = $this->logic->trandformListColumn($data['data'],['game']);
+        return $this->success($data);
+    }
+
+    // 注册按时s
+    public function getRegHourDataList(Request $request){
+        $where = $request->more([
+            ['game_id', ''],
+            ['reg_date', '']
+        ]);
+        $data = $this->logic->getRegHourDataList($where);
+        $data['data'] = $this->logic->trandformListColumn($data['data'],['game']);
+        return $this->success($data);
+    }
+
+
+}

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

@@ -108,4 +108,19 @@ class channelAnalysisController extends BaseController
         $resultData = $this->logic->getLtvDataList($where);
         return $this->success($resultData);
     }
+
+    // ltvm
+    public function getLtvmDataList(Request $request){
+        $where = $request->more([
+            ['game_id', ''],
+            ['media_id', ''],
+            ['auth_id', ''],
+            ['agent_id', ''],
+            ['site_id', ''],
+            ['reg_date', ''],
+            ['data_type', '']
+        ]);
+        $resultData = $this->logic->getLtvmDataList($where);
+        return $this->success($resultData);
+    }
 }

+ 191 - 0
app/v1/logic/gameLog/AnalyseLogic.php

@@ -0,0 +1,191 @@
+<?php
+
+// 玩家日志逻
+
+namespace app\v1\logic\gameLog;
+
+use app\v1\logic\tool\ToolLogic;
+use plugin\saiadmin\basic\BaseLogic;
+use support\think\Db;
+
+class AnalyseLogic extends BaseLogic
+{
+
+    // 注册按日
+    public function getRegDayDataList($where){
+      $params = $this->searchByAuth($where);
+      $whereSql = $this->generateWhereSql($params);
+      $field = "SUM(reg_total) AS reg_total, tdate,game_id";
+      $baseData = $this->generateYearUnionList('base_total_day_',$where['reg_date'],$whereSql,$field,'game_id,tdate');
+
+
+      $data=[];
+      foreach($baseData as $row){
+        $tdate = $row['tdate'];
+        $game_id = $row['game_id'];
+        $data[$game_id][$tdate] = $row['reg_total'];
+        $data[$game_id]['total'] = !empty($data[$game_id]['total']) ? $data[$game_id]['total'] + $row['reg_total'] : $row['reg_total'];
+        $data[$game_id]['game_id'] = $game_id;
+      }
+
+      $list = array_values($data);
+ 
+      $totalRow = ['game_id'=>'合计'];
+      foreach($list as &$row){
+        $totalRow['total'] = !empty($totalRow['total']) ? $totalRow['total'] + $row['total'] : $row['total'];
+        foreach ($row as $key => $value) {
+          if($key == 'total' || $key == 'game_id'){
+            continue;
+          }
+          $totalRow[$key] = !empty($totalRow[$key]) ? $totalRow[$key] + $value : $value;
+        }
+      }
+
+      // 获取两个注册日期之间的日期列表
+      $dateList = ToolLogic::getDatesBetween($where['reg_date'][0],$where['reg_date'][1]);
+      $columnsData = [
+        [
+          'title' => '游戏ID',
+          'dataIndex' => 'game_id',
+          'width' => 120,
+        ],
+        [
+          'title' => '游戏',
+          'dataIndex' => 'game_name',
+          'width' => 120,
+        ],
+        [
+          'title' => '合计',
+          'dataIndex' => 'total',
+          'width' => 120,
+        ]
+      ];
+      foreach($dateList as $date){
+        $columnsData[] = [
+          'title' => $date,
+          'dataIndex' => $date,
+          'width' => 120,
+        ];
+      }
+
+      $result['data'] = $list;
+      $result['totalRow'] = $totalRow;
+      $result['columns'] = $columnsData;
+
+      return $result;
+    }
+
+    // 注册按时
+    public function getRegHourDataList($where){
+      $params = $this->searchByAuth($where);
+     
+      $field = "SUM(role_create_user) AS role_create_user, tdate,game_id,thour";
+      $regDate = $where['reg_date'];
+      // 将$regDate转化为年月格式,如202509
+      $ym = date('Ym', strtotime($regDate));
+
+      $tableName = 'base_total_hour_'.$ym;
+    
+      $whereSql = 'WHERE 1=1';
+      if(!empty($params['game_id'])){
+        $whereSql .= " AND game_id IN(" . implode(',', $params['game_id']) . ")";
+      }
+      if(!empty($params['reg_date'])){
+        $whereSql .= " AND tdate = '" .$params['reg_date']. "'";
+      }
+      $sql = "SELECT {$field} FROM {$tableName} {$whereSql}  GROUP BY game_id,thour,tdate";
+      $baseData = Db::connect('db_data_report')->query($sql);
+      $data = [];
+      foreach($baseData as &$row){
+        $game_id = $row['game_id'];
+        $thour = $row['thour'];
+        $data[$game_id]['h'.$thour] = $row['role_create_user'];
+        $data[$game_id]['total'] = !empty($data[$game_id]['total']) ? $data[$game_id]['total'] + $row['role_create_user'] : $row['role_create_user'];
+        $data[$game_id]['game_id'] = $game_id;
+      }
+
+      $list = array_values($data);
+
+      $totalRow = ['game_id'=>'合计'];
+      foreach($list as &$row){
+        $totalRow['total'] = !empty($totalRow['total']) ? $totalRow['total'] + $row['total'] : $row['total'];
+        foreach ($row as $key => $value) {
+          if($key == 'total' || $key == 'game_id'){
+            continue;
+          }
+          $totalRow[$key] = !empty($totalRow[$key]) ? $totalRow[$key] + $value : $value;
+        }
+      }
+
+      $result['data'] = $list;
+      $result['totalRow'] = $totalRow;
+      return $result;
+    }
+
+
+
+
+    // 生成基础日统计表的联合查询列表
+    public function generateYearUnionList($namePrefix, $regDate,$whereSql='',$field='*',$group=null){
+
+        $tableNames = ToolLogic::getYearlyTableNames($namePrefix, $regDate[0],$regDate[1]);
+        $sqlParts = [];
+        foreach ($tableNames as $tableName){
+            $sqlParts[] = "SELECT * FROM {$tableName} WHERE 1=1 {$whereSql}";
+        }
+        $unionSql = implode(" UNION ALL ", $sqlParts);
+        $finalSql = "
+            SELECT {$field} FROM ( {$unionSql} ) AS all_total_day
+        ";
+        if (!empty($group)) {
+            $finalSql .= " GROUP BY {$group}";
+        }
+        $baseData = Db::connect('db_data_report')->query($finalSql);
+        return $baseData;
+    }
+
+
+    // 生成wheresql
+    public function generateWhereSql($params){
+
+        $whereSql = "";
+        // 游戏id
+        if(!empty($params['game_id'])){
+            if (is_array($params['game_id'])) {
+                $whereSql .= " AND game_id IN(" . implode(',', $params['game_id']) . ")";
+            } else {
+                $whereSql .= " AND game_id = {$params['game_id']}";
+            }
+        }
+        // 媒体id
+        if(!empty($params['media_id'])){
+            $whereSql .= " AND media_id = {$params['media_id']}";
+        }
+        // 渠道id
+        if(!empty($params['agent_id'])){
+            $whereSql .= " AND agent_id = {$params['agent_id']}";
+        }
+        // 广告位id
+        if(!empty($params['site_id'])){
+            if (is_array($params['site_id'])) {
+                $whereSql .= " AND site_id IN(" . implode(',', $params['site_id']) . ")";
+            } else {
+                $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']) . ")";
+            } else {
+                $whereSql .= " AND auth_id = {$params['auth_id']}";
+            }
+        }
+        // 注册日期
+        if(!empty($params['reg_date'])??null){
+            $whereSql .= " AND tdate BETWEEN '{$params['reg_date'][0]}' AND '{$params['reg_date'][1]}'";
+        }
+
+        return $whereSql;
+    }
+}

+ 361 - 98
app/v1/logic/gameLog/ChannelAnalysisLogic.php

@@ -842,8 +842,6 @@ class channelAnalysisLogic extends BaseLogic
         // 2. 获取注册数
         $baseData = $this->generateYearUnionList('base_total_day_', $params['reg_date'], $whereSql, "SUM(reg_total) as reg_total, tdate", 'tdate');
         $baseData = array_column($baseData, null, 'tdate');
-
-        print_r($baseData);
      
         // 3. 获取注册付费金额
          $field  = "
@@ -851,193 +849,458 @@ class channelAnalysisLogic extends BaseLogic
             pay_date,
             SUM(pay_num) as pay_num,
             SUM(pay_total) as pay_total,
-            DATEDIFF(pay_date, reg_date) as day,
             SUM(addup_pay_num) AS addup_pay_num,
             SUM(addup_pay_total) AS addup_pay_total,
             SUM(addup_pay_amount) AS addup_pay_amount
         ";
         $regPayWhereSql = str_replace('AND tdate','AND reg_date',$whereSql);
-        $regPayData = $this->generateYearUnionList('game_reg_pay_day_', $params['reg_date'], $regPayWhereSql, $field, 'reg_date,day');
+        $regPayData = $this->generateYearUnionList('game_reg_pay_day_', $params['reg_date'], $regPayWhereSql, $field, 'reg_date,pay_date');
 
+        // 如果注册付费数据为空,则返回空数据给前端
        if(empty($regPayData)){
         return ['data'=>[],'totalRow'=>[]];
        }
-           
-        // 3. 获取日期列表(注册日期和今天之间的日期)
-        /**
-         * 计算ltv
-         * game_reg_pay_day_
-         * 
-         * 消耗金额、注册数、注册成本,按照注册日期,分组统计
-         * 
-         * 第一天: reg_date 注册时间(不变), reg_pay 1天总付费金额(addup_pay_total) / 消耗金额 * 100%
-         * 第二天: reg_date 注册时间(不变), reg_pay 2天总付费金额(addup_pay_total) / 消耗金额 * 100%
-         */
-
-        // 合计
+        // 前端合计数据
         $totalRow = [
             'tdate' => '合计'
         ];
+
+        // 前端data数据
+        $data = [];
+
+        $totalLtv=[];
+
+
+        // 合计 消耗金额,注册数,注册成本
+        foreach($baseData as $key=>$row){
+            $totalRow['cost'] = !empty($totalRow['cost']) ? ($totalRow['cost'] + $costData[$key]??0) : $costData[$key]??0;
+            $totalRow['d0']['cost'] = !empty($totalRow['cost']) ? ($totalRow['cost'] + $costData[$key]??0) : $costData[$key]??0;
+            $totalRow['reg_total'] = !empty($totalRow['reg_total']) ? ($totalRow['reg_total'] + $row['reg_total']??0) : $row['reg_total']??0;
+            $totalRow['d0']['reg_total'] = !empty($totalRow['reg_total']) ? ($totalRow['reg_total'] + $row['reg_total']??0) : $row['reg_total']??0;
+            $totalRow['reg_cost'] = ToolLogic::getRound($totalRow['cost']??0,$totalRow['reg_total']??0);
+           
+            $days = (strtotime($nowDate)-strtotime($key))/86400+1;
+            for($i=1;$i<=$days;$i++){
+                $daykey  = 'd'.$i;
+                $totalRow[$daykey]['reg_total'] = !empty($totalRow[$daykey]['reg_total']) ? ($totalRow[$daykey]['reg_total'] + $row['reg_total']??0) : $row['reg_total']??0;
+                $totalRow[$daykey]['cost'] = !empty($totalRow[$daykey]['cost']) ? ($totalRow[$daykey]['cost'] + $costData[$key]??0) : $costData[$key]??0;
+            }
+        }
+
+
+
         // 按照天计算LTV
         foreach($regPayData as &$row){
-            $data[$row['reg_date']]['tdate'] = $row['reg_date'];
-            // 计算相差
-            $daykey = (strtotime($row['pay_date'])-strtotime($row['reg_date']))/86400+1;
-            $daykey = 'd'.$daykey;
-           
+            $regDate = $row['reg_date'];
+            $data[$regDate]['tdate'] = $regDate;
+     
             // 注册数
-            $data[$row['reg_date']]['reg_total'] = $baseData[$row['reg_date']]['reg_total'] ?? 0;
+            $data[$regDate]['reg_total'] = $baseData[$regDate]['reg_total'] ?? 0;
+           
             // 注册成本
-            $data[$row['reg_date']]['reg_cost'] = ToolLogic::getRound($costData[$row['reg_date']]??0,$data[$row['reg_date']]['reg_total']??0);
+            $data[$regDate]['reg_cost'] = ToolLogic::getRound($costData[$regDate]??0,$data[$regDate]['reg_total']??0);
             // 消耗金额
-            $data[$row['reg_date']]['cost'] = $costData[$row['reg_date']]??0;
-          
+            $data[$regDate]['cost'] = $costData[$regDate]??0;
+            
+            // 计算日期相差天数
+            $daykey = (strtotime($row['pay_date'])-strtotime($regDate))/86400+1;
+            $daykey = 'd'.$daykey;
+           
 
             switch($dataType){
-
-                /* 不扣除分成/cost , 计算 */
                 case 'recovery':
-                // 按天回本率
-                $data[$row['reg_date']][$daykey] = ToolLogic::getPercent($row['addup_pay_total'],$costData[$row['reg_date']]??0,1);
-                // 累计回本率
+                $data[$regDate][$daykey] = ToolLogic::getPercent($row['addup_pay_total'],$costData[$regDate]??0,1);
                 if($nowDate === $row['pay_date']){
-                    $data[$row['reg_date']]['d0'] = ToolLogic::getPercent($row['addup_pay_total'],$costData[$row['reg_date']]??0,1);
-                    $totalRow['d0']['addup_pay_total'] = !empty($totalRow['d0']['addup_pay_total']) ? ($totalRow['d0']['addup_pay_total'] + $row['addup_pay_total']) : $row['addup_pay_total'];
+                    $data[$regDate]['d0'] = ToolLogic::getPercent($row['addup_pay_total'],$costData[$regDate]??0,1);
                 }
-                // $data[$row['reg_date']]['addup_pay_total'] = $row['addup_pay_total'];
-                // 合计的按日的注册总充值
-                $totalRow[$daykey]['addup_pay_total'] = !empty($totalRow[$daykey]['addup_pay_total']) ? ($totalRow[$daykey]['addup_pay_total'] + $row['addup_pay_total']??0) : $row['addup_pay_total']??0; 
                 break;
 
                 /* 扣除分成/cost , 计算 */
                 case 'remount':
                     // 按天回本率
-                    $data[$row['reg_date']][$daykey] = ToolLogic::getPercent($row['addup_pay_amount'],$costData[$row['reg_date']]??0,1);
+                    $data[$regDate][$daykey] = ToolLogic::getPercent($row['addup_pay_amount'],$costData[$regDate]??0,1);
                     // 累计回本率
                     if($nowDate === $row['pay_date']){
-                        $data[$row['reg_date']]['d0'] = ToolLogic::getPercent($row['addup_pay_amount'],$costData[$row['reg_date']]??0,1);
-                        $totalRow['d0']['addup_pay_amount'] = !empty($totalRow['d0']['addup_pay_amount']) ? ($totalRow['d0']['addup_pay_amount'] + $row['addup_pay_amount']) : $row['addup_pay_amount'];
+                        $data[$regDate]['d0'] = ToolLogic::getPercent($row['addup_pay_amount'],$costData[$regDate]??0,1);
                     }
-                    // $data[$row['reg_date']]['addup_pay_amount'] = $row['addup_pay_amount'];
-                    // 合计的按日的扣除分成(注册总充值)
-                    $totalRow[$daykey]['addup_pay_amount'] = !empty($totalRow[$daykey]['addup_pay_amount']) ? ($totalRow[$daykey]['addup_pay_amount'] + $row['addup_pay_amount']??0) : $row['addup_pay_amount']??0; 
                 break;
 
                 /*  累计计费付费金额 / 注册数 */
                 case 'ltv':
                     // 按天LTV
-                    $data[$row['reg_date']][$daykey] = ToolLogic::getRound($row['addup_pay_total'],$baseData[$row['reg_date']]['reg_total']??0,1);
+                    $data[$regDate][$daykey] = ToolLogic::getRound($row['addup_pay_total'],$baseData[$regDate]['reg_total']??0,1);
                     // 累计LTV
                     if($nowDate === $row['pay_date']){
-                        $data[$row['reg_date']]['d0'] = ToolLogic::getRound($row['addup_pay_total'],$baseData[$row['reg_date']]['reg_total']??0,1);
-                        $totalRow['d0']['addup_pay_total'] = !empty($totalRow['d0']['addup_pay_total']) ? ($totalRow['d0']['addup_pay_total'] + $row['addup_pay_total']) : $row['addup_pay_total'];
-                    }
-                    // $data[$row['reg_date']]['addup_pay_total'] = $row['addup_pay_total'];
-                    // 合计的按日的注册总充值
-                    $totalRow[$daykey]['addup_pay_total'] = !empty($totalRow[$daykey]['addup_pay_total']) ? ($totalRow[$daykey]['addup_pay_total'] + $row['addup_pay_total']??0) : $row['addup_pay_total']??0; 
+                        $data[$regDate]['d0'] = ToolLogic::getRound($row['addup_pay_total'],$baseData[$regDate]['reg_total']??0,1);
+                    } 
                 break;
 
                 /* 后面的LTV数据, 按天LTV / 第一天LTV , 目的是为了计算LTV增长率*/
                 case 'ltvbs':
-                     $data[$row['reg_date']][$daykey] = ToolLogic::getRound($row['addup_pay_total'],$baseData[$row['reg_date']]['reg_total']??0,1);
-                     $fz = $data[$row['reg_date']]['d1']!=0 ? $data[$row['reg_date']]['d1'] : 1;
-                     $data[$row['reg_date']][$daykey] = round($data[$row['reg_date']][$daykey] / $fz,2);
-
-                     if($nowDate === $row['pay_date']){
-                        $data[$row['reg_date']]['d0'] = round($data[$row['reg_date']][$daykey] / $fz,2);
-                        $totalRow['d0']['addup_pay_total'] = !empty($totalRow['d0']['addup_pay_total']) ? ($totalRow['d0']['addup_pay_total'] + $row['addup_pay_total']) : $row['addup_pay_total'];
-                    }
-                    $totalRow[$daykey]['addup_pay_total'] = !empty($totalRow[$daykey]['addup_pay_total']) ? ($totalRow[$daykey]['addup_pay_total'] + $row['addup_pay_total']??0) : $row['addup_pay_total']??0; 
-                
+                    $totalLtv[$daykey] = ToolLogic::getRound($row['addup_pay_total'],$baseData[$regDate]['reg_total']??0,1);
+                    $fz = $totalLtv['d1']??0!=0 ? $totalLtv['d1'] : 1;
+                    $data[$regDate][$daykey] = round($totalLtv[$daykey] / $fz, 2);
                 break;
 
                 /* 付费人数*/ 
                 case 'pay_num':
-                    $data[$row['reg_date']][$daykey] = $row['pay_num'];
+                    $data[$regDate][$daykey] = $row['pay_num'];
                     if($nowDate === $row['pay_date']){
-                        $data[$row['reg_date']]['d0'] = $row['addup_pay_num'];
-                        $totalRow['d0'] = !empty($totalRow['d0']) ? ($totalRow['d0'] + $row['addup_pay_num']) : $row['addup_pay_num'];
+                        $data[$regDate]['d0'] = $row['addup_pay_num'];
                     }
-                    $totalRow[$daykey] = !empty($totalRow[$daykey]['addup_pay_num']) ? ($totalRow[$daykey]['addup_pay_num'] + $row['pay_num']??0) : $row['pay_num']??0; 
-                     
                 break;
 
                 /* 付费总额 */
                 case 'pay_total':
-                    $data[$row['reg_date']][$daykey] = $row['pay_total'];
+                    $data[$regDate][$daykey] = $row['pay_total'];
                     if($nowDate === $row['pay_date']){
-                        $data[$row['reg_date']]['d0'] = $row['addup_pay_total'];
-                        $totalRow['d0'] = $row['addup_pay_total'];
+                        $data[$regDate]['d0'] = $row['addup_pay_total'];
                     }
-                    $totalRow[$daykey] = !empty($totalRow[$daykey]['addup_pay_total']) ? ($totalRow[$daykey]['addup_pay_total'] + $row['pay_total']??0) : $row['pay_total']??0; 
+                    
                 break;
 
                 /* 付费率 */
                 case 'pay_rate':
-                    $data[$row['reg_date']][$daykey] = ToolLogic::getPercent($row['pay_num'],$baseData[$row['reg_date']]['reg_total']??0);
+                    $data[$regDate][$daykey] = ToolLogic::getPercent($row['pay_num'],$baseData[$regDate]['reg_total']);
                     if($nowDate === $row['pay_date']){
-                        $data[$row['reg_date']]['d0'] = ToolLogic::getPercent($row['addup_pay_num'],$baseData[$row['reg_date']]['reg_total']??0);
+                        $data[$regDate]['d0'] = ToolLogic::getPercent($row['addup_pay_num'],$baseData[$regDate]['reg_total']);
                     }
-                    $totalRow[$daykey] = !empty($totalRow[$daykey]['addup_pay_num']) ? ($totalRow[$daykey]['addup_pay_num'] + $row['pay_num']??0) : $row['pay_num']??0; 
                 break;
 
                 /* 付费ARPU */
                 case 'arpu':
-                    $data[$row['reg_date']][$daykey] = ToolLogic::getRound($row['pay_total'],$row['pay_num']);
-
+                    $data[$regDate][$daykey] = ToolLogic::getRound($row['pay_total'],$row['pay_num']);
                     if($nowDate === $row['pay_date']){
-                        $data[$row['reg_date']]['d0'] = ToolLogic::getRound($row['addup_pay_total'],$row['addup_pay_num']);
-                        $totalRow['d0']['addup_pay_total'] = $row['addup_pay_total'];
-                        $totalRow['d0']['addup_pay_num'] = $row['addup_pay_num'];
+                        $data[$regDate]['d0'] = ToolLogic::getRound($row['addup_pay_total'],$row['addup_pay_num']);
                     }
-                    $totalRow[$daykey]['addup_pay_total'] = !empty($totalRow[$daykey]['addup_pay_total']) ? ($totalRow[$daykey]['addup_pay_total'] + $row['pay_total']??0) : $row['pay_total']??0; 
-                    $totalRow[$daykey]['addup_pay_num'] = !empty($totalRow[$daykey]['addup_pay_num']) ? ($totalRow[$daykey]['addup_pay_num'] + $row['pay_num']??0) : $row['pay_num']??0; 
-                    break;
+                break;
+                default:
+                    continue 2;
+                break;
             }
-        }
+            $totalRow[$daykey]['addup_pay_total'] = $totalRow[$daykey]['addup_pay_total'] ?? 0;
+            $totalRow[$daykey]['addup_pay_amount'] = $totalRow[$daykey]['addup_pay_amount'] ?? 0;
+            $totalRow[$daykey]['pay_num'] = $totalRow[$daykey]['pay_num'] ?? 0;
+            $totalRow[$daykey]['pay_total'] = $totalRow[$daykey]['pay_total'] ?? 0;
 
-        foreach($data as $key=>&$row){
-            // 合计注册数
-            $totalRow['reg_total'] = !empty($totalRow['reg_total']) ? ($totalRow['reg_total'] + $baseData[$row['tdate']]['reg_total'] ?? 0) : $baseData[$row['tdate']]['reg_total'] ?? 0;
-           
-            // 合计消耗金额
-            $totalRow['cost'] = !empty($totalRow['cost']) ? ($totalRow['cost'] + $row['cost']??0) : $row['cost']??0;
+            $totalRow[$daykey]['addup_pay_total'] = !empty($totalRow[$daykey]['addup_pay_total']) ? $totalRow[$daykey]['addup_pay_total'] + $row['addup_pay_total'] : $row['addup_pay_total'];
+            $totalRow[$daykey]['addup_pay_amount'] = !empty($totalRow[$daykey]['addup_pay_amount']) ? $totalRow[$daykey]['addup_pay_amount'] + $row['addup_pay_amount'] : $row['addup_pay_amount'];
+            $totalRow[$daykey]['pay_num'] = !empty($totalRow[$daykey]['pay_num']) ? $totalRow[$daykey]['pay_num'] + $row['pay_num'] : $row['pay_num'];
+            $totalRow[$daykey]['pay_total'] = !empty($totalRow[$daykey]['pay_total']) ? $totalRow[$daykey]['pay_total'] + $row['pay_total'] : $row['pay_total'];
 
-            // 合计注册成本
-            $totalRow['reg_cost'] = ToolLogic::getRound($totalRow['cost']??0,$totalRow['reg_total']??0);
-     
+
+            if($row['pay_date'] == $regDate){
+                $pay_total = !empty($pay_total) ? $pay_total + $row['addup_pay_total'] : $row['addup_pay_total'];
+                $pay_amount = !empty($pay_amount) ? $pay_amount + $row['addup_pay_amount'] : $row['addup_pay_amount'];
+                $pay_num = !empty($pay_num) ? $pay_num + $row['pay_num'] : $row['pay_num'];
+            }
+            
+           
         }
+
         foreach($totalRow as $key=>&$row){
              if($key[0]==='d'){
                 switch($dataType){
                     case 'recovery':
-                        $totalRow[$key] = ToolLogic::getPercent($totalRow[$key]['addup_pay_total'],$totalRow['cost']??0,1);
+                        $totalRow[$key] = ToolLogic::getPercent($totalRow[$key]['addup_pay_total']??0,$totalRow[$key]['cost']??0,1);
                     break;
                     case 'remount':
-                        $totalRow[$key] = ToolLogic::getPercent($totalRow[$key]['addup_pay_amount'],$totalRow['cost']??0,1);
+                        $totalRow[$key] = ToolLogic::getPercent($totalRow[$key]['addup_pay_amount']??0,$totalRow[$key]['cost']??0,1);
                     break;
                     case 'ltv':
-                        $totalRow[$key] = ToolLogic::getRound($totalRow[$key]['addup_pay_total'],$totalRow['reg_total']??0);
+                        $totalRow[$key] = ToolLogic::getRound($totalRow[$key]['addup_pay_total']??0,$totalRow[$key]['reg_total']??0);
                     break;
                     case 'ltvbs':
-                        $totalRow[$key] = ToolLogic::getRound($totalRow[$key]['addup_pay_total'],$totalRow['reg_total']??0);
-                        $fz = $totalRow['d1']??0!=0 ? $totalRow['d1'] : 1;
-                        $totalRow[$key] = round($totalRow[$key] / $fz,2); // 增长率
+                        $totalLtv[$key] = ToolLogic::getRound($totalRow[$key]['addup_pay_total']??0,$totalRow[$key]['reg_total']??0);
+                        $fz = $totalLtv['d1']??0!=0 ? $totalLtv['d1'] : 1;
+                        $totalRow[$key] = round($totalLtv[$key] / $fz, 2);
+
+                    break;
+                    case 'pay_num':
+                        $totalRow[$key] = $totalRow[$key]['pay_num']??0;
+                    break;
+                    case 'pay_total':
+                        $totalRow[$key] = $totalRow[$key]['pay_total']??0;
                     break;
                     case 'pay_rate':
-                        $totalRow[$key] = ToolLogic::getPercent($totalRow[$key]['addup_pay_num'],$totalRow['reg_total']??0);
+                        $totalRow[$key] = ToolLogic::getPercent($totalRow[$key]['pay_num']??0,$totalRow[$key]['reg_total']??0);
                     break;
                     case 'arpu':
-                        $totalRow[$key] = ToolLogic::getRound($totalRow[$key]['addup_pay_total'],$totalRow['addup_pay_num']??0);
+                        $totalRow[$key] = ToolLogic::getRound($totalRow[$key]['pay_total']??0,$totalRow[$key]['pay_num']??0);
                     break;
                 }
             }
         }
 
+        if($data && $totalRow){
+                switch($dataType){
+                    case 'recovery':
+                        $totalRow['d0'] = ToolLogic::getPercent($pay_total,$totalRow['cost'],1);
+                    break;
+                    case 'remount':
+                        $totalRow['d0'] = ToolLogic::getPercent($pay_amount,$totalRow['cost'],1);
+                    break;
+                    case 'ltv':
+                        $totalRow['d0'] = ToolLogic::getRound($pay_total,$totalRow['reg_total']);
+                    break;
+                    case 'ltvbs':
+                        $totalLtv['d0'] = ToolLogic::getRound($pay_total,$totalRow['reg_total']);
+                        $fz = $totalLtv['d1']??0!=0 ? $totalLtv['d1'] : 1;
+                        $totalRow['d0'] = round($totalLtv['d0']/$fz, 2);
+                        break;
+                    case 'pay_num':
+                        $totalRow['d0'] = $pay_num;
+                    break;
+                    case 'pay_total':
+                        $totalRow['d0'] = $pay_total;
+                    break;
+                    case 'pay_rate':
+                        $totalRow['d0'] = ToolLogic::getPercent($pay_num,$totalRow['reg_total']);
+                    break;
+                    case 'arpu':
+                        $totalRow['d0'] = ToolLogic::getRound($pay_total,$pay_num);
+                    break;
+                    default:
+                    break;
+                }
+                $totalRow['reg_cost'] = ToolLogic::getRound($totalRow['cost'],$totalRow['reg_total']);
+                $list = ToolLogic::arrSort($data,'tdate','asc');
+            }
+        return [
+            'data' =>array_values( $list),
+            'totalRow' => $totalRow
+        ];
+        
         
+    }
+
+    /**
+     * ltv按月
+     */
+    public function getLtvmDataList($where){
+        $params = $this->searchByAuth($where);
+        // 展示类型
+        $dataType = $params['data_type'] ?? 'recovery';
+        $nowDate = date("Y-m");
+        $whereSql = $this->generateWhereSql($params);
+
+        // 1. 获取消耗金额
 
+        // 2. 获取注册数
+         $totalBaseWhereSql = str_replace('AND tdate','AND tmonth',$whereSql);
+        $baseData = Db::connect('db_data_report')->query("SELECT tmonth,SUM(cost) as cost,SUM(reg_total) as reg_total FROM game_total_month WHERE 1=1 $totalBaseWhereSql GROUP BY tmonth");
+        $baseData = array_column($baseData, null, 'tmonth');
+
+     
+        // 3. 获取注册付费金额
+         $field  = "
+            reg_month,
+            pay_month,
+            SUM(pay_num) as pay_num,
+            SUM(pay_total) as pay_total,
+            SUM(addup_pay_num) AS addup_pay_num,
+            SUM(addup_pay_total) AS addup_pay_total,
+            SUM(addup_pay_amount) AS addup_pay_amount
+        ";
+        $regPayWhereSql = str_replace('AND tdate','AND reg_month',$whereSql);
+        $regPayData = Db::connect('db_data_report')->query("SELECT $field FROM game_reg_pay_month WHERE 1=1 $regPayWhereSql GROUP BY reg_month,pay_month");
+
+        // 如果注册付费数据为空,则返回空数据给前端
+       if(empty($regPayData)){
+        return ['data'=>[],'totalRow'=>[]];
+       }
+        // 前端合计数据
+        $totalRow = [
+            'tmonth' => '合计'
+        ];
+
+        // 前端data数据
+        $data = [];
+
+         $pay_total = 0;
+         $pay_amount = 0;
+         $pay_num = 0;
+
+
+        // 合计 消耗金额,注册数,注册成本
+        foreach($baseData as $key=>$row){
+            $totalRow['cost'] = !empty($totalRow['cost']) ? round($totalRow['cost'] + $row['cost']??0,2) : $row['cost']??0;
+            $totalRow['reg_total'] = !empty($totalRow['reg_total']) ? ($totalRow['reg_total'] + $row['reg_total']??0) : $row['reg_total']??0;
+            $totalRow['reg_cost'] = ToolLogic::getRound($totalRow['cost']??0,$totalRow['reg_total']??0);
+           
+            $days = ToolLogic::getMonthNum($key,$nowDate);
+            for($i=1;$i<=$days;$i++){
+                $daykey  = 'm'.($i+1);
+                $totalRow[$daykey]['reg_total'] = !empty($totalRow[$daykey]['reg_total']) ? ($totalRow[$daykey]['reg_total'] + $row['reg_total']??0) : $row['reg_total']??0;
+                $totalRow[$daykey]['cost'] = !empty($totalRow[$daykey]['cost']) ? ($totalRow[$daykey]['cost'] + $row['cost']??0) : $row['cost']??0;
+            }
+        }
+
+print_r($regPayData);
+
+        // 按照天计算LTV
+        foreach($regPayData as &$row){
+            $regDate = $row['reg_month'];
+            
+            $data[$regDate]['tmonth'] = $regDate;
+     
+            // 注册数
+            $data[$regDate]['reg_total'] = $baseData[$regDate]['reg_total'] ?? 0;
+           
+            // 注册成本
+            $data[$regDate]['reg_cost'] = ToolLogic::getRound($baseData[$regDate]['cost']??0,$data[$regDate]['reg_total']??0);
+            // 消耗金额
+            $data[$regDate]['cost'] = $baseData[$regDate]['cost']??0;
+            
+            // 计算日期相差天数
+            // $daykey = (strtotime($row['pay_month'])-strtotime($regDate))/86400+1;
+            $daykey = 'm'.(ToolLogic::getMonthNum($regDate,$row['pay_month'])+1);
+           
+
+            switch($dataType){
+                case 'recovery':
+                $data[$regDate][$daykey] = ToolLogic::getPercent($row['addup_pay_total'],$baseData[$regDate]['cost']??0,1);
+                if($nowDate === $row['pay_month']){
+                    $data[$regDate]['m0'] = ToolLogic::getPercent($row['addup_pay_total'],$baseData[$regDate]['cost']??0,1);
+                }
+                break;
+
+                /* 扣除分成/cost , 计算 */
+                case 'remount':
+                    // 按天回本率
+                    $data[$regDate][$daykey] = ToolLogic::getPercent($row['addup_pay_amount'],$baseData[$regDate]['cost']??0,1);
+                    // 累计回本率
+                    if($nowDate === $row['pay_month']){
+                        $data[$regDate]['m0'] = ToolLogic::getPercent($row['addup_pay_amount'],$baseData[$regDate]['cost']??0,1);
+                    }
+                break;
+
+                /*  累计计费付费金额 / 注册数 */
+                case 'ltv':
+                    // 按天LTV
+                    $data[$regDate][$daykey] = ToolLogic::getRound($row['addup_pay_total'],$baseData[$regDate]['reg_total']??0,1);
+                    // 累计LTV
+                    if($nowDate === $row['pay_month']){
+                        $data[$regDate]['m0'] = ToolLogic::getRound($row['addup_pay_total'],$baseData[$regDate]['reg_total']??0,1);
+                    } 
+                break;
+
+                /* 付费人数*/ 
+                case 'pay_num':
+                    $data[$regDate][$daykey] = $row['pay_num'];
+                    if($nowDate === $row['pay_month']){
+                        $data[$regDate]['m0'] = $row['addup_pay_num'];
+                    }
+                break;
+
+                /* 付费总额 */
+                case 'pay_total':
+                    $data[$regDate][$daykey] = $row['pay_total'];
+                    if($nowDate === $row['pay_month']){
+                        $data[$regDate]['m0'] = $row['addup_pay_total'];
+                    }
+                    
+                break;
+
+                /* 付费率 */
+                case 'pay_rate':
+                    $data[$regDate][$daykey] = ToolLogic::getPercent($row['pay_num'],$baseData[$regDate]['reg_total']);
+                    if($nowDate === $row['pay_month']){
+                        $data[$regDate]['m0'] = ToolLogic::getPercent($row['addup_pay_num'],$baseData[$regDate]['reg_total']);
+                    }
+                break;
+
+                /* 付费ARPU */
+                case 'arpu':
+                    $data[$regDate][$daykey] = ToolLogic::getRound($row['pay_total'],$row['pay_num']);
+                    if($nowDate === $row['pay_month']){
+                        $data[$regDate]['m0'] = ToolLogic::getRound($row['addup_pay_total'],$row['addup_pay_num']);
+                    }
+                break;
+                default:
+                    continue 2;
+                break;
+            }
+            $totalRow[$daykey]['addup_pay_total'] = $totalRow[$daykey]['addup_pay_total'] ?? 0;
+            $totalRow[$daykey]['addup_pay_amount'] = $totalRow[$daykey]['addup_pay_amount'] ?? 0;
+            $totalRow[$daykey]['pay_num'] = $totalRow[$daykey]['pay_num'] ?? 0;
+            $totalRow[$daykey]['pay_total'] = $totalRow[$daykey]['pay_total'] ?? 0;
+
+            $totalRow[$daykey]['addup_pay_total'] = !empty($totalRow[$daykey]['addup_pay_total']) ? $totalRow[$daykey]['addup_pay_total'] + $row['addup_pay_total'] : $row['addup_pay_total'];
+            $totalRow[$daykey]['addup_pay_amount'] = !empty($totalRow[$daykey]['addup_pay_amount']) ? $totalRow[$daykey]['addup_pay_amount'] + $row['addup_pay_amount'] : $row['addup_pay_amount'];
+            $totalRow[$daykey]['pay_num'] = !empty($totalRow[$daykey]['pay_num']) ? $totalRow[$daykey]['pay_num'] + $row['pay_num'] : $row['pay_num'];
+            $totalRow[$daykey]['pay_total'] = !empty($totalRow[$daykey]['pay_total']) ? $totalRow[$daykey]['pay_total'] + $row['pay_total'] : $row['pay_total'];
+
+
+            if($row['pay_month'] == $regDate){
+                $pay_total = !empty($pay_total) ? $pay_total + $row['addup_pay_total'] : $row['addup_pay_total'];
+                $pay_amount = !empty($pay_amount) ? $pay_amount + $row['addup_pay_amount'] : $row['addup_pay_amount'];
+                $pay_num = !empty($pay_num) ? $pay_num + $row['pay_num'] : $row['pay_num'];
+            }
+            
+           
+        }
+
+        foreach($totalRow as $key=>&$row){
+             if($key[0]==='m'){
+                switch($dataType){
+                    case 'recovery':
+                        $totalRow[$key] = ToolLogic::getPercent($totalRow[$key]['addup_pay_total']??0,$totalRow[$key]['cost']??0,1);
+                    break;
+                    case 'remount':
+                        $totalRow[$key] = ToolLogic::getPercent($totalRow[$key]['addup_pay_amount']??0,$totalRow[$key]['cost']??0,1);
+                    break;
+                    case 'ltv':
+                        $totalRow[$key] = ToolLogic::getRound($totalRow[$key]['addup_pay_total']??0,$totalRow[$key]['reg_total']??0);
+                    break;
+                    case 'pay_num':
+                        $totalRow[$key] = $totalRow[$key]['pay_num']??0;
+                    break;
+                    case 'pay_total':
+                        $totalRow[$key] = $totalRow[$key]['pay_total']??0;
+                    break;
+                    case 'pay_rate':
+                        $totalRow[$key] = ToolLogic::getPercent($totalRow[$key]['pay_num']??0,$totalRow[$key]['reg_total']??0);
+                    break;
+                    case 'arpu':
+                        $totalRow[$key] = ToolLogic::getRound($totalRow[$key]['pay_total']??0,$totalRow[$key]['pay_num']??0);
+                    break;
+                }
+            }
+        }
+
+        if($data && $totalRow){
+                switch($dataType){
+                    case 'recovery':
+                        $totalRow['m0'] = ToolLogic::getPercent($pay_total,$totalRow['cost'],1);
+                    break;
+                    case 'remount':
+                        $totalRow['m0'] = ToolLogic::getPercent($pay_amount,$totalRow['cost'],1);
+                    break;
+                    case 'ltv':
+                        $totalRow['m0'] = ToolLogic::getRound($pay_total,$totalRow['reg_total']);
+                    break;
+                
+                    case 'pay_num':
+                        $totalRow['m0'] = $pay_num;
+                    break;
+                    case 'pay_total':
+                        $totalRow['m0'] = $pay_total;
+                    break;
+                    case 'pay_rate':
+                        $totalRow['m0'] = ToolLogic::getPercent($pay_num,$totalRow['reg_total']);
+                    break;
+                    case 'arpu':
+                        $totalRow['m0'] = ToolLogic::getRound($pay_total,$pay_num);
+                    break;
+                    default:
+                    break;
+                }
+                $totalRow['reg_cost'] = ToolLogic::getRound($totalRow['cost'],$totalRow['reg_total']);
+                $list = ToolLogic::arrSort($data,'tmonth','asc');
+            }
         return [
-            'data' =>array_values($data),
+            'data' =>array_values( $list),
             'totalRow' => $totalRow
         ];
         

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

@@ -95,6 +95,17 @@ class ToolLogic
         return $dates;
     }
 
+       /**
+     * 获取月份差
+     */
+    public static function getMonthNum($sdate,$edate){
+        if($sdate > $edate){
+            return 0;
+        }
+        list($y1,$m1)=explode("-",date('Y-m',strtotime($sdate)));
+        list($y2,$m2)=explode("-",date('Y-m',strtotime($edate)));
+        return abs(($y2-$y1)*12 + $m2-$m1);
+    }
 
 
 }