浏览代码

数据图表

ith5 5 月之前
父节点
当前提交
2a9b0c7746
共有 2 个文件被更改,包括 255 次插入1 次删除
  1. 14 0
      app/v1/controller/gameLog/AnalyseController.php
  2. 241 1
      app/v1/logic/gameLog/AnalyseLogic.php

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

@@ -96,4 +96,18 @@ class AnalyseController extends BaseController
         $data = $this->logic->getPayRetention($where);
         return $this->success($data);
     }
+
+    // 图表数据
+    public function getChartData(Request $request){
+        $where = $request->more([
+            ['game_id', ''],
+            ['compare_date1', ''],
+            ['compare_date2', ''],
+            ['compare_date1_date', ''],
+            ['compare_date2_date', ''],
+            ['compare_type', 'day']
+        ]);
+        $data = $this->logic->getChartData($where);
+        return $this->success($data);
+    }
 }

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

@@ -618,6 +618,222 @@ class AnalyseLogic extends BaseLogic
       ];
     }
 
+    // 图表数据
+    public function getChartData($where){
+      $params = $this->searchByAuth($where);
+      $type = $params['compare_type']??'day';
+
+       // 如果按照天对比
+      if($type === 'day'){
+        $data1 = [];
+        $data2 = [];
+        $data1Res = [];
+        $data2Res = [];
+        
+        $field = "
+          SUM(reg_total) as reg, -- 注册人数
+          SUM(old_login_total) as login, -- 老用户登陆人数
+          SUM(pay_total) as pay, -- 付费金额
+          tdate
+        ";
+
+       // 获取对比日期1的数据, 注册、登录、充值
+        $params['reg_date'] = $params['compare_date1'];
+        $whereSql1 = $this->generateWhereSql($params);
+        
+        $baseData1 = $this->generateYearUnionList('base_total_day_',$params['compare_date1'],$whereSql1,$field,'tdate');
+        
+        foreach($baseData1 as $item){
+            $data1Res[$item['tdate']]['reg'] = $item['reg'];
+            $data1Res[$item['tdate']]['pay'] = $item['pay'];
+            $data1Res[$item['tdate']]['login'] = $item['login'];
+        }
+
+        
+        // 获取对比日期2的数据, 注册、登录、充值
+        $params['reg_date'] = $params['compare_date2'];
+        $whereSql2 = $this->generateWhereSql($params);
+        $baseData2 = $this->generateYearUnionList('base_total_day_',$params['compare_date2'],$whereSql2,$field,'tdate');
+
+
+         foreach($baseData2 as $item){
+            $data2Res[$item['tdate']]['reg'] = $item['reg'];
+            $data2Res[$item['tdate']]['pay'] = $item['pay'];
+            $data2Res[$item['tdate']]['login'] = $item['login'];
+        }
+
+
+
+        // 获取消耗数据1
+        $params['reg_date'] = $params['compare_date1'];
+        $costWhereSql1 = $this->generateWhereSql($params);
+        echo $costWhereSql1;
+        $costData1 = Db::connect('db_advert')->query("
+          SELECT SUM(money) as money, tdate
+          FROM media_cost
+          WHERE 1=1 {$costWhereSql1}
+          GROUP BY tdate
+        ");
+
+        foreach($costData1 as $item){
+            $data1Res[$item['tdate']]['cost'] = $item['money'];
+        }
+
+        
+        // 获取消耗数据2
+        $params['reg_date'] = $params['compare_date2'];
+        $costWhereSql2 = $this->generateWhereSql($params);
+        $costData2 = Db::connect('db_advert')->query("
+          SELECT SUM(money) as money, tdate
+          FROM media_cost
+          WHERE 1=1 {$costWhereSql2}
+          GROUP BY tdate
+        ");
+
+        foreach($costData2 as $item){
+            $data2Res[$item['tdate']]['cost'] = $item['money'];
+        }
+
+
+
+        // 获取两个日期之间的所有日期
+        $day1Date = ToolLogic::getDatesBetween($params['compare_date1'][0],$params['compare_date1'][1]);
+        $day2Date = ToolLogic::getDatesBetween($params['compare_date2'][0],$params['compare_date2'][1]);
+
+       
+        foreach($day1Date as $k=>$d){
+         
+          $data1['days'][$k] = $d;
+          
+          $data1['pay'][$k]  = !empty($data1Res[$d]['pay']) ? round((float)$data1Res[$d]['pay'], 2) : 0;
+          $data1['cost'][$k] = !empty($data1Res[$d]['cost']) ? round((float)$data1Res[$d]['cost'], 2) : 0;
+          $data1['reg'][$k]  = !empty($data1Res[$d]['reg']) ? (int)$data1Res[$d]['reg'] : 0;
+          $data1['login'][$k]= !empty($data1Res[$d]['login']) ? (int)$data1Res[$d]['login'] : 0;
+        }
+
+        foreach($day2Date as $k=>$d){
+         
+            $data2['days'][$k] = $d;
+            $data2['pay'][$k]  = !empty($data2Res[$d]['pay']) ? round((float)$data2Res[$d]['pay'], 2) : 0;
+            $data2['cost'][$k] = !empty($data2Res[$d]['cost']) ? round((float)$data2Res[$d]['cost'], 2) : 0;
+            $data2['reg'][$k]  = !empty($data2Res[$d]['reg']) ? (int)$data2Res[$d]['reg'] : 0;
+            $data2['login'][$k]= !empty($data2Res[$d]['login']) ? (int)$data2Res[$d]['login'] : 0;
+        }
+
+        // 格式化x轴的时间
+        $forData = [];
+        $days1 = [];
+        $days2 = [];
+        if(count($data1['days'])>count($data2['days'])){
+            $forData = $data1['days'];
+        }else{
+            $forData = $data2['days'];
+        }
+
+       
+        for($i=0;$i<count($forData);$i++){
+            $d1 = !empty($data1['days'][$i]) ? date("m-d", strtotime($data1['days'][$i])) : "";
+            $d2 = !empty($data2['days'][$i]) ? date("m-d", strtotime($data2['days'][$i])) : "";
+            $days1[] = $d1;
+            $days2[] = $d2;
+        }
+      
+        
+        $data1['series'] = "日期1";
+        $data2['series'] = "日期2";
+
+
+        return [
+          'data1' => $data1,
+          'data2' => $data2,
+          'days1' => $days1,
+          'days2' => $days2
+        ];
+      }
+
+
+      // 如果按小时对比
+      if($type === 'hour'){
+        $data1 = [];
+        $data2 = [];
+        $data1Res = [];
+        $data2Res = [];
+
+        $field = "
+          SUM(reg_total) as reg, -- 注册人数
+          SUM(old_login_total) as login, -- 老用户登陆人数
+          SUM(pay_total) as pay, -- 付费金额
+          SUM(cost) as cost, -- 消耗金额
+          thour
+        ";
+
+        // 获取对比日期1的数据, 注册、登录、充值
+        $params['reg_date'] = $params['compare_date1_date'];
+        $whereSql1 = $this->generateWhereSql($params);
+        $baseData1 = $this->generateMonthUnionList('base_total_hour_',$params['compare_date1'],$whereSql1,$field,'thour');
+
+        foreach($baseData1 as $item){
+          $data1Res[$item['thour']]['reg'] = $item['reg'];
+          $data1Res[$item['thour']]['pay'] = $item['pay'];
+          $data1Res[$item['thour']]['login'] = $item['login'];
+          $data1Res[$item['thour']]['cost'] = $item['cost'];
+        }
+
+        // 获取对比日期2的数据, 注册、登录、充值
+        $params['reg_date'] = $params['compare_date2_date'];
+        $whereSql2 = $this->generateWhereSql($params);
+        echo $whereSql2;
+        $baseData2 = $this->generateMonthUnionList('base_total_hour_',$params['compare_date2'],$whereSql2,$field,'thour');
+
+        foreach($baseData2 as $item){
+          $data2Res[$item['thour']]['reg'] = $item['reg'];
+          $data2Res[$item['thour']]['pay'] = $item['pay'];
+          $data2Res[$item['thour']]['login'] = $item['login'];
+          $data2Res[$item['thour']]['cost'] = $item['cost'];
+        }
+        
+        
+        $ndate = date("Y-m-d");
+        $hour = date("H");
+        print_r($data1Res);
+        for ($h=0; $h<24; $h++){
+            if($params['compare_date1_date']==$ndate && $h>$hour){
+                continue;
+            }
+            $data1['hour'][$h]  = $h;
+            $data1['pay'][$h]   = !empty($data1Res[$h]) ? round((float)$data1Res[$h]['pay']??0, 2) : 0;
+            $data1['cost'][$h]  = !empty($data1Res[$h]) ? round((float)$data1Res[$h]['cost']??0, 2) : 0;
+            $data1['reg'][$h]   = !empty($data1Res[$h]) ? (int)$data1Res[$h]['reg']??0 : 0;
+            $data1['login'][$h] = !empty($data1Res[$h]) ? (int)$data1Res[$h]['login']??0 : 0;
+        }
+
+        for($h=0; $h<24; $h++){
+          if($params['compare_date2_date']==$ndate && $h>$hour){
+            continue;
+          }
+          $data2['hour'][$h]  = $h;
+          $data2['pay'][$h]   = !empty($data2Res[$h]) ? round((float)$data2Res[$h]['pay']??0, 2) : 0;
+          $data2['cost'][$h]  = !empty($data2Res[$h]) ? round((float)$data2Res[$h]['cost']??0, 2) : 0;
+          $data2['reg'][$h]   = !empty($data2Res[$h]) ? (int)$data2Res[$h]['reg']??0 : 0;
+          $data2['login'][$h] = !empty($data2Res[$h]) ? (int)$data2Res[$h]['login']??0 : 0;
+        }
+         $hour = [];
+          for ($h=0; $h<24; $h++){
+              $hour[] = $h;
+          }
+
+        $data1['series'] = $params['compare_date1_date'];
+        $data2['series'] = $params['compare_date2_date'];
+
+        return [
+          'data1' => $data1,
+          'data2' => $data2,
+          'days1' => $hour,
+          'days2' => $hour
+        ];
+      }
+    }
+
     // 生成基础日统计表的联合查询列表
     public function generateYearUnionList($namePrefix, $regDate,$whereSql='',$field='*',$group=null){
 
@@ -639,6 +855,26 @@ class AnalyseLogic extends BaseLogic
     }
 
 
+    // 生成基础小时统计表的联合查询列表
+    public function generateMonthUnionList($namePrefix, $regDate,$whereSql='',$field='*',$group=null){
+        $tableNames = ToolLogic::getMonthlyTableNames($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){
 
@@ -676,9 +912,13 @@ class AnalyseLogic extends BaseLogic
             }
         }
         // 注册日期
-        if(!empty($params['reg_date'])??null){
+        if(!empty($params['reg_date']) && is_array($params['reg_date'])){
             $whereSql .= " AND tdate BETWEEN '{$params['reg_date'][0]}' AND '{$params['reg_date'][1]}'";
         }
+        // 注册日期,不是数组,则认为是单个日期
+        if(!empty($params['reg_date']) && !is_array($params['reg_date'])){
+          $whereSql .= " AND tdate = '{$params['reg_date']}'";
+        }
 
         return $whereSql;
     }